ciscn2019_final_3 writeup
buu刷题记录:ciscn_final_3
写在前面
今天解决了C++文件换版本的问题,也是一刻没耽误直接做了这道C++题目,不得不说太爽了啊,再也不用因为题目是C++写的就做不了了,话不多说来看文件。
静态分析elf文件
题目告知是ubuntu18版本的,给了libc.so.6文件,但是盲猜跟它自己的一样,那就先换好elf文件的版本。checksec观察保护全开。然后IDA打开一看,发现是经典的堆菜单题,提供了两种操作,add和delete。delete很明显free之后指针没有清零,存在UAF漏洞,并且add只允许下标开到0x18,也就是0~24总共能add 25次。然后大小限制在了fastbin大小的范围内,但是很贴心地,每次add之后给了malloc之后的地址。那么大概率通过这里泄露(ps:一开始并没有想到,还想着用IO泄露来着的),思路大概是先通过一次double free修改一个chunk的size为其它大小,然后free一次,再修改成非fastbin范围的堆块,并且防止堆块放入unsortedbin被check fail,最好不要构造堆相互重叠(这句话的意思差不多就是尽量让小堆块完全被大堆块包含,因为它会检测next chunk的)。然后出来了libc的地址之后准备好之前被free的堆块,add添加之后libc地址落入tcache中,再次add泄露这个地址,然后就很简单了,double free劫持free_hook为system函数,再free一个带有/bin/sh字符串的堆块即可getshell。
exp
1 | from pwn import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xia0ji233's blog!