PWN系列-Unsorted Bin Attack

PWN系列-Unsorted Bin Attack

概述

Unsorted Bin Attack,顾名思义,该攻击与 Glibc 堆管理中的的 Unsorted Bin 的机制紧密相关。

Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指针。

Unsorted Bin Attack 可以达到的效果是实现修改任意地址值为一个较大的数值。

Unsorted Bin 回顾

在介绍 Unsorted Bin 攻击前,可以先回顾一下 Unsorted Bin 的基本来源以及基本使用情况。

基本来源

  1. 当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。
  2. 释放一个不属于 fastbin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。
  3. 当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近邻的话。

基本使用情况

  1. Unsorted Bin 在使用的过程中,采用的遍历顺序是 FIFO,即插入的时候插入到 unsorted bin 的头部,取出的时候从链表尾获取
  2. 在程序 malloc 时,如果在 fastbin,small bin 中找不到对应大小的 chunk,就会尝试从 Unsorted Bin 中寻找 chunk。如果取出来的 chunk 大小刚好满足,就会直接返回给用户,否则就会把这些 chunk 分别插入到对应的 bin 中。

Unsorted Bin Leak

在介绍 Unsorted Bin Attack 之前,我们先介绍一下如何使用 Unsorted Bin 进行 Leak。这其实是一个小 trick,许多题中都会用到。

Unsorted Bin 的结构

Unsorted Bin 在管理时为循环双向链表,若 Unsorted Bin 中有三个 bin,那么该链表结构如下

image-20240522170755052

在申请到Unsorted Bin后可以想办法输出chunk的内容,这样就可以泄露main_arena的一个地址,通过计算就可以得到libc的基地址了。

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
unsorted_chunks (av)->bk = bck
bck->fd = unsorted_chunks (av)//此时fd中存放的是main_arena的地址
//

这里一行代码一行代码进行解释

victim = unsorted_chunks (av)->bk

unsorted_chunks (av)->bk其实就是chunk3,所以此时victim就是chunk3

bck = victim->bk

此时bck就是chunk3的bk值

unsorted_chunks (av)->bk = bck

如果我们没有修改chunk3的bk值,这一步其实就是让unsorted_chunks (av)->bk指向chunk2,如果我们修改了chunk3的bk值,这里就是指向了我们修改的target_addr了,unsortedbin attack之后不能在遍历`unsorted bin链了,因为此时的main_arena的bk已经被我们改为target_addr,av->bk索引到的地址是一般是无法绕过check的。

bck->fd = unsorted_chunks (av)

这里的bck->fd其实就是chunk3->bk->fd,正常情况下这步是将unsorted_chunks (av)写入chunk2的fd,如果我们修改了chunk3的bk的话,这里就会将unsorted_chunks (av)写入chunk3->bk->fd(也就是chunk3->bk+0x10)的位置,所以这里一般会写_IO_list_all-0x10来进行劫持。

换而言之,如果我们控制了 bk 的值,我们就能将 unsorted_chunks (av) 写到任意地址。

几乎全部都是抄的ctf-wiki,学到很多,记录在此供自己日后再次学习。

参考文章:https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/unsorted-bin-attack/

posted @   山西小嫦娥  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示