pwn-堆入门

目录

堆概述

一、堆管理器是什么?

二、堆管理的操作步骤

三、bin分类


堆概述

 在动态链接的程序中,会分配一段动态的内存区域,控制动态内存的便是堆。堆的本质是程序虚拟地址空间的一块连着的线性区域,它由低地址往高地址增长。管理堆本身的,叫做堆的管理器。





一、堆管理器是什么?

堆管理器位于内核与程序之间(既不是内核管理,也不是程序本身进行管理,存在的意义在于:如果使内核直接对用户态进行内初处理,每次会保存大量的状态值,造成资源的浪费,所以利用堆管理器来进行内存的取用),功能包含:

1.响应用户的内存申请   2.管理用户释放的内存

在现行linux中:      glibc 的堆分配器:ptmalloc2,通过 malloc/free 来分配和释放内存块

不同的线程维护的堆(理解为子线程)称为:per thread arena

主线程创建的堆称为:main_arena

chunk:堆的最小的操作单元

bin:管理被free的chunk

二、堆管理的操作步骤

1)程序的执行中,首先先进行堆的创建,即主函数分配堆内存,此时:

由sbrk()创建main_arena               --->main_status包含arena本身的信息,如堆状态、bin,注意main_arena的main_status保存在libc全局变量中,一般此时生成 top chunk

2)子线程开始进行堆创建时分配堆内存时:

由mmap()创建per thread arena            --->main_status包含在per thread arena本身

3)chunk过程:

chunk本身属于堆的最小操作单元,可以把堆看成一块一块的存在,然后每次对堆的调用都是对chunk的操作,chunk分三类:allocate chunk              free chunk                  top chunk

chunk结构:

/*
  This struct declaration is misleading (but accurate and necessary).
  It declares a "view" into memory allowing access to necessary
  fields at known offsets from a given base. See explanation below.
*/
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;
};

top chunk最开始在sbrk()生成后,每一次malloc申请时,top chunk转化一部分给出生成malloc chunk,malloc chunk占用满top chunk时会再次调用sbrk(),而在正常的释放堆过程中,会将chunk释放,被释放的chunk通过bin以链表的形式进行管理。如下图所示:

在上图被free的chunk B会由Bin来开始管理,可以将Bin视为空闲chunk管理器,一有chunk就收集,程序需要chunk时会从bin中调取合适的chunk,bin整体是一个单/双链表结构。

三、bin分类

 根据空闲的 chunk 的大小以及使用状态将 chunk 初步分为 4 类:fast bins,small bins,large bins,unsorted bin。

对于 small bins,large bins,unsorted bin 来说,ptmalloc 将它们维护在同一个数组中。这些 bin 对应的数据结构在 malloc_state 中,如下

#define NBINS 128
/* Normal bins packed as described above */
mchunkptr bins[ NBINS * 2 - 2 ];

一般而言,较小的chunk作为 fast bin,对应的变量就是 malloc state 中的 fastbinsY

bins中的bin[1]:unsorted bin   bin[2_63]:small bins    bin[64_126]:large bins

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值