3.10.4 对抗缓冲区溢出的攻击
P198
解释一下栈随机化
程序执行的时候会分配栈帧,如果使用随机化,就是在main函数前随机分配一段内存不适用,这个时候就没办法预测返回地址了,如下

P199
解释一下空操作雪橇:
假设有一个机器,攻击者可以向机器中输入一个字符串,而且攻击者知道机器在接收字符串之后的具体行为,从而可以算出可以在哪里发生缓冲区溢出(也就是这个字符串在栈中存储的起始位置以及返回位置,见下)。

攻击者的字符串首先由一大堆NOP组成,然后由攻击代码组成,最后由一些填充和跳转地址组成。假设NOP是\(L\)字节,栈的起始位置的变化范围是\(N\)字节,那么攻击者一共会猜\(\frac{N}{L}\)个起始地址,每个地址之间的间隔是\(L\)字节,于是这些起始地址就可以覆盖\(N\)字节。攻击者通过自动化脚本,运行多次,总会让跳转地址跳转到当前NOP的某一个字节中(每次运行程序的时候,NOP覆盖了\(L\)个字节,于是栈的起始位置有\(\frac{N-L}{N}\)的概率没有被覆盖,所以运行\(K\)次没猜中的概率是\((\frac{N-L}{N})^K\))
P201
下面的内容还没看

最后补充一下一个叫做ROP的攻击。ROP即面向返回编程,核心思路是解决前面说到的由于栈随机化而无法知道具体执行什么指令的问题。栈随机化随机化的是栈帧,而其他地方比如Text/Data等区域是不会动的,可执行程序就存储在Text里,所以我们只要知道Text里面各个指令的位置,就可以依靠这些指令组合出我们的攻击代码。问题就是我们不能直接知道指令具体在哪里,这个时候就是要找到各个指令的位置。而我们运行一段程序,就可以反汇编出一段程序,就可能包含称为gadget的指令。gadget是以0xc3(即ret)结尾的指令。得到这些指令之后,我们就可以利用这些指令构造出合法的攻击序列


ret的作用就是让各个gadget之间能够连续执行,可以想一下。ret就是面向返回

浙公网安备 33010602011771号