简介:
一个之前复现的题后期再哪来复现学习的时候,发现用一样的思路打缺拿不到shell了,重新搞了一下才发现是栈迁移的坑
问题分析
假设在x32位的系统中漏洞函数可以任意写入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 我们继续可以加以利用。
原文始发于微信公众号(Kone安全):双leave栈迁移的坑爹问题
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论