X64汇编语言教程(白帽黑客系列课程)(七)
为什么要写这篇教程呢?
本文章仅提供学习,切勿将其用于不法手段!
因为想要成为一名白帽黑客,汇编语言是必须要掌握的!
无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !
你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !
你必须看得懂,汇编语言代码 和 C语言代码,这是硬性要求!
想要参加CTF竞赛,汇编语言 和 C语言 都是重要的底层基础知识。
接下来,让我们来讲一下,汇编语言编程的基础知识!
上面的图中,展示了汇编语言编程的大体流程!
在进行64位环境下的汇编语言编程时,我们要注意在调用函数时,保护好栈平衡!
什么是栈平衡呢?
栈平衡是指在函数运行时,编译器确保在函数结束之前,通过执行相同次数的pop指令来抵消函数内部执行的push指令,从而使栈恢复到执行该函数之前的状态。
在汇编语言中,栈平衡是确保程序正确执行的重要概念。当函数调用时,会将参数、返回地址等信息压入栈中,函数执行完毕后,需要将这些信息从栈中弹出,以恢复栈的原始状态。这个过程就是栈平衡。
栈平衡分为内平栈和外平栈两种方法。内平栈是在函数内部进行平衡操作,确保在函数返回之前栈已经平衡;而外平栈则是在函数外部,通过调用者来恢复堆栈状态。
在上图中,我们所使用的栈平衡方法,为 “ 内平栈 ” 和 “ 外平栈 ” 的结合!
在函数内部,需要维护好栈平衡!在函数外部,也需要维护好栈平衡!
因为在64位环境下,如果是WINDOWS系统,在MSVC编译器环境下,超出4个的函数参数,将被以栈方式进行函数参数传递!如果是Linux系统,在GCC编译器环境下,超出6个的函数参数,将被以栈方式进行函数参数传递!
如果函数使用栈方式进行了参数传递,那么在函数调用结束时,我们就应该把函数调用时传递参数所使用的栈空间去释放掉!这是非常有必要的!因为我们要维护“栈平衡”!
保持栈平衡对于程序的正确执行至关重要。如果栈不平衡,可能会导致返回地址错误,进而引发程序崩溃或不可预测的行为。因此,在编写汇编语言程序时,需要特别注意栈平衡的问题,确保每次函数调用都能正确地恢复栈的原始状态。
接下来,我们来讲一下,内存模型 和 运行模式 方面的相关知识 !
是不是觉得跨度有些大了?!
其实这里,笔者更多希望的是,作为读者的您,能够通过自学能力去学习到更多的知识。
笔者不可能,把所有的知识点,都讲得非常细,都讲得非常多,那样,几乎任何一个知识点,都可以被写成一本厚厚的教科书。在这里,笔者会告诉你,你需要学习什么,需要去了解哪方面的知识,需要在编程去注意哪些事项,少踩哪些坑!
我们来接触下 物理内存 的相关知识
指令寻址 或 数据寻址 的 范围 ,取决于 CPU (中央处理器)的 地址总线 宽度 !
64条地址线,对应着 64 个比特位 bit !简称为 64位地址总线 !
32位环境 的 可寻址范围,最大为 4GB ,也就是 4294967296 个字节!
16位环境 的 可寻址范围,就更小了,仅有 1MB(1048576个字节) ,这还要依赖于段寄存器发挥的辅助寻址作用( 段基址 = 段寄存器的内容值 * 16 )!否则 16位系统,只能寻址 64KB,也就是 1024 byte * 64 = 65536 字节 !
64位环境 的 可寻址范围,最大为 140737488355328 个字节,也就是 16777216 TB !
64位环境 的 可寻址范围,最大为 16777216 TB ,1TB = 1024 GB ;1GB = 1073741824 字节 !
我们简单点理解,140737488355328 byte = 17179869184 GB = 16777216 TB !
byte 是字节的意思,1字节等于8位,也就是8个比特位!比特位,也就是 bit !
我们要注意,内存地址的下标,是以 0 开始的,而不是以 1 开始 !
因此 最大地址偏移 为 最大内存寻址范围 - 1 !
可寻址的内存范围大小,限制了软件程序的规模!
在 32位环境下,去运行几个虚拟机,是难以想象的!可寻址的内存范围,真的太小了!
64位环境,为我们的软件程序,提供了广阔的生存空间 !
那么,读者朋友们,是不是觉得,64位环境下,计算机内存的使用空间非常之大呢?!
事实上,不要高兴的太早,这仅仅是理想情况!
基于x86-64架构的内存模型(PC机基本都是x86-64架构),仅支持最大8TB的内存地址空间!
即使是只有8TB的内存地址空间支持,其实已经非常不错了!
1 TB = 1024 GB ,8 TB = 8192 GB ,基本上已经足够满足现有软件体系的功能需求了!
CS、DS、ES、FS、GS、SS 这些寄存器,为什么会存在呢?
在计算机的远古时期,也就是 1980年左右的时间 !
8088处理器,仅有 20条地址线,也就是说 8088处理器的地址总线宽度,仅有 20 !
上面,我们说过,16位地址总线,可寻址的最大范围是 64KB(65536个字节)
那么,20位的地址总线,可寻址范围是多少?是2的20次方!也就是 1048576 个字节(1MB)!
在16位系统下,如果我们想要寻址1MB的内存地址空间,我们就必须要借助于 CS、DS、ES、FS、GS、SS 这些16位寄存器!这些寄存器,在16位系统环境中,被称为 段寄存器 !或者说,叫做 段基址寄存器!
CS 是 代码段 基址寄存器,DS 是 数据段 基址寄存器,ES 、FS、GS 等被称为 附加段 基址寄存器 ! SS 是 栈段 基址寄存器 !
在16位系统中,想要寻址到1MB的内存地址,就必须采用 段基址寄存器的内容 * 16 ,再加上 16位偏移地址 的方式,去进行内存寻址 !
段基址寄存器的值为什么要去乘以 16 呢?
65536 * 16 = 1048576 个字节,也就是 1MB !
段基址寄存器 的内容值 乘以16 的 计算结果 的 低4位 ,全部为 0 !
为什么 段基址寄存器 的内容值 乘以16 的 计算结果 的 低4位 ,全部是 0 呢?
我们知道,乘以 2 = 左移 1位 !乘以 4 = 左移 2 位 !乘以 8 = 左移 3 位 !乘以 16 = 左移 4 位 !
乘以 2 = 乘以2的1次方,乘以 4 = 乘以2的2次方,乘以 8 = 乘以2的3次方,乘以 16 = 乘以2的4次方!左移4位后, 右4位(或者说叫做 低4位)的 BIT 值 就 全部为 0 了 !
懂了吗?高16位 搭配 低4位的完美组合,刚好构成了完整的段基址(20位的段基址)!
20位的段基址 + 16位的偏移地址 ,刚好可以寻址 1MB 的 内存地址空间 !
段基址 的数值,一定是16的倍数 !段基址 是 段基址寄存器 的内容值 乘以 16 后计算得出的!
话题回到 内存模型 和 运行模式 上来,x86-64架构 主要采用的是基于分页机制的内存模型。
以下是关于x86-64架构内存模型的详细解释:
-
分页机制:
- x86-64架构的内存管理主要通过分页机制实现。
- 每个进程都有一个4级页表,页表项中包含物理地址、访问权限、缓存策略等信息。
- 这种分页机制使得内存空间可以灵活地管理和保护。
-
地址空间:
- x86-64架构的内存模型基于8TB(或更大,取决于具体实现)的地址空间。
- 这意味着它可以支持最大8TB(或更大)的物理内存。
-
内存访问:
- 在x86-64架构中,CPU可以直接访问内存,但访问外部设备(如硬盘、显卡等)则是通过内存间接进行的。
- CPU首先将数据从外部设备加载到内存中,然后再从内存中访问这些数据。
-
兼容性:
- 虽然x86-64架构是基于64位的,但它仍然保留了与32位x86架构的兼容性。
- 这意味着32位的程序可以在64位的操作系统上运行,但可能需要进行一些兼容性转换(如WOW64模式)。
-
其他特性:
- x86-64架构还支持虚拟内存,这进一步增强了内存管理的灵活性和安全性。
- 通过虚拟内存,系统可以为每个进程提供独立的地址空间,从而避免进程之间的内存冲突。
综上所述,x86-64架构的内存模型是基于分页机制的,它提供了灵活、高效且安全的内存管理方式,支持大容量的物理内存和虚拟内存,并保留了与32位架构的兼容性。
这里要重点强调一下 虚拟内存 !
当进程切换时,也就是,上一个进程被暂停执行时,上一个进程的内存数据 会被临时转储到 硬盘空间 之上 ,当上一个进程被恢复执行时,被存储在硬盘之上的进程数据 又会被重新写回到物理内存空间之中 !这样保证了,每一个进程开始执行时,即使向相同的物理内存写入数据,也不会覆盖其它进程的内存数据(此时,其它进程的内存数据,已经被临时存储到了硬盘之上)!
我们为什么要强调,x86-64架构呢?
PC机的CPU(中央处理器),基本上都是x86-64架构,它是具有较为广泛的通用性的!
主要应用于嵌入式设备和便携式设备上的ARM64架构,在本篇文章中,暂不做讲述,以后或许会讲一下 如何在 ARM64架构上进行汇编语言程序设计,但是我们需要认识到,ARM64架构下的汇编语言的指令语法等,对比 x86-64架构下的汇编语言的指令语法等,是具有非常大区别的! ARM64架构,具备自己的CPU指令集合!
关于运行模式中的 实模式 、保护模式、虚拟8086模式 等,在下一章节中再做介绍。
(未完待续)
原文地址:https://blog.csdn.net/fearhacker/article/details/145109529
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!