双 leave 栈迁移的坑
简介
之前在复现自己做出来的题时,一样的思路发现拿不了 shell 了,后来发现是栈迁移的坑。
问题
假设 32 位系统中,漏洞函数可以任意写入 0x00000000。
现在我们已经用双 leave 迁移栈,然后运用 rop 技术泄露 got 表地址,如下:
0x00000000 0x0
0x00000004 puts_plt <=== esp
0x00000008 return_addr
0x0000000c puts_got
当我们泄露完地址,从返回地址返回漏洞函数后
0x00000000 0x0
0x00000004 puts_plt
0x00000008 return_addr
0x0000000c puts_got <=== esp
可以看到,漏洞函数就会把 puts_got 上部分作为它的栈,然后我们需要双 leave 迁移和写入其他的 rop ,就会出现如下情况
双 lieave ROP
0x00000000 0x0 0xaaaaaaaaa 0x0
0x00000004 puts_plt 迁移的目标地址 read_plt
0x00000008 return_addr leave_gadget地址 return_system
0x0000000c puts_got puts_got read 第一个参数
可以看到,双 leave 会与 rop 重叠,这样就会导致我们利用失败。
解决办法
- 再次把栈迁移到其他位置。
- 有些程序的主函数有类似 and esp, 0FFFFFFF0h 可以加以利用。