堆入门---Unsorted Bin Attack
Unsorted Bin Attack
概述
-
利用机制:Glibc 堆管理中的的 Unsorted Bin 的机制
-
利用前提:能控制 Unsorted Bin Chunk 的 bk 指针。
-
达到效果:实现修改任意地址值为一个较大的数值(不是任意写)。如:
- 修改某个值绕过循环或者判断条件
- 修改
global_max_fast为一个较大的值使得几乎所有大小的chunk都用fast bin的管理方式进行分配和释放 - 修改
_IO_list_all来伪造_IO_FILE进行攻击
前置知识
1.Unsorted Bin在使用过程中采用的遍历顺序是 First In First Out(FIFO),即从unsorted bin头部插入,从链表尾取出
注:这里所说的链表尾并不准确,因为是双向循环链表,可以意会一下,正常情况下是unsorted bin (av)->bk所指向的堆块。
2.调用malloc程序运行流程
->计算真正的堆块大小(加上头部,对齐)
->在fastbin范围内?
->是,检查对应的链表有没有chunk
| ->**有,分配,完成**
->否,或者没有chunk可用
->在smallbin范围内?
| ->是,检查对应大小的bin链表有没有chunk
| ->**有,取出,完成**
->否,或者没有chunk可用
->unsortedbin中有没有chunk
| ->有,从尾部取出第一个chunk,看看大小是否满足需求
| ->满足,切分后大小是否大于minsize?
| | ->大于,切分块,返回给用户,剩下的块放进unsortedbin
| | ->**小于等于,全都返回给用户,完成**
| ->不满足,把这个块放入small/largebin对应的链表中,继续遍历下一个块
->否,或者没有chunk可用
->大小是否在largebin中?
| ->是,检查对应的bin链表中有没有符合的chunk
| ->有,找到满足需求最小的chunk,切分块返回,剩下的放进unsortedbin中
->largebin也不行,**再次遍历small/largebin找best fit的chunk**
->还是没有,**从topchunk中切割**
->topchunk也不够?**mmap系统调用**
在程序 malloc 时,如果在 fast bin,small bin 中找不到对应大小的 chunk,就会尝试从 Unsorted Bin 中寻找 chunk。如果取出来的 chunk 大小刚好满足,就会直接返回给用户,否则就会把这些 chunk 分别插入到对应的 bin 中。
Unsorted Bin Leak
一个小treak
如果我们能把fd或bk指针leak出来,就可以获得一个与main_arena 有固定偏移的地址,而main_arena和libc_base也有一个固定偏移,那么就可以绕过ASLR了。
Unsorted Bin Attack
源码分析
在 glibc/malloc/malloc.c 中的 _int_malloc 有这么一段代码,当将一个 unsorted bin 取出的时候,会将 bck->fd 的位置写入本 Unsorted Bin 的位置。
/* remove from unsorted list */
victim = unsorted_chunks (av)->bk
bck = victim->bk
nsorted_chunks (av)->bk= bck
bck->fd = unsorted_chunks (av)
//
参考图片,下面依据图片对源码进行解释。

取出bin2正常情况下:
-
victim = unsorted_chunks (av)->bk即victim指向bin2 -
bck = victim->bk即bck指向bin1 -
unsorted_chunks (av)->bk = bck即main_arena.bins[0,1]的bk指针指向bin1 -
bck->fd = unsorted_chunks (av)即bin1的fd指针指向main_arena.bins[0,1],也就是bck+0x10=main_arena.bins
那么当我们改写victim的bk为target-0x10的时候,unsorted_chunks (av)->bk =bck=target-0x10,bck->fd = bck+0x10=target,此时*target=main_arena.bins
总结
综上,unsorted bin attack确实实现了修改任意地址的值,但修改的值却不是我们指定的,但可以确定的是,这个值比较大。另外我们还需要注意上述代码没有检查fd指针,因此我们可以把它修改成一个不合法的值,同时unsorted bin的双向链表可能就此破坏,所以如果后面想插入chunk可能会出现问题。
参考文章
https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/unsorted-bin-attack/#__malloc_hook
https://xz.aliyun.com/news/6847

浙公网安备 33010602011771号