堆的理解

作者: y4ngyy | 来源:发表于2018-12-16 17:45 被阅读33次

参考hac师傅的博客CTF-wiki自己总结一下。理解有误,请多指正。

堆块概念

堆为程序运行时可以由程序动态申请的线性内存区域,由低地址向高地址增长(栈为从高到低),在C语言中可以通过mallocfree进行堆块申请和释放操作。

堆块机制

堆分配中以chunk为单位,其中chunk的数据结构如下:

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;
};

prev_size:当前一个堆块为free状态时,存放前一个堆块的大小。在前一个堆块不处于空闲状态时,数据为前一个堆块中用户写入的数据,本字段不计入chunk的大小计算。
size:本堆块的大小,计算方法为size字段(32位为4|64位为8)+用户申请的大小+对齐,32位下对8对齐,64位下对16对齐。且chunk地址的偏移为相邻上一个chunk的地址+上一个chunk的size。在pwndbg中调试好像会加上一位PREV_INUSE
fb&bk:当chunk为free的状态时,分别指向chunk所在单向链表中的前一个chunk和后一个chunk。在被分配状态时,均用来存储数据,fb为存储数据的开始位置。
fb_nextsize&bk_nextsize:在被分配状态时也用来存储数据,在free状态时只在large bin中用到,目前没有用,等用到了再总结。

堆块分配机制

Bins

A bin is a list (doubly or singly linked list) of free (non-allocated) chunks.

bin为一个单向或者双向链表存放空闲的chunk,下一次分配时,若bin中有大小合适的chunk会直接分配出去。bin由存放其中的chunk大小分类为fastbinsmallbinlargebin
比较常用的是fastbin,在32位系统下fastbin主要存储0-80字节的chunk,在64位系统下存储0-160字节的chunk。
其中还有一个unsorted bin,是当small chunklarge chunkfree掉之后,不会直接进入smallbin或largebin,而是会先进入unsortedbin

arena

个人理解arena为chunk的存储组织形式,在arena的最上层始终为Top chunk,向下分出用户chunk,其中主线程中的arena为main arena。

top chunk

top chunk为arena的边界,当bin中无合适的chunk分配时,会将top chunk分出一部分进行分配。
当与top chunk相邻的chunk处于free状态时,该chunk不会进入bin中,而是会合并入top chunk。

相关文章

  • 堆的理解

    参考hac师傅的博客和CTF-wiki自己总结一下。理解有误,请多指正。 堆块概念 堆为程序运行时可以由程序动态申...

  • 对”堆”的理解

    对”堆”的理解 向下调整 向上调整堆是一种特殊的完全二叉树,至于什么是完全二叉树自己搜吧,这里就不讲了,看图:堆的...

  • 理解托管堆

    原文链接:https://docs.unity3d.com/Manual/BestPracticeUndersta...

  • 什么是堆排序

    阅读原文 理解堆排,首先要理解二叉堆。理解了二叉堆的“下沉”操作,基本上就可以理解堆排了。今天我们来看一看什么是堆...

  • 堆和栈的理解

    一、预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)― 由编...

  • Js堆棧理解

    栈(stack) 自动分配的内存空间,它由系统自动释放; 堆(heap) 动态分配的内存,大小不定也不会自动释放。...

  • 理解glibc的堆管理策略

    说明:CTF的pwn题很多与malloc()与free()有关这关系到系统堆管理策略的实现这一节主要讨论主流的堆管...

  • iOS堆和栈的理解

    操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“...

  • 对堆和栈的理解

    对堆和栈的理解 管理方式:对于栈来讲,是由编译器自动管理,而堆是由我们手动控制,容易产生内存泄漏 申请大小:栈:是...

  • 堆、栈、队列简单理解

    堆 堆通常是一个可以被看作一棵树的数组对象,堆总是满足以下两个性质:1、堆中某个节点的值总是不大于或不小于其父节点...

网友评论

    本文标题:堆的理解

    本文链接:https://www.haomeiwen.com/subject/tbexkqtx.html