PWN 堆入门

什么是堆

堆(chunk)内存是一种允许程序在运行过程中动态分配和使用的内存区域。相比于栈内存和全局内存,堆内存没有固定的生命周期和固定的内存区域,程序可以动态地申请和释放不同大小的内存。被分配后,如果没有进行明确的释放操作,该堆内存区域都是一直有效的。


image.png

基本思想

申请堆块

  • 从堆空间中按顺序分配堆块给用户
  • 尝试从释放的堆块中获取

释放堆块

  • 将释放的堆块组织成链表(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的元素)
    • 先进先出
    • 大小可以不同
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容