堆结构

runwu2204 Lv6

free后的堆块管理根据不同情况使用不同的bin链

堆漏洞挖掘中的bins分类(fastbin、unsorted bin、small bin、large bin)-CSDN博客

已经申请的堆结构类似于下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct chunk
{
size_t prev_size;
union
{
size_t size;//注意16字节对齐
union
{
int flag:3;
struct
{
bool PREV_INUSE:1;//如果前面一个chunk处于分配状态,那么此位为1。一般来说,堆中第一个被分配的内存块的 size 字段的 P 位都会被设置为 1,以便于防止访问前面的非法内存。当一个chunk 的size 的P位为0时,我们能通过 prev_size 字段来获取上一个 chunk 的大小以及地址。这也方便进行空闲chunk之间的合并
bool IS_MAPPED:1;//记录当前chunk是否是由mmap分配的
bool NON_MAIN_AREA:1;//记录当前 chunk 是否不属于主线程
};
};
};
union
{
char data[size&0xFFFFFFF8]//只取高29位
}
};

而其中char data[size&0xFFFFFFF8]部分的第一个size_t大小个字节用于fd,第二个size_t大小个字节用于bk在已经分配的情况下,这两个指针无意义可直接被数据覆盖

已经free掉的则为

1
2
3
4
5
6
7
struct chunk
{
//具体定义根据对应堆类型决定
size_t fd;//指向下一个堆块
size_t bk;//指向上一个堆块

};

这些chunk由链表串联,这一系列相同大小的称为bin

例如xxbin[0x20]–>chunk1–>chunk2 (其实是循环链表)

Tcache bin

tcache bin 是在后续glibc版本中使用的(libc2.26)

Unsorted bin

  • 标题: 堆结构
  • 作者: runwu2204
  • 创建于 : 2024-06-08 17:02:22
  • 更新于 : 2024-10-27 23:03:47
  • 链接: https://runwu2204.github.io/2024/06/08/Pwn/linux/heap/堆结构/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
堆结构