Unsorted Bin Attack 漏洞笔记
TOC
资料来源:ctf-wiki 。
前导知识
基本来源
- 当一个较大的 chunk 被分割成两半后,如果剩下的部分大就会被放到 unsorted bin 中。
- 释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。
- 当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近邻的话。
基本使用情况
- Unsorted Bin 在使用的过程中,采用的遍历顺序是 FIFO,即插入的时候插入到 unsorted bin 的头部,取出的时候从链表尾获取。
- 在程序 malloc 时,如果在 fastbin,small bin 中找不到对应大小的 chunk,就会尝试从 Unsorted Bin 中寻找 chunk。如果取出来的 chunk 大小刚好满足,就会直接返回给用户,否则就会把这些 chunk 分别插入到对应的 bin 中。
malloc_chunk结构
原理
这是对 unsorted_chunks 操作的部分源码:
glibc-2.23/malloc/malloc.c:3454
/* |
Unsorted Bin Attack 漏洞的核心就是下面的代码:
/* remove from unsorted list */ |
代码举例
|
运行完成后,局部变量情况如下:
pwndbg> info locals |
注意
触发时的申请的size要和free掉的size一样,否则将unsort bin中的chunk放回对应的bin后,unsort bin的连续性会被破坏,也就过不了下面的check。
if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0) |
举个例子:
|
运行结果:
ex@ubuntu:~/test$ gcc -g main.c |
用处
- 们通过修改循环的次数来使得程序可以执行多次循环。
- 我们可以修改 heap 中的 global_max_fast 来使得更大的 chunk 可以被视为 fast bin,这样我们就可以去执行一些 fast bin attack 了。
总结
要完成一个大目标是件非常困难的事,但是实现很多个小目标就要简单的多,那为什么不将大目标拆分成许多小目标呢?