[pwn] 8.堆基础

堆和堆管理器

是内存中一块连续的空间,由堆管理器管理。
堆管理器不是由操作系统实现,是在libc中实现的。其中封装了一些系统调用来管理申请来的内存,同时为用户提供接口。

主要使用两个系统调用:brk(break),mmap(memory map)
主线程可以用brk和mmap,子线程只能用mmap。
其次如果主线程申请的空间较大的话,也需要用mmap。

arena

arena(内存分配区)
可以理解为堆管理器所持有的内存池
堆管理器与用户的内存交易发生在arena中

当线程比较少的时候,每个线程可以拥有自己的arena,
而当 arena 数目超过允许最大值时,多个线程共享一个arena。

chunk

chunk是用户申请内存的基本单位,也是堆管理器管理内存的基本单位
malloc函数返回的指针就指向一个chunk的数据区域

chunk的数据结构

struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */
 
  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;
 
  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;

malloc chunk

32位系统通过malloc申请内存的chunk如下图

请添加图片描述

p=0时,表示前一个chunk为空闲,prev_size才有效。
p=1时,表示前一个chunk正在使用,prev_size无效 p主要用于内存块的合并操作。

free chunk

请添加图片描述

bin

管理arena中空闲chunk的结构
以数组的形式存在,数组元素为相应大小的chunk链表的链表头,
存在于arena的malloc_state中

主要分为unsorted binfast binssmall binslarge bins

fastbins

存储于fastbinsY[]
单向列表后进先出
32位下默认管理16\24\32\40\48\56\64字节的free chunk
其中的chunk的p位(相邻下一个chunk的p位)一定是1
因为fastbin单独记录,需要让其他bins认为是被用的,不会被合并

unsorted bin

bins[1]
管理刚刚释放的还未被分类的chunk

small bins

bins[2]~bins[63]
32个循环双向链表
先进先出
32位下默认管理16\24\32\40…\504字节的free chunk
每个链表中存储的chunk大小都一致

large bins

bins[64]~bins[126]
63个循环双向链表
先进先出
32位下管理大于504字节的free chunk


注意只有fastbins是单向链表

fastbins结构

请添加图片描述

bin的双向链表结构

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H4ppyD0g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值