为什么需要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就完成了