介绍
仍然是国赛2019的一道题,正如它的名字,是一个double free,不过漏洞不那么容易看出来(虽然我是一下子就看出来了)。
分析程序
还是一个单选程序,可以增加,查看,编辑,删除。处理的是一个单链表,结构体如下。有两个全局变量指向链表头和尾。
1 | 00000000 node struc ; (sizeof=0x18, mappedto_6) |
其中漏洞在new的时候,当new一个新node的时,读入content后,会与上一次的content做比较,如果相同则无需开辟新空间,直接将指针指过去就好。因此,虽然在free时有将指针清零,但有可能有多个指针指向一个堆块,所以会造成double free,其实因为还有edit操作,所以我们可以直接UAF,即可分配堆到我们想要的地方。
(这大概就是所谓的优化带来的bug吧)
利用方式
- malloc两个content相同的smallbin,并free掉其中一个,content上就会有libc的地址,利用另一个node打印出来即可造成信息泄漏。
- 再次malloc两个content相同的smallbin,free其中一个,再利用另一个node去改写fd的值,导致下一次malloc的地址可控,malloc到
__malloc_hook
附近,然后将__malloc_hook
填为onegadget即可。
脚本
1 | #!/usr/bin/env python2 |