111 gyctf_2020_signin
保护

四个功能,1,2,3,6.
1 add


只能申请0x70大小的chunk,而且最多申请十次。
edit
输入的大小最多0x50.cnt的值初始化为0,所以只有一次edit的机会。
没有清理干净,有uaf。
后门函数也有了,但是里面先是莫名其妙申请了个chunk,然后要求这个从来没有用过的ptr不是null。
注意到这个题是18.04,有tcache机制。
在说这个题的整体思路前呢,我们需要先明白两个机制。
calloc 有以下特性
不会分配 tcache chunk 中的 chunk 。
tcache 有以下特性
在分配 fastbin 中的 chunk 时若还有其他相同大小的 fastbin_chunk 则把它们全部放入 tcache 中。
我们的总体思路是这样的。
因为我们最终的目的只不过是在ptr中能留下点什么东西就好。结合这道题的漏洞uaf,我们能做的是修改一些fd啥的。那么怎么通过这个uaf做到修改。
我们平常如果有uaf的话,就会去想到fastbin_attack,或者double free。但是这道题double free不行,他会有flag检测,我们只能想一想fastbin_attack的事情。
平常的话我们可以先修改一次fd,申请到malloc_hook,然后再写一次这样子,但是这道题我们只能写一次,我们只能向这道题靠拢,想办法利用题里面的把ptr的地方写一些东西。
我们最后发现system上面有个calloc,结合上面的机制,假如我们calloc的时候只能申请fastbin,而且会把剩余的大小相同的chunk挂入tcache,那么我们假如修改一次fastbin的fd,calloc一次,让下一个chunk,也就是我们的fakechunk挂到tcache链里面,那么自然会在那个fakechunk里面写一个chunk的地址,因为要形成一个链,那么我们的利用方式就想好了。
具体的利用方法
我们想要达成的最后目的是,申请一个fastbin的时候,把下一个我们的fakechunk挂进去,所以我们首先需要有fastbin chunk,那么就申请8个,释放8个。
我们需要再申请一个,因为我们需要给一会要挂进去的chunk留一个位置,然后就直接calloc申请,挂进去就好了。
exp
from pwn import *
r = remote("node3.buuoj.cn", 26121)
context.log_level = 'debug'
def add(idx):
r.sendlineafter('your choice?',str(1))
r.sendlineafter('idx?',str(idx))
def edit(idx,context):
r.sendlineafter('your choice?',str(2))
r.sendlineafter('idx?',str(idx))
r.send(context)
def delete

本文解析了多个CTF挑战题目,包括利用UAF漏洞修改fd指针、栈溢出攻击、利用信号量机制获取flag等技术细节。
最低0.47元/天 解锁文章
787

被折叠的 条评论
为什么被折叠?



