pwn学习总结(四)—— 堆基础知识(持续更新)
pwn学习总结(四)—— 堆基础知识(持续更新)
- 前言
- chunk
- 使用中(分配后)
- 空闲中(释放后)
- 堆块大小
- 空间复用
- bins
- fastbin
- unsorted bin
- small bin
前言
学习自《glibc内存管理ptmalloc源代码分析》庄明强 著
部分资料参考自互联网
chunk
描述:
- 当用户通过malloc等函数申请空间时,实际上是从堆中分配内存
- 目前 Linux 标准发行版中使用的是 glibc 中的堆分配器:ptmalloc2
- 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
:
- 上一个chunk的大小,32位占4字节,64位占8字节
- 只有当上一个chunk处于空闲状态时才有效
size
:
- 当前chunk的大小,32位占4字节,64位占8字节
- 后三个比特位为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数据区指针
空闲中(释放后)
描述:
- 空闲中的chunk不存在M状态,只有A|P状态
- user data头部被分配出两个成员,fd和bk
fd
:指向前一个空闲chunk的起始地址,32位占4字节,64位占8字节
bk
:指向后一个空闲chunk的起始地址,32位占4字节,64位占8字节
注意:事实上,释放后的large block中还存在另外两个成员:fd_nextsize和bk_nextsize,后续再作介绍
堆块大小
32位程序:
- 用户分配到的最小堆块大小为
17B
:prev_size(4B) + size(4B) + fd(4B) + bk(4B) + next_chunk->p(1B) - 若用户申请的大小超过最小堆块大小,会与8B进行对齐
64位程序:
- 用户分配到的最小堆块大小为
33B
:prev_size(8B) + size(8B) + fd(8B) + bk(8B) + next_chunk->p(1B) - 若用户申请的大小超过最小堆块大小,会与16B进行对齐
空间复用
描述:当一个 chunk 处于使用状态时,它的下一个 chunk 的 prev_size 无效。所以下一个 chunk 的 prev_size 也可以被当前 chunk 使用,这就是 chunk 的空间复用
bins
描述:
- 用户free掉的内存并不是都会马上归还给系统,ptmalloc会统一管理heap和mmap映射区域中的空闲的chunk
- 当用户进行下一次分配请求时,ptmalloc会首先试图在空闲的chunk中挑选一块给用户,这样就避免了频繁的系统调用,降低了内存分配的开销
- ptmalloc将相似大小的chunk用双向链表链接起来,这样的一个链表被称为一个bin
- ptmalloc一共维护了128个bin,并使用一个数组来存储这些bin
- 堆管理器根据特点,将堆分为四种:fastbin | unsortedbin | smallbin | largebin
- 数组中bin 1为unsorted bin;bin 2到63为small bin;bin 64到126为large bin
fastbin
描述:
- 在32位操作系统中,当用户释放的堆块大小小于64B时使用fastbin进行管理,即chunk空间最大为80字节
- fastbin只使用了fd成员,是个单链表结构
- fastbin不会对P位进行操作,也就是说它不会主动进行合并;只有在某些特定情况下,堆管理器才会对fastbin进行合并
- fastbinY为管理fastbin的数组,每个成员分别管理不同大小的fastbin链表,且均指向了当前链表的尾节点,当尾节点被分配时,通过其fd指针指向前一个结点
- 当用户申请chunk大小小于或等于MAX_FAST_SIZE时,优先从fastbins中查找相应的空闲块,且规则为LIFO(Last in, first out, 后进先出)
unsorted bin
描述:
- 当释放较小或较大的chunk的时候,为了增加分配效率,系统会先将最近释放的chunk添加到unsorted bin中
- unsorted bin 为一个双向循环链表,对chunk的大小没有限制,即任何大小的chunk都可以放入unsorted bin链表中
small bin
描述:
- 在32位操作系统中,当用户释放的堆块大小大于64B,小于等于512B时使用small bin进行管理
- small bin 为双向循环链表,且使用 FIFO(First in, first out, 先入先出) 算法
- 当满足small bin条件的chunk被释放后,会优先被放入unosrted bin,只有在一定情况下,才会被分配到small bin中
- 相邻的free chunk将会被合并成一个更大的fee chunk,增加内存利用率
pwn学习总结(四)—— 堆基础知识(持续更新)相关推荐
- [Python学习] 专题四.文件基础知识
前面讲述了函数.语句和字符串的基础知识,该篇文章主要讲述文件的基础知识(与其他语言非常类似). 一. 文件的基本操作 文件是指存储在外部介质(如磁盘)上数据的集合.文件 ...
- jQuery学习总结之基础知识----持续更新中
语法总结和注意事项 1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象 ...
- 前端使用Canvas绘图(基础知识)--持续更新中
文章目录 前言 canvas文档 一.canvas代码提示(插件和注释) 1.1.使用插件方式(推荐这种方式) =>canvas-snippets 1.2.使用注释方式 二.初始canvas 2 ...
- linux基础知识(持续更新)
文章目录 前言 Linux查看cpu相关信息,包括型号.主频.内核信息等 touch mkdir echo cat/tail grep egrep| ls sed tee cp scp 查看端口号占用 ...
- 前端基础知识(持续更新中)
HTML Hyper Text Markup Language 超文本标记语言 1.html5为什么只需要写<! DOCTYPE HTML> 答:这是w3c制定的规则,是文档类型声明,语义 ...
- 210学习日记(18)_ARM基础知识
210学习日记(18) --ARM基础知识 注意: 以下大部分类容都来自网上现成的(直接拷贝过来的,然后经整理)!!!! 问1:ARM处理器工作模式有几种?各种工作模式下分别有什么特点? 答1:ARM ...
- invader的java学习第四天基础篇
invader的java学习第四天基础篇(持续更新中-) 一.类型转换 自动转换(数值之间在进行四则运算时,数据类型会自动向大类型靠拢) byte num=10; short a=num; Syste ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- 汇编学习(1)——基础知识
汇编学习(1)--基础知识 ---谨以此系列文章记录我的汇编学习. 关于汇编 说起汇编语言,那自然不得不想到机器语言,在汇编语言尚未诞生之际,程序猿们只能非常苦逼的敲着0和1,还要记住一大堆复杂难记 ...
最新文章
- Breakpad查C++崩溃问题
- 高效使用Bitmaps(二) 后台加载Bitmap
- 信息系统项目管理师优秀论文:沟通与干系人管理
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
- 适合 Kubernetes 初学者的一些实战练习(一)
- WebApiClient的JsonPatch局部更新
- node.js全局对象和全局变量
- Java基础结构语句和IDEA使用和数组
- 分子模拟的理论与实践_基于分子模拟的数据驱动发现流体力学宏观方程
- vue思维导图(这是我在b站老师下载资源里的讲课流程,用来复习和整体把握还不错)
- ERROR: libass not found using pkg-config2
- Xamarin ios 设置支持在PP助手、XY苹果助手上查看该应用下的文件
- bat生成exe总结
- greasemonkey油猴子初学过程中遇到的问题
- mysql er图注释_powerdesigner 生成mysql带注释的ER图
- 树莓派编译ch934x usb转多串口驱动
- excel自动换行_Excel如何自动换行?
- 计算广告之淘宝oCPC智能出价
- How to build openssl with fips module on Linux and Windows?
- 可编程并行通信接口8255A
热门文章
- ML之回归预测之BE:利用BE算法解决回归(实数值评分预测)问题—线性方法解决非线性问题
- Batch Normalization深入理解
- hibernate映射简单实例
- C语言博客作业05--指针
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
- java基础----Runtime类的使用(一)
- 关于大小型项目如何最大限度提高WebAPi性能
- ecshop php5.4以上版本错误之preg_replace 替换成 preg_replace_callback
- DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
- [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...