内存攻击小结
我花了大约一个月的时间看了《0day安全:软件漏洞分析技术》的第 1 篇:漏洞利用原理(初级)和第 2 篇:漏洞利用原理(高级)。这部分主要讲解了Windows平台下的各种内存攻击技术,从简单的栈溢出到绕过GS、DEP等高级防护措施。内容庞杂而深刻,觉得一时难以消化,故在此进行总结。
依我自己的理解,按目的,将内存攻击分为两大类,第一类是以修改关键指令(书中实验1.4),关键变量(书中实验2.2)为最终目的的内存攻击,第二类是以控制EIP(32位机)为终极目标的内存攻击。第一类相对简单易懂,且往往无法执行shellcode(但并不意味着危害更小),故不详细讨论,主要总结第二类内存攻击。
CPU根据指令寄存器EIP的值来执行相应位置的指令,控制了EIP,便控制了程序流程。第二类内存攻击技术,以控制EIP,执行shellcode为目标,为达成这一目标,分两步走:
第一步:修改内存值
修改内存值的方法便是栈溢出,堆溢出等。堆溢出又可细分为二:连续覆盖(溢出)⇒ 精确打击(DWORD SHOOT)。无论是栈溢出,堆溢出还是其他修改内存值的方式,都是在为第二步做准备。
第二步:控制EIP
通过修改特定位置的内存值,借助某些特殊指令、机制,便可以控制EIP。书中提到的控制EIP的方法有:
- 函数返回地址(实验2.4,4.6,10.5,12.3,12.4)
- 函数指针(实验6.3,10.3)
- 异常处理S.E.H(实验6.1,10.4,11.4,11.5,11.6,15.3,15.4)
- 进程环境块P.E.B(实验5.4)