之前没有全面的学习,现在网上资料真是比几年前全面的多了,这里总结回顾一下fastbin attack的原理思路。这里参考的博主链接如下,写的确实很详实
https://blog.csdn.net/Breeze_CAT/article/details/103788698
一、基础知识
需要了解fastbin的分配原理,fastbins是管理在malloc_state结构体重的一串单向链表,分为0x20-0x80总共7个链表:
- 每次free释放对应大小的堆块,会加入到对应的链表中
- 每次malloc分配堆块,会从对应大小的链表中分配一个堆块
- 维护malloc_state遵循后入先出的原则(LIFO)
关于第三条原则,用引用网站的两张图便可以解释清楚
二、double free
double free+fastbin attack的利用场景,通常在对堆块有越界写入的情况下,实现申请任意地址的malloc块
直接用下面的步骤进行举例说明
步骤一:申请两个fastbin大小的堆块1和2,然后分别释放chunk 1和chunk 2,fastbin的链表结构就会如下图
步骤二:通过越界写入,修改chunk1的状态值,使得chunk1能够再次被free,经过第二次free的chunk1后,链表状态如下
具体如何通过越界修改chunk1,我在后面会出一个unlink攻击篇详细介绍
步骤三:malloc一个新的chunk,chunk1被申请
步骤四:修改chunk1的指针指向(目的地址-0x10),然后申请新的chunk,原chunk2被申请
步骤五:申请新的new chunk,此时状态如下
可以看到,只要在申请一个new chunk,就可以申请一个到目标地址的块了,自此实现完毕
三、use after free
我理解的UAF应用场景比double free更广,而且实际是double free的后面几步(不知道自己的理解对不对)
步骤一:申请一个对应fastbin区间内的堆块并释放
步骤二:通过越界写入或者本身的指针操作修改free过的chunk的内容,指向目标地址
后面步骤和doule free一致
四、chunk extend
这个chunk extend大致讲的是通过堆布局或者一字节溢出,修改某个bin的大小,最终导致堆同一堆块内不同地址的操作,具体用一张图可以大致表示出来,详细还是去看原博主的内容把(个人目前没碰到过需要用这种方法的)
五、相关练习题目
- bugku Baby-heap1