为什么需要stack pivoting
- 当stack overflow的空间不足时
怎么实现stack pivoting
通过将ebp覆盖成构造的fake_ebp,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上,从而实现栈的迁移
为什么是leave ret
-
leave:
- mov esp , ebp;
- pop ebp;
-
ret:
- pop eip
实现过程
首先程序有stack overflow漏洞,我们将栈覆盖成下面的样子

执行完mov esp , ebp后

接着就是pop ebp,执行完后如图

由于esp是栈顶指针,当pop ebp后,栈顶的元素被弹给了ebp,所以esp应当向下移4个字节,也就是一个单位
下一步通过read()函数的ret来把内容输入到fake_ebp1地址上,这里主要是要将fake_ebp2的地址给到fake_ebp1的地址上

下一步就来到了leave_ret,也就是重复上方的mov esp,ebp pop ebp和pop eip
mov esp,ebp 后

接着pop ebp,由于fake_ebp1中放的是fake_ebp2的地址,所以ebp会指到fake_ebp2处去

此时再执行ret命令,他就会执行我们构造在bss段或者data段上的内容了
到这里stack pivoting就完成了