堆喷射原理学习
一、原理
堆喷射(Heap Spray)是一种针对缓冲区溢出的高级利用技术。攻击者在堆区申请大量充满空指令的内存块,每个内存块的末尾填充 Shellcode。
然后,通过缓冲区溢出等方式修改程序的返回地址到这个堆空间。
由于空指令在这个空间中占据了绝大多数,大部分情况下,这个修改之后的返回地址会跳在空指令区。
跳转后的程序将会先一条一条地执行空指令,进而滑行到 Shellcode 执行。
二、常用地址 0x0C0C0C0C 的原因
0x0C0C0C0C 是一个常用的堆喷射地址,因为它具有以下几个特点:
1. 地址范围优势
0x0C0C0C0C(192M)是一个较大的地址,一般还未被系统分配。当申请大内存(如 200MB)堆区填充空指令与 Shellcode 时,0x0C0C0C0C 很可能会在被分配到的堆区中。
2. 字节一致性优势
为什么地址中每字节都是 0C?原因是每个字节都是 0C,这样溢出时就不需要考虑 4 字节对齐的问题,只要覆盖了目标地址,就肯定是 0x0C0C0C0C。
3. 指令有效性优势
另外,0x0C0C 对应的 x86 指令是 OR AL, 0x0C,这可以代替 NOP 指令(0x90)作为无害空指令。这使得堆喷射变得更加隐蔽和有效。