unsorted bin attack

14 篇文章 1 订阅

0x01 unsorted bin

基本来源

  1. 当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。
  2. 释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。
  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 中。

0x02 unsorted bin attack原理

源码在glibc2.23 /malloc/malloc.c:3515中,当将一个 unsorted bin 取出的时候,会将 bck->fd 的位置写入本 Unsorted Bin 的位置。如果能控制bk的值,就能能将unsorted_chunks(av)写入到任意地址。将某个位置写入一个大数。

/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);

如果将chunk1的bk覆盖为G_ptr-0x10,当chunk1被取下的时候

  1. *G_ptr将会被重新赋值为chunk1->fd
  2. main_arena_unsortedbin->bk=&G_ptr-0x10
    在这里插入图片描述

简单示例

程序是在ubuntu1604的系统中编译(没有tcache)。

  1. 申请0x80,0x10(防止和topchunk合并)两个堆块
  2. 释放0x80的堆块进入unsorted bin
  3. 修改bk为&ptr-0x10
  4. 重新申请0x80大小的堆块
  5. 此时ptr的内容已经被修改了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
  char *ptr1=NULL,*ptr2,*ptr3;
  ptr2 = malloc(0x80);
  malloc(0x10);
  free(ptr2);
  ((void**)ptr2)[1]=&ptr1-2;
  fprintf(stderr,"ptr1:%p\n",ptr1);
  malloc(0x80);
  fprintf(stderr,"ptr1:%p\n",ptr1);
  return 0;
}

在这里插入图片描述

0x03 总结

利用流程

  • Unsorted Bin Attack
    利用 unsorted bin attack ,修改 global_max_fast 全局变量,由于 global_max_fast 变量为控制最大的 Fast chunk 的大小,将这里改写为 unsorted bin 的地址 (一般来说是一个很大的正数),就能使之后的 chunk 都被当作 fast chunk,即可进行 Fast bin attack。
  • Fast Bin Attack
快速块(fast bin)、小型块(small bin)、未排序块(unsorted bin)和大型块(large bin)是堆管理中不同的内存块分类。它们有一些区别和共同点,如下所示: 区别: 1. 大小范围:快速块是一组固定大小的小块,通常用于快速分配和释放小型对象;小型块是一组尺寸逐渐增大的内存块,用于中等大小的对象;未排序块是不同尺寸的内存块,用于中等和大型对象;大型块是较大的内存块,通常用于分配较大的对象。 2. 管理方式:快速块和小型块使用特定的数据结构(如双向链表或位图)来管理内存块;未排序块和大型块使用不同的数据结构(如双向链表)来管理内存块。 3. 分配策略:快速块通常通过简单的指针移动来分配和释放内存块,具有较低的开销;小型块和未排序块通常采用更复杂的算法来选择合适的内存块进行分配和释放;大型块通常通过系统调用来分配和释放内存。 共同点: 1. 都是用于管理堆中的内存块,以支持动态内存分配和释放操作。 2. 都涉及内存块的分配、释放和管理,以提高内存使用效率和减少碎片。 3. 都使用特定的数据结构来组织和管理内存块,以便快速查找可用的内存块。 这些块分类是堆管理中常见的策略,旨在根据对象的大小和使用模式来优化内存分配和释放的性能。具体的实现可能会因不同的堆管理算法而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值