linux 堆块分配

【linux】Valgrind工具集详解(十二):DHAT:动态堆分析器 一、概述 DHAT动态堆分析器。Massif(堆分析器)是在程序结束后输出分析结果,而DHAT是实时输出结果,所以叫做动态堆分析器。Massif只记录堆内存的申请和释放,DHAT还会分析堆空间的使用率、使用周期等信息。 DHAT的功能:它首先记录在堆上分配的块,通过分析每次内存访问时所指定的块判断是否是之前已经记录过的块,并收集统计这些信息,最终输入如下结果: 总共分配的堆内存数(字节数和块数)... 阅读详情

linux 堆块分配

关于fastbin

我们一般熟悉的堆都是双链表的chunk,但是对于大小为(16 Bytes~ 64 Bytes)的堆块来说则是使用fastbin来进行管理的。
fastbin的堆块结构与常规的chunk是完全一样,除了使用的是单链表。
fastbin
![fastbin]

2.2 Bins
注意:Bin的翻译为箱子,chunk的翻译为块

  • Bin:freelist数据结构,用于保存free chunks。

  • 基于chunk size,bins被划分为以下几种类型:

List item

  • Fast bin(单链表,大小相同)

  • Unsorted bin(环形双链表,乱序状态,空闲 chunk 回归所属 bin 之前的缓冲区)

  • Small bin(环形双链表,大小相同)

  • Large bin(环形双链表,按大小降序排列)

2.2.1 Fast bin

  1. 大小为16 ~ 80 / 32 ~160字节的chunk称为fast chunk;

存储fast chunk的bins称为fast bins;

2.2.3 Small bin

  1. 小于512/1024字节的chunk称为small chunk。

存储small chunk的bins称为small bins;

2.2.4 Large bin

  1. 大小大于等于512字节的chunk称为large chunk;

堆管理

Top Chunk

当一个chunk处于一个arena的最顶部(即最高内存地址处)的时候,就称之为top chunk。该chunk并不属于任何bin,而是在系统当前的所有free chunk(无论那种bin)都无法满足用户请求的内存大小的时候,将此chunk当做一个应急消防员,分配给用户使用。如果top chunk的大小比用户请求的大小要大的话,就将该top chunk分作两部分:1)用户请求的chunk;2)剩余的部分成为新的top chunk。否则,就需要扩展heap或分配新的heap了——在main arena中通过sbrk扩展heap,而在thread arena中通过mmap分配新的heap。

Last Remainder Chunk

当用户请求的是一个small chunk,且该请求无法被small bin、unsorted bin满足的时候,就通过binmaps遍历bin查找最合适的chunk,如果该chunk有剩余部分的话,就将该剩余部分变成一个新的chunk加入到unsorted bin中,另外,再将该新的chunk变成新的last remainder chunk。

在这里插入图片描述

堆利用笔记
在这里插入图片描述

House Of Force

· 可覆写top chunk的size字段
· 存在一次malloc,攻击者控制malloc的size,前两项是为了新分配堆时可得到任意地址。
· 存在另一次malloc,攻击者可以向里面写入数据
· top chunk的地址

House of Spirit

当glibc被free时,glibc在想什么。
· glibc如何确定free是一个真正的chunk?
· 如果我们free(0xdeadbeef)呢?
如果我们需要fake chunk成功进入free list,需要哪些条件?
攻击的本质:
· 能够控制free的参数
· 能够满足free中对chunk的各项检查
· 触发free,使得fake chunk进入list
· 再次malloc得到chunk,相当于弱化版的任意地址写

House of Mind

如果我们能控制指针p以及对应的arena。
Advanced Heap Exp
fastbin attack
更改fastbin的后向指针,从而使堆分配到我们想要的地方,形成任意地址写。
检查——in free
· address < -size && address alignment
· size > MINSIZE(0x20) && multiple of 0x10
· next chunk size
o > MINSIZE
· < system_mem
· chunk size 是否和当前链表匹配
o 可以具有较小的偏移,但fastbin_index (chunksize (victim)) != idx, 0)
fastbin_index是通过移位做到的。
of by one
· 这一个字节将影响到下一个chunk的size字段
· off by one to extend allocated chunk
· off by NULL to shrink free chunk
· 堆溢出的利用可能会用到多个技巧
· 某些漏洞可被转化为堆溢出
· 整数溢出或竞态条件

堆喷
0x0c0c0c0c地址的优越性。
地址低
\x0c\x0c -> OR AL, 0C (NOP-like instruction

glibc malloc

main arena中的内存申请

内存回收

分配顺序

在这里插入图片描述
unsorted bin如果满足,可能会被分割。top_chunk分割采用向后移动top指针的方式。
走到unsorted bin ,fast bin 和small_bin会被合并整合到unsorted_bin
在这里插入图片描述
在这里插入图片描述

Unsorted Bin Attack

任意地址修改为一个较大的值,值不可控。利用unsorted bin链表覆盖实现,伪造的unsorted bin的bk位置在从链表中出来的时候会被修改,但此时链表被破坏了。

深入Linux内核架构笔记(进程空间堆管理) 堆是进程中用于动态分配变量和数据的内存区域,堆的管理对应用程序员不是直接可见的。因为 它依赖标准库提供的各个辅助函数(其中最重要的是malloc)来分配任意长度的内存区。malloc和 内核之间的经典接口是brk系统调用,负责扩展/收缩堆。新近的malloc实现(诸如GNU标准库提供的) 使用了一种组合方法,使用brk和匿名映射。该方法提供了更好的性能,而且在分配较大的内存区时 具有某些优点 brk系统调用只需要一个参数,用于指定堆在虚拟地址空间中新的结束地址(如果堆将要收缩, 当然可以小于当前值)。 照 阅读详情

相关推荐

堆内存管理在linux上的实现原理

堆内存管理总结,基于Gnu C lib代码

堆之*bin理解

在程序运行中,使用bins结构对释放的堆块进行管理,以减少向系统申请内存的开销,提高效率。 chunk数据结构 从内存申请的所有堆块,都使用相同的数据结构——malloc_chunk,但在inuse和free状态,表现形式上略有差别。 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...

aoque9909的博客 1043

SMARTFORMS实战:用Template+Loop实现复杂表格布局(附避坑指南)

本文深入解析了SMARTFORMS中Template与Loop组合实现复杂表格布局的实战技巧,突破传统TABLE组件的限制。通过多级表头、单元格合并等案例演示,提供从基础架构搭建到动态数据绑定的完整解决方案,并分享性能优化与异常处理的最佳实践,助力开发者高效应对企业级报表设计挑战。

numpy6sculptor的博客 805

CTF pwn题堆入门 -- Unsorted bin

Unsorted bin概述攻击方式泄露libc地址总结 概述   Unsorted bin也是堆题中常见的,当一个堆块被释放时,且该堆块大小不属于fast bin(libc-2.26之后要填满tcache),那么在进入small bin和large bin之前,都是先加入到unsorted bin的。之后当我们再次分配内存到unsorted bin上寻找时,如果申请的内存堆块小于寻找的unsorted bin,那么会将该内存块切割后返回给用户,剩下的仍然保存在unsorted bin上;如果申请的内存堆块

lifanxin的博客 3711

Agent测试框架Harbor指南

Harbor是一个AI Agent单元测试框架,用于自动化测试AI代理在容器环境中的任务执行能力。它支持18+种AI代理,通过沙箱隔离和自动验证机制评估任务完成情况。任务必须具有可编程验证的输出结果,适合代码、数据、系统等可量化任务,不适合创意写作等主观任务。Harbor采用CLI操作方式,核心架构包含Job管理、Trial执行和验证器三个层级,执行流程包括环境启动、Agent执行和结果验证。任务目录包含指令文件、配置文件、Docker环境定义和测试脚本等必需组件,通过测试脚本自动判断任务完成质量。

loo_Charles_ool的博客 1404

伪距单点定位推导+DOP值分析(附matlab仿真代码)

伪距单点定位公式推导、DOP值分析与matlab仿真分析

shannanshouyin的博客 2513

Linux在堆上分配内存相关知识以及内存泄漏分析方法

Linux内存泄漏等问题分析工具

weixin_38331755的博客 1578

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

linux堆内存管理

堆内存的使用在linux开发过程中非常普遍,我们有必要了解相关的内存管理方便我们对内存问题的理解和定位。 堆内存结构层次 linux的堆内存管理分为三个层次,分别为分配区area、堆heap和内存块chunk。 area:堆内存最上层即为分配区area。分配区area分为主分配区(main area)和线程分配区(thread area)。 主进程堆空间对应的分配区即为主分配区main area,每个进程仅有一个主分配区,对应我们通常所说的bss段上面堆空间位置。 线程堆空间对应的分配区即为线程分配区

sy4331的博客 3281

Stable Diffusion WebUI 安装前准备

大家好,我是水滴~~在安装 stable-diffusion-webui 前需要做一些准备工作,本篇文章主要介绍需要的电脑配置、魔法、安装 Python、安装 Git 等。

水滴的博客 2100

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 306

linux 堆利用基础知识

ptmalloc2 是目前 Linux 标准发行版中使用的堆分配器。malloc 函数返回对应大小字节的内存块的指针。此外,该函数还对一些异常情况进行了处理:用以扩展 chunk,相邻 chunk 闲置且空间充足则会进行合并,否则会重新分配 chunk。即通过 realloc 我们可以完成对一个 chunk 的 free,也就是说在特殊情况下 realloc 是可以当作 free 使用的,其中,在size 为 0 的情况下,realloc 函数会调用 free 释放该 chunk。该函数在分配时会清空 ch

sky123博客 4501

Backtrader官方中文文档:第四章Concepts基本概念

官方Concepts章节:https://backtrader.com/docu/concepts/

汇渊科技 2602

堆入门的必备基础知识

i春秋作家:W1ngs 原文来自:堆入门的必备基础知识 前言 堆的利用相对于栈溢出和格式化字符串会复杂很多,这里对堆的一些基本知识点和实现原理进行了一些小小的总结,写的如有不当恳请大佬们斧正。 堆的实现原理 对堆操作的是由堆管理器来实现的,而不是操作系统内核。因为程序每次申请或者释放堆时都需要进行系统调用,系统调用的开销巨大,当频繁进行堆操作时,就会严重影响程序的性能 ...

dfdhxb995397的博客 227

C#【必备技能篇】Winform实现多语言切换(.resx文件的应用)

在实际的项目开发中,软件需要实现多语言切换。本文通过一个实际的例子,可以让你学习到这个技能。

星Yeah 的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Android Linux内存及性能优化】(一) 进程内存的优化 - 堆段

【Android Linux内存及性能优化】一 内存的测量一、内存篇1.1 系统当前可用内存1.1.1 命令 free -h1.1.2 命令 cat /proc/meminfo1.2 进程的内存使用1.2.1 虚拟内存和物理内存 一、内存篇 1.1 系统当前可用内存 1.1.1 命令 free -h 在Linux 中敲入free 命令获得当前系统的内存使用情况。 msm8953_32:/ # free total used free shared b

|~~~热爱生活、努力学习的小伙汁~~~| 3417

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ptmalloc 内存分配器

Arm堆利用 第 1 部分:了解 GLIBC 堆实现 在前面的文章中,我已经讨论过的内存破坏漏洞,一个老的(但重要)类叫做“堆栈缓冲区溢出”,以及我们如何,因为攻击者可以利用这些漏洞采取远程程序的控制,并使其运行我们的shellcode。 对于使用称为“堆栈金丝雀”的漏洞利用缓解措施的应用程序,事实证明,这些堆栈缓冲区溢出漏洞可能更难被攻击者利用,并且通常需要额外的漏洞才能可靠地利用它们。当开发人员使用各种基于堆栈的漏洞利用缓解措施时,攻击者通常...

weixin_45639450的博客 397

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

linux kernel pwn学习之堆漏洞利用+bypass smap、smep

Linux kernel Heap exploit Linux内核使用的是slab/slub分配器,与glibc下的ptmalloc有许多类似的地方。比如kfree后,原来的用户数据区的前8字节会有指向下一个空闲块的指针。如果用户请求的大小在空闲的堆块里有满足要求的,则直接取出。 通过调试,可以发现,被释放的堆的数据域前8字节正好指向下一个空闲堆的数据域 与glibc下的ptmalloc...

seaaseesa的博客 5825

内存取证_Linux内存取证:解析用户空间进程堆(中)

上文我们对解析用户空间进程堆的动机和历史,做了一个简要的概述。另外,我们Glibc堆的3层结构也做了一些概述,这些结构是解析用户空间进程堆的关键。至于每个结构所起的作用,请看本文的分析。 内存视图本节描述如何以及在何处将前一节中描述的结构存储在内存中,以用于运行中的Linux用户空间进程。 内存中的块块的结构名为malloc_chunk,包含以下字段:· prev_size:如果上一个块...

weixin_29370077的博客 302

7. Linux的内存分配

本章讲解了基本的内存管理和内存分配形式,尤其注重讲解了heap区域的特性,以及如何使用malloc(), free()等等,并且介绍了他们和brk()以及sbrk()的关系。

u010933311的博客 2934

[嵌入式系统-252]:内存堆就像一个没有划停车位的大型停车场,而内存池就像根据车辆型号分区且划了停车位的停车场。

表格特性内存堆 (Heap)内存池 (Pool)你的比喻没划线的广场,车随便停,走后留坑。划好线的车库,按车型分区,整齐划一。分配速度慢(需要搜索合适的空隙)。极快(直接去对应分区拿现成的)。内存碎片严重(容易产生无法利用的小空隙)。几乎为零(特别是同类型对象复用)。适用场景通用场景,对象大小不可预测。游戏、服务器,频繁创建/销毁同类对象。这种“分区划线”的思想,就是为了解决堆内存“碎片化”和“分配慢”这两个致命弱点而诞生的。

文火冰糖(王文兵)的博客 225

linux 内核分配算法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34387468的博客 251

针对linux课本的一个程序,反映出来的问题(留有问题没解决)

下面的代码是linux课本上的一段代码,主要就是看一下,每一个进程分配的3G虚拟内存中的,不同区间是怎么存储的。 这些区间包含: 栈区间,堆区间,代码区,BSS区,数据区。 代码如下: /* *这段代码留了两个问题没有解决。 * * * * */ #include #include #include int bss_var; int data_var0 = 0; int

Bob的博客 457

Linux 内核 Slab 块分配器深度剖析

在现代操作系统内存管理体系中,高效的小对象分配与回收机制是内核性能的基石。Linux 内核自 2.2 版本引入slab 分配器(Slab Allocator),以解决频繁分配/释放内存带来的碎片化和性能瓶颈问题。本文将从设计思想、源码流程、业务实践、调优技巧到架构演进,深度剖析 slab 分配器,帮助你从“知其然”到“知其所以然”,掌握其高阶优化与应用。“三链管理三状态,分层分配防碎片;局部性优化命中高,锁粒度权衡多。

IT技术学习与工作笔记分享 1238

linux 进程 堆大小,Linux进程的默认分配堆大小

在Linux中的进程启动过程中,默认的allocated堆大小是多少?这与ulimit无关,而是因为注意到了question。我还通过g++ -O0 -Wall -std=c++11和strace进行了以下测试,因此没有显示堆分配。#include using namespace std;class C {public:int i;};int main() {cout << "poss...

weixin_36060539的博客 1370

Linux内核 Slab块分配器深度剖析

Slab分配器通过对象缓存、分层管理、批量操作等机制,有效解决了内核对象分配的碎片化与性能瓶颈。其架构不断演进,适应多核、NUMA等现代硬件环境。通过源码剖析和实际调优,开发者能深入理解其高效之道,并在用户空间借鉴其设计思想。

IT技术学习与工作笔记分享 1319
上一篇: Android取证
下一篇: 泄露libc
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值