介绍
starctf2019的一道题,题目不难,但是是最新的2.29的libc,调试起来挺麻烦的。
分析程序
程序是一个典型的单选系统,有add、show、call(free)等操作,结构体如下
1 | 00000000 node struc ; (sizeof=0x18, mappedto_6) |
漏洞出现在call的时候,free掉指针后,并没有将指针清零,并且没有对index做检查,所以可以做到double free
并且leak信息也很简单,程序可以打印堆内容,打印chunk中残留的libc地址即可。
利用方式
- malloc一个大于tcache的堆,并free掉,直接输出堆内容,即可拿到残留的libc地址
- malloc两次,用于之后的double free
- malloc7个chunk并free掉,填满tcache
- 再次free即可造成fastbin上double free,绕过检查即可
- malloc7次用完tcache,再利用double free修改
__free_hook
- free(“/bin/sh”)即可getshell
脚本
1 | #!/usr/bin/env python2 |