unsortedbin_attack
本文最后更新于 2024年10月25日 下午
unsortedbin_attack——magicheap
unsorted bin回顾
以下内容来自wiki
Unsorted bin可视为空闲chunk回归所属bin之前的缓冲区。Unsorted bin处于bin数组下标1处,所以Unsorted bin只有一个链表,并且是双向链表。因此Unsorted bin中的chunk不按照size进行分类,所有空闲chunk处于乱序状态
Unsorted bin中chunk的主要来源
- 当一个较大的chunk被分割成两部分后,如果剩下的部分大于MINSIZE,则会被放进Unsorted bin中
- 释放一个不属于fast bin的chunk,并且该chunk不与top chunk相邻,该 chunk会被首先放到Unsorted bin中
- 当进行malloc_consolidate(块合并)时,如果合并后的chunk不与top chunk相邻,则可能会把合并后的chunk放到Unsorted bin中
基本使用情况
- Unsorted Bin在使用过程中,采用的遍历顺序是FIFO(先进先出),即挂进链表的时候依次从Unsorted bin的头部向尾部挂,取的时候是从尾部向头部取(这里的先进先出是指取出时候的操作,插入时采取的是后进先出的顺序)
- 在程序malloc时,如果fast bin、small bin中找不到对应大小的chunk,就会尝试从Unsorted bin中寻找chunk。如果取出来的chunk的size刚好满足,则直接交给用户,否则就会把这些chunk分别插入到对应的bin中
unsortedbin_attack
原理
当有一个unsorted bin是空的时候和挂着chunk的情况分别如图
当无chunk时,unsorted bin 的两个指针都指向自身,而有一个chunk挂进unsorted bin 时他们的指针互指形成双链表
这时候我们通过如果某种手段将chunk的bk指针改成其他地方,就会如下
此时unsorted bin的链表结构会被破坏出现corrupted,这时我们重新申请一个合适chunk时,程序会把chunk把从unsorted bin 中摘掉,但是由于本身的结构呗破坏,所以unsorted bin的fd指针还是会指向原先的chunk(这个可以自己去网上查查),但是实际上chunk已经没了,而target变成了与unsorted bin相邻的链表,就会出现下图的情况
unsorted bin的fd指针顺着原先的chunk指向了我们的target chunk(个人认为这样教好理解),而bk指针就直接指向了target_presize,同样的target 的值就变成了unsorted bin的bk指针,变成了一个很大的值。
可以看到虽然这种方式可以实现任意写,但是内容并不受我们控制,而是随机的
接下来用个题目理解一下吧
magicheap
creat函数
这个函数很好理解,就是输入大小如何创建chunk罢了
delete函数
这个也没什么好说的,就是释放函数
edit函数
这个函数就有说法啦,这个编辑函数要求我们重新输入size,这不就坏了吗,如果这个size比创建的时候大,就造成了堆溢出
main函数
主函数也是经典的类型,并且给了后面,但是进入的条件是magic大于0x1305
思路
这道题较为简单,我就直接说思路了,前面我们刚刚学了unsorted bin attack,不就是能把任意的地址的值变大吗
我们先创建三个chunk
1 |
|
第一个chunk是为了溢出修改chunk2的bk指针,第三个chunk是为了挂进unsorted bin,第三个chunk是为了让chunk2不直接与topchunk相邻,从而让他挂进unsorted bin
接着溢出修改bk指针
1 |
|
可以看到此时bk已经覆盖
最后在申请chunk造成攻击
可以看到magic已经变得很大,就可以打通了
exp
1 |
|