PWN 堆入门
2021-08-01 本文已影响0人
佩玖吟
什么是堆
堆(chunk)内存是一种允许程序在运行过程中动态分配和使用的内存区域。相比于栈内存和全局内存,堆内存没有固定的生命周期和固定的内存区域,程序可以动态地申请和释放不同大小的内存。被分配后,如果没有进行明确的释放操作,该堆内存区域都是一直有效的。

基本思想
申请堆块
- 从堆空间中按顺序分配堆块给用户
- 尝试从释放的堆块中获取
释放堆块
- 将释放的堆块组织成链表(bins)
- 两个相邻的堆块均释放时,进行合并
由malloc申请的内存称为chunk,是glibc管理内存的基本单位。为了高效地分配内存并尽量避免内存碎片,Ptmalloc2 将大小不同的 free chunk 分为不同的 bin 结构
- allocated chunk (metadata + user memory)
- free chunk
- fast bin
- small bin
- unsorted bin
- large bin
-
top chunk
image.png
堆块的基本单位——malloc_chunk
image.png
free chunk
chunk被释放时,glibc会将他们重新组织起来构成不同的bin链表,当用户重新申请时,就从中寻找合适的chunk返回用户。
Fast bin
- 程序申请和释放的堆块往往比较小
- 管理对象
小堆块(0x20-0x80) - 管理策略
- 不会进行合并操作(PREV_INUSE永远为1)
- 单链表(使用fd指针)
- 后进先出
- 同一个fast bin里面的chunk大小都相同
Unsorted bin
- 一个被释放的 chunk 往往很快就会被重新使用
- 管理对象
一定大小的chunk被释放时,在进入small/large bin之前,会先进入unsorted bin。 - 管理策略
- 双链表(占用两个bins的元素)
- 先进先出
- 大小可以不同