pwn学习总结(四)—— 堆基础知识(持续更新)

  • 前言
  • chunk
    • 使用中(分配后)
    • 空闲中(释放后)
    • 堆块大小
    • 空间复用
  • bins
    • fastbin
    • unsorted bin
    • small bin

前言

学习自《glibc内存管理ptmalloc源代码分析》庄明强 著
部分资料参考自互联网

chunk

描述

  1. 当用户通过malloc等函数申请空间时,实际上是从堆中分配内存
  2. 目前 Linux 标准发行版中使用的是 glibc 中的堆分配器ptmalloc2
  3. ptmalloc根据用户的需要,为用户分配不同类型的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;
};

使用中(分配后)


chunk start:chunk的起始地址
previous size

  1. 上一个chunk的大小,32位占4字节,64位占8字节
  2. 只有当上一个chunk处于空闲状态时才有效

size

  1. 当前chunk的大小,32位占4字节,64位占8字节
  2. 后三个比特位为A|M|P标志位,分别代表不同含义
    A:为0表示该chunk属于主分配区,为1表示该chunk属于非主分配区
    M:表示当前chunk是从哪个内存区域获得的虚拟内存。为1表示该chunk是从mmap映射区域分配的,否则是从heap区域分配的
    P:为1表示前一个chunk正在使用中,当前chunk的prev_size无效,不能对前一个chunk进行任何操作。第一块heap总是将P设为1,以防止程序引用到不存在的区域

memory:malloc等函数返回给用户的chunk数据区指针

空闲中(释放后)

描述

  1. 空闲中的chunk不存在M状态,只有A|P状态
  2. user data头部被分配出两个成员,fd和bk

fd:指向前一个空闲chunk的起始地址,32位占4字节,64位占8字节
bk:指向后一个空闲chunk的起始地址,32位占4字节,64位占8字节

注意:事实上,释放后的large block中还存在另外两个成员:fd_nextsizebk_nextsize,后续再作介绍

堆块大小

32位程序

  1. 用户分配到的最小堆块大小为17Bprev_size(4B) + size(4B) + fd(4B) + bk(4B) + next_chunk->p(1B)
  2. 若用户申请的大小超过最小堆块大小,会与8B进行对齐

64位程序

  1. 用户分配到的最小堆块大小为33Bprev_size(8B) + size(8B) + fd(8B) + bk(8B) + next_chunk->p(1B)
  2. 若用户申请的大小超过最小堆块大小,会与16B进行对齐

空间复用

描述当一个 chunk 处于使用状态时,它的下一个 chunk 的 prev_size 无效。所以下一个 chunk 的 prev_size 也可以被当前 chunk 使用,这就是 chunk 的空间复用

bins

描述

  1. 用户free掉的内存并不是都会马上归还给系统,ptmalloc会统一管理heap和mmap映射区域中的空闲的chunk
  2. 当用户进行下一次分配请求时,ptmalloc会首先试图在空闲的chunk中挑选一块给用户,这样就避免了频繁的系统调用,降低了内存分配的开销
  3. ptmalloc将相似大小的chunk用双向链表链接起来,这样的一个链表被称为一个bin
  4. ptmalloc一共维护了128个bin,并使用一个数组来存储这些bin
  5. 堆管理器根据特点,将堆分为四种:fastbin | unsortedbin | smallbin | largebin
  6. 数组中bin 1为unsorted binbin 2到63为small binbin 64到126为large bin

fastbin

描述

  1. 在32位操作系统中,当用户释放的堆块大小小于64B时使用fastbin进行管理,即chunk空间最大为80字节
  2. fastbin只使用了fd成员,是个单链表结构
  3. fastbin不会对P位进行操作,也就是说它不会主动进行合并;只有在某些特定情况下,堆管理器才会对fastbin进行合并
  4. fastbinY为管理fastbin的数组,每个成员分别管理不同大小的fastbin链表,且均指向了当前链表的尾节点,当尾节点被分配时,通过其fd指针指向前一个结点
  5. 当用户申请chunk大小小于或等于MAX_FAST_SIZE时,优先从fastbins中查找相应的空闲块,且规则为LIFO(Last in, first out, 后进先出)

unsorted bin

描述

  1. 当释放较小或较大的chunk的时候,为了增加分配效率,系统会先将最近释放的chunk添加到unsorted bin中
  2. unsorted bin 为一个双向循环链表,对chunk的大小没有限制,即任何大小的chunk都可以放入unsorted bin链表中

small bin

描述

  1. 在32位操作系统中,当用户释放的堆块大小大于64B,小于等于512B时使用small bin进行管理
  2. small bin 为双向循环链表,且使用 FIFO(First in, first out, 先入先出) 算法
  3. 当满足small bin条件的chunk被释放后,会优先被放入unosrted bin,只有在一定情况下,才会被分配到small bin中
  4. 相邻的free chunk将会被合并成一个更大的fee chunk,增加内存利用率

pwn学习总结(四)—— 堆基础知识(持续更新)相关推荐

  1. [Python学习] 专题四.文件基础知识

            前面讲述了函数.语句和字符串的基础知识,该篇文章主要讲述文件的基础知识(与其他语言非常类似). 一. 文件的基本操作         文件是指存储在外部介质(如磁盘)上数据的集合.文件 ...

  2. jQuery学习总结之基础知识----持续更新中

    语法总结和注意事项 1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象 ...

  3. 前端使用Canvas绘图(基础知识)--持续更新中

    文章目录 前言 canvas文档 一.canvas代码提示(插件和注释) 1.1.使用插件方式(推荐这种方式) =>canvas-snippets 1.2.使用注释方式 二.初始canvas 2 ...

  4. linux基础知识(持续更新)

    文章目录 前言 Linux查看cpu相关信息,包括型号.主频.内核信息等 touch mkdir echo cat/tail grep egrep| ls sed tee cp scp 查看端口号占用 ...

  5. 前端基础知识(持续更新中)

    HTML Hyper Text Markup Language 超文本标记语言 1.html5为什么只需要写<! DOCTYPE HTML> 答:这是w3c制定的规则,是文档类型声明,语义 ...

  6. 210学习日记(18)_ARM基础知识

    210学习日记(18) --ARM基础知识 注意: 以下大部分类容都来自网上现成的(直接拷贝过来的,然后经整理)!!!! 问1:ARM处理器工作模式有几种?各种工作模式下分别有什么特点? 答1:ARM ...

  7. invader的java学习第四天基础篇

    invader的java学习第四天基础篇(持续更新中-) 一.类型转换 自动转换(数值之间在进行四则运算时,数据类型会自动向大类型靠拢) byte num=10; short a=num; Syste ...

  8. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  9. 汇编学习(1)——基础知识

    汇编学习(1)--基础知识 ---谨以此系列文章记录我的汇编学习.  关于汇编 说起汇编语言,那自然不得不想到机器语言,在汇编语言尚未诞生之际,程序猿们只能非常苦逼的敲着0和1,还要记住一大堆复杂难记 ...

最新文章

  1. Breakpad查C++崩溃问题
  2. 高效使用Bitmaps(二) 后台加载Bitmap
  3. 信息系统项目管理师优秀论文:沟通与干系人管理
  4. [ACM] hdu 1285 确定比赛名次 (拓扑排序)
  5. 适合 Kubernetes 初学者的一些实战练习(一)
  6. WebApiClient的JsonPatch局部更新
  7. node.js全局对象和全局变量
  8. Java基础结构语句和IDEA使用和数组
  9. 分子模拟的理论与实践_基于分子模拟的数据驱动发现流体力学宏观方程
  10. vue思维导图(这是我在b站老师下载资源里的讲课流程,用来复习和整体把握还不错)
  11. ERROR: libass not found using pkg-config2
  12. Xamarin ios 设置支持在PP助手、XY苹果助手上查看该应用下的文件
  13. bat生成exe总结
  14. greasemonkey油猴子初学过程中遇到的问题
  15. mysql er图注释_powerdesigner 生成mysql带注释的ER图
  16. 树莓派编译ch934x usb转多串口驱动
  17. excel自动换行_Excel如何自动换行?
  18. 计算广告之淘宝oCPC智能出价
  19. How to build openssl with fips module on Linux and Windows?
  20. 可编程并行通信接口8255A

热门文章

  1. ML之回归预测之BE:利用BE算法解决回归(实数值评分预测)问题—线性方法解决非线性问题
  2. Batch Normalization深入理解
  3. hibernate映射简单实例
  4. C语言博客作业05--指针
  5. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
  6. java基础----Runtime类的使用(一)
  7. 关于大小型项目如何最大限度提高WebAPi性能
  8. ecshop php5.4以上版本错误之preg_replace 替换成 preg_replace_callback
  9. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
  10. [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...