一、什么是堆

  • 在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。
  • 堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。
  • 我们一般成管理堆的那部分程序为堆管理器。
  • 堆管理器处于用户程序与内核中间,主要做以下工作:
    • malloc。
    • free。

二、堆的历史

  • Linux早期的堆分配与回收由Doug Lea实现,但它在并行处理多个线程时,会共享进程的堆内存空间。因此,为了安全性,一个线程使用堆时,会进行加锁。然而,与此同时,加锁会导致其它线程无法使用堆,降低了内存分配与回收的高效性。同时,如果在多线程使用时,没能正确控制,也可能引起内存分配和回收的正确性。
  • Wolfram Gloger在Doug Lea的基础上进行改进使其可以支持多线程,这个堆分配器就是ptmalloc。在globc-2.3.x之后,glibc中继承了ptmalloc2。
  • 目前Linux标准发行版中使用的堆分配器是glibc中的堆分配器:ptmalloc2。ptmalloc2主要是通过malloc/free函数来分配和释放内存块。

三、malloc和free函数

malloc函数

void *malloc(size_t n);
  • 该函数返回对应大小字节的内存块的指针。
  • 此外,该函数还对一些异常情况进行了处理。
  • 当n=0时,返回当前系统允许的堆的最小内存块。
  • 当n为负数时,由于在大多数系统中,size_t是无符号数,所以程序就会申请很大的内存空间,但通常来说都会失败,因为系统没有那么多的内存可以分配。

free函数

void free(void *p);
  • 该函数会释放由p所指向的内存块。这个内存块有可能是通过malloc函数得到的,也有可能是通过相关的函数realloc得到的。
  • 该函数还对异常情况进行了一下处理:
    • 当p为空指针时,函数不执行任何操作。
    • 当p已经被释放之后,再次释放会出现错误的效果,这其实就是double free。
    • 除了被禁用(mallocpt)的情况下,当释放很大的内存空间时,程序会将这些内存空间还给系统,以便减小程序所使用的内存空间。

四、什么是Arena

  • 堆的glibc实现主要包括struct _heap_info,struct malloc_state,struct malloc_chunk这3个结构体。
  • 在介绍结构体之前需要介绍一下非常重要的arena(竞技场)。
  • 我们知道一个线程申请的1个/多个堆包含很多的信息:二进制位信息,多个malloc_chunk信息等这些堆需要东西来进行管理,那么Arena就是来管理线程中的这些堆的。

五、Arena的特性

  • 一个线程只有一个arnea,并且这些线程的arnea都是独立的不是相同的。
  • 主线程的arnea称为“main_arena”。子线程的arnea称为“thread_arena”。

六、Arena的数量限制与多线程管理

  • 每个程序中arnea的数量是有限制的,因为过多的线程也不会产生过多的arnea,而是由以下规则制定的:
32位系统中:Number of arena = 2 * number of cores + 1.
64位系统中:Number of arena = 8 * number of cores + 1

从上面的公式可以知道,当线程数量超出系统可以提供的arnea数量时,就需要一些在概念上类似于在Linux的中锁的机制来实现线程对不同arnea的共享,下面进行举例:

演示案例

  • 一台只含有一个处理器核心的PC机安装有32位操作系统,其上运行了一个多线程应用程序,共含有4个线程 - 主线程和三个用户线程显然线程个数大于系统能维护的最大竞技场个数(2 *核心数+ 1 = 3),那么此时glibc malloc就需要确保这4个线程能够正确地共享这3个竞技场。
  • 第一步:当主线程首次调用malloc的时候,glibc malloc会直接为它分配一个主竞技场,不发生其他操作。
  • 第二步:当用户线程1和用户线程2首次调用malloc的时候,glibc malloc会分别为每个用户线程创建一个新的线程竞技场。此时,各个线程与arena是一一对应的。
  • 第三步:当用户线程3调用malloc的时候,就出现问题了。因为此时glibc malloc能维护的arena个数已经达到上限,无法再为线程3分配新的arena了,那么就需要重复使用已经分配好的3个竞技场中的一个(主竞技场,竞技场1或者竞技场2)。
  • 此时glibc malloc会做以下操作:
    • 首先,glibc malloc循环遍历所有可用的竞技场,在遍历的过程中,它会尝试锁该竞技场。如果成功锁(该竞技场当前对应的线程并未使用堆内存则表示可锁),那么该竞技场就可以被线程3所使用。
    • 而如果没能找到可用的舞台上,那么就将线程3的malloc的操作阻塞,直到有可用的舞台为止。
    • 当线程3的malloc阻塞解除时,glibc malloc就会先尝试使用最近访问的竞技场(此时为主竞技场)。如果此时主竞技场可用的话,就直接使用,否则就将线程3再次阻塞,直到主舞台上再次可用为止。
  • 其他情况以此类推。

七、struct malloc_state(Arena的实现)

struct malloc_state
{/* Serialize access.  */__libc_lock_define (, mutex);/* Flags (formerly in max_fast).  */int flags;/* Set if the fastbin chunks contain recently inserted free blocks.  *//* Note this is a bool but not all targets support atomics on booleans.  */int have_fastchunks;/* Fastbins */mfastbinptr fastbinsY[NFASTBINS];/* Base of the topmost chunk -- not otherwise kept in a bin */mchunkptr top;/* The remainder from the most recent split of a small request */mchunkptr last_remainder;/* Normal bins packed as described above */mchunkptr bins[NBINS * 2 - 2];/* Bitmap of bins */unsigned int binmap[BINMAPSIZE];/* Linked list */struct malloc_state *next;/* Linked list for free arenas.  Access to this field is serializedby free_list_lock in arena.c.  */struct malloc_state *next_free;/* Number of threads attached to this arena.  0 if the arena is onthe free list.  Access to this field is serialized byfree_list_lock in arena.c.  */INTERNAL_SIZE_T attached_threads;/* Memory allocated from the system in this arena.  */INTERNAL_SIZE_T system_mem;INTERNAL_SIZE_T max_system_mem;
}; 
  • glibc的中arnea就是用这个结构体表示的。
  • 其中包含很多的信息:各种bins的信息,top chunk以及最后一个剩余chunk等。
  • bins数组为什么是NBINS*2-2个大小,见文章:https://blog.csdn.net/qq_41453285/article/details/97613588。

成员介绍

  • last_remainder:当次arena中产生last_remainder时,此成员被初始化,并且指向arnea中的last_remainder。
  • fastbinsY数组:存储的是该领域管理的fastbins。
  • bins数组:存储的是该领域管理的smallbins,unsortedbin,largebins。
  • binmap变量:系统查看有哪些垃圾箱链中有块时,不可能去fastbinsY和箱数组一个一个的遍历通过binmap变量,采用二进制存储,将二进制位与数组的索引相对,系统查找箱链时可以。通过按位与来查询,这样更高效。虽然unsigned int的二进制位比数组总元素少,但是系统不会有那么多的bin链,不需要考虑这个问题。

八、struct _heap_info(堆信息结构体)

  • 我们知道一个线程可以包含多个堆段,这些堆段同属于一个舞台来管理。每个堆段的信息就是用这个结构体来表示的。
  • 注意:这个不是存储堆块的数据,而是来解释说明这个堆段的。
typedef struct _heap_info
{mstate ar_ptr;            /* Arena for this heap. */struct _heap_info *prev;  /* Previous heap. */size_t size;              /* Current size in bytes. */size_t mprotect_size;     /* Size in bytes that has been mprotectedPROT_READ|PROT_WRITE.  *//* Make sure the following data is properly aligned, particularlythat sizeof (heap_info) + 2 * SIZE_SZ is a multiple ofMALLOC_ALIGNMENT. */char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK];
} heap_info;

相关成员

  • ar_ptr:此堆段归属于哪一个arnea管理。
  • prev:前一个堆段。

九、struct malloc_chunk

  • 一个堆块被分为多个块,这些块就是用这些结构体表示的,这个才是我们在glibc的正真存储堆数据信息的结构体。
  • 结构体详细简介,见文章:https://blog.csdn.net/qq_41453285/article/details/97135257。
struct malloc_chunk {INTERNAL_SIZE_T      mchunk_prev_size;  /* Size of previous chunk (if free).*/INTERNAL_SIZE_T      mchunk_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;};

十、Main_arena与堆的宏观结构图

  • 注意:主竞技场没有多个堆,因此没有heap_info结构。当主竞技场所指向的堆内存不足时,sbrk的堆段被扩展(连续区域),直到它碰到内存映射段。
  • 不同于主题竞技场主竞技场的竞技场标题并不是sbrk heap segment 的一部分,而是一个全局变量!因此它属于libc.so 的数据段。
  • 可以看到main arena的顶级成员指向堆块的malloc_chunk结构体。
  • 因为主竞技场没有多个堆,所以没有heap_info结构体。

十一、Thead_arena与堆的宏观结构图

当一个线程只有一个堆段时

可以看到该图被分为3部分:

  • heap_info:表示该堆段的信息,并且该结构体的ar_ptr成员指针指向于该堆段所属的thread arena。
  • malloc_state:该堆段的竞技场并且顶部指向于最顶端的个malloc_chunk。
  • chunk块:就是该堆段所存储的区域。

当一个线程含有多个堆段时

相对于一个堆段,做了如下改变:

  • heap_info:因为有两个堆段,所以每个堆段都有自己的heap_info并且两个堆段在内存中不是物理相邻的,因此第二个heap_info的上一个指针指向于第一个heap_info的ar_ptr成员,而第一个heap_info结构体的ar_ptr成员指向了malloc_state,这样就构成了一个单链表,方便后续管理。
  • malloc_state:虽然有多个堆段,但是只有一个arena。


  • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

什么是堆漏洞挖掘?堆的glibc实现、Arena(main_arena、thread_arena)相关推荐

  1. 堆漏洞挖掘——fastbin attack漏洞

    一.核心思想 通过fastbins链的管理,达到目标地址(target)读写. 二.原理图解 fastbin存储freechunk的单链表结构: fastbins是如何存取fastchunk的,见文章 ...

  2. 堆漏洞挖掘——__lib_malloc函数、_int_malloc函数、__lib_free函数源码详解

    一._lib_malloc函数介绍 当我们在应用层调用malloc申请堆的时候,在glibc中实际上调用的是_lib_malloc函数,但是_lib_malloc函数只是用来简单的封装_int_mal ...

  3. 堆漏洞挖掘:19---_lib_malloc函数源码详解

    一._lib_malloc函数介绍 当我们在应用层调用malloc申请堆的时候,在glibc中实际上调用的是_lib_malloc函数,但是_lib_malloc函数只是用来简单的封装_int_mal ...

  4. IOT漏洞挖掘学习笔记(一)——堆基础及相关数据结构

    1.CTF介绍 线上赛:答题模式 线下赛:AWD(攻防模式)RealWorld(展示模式) 主要考查漏洞挖掘与利用能力 二进制安全:栈溢出栈溢出的防护绕过堆溢出堆溢出漏洞格式化字符串IOFILERAC ...

  5. ie 打开后端发过来的pdf_某办公软件PDF阅读器漏洞挖掘及Crash分析

    摘要 本文主要讲述如何利用winafl对***pdf阅读器程序进行漏洞挖掘的过程. 准备 winafl.DynamoRIO ***pdf(11.6.0.8537)32位 测试环境:win7 32位.4 ...

  6. 二进制漏洞挖掘_漏洞挖掘的艺术-面向二进制的静态漏洞挖掘

    本文首发于"合天智汇"公众号 作者: 萌新 0 本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍与分析. 面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构 ...

  7. 漏洞挖掘——实验3 Race_Condition

    漏洞挖掘前言 题目 lab Race_Condition pre 1.查看这段代码的执行结果,解释%.20d和%hn的含义. main() {int num=0x41414141;printf(&qu ...

  8. 漏洞挖掘——实验12 Cross-Site Scripting (XSS) Attack Lab

    漏洞挖掘前言 题目 Lab Cross-Site Scripting (XSS) Attack Lab Pre 1.名词解释:double free,UAF (Use After Free),RELR ...

  9. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

最新文章

  1. Spark源码阅读04-Spark运行架构之Standalone运行模式
  2. nginx+tomcat的负载均衡
  3. NodeJs基础之字节操作、路径操作和文本操作
  4. Metasploit入门用法(主动攻击)
  5. 面向.Net程序员的dump分析
  6. 【思科百难】RIP两个版本之间能够相互通信?
  7. data access components 2.0未响应_Vue2.x 源码剖析之响应式原理
  8. matlab2012 powerlib,matlab没有powerlib2
  9. (11)数据分析-TableOne工具
  10. Ubuntu 安装配置 ROR3
  11. 折线图x轴的日期会超出_折线图技巧丨阈限颜色设置
  12. VFP用Foxjson玩转JSON,超简单的教程
  13. DTCC 2018大会归来
  14. win10/11: Windows Audio无法启动 错误 0x80070005:拒绝访问
  15. javascript趣味钢琴小游戏(附源码)js+css+html
  16. 电大形考作业c语言答案,题目精编国家开放大学电大《管理信息系统》形考网络课作业1-4试题及答案...
  17. gitbook看电子书
  18. 最新研究进展|肠道微生物组在改善抗癌治疗效果方面的强大作用
  19. 电脑重启后自带键盘失灵而外接键盘有用的一种情况
  20. 信息学奥赛一本通 题解目录

热门文章

  1. win10+vs2017配置mpi环境的记录(已成功)
  2. Windows服务器双网卡绑定的方法(HP/Broadcom网卡)
  3. 利用Excel删除csv文件中所有空行
  4. Redis学习(1)——下载与配置[转]
  5. python 获取计算机的网卡信息
  6. 状压搜索 Circling Round Treasures:CodeForces - 375C
  7. 图像处理--鱼眼图像
  8. 学习Excel一定要精通VBA才是高手吗?
  9. 知识图谱入门 【九】- 知识问答
  10. 计算机内存坏了是什么反应,电脑内存坏了会出现什么现象