堆入门---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)
//

参考图片,下面依据图片对源码进行解释。

img

取出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

posted @ 2026-01-31 15:10  sprYAaaa  阅读(69)  评论(0)    收藏  举报