RCTF-2015 welpwn
分析
直接打开ida x64分析源码
发现读了0x400个数据到buf里,刚好没法溢出。于是再查看一下echo函数。
这个for循环特别可疑,会把之前main函数读到的数据赋给s2,直到到有\x00才会停下来。所以这里是一个溢出点。但是我们在覆盖返回地址的时候,肯定会有\x00在里面,所以这里我们最多只能使用一个gadget,剩下的部分就会被截断了。
一开始思路到这里就断了。但是再仔细分析main函数,不难发现buf的起始位置是main函数一开始rsp的位置。好家伙,这下有意思了,s2的起始位置到buf的起始位置起始只隔了0x20!
payload送上去之后,前0x18个位置是不能出现\x00的,接下来0x8可以是一个gadget,再之后就遇上了buf,也就是又会是那0x18个垃圾字符,以及这个gadget。
基于这个特殊的结构,这时就有一种思路了:有没有可能,让前面s2那里的数据和buf的数据能刚好接上,并且只使用一个gadget?答案是有的。用__libc_csu_init
上面的pop指令:
0x000000000040089e : pop r13 ; pop r14 ; pop r15 ; ret
这样一来,前面那0x18个垃圾字符刚好就能拿来当缓冲了。
这时的栈,被我们布置成这样:
0x18个垃圾字符,pop_r13_r14_r15_ret, 0x18个垃圾字符,pop_r13_r14_r15_ret ······
在省略的部分再填上0x18个垃圾字符,然后后面写上正常的ROP链,就可以去泄露libc,然后打第二波拿到shell了。
exp
1 | from pwn import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 kotori的菜园!