CTF-PWN程序员

理解glibc的堆管理策略

2017-08-06  本文已影响500人  91a96ee9d8f9

说明:CTF的pwn题很多与malloc()与free()有关
这关系到系统堆管理策略的实现
这一节主要讨论主流的堆管理策略glibc在系统中的结构和一些基本概念
本文主要是一篇国外写的挺好的介绍堆的博客的翻译+读书笔记,建议可以读一读
原文地址:https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/
以后会深入学习堆管理策略的实现和堆机制漏洞攻击的方法
最后推荐一个在线画结构图、流程图、思维导图的网站:https://www.processon.com

历史沿革

常常用到的堆管理策略主要有以下几种

ptmalloc2最初由dlmalloc修改而来,后来ptmalloc2加入了多线程机制的支持,从此与dlmalloc渐渐区分开来,现在是linux的默认内存管理策略。
dlmalloc为多个线程维护一个堆,多个线程调用malloc时只能依次执行。ptmalloc为每个线程分配一个arena,在各个线程专属的arena中进行堆管理,因此可以同时处理多个线程的malloc调用,该机制称为Per Thread Arena

实现细节

调用的系统函数

  1. brk:改变程序退出的节点地址所在,一般情况下,程序退出节点位于数据段末尾后内存,但是堆管理过程需要在数据段后附加新数据(堆),因此调用系统函数brk()增加内存空间
  2. mmap:与brk直接粗暴的改变程序退出节点不同,mmap用来添加新的映射到其余的内存地址中,堆管理在映射到的内存地址中进行

malloc()

  1. 调用malloc后,会根据情况调用brk和mmap两个系统函数创建堆
  1. 堆会维护一个freelist(glibc里面称为bin)来对堆中未被使用的内存地址进行记录,如果在同一个arena中请求堆,先检查bin中是否有free的堆地址,如果堆不够用时,才会向内核请求增加arena的内存大小

free()

调用free()函数并不会将malloc()分配的内存释放掉,仅仅是将free的内存地址加入bin,在下一次malloc的时候可以使用

堆结构

堆结构分为三层:arena、heap、chunk
这里绘制了一副图表明堆,类似的这样的图网上还有很多

arena

  1. arena的个数有上限,通常为CPU核心的个数2(32位系统)8(64位系统),如果超过了这一上限,则内核可能将多个线程的堆映射到一个arena
  2. 一个arena可以维护多个堆,但是只维护一个malloc_state(即Arena Header)
只有一个堆的内存地址

当当前堆内存地址空间不足时,调用mmap()在内存空间中映射一个新的堆出来,映射出来后的结果如下

heap

  1. 如果一个arena维护了多个堆,每个堆需要维护一个heap_info(即Heap Header)。但main arena是例外,因为他不需要调用mmap,只需要往后增加内存大小就可以,他只用维护一个堆就好
  2. main heap

chunk

chunk是堆中分出的数据块,每个chunk是一个连续的内存地址,用来存放比如数组等程序运行时的数据
chunk分为四种类型

1. allocated chunk

被分配了的在使用中的chunk

image.png

2. free chunk

记录在bin中未被使用的chunk。两个chunk不能是地址连续的,否则会被合并掉
除了allocated chunk中记录的数据外,free chunk还记录了一些指针指向bin中记录的上一个/下一个free chunk的地址

bin

bin即freelist,维护一个记录freechunk地址的列表,根据free chunk的大小不同分为4种chunk

  1. bins数组用于记录Small bin、Large bin、Unsorted bin。fastbinsY记录fast bin,共包含10个bin。bins数组包含共126个bin,第1个bin记录unsorted chunks,Bin 2-63是Small bin,Bin 64-126是Large bin
  2. fast bins:
  1. unsorted bins:
  1. small bins:
  1. large bins:

3. Top Chunk

堆中最高地址处的chunk,不属于任何bin,当最大的chunk都不能满足用户的需求时,调用此处chunk,如果还不够,则调用系统函数增加top chunk

4. Last Remainder Chunk

unsorted bin中存放的最后一个没有被使用的chunk

上一篇 下一篇

猜你喜欢

热点阅读