malloc 分配大堆块(128KB)的一次探索

前言

一次意外执行了 malloc(0x5000),结构使用 gdb 调试发现其分配的位置在 TLS 区域,这令我不解(:最后去看了下 malloc 源码和 mmap 源码实现,发现似乎可能gdb 插件的问题,乐

场景复现

#include <stdio.h>
int main() {
        malloc(0x5000);
        return 0;
}

调试:
在这里插入图片描述
wtf 不应该啊,这咋能分配到 tls 区域去了呢?

问题探索

通过对 malloc 源码的查看,发现其超过了 mmap_threshold,所有最后走的 mmap 映射的一段私有匿名区域(这里大家应该都很熟悉了)所以不应该分配到 tls 区域去啊,在与 henry 师傅交流后,觉得可能与 mmap 的行为有关,于是说干就干,简单地去审了一下 mmap 的源码,最后发现可能是插件的问题

mmap 源码分析就不写了,我也没做笔记,毕竟是开源的,需要时自己去看看就行了,而且我看完 mmap 源码时已经快凌晨 3 点了,就简单说下 mmap 是如何分配虚拟内存的。在内核态,为进程维护了一颗红黑树,其根据地址组织了空闲的 vma(struct vm_area_struct 结构体表示),而在我的 ubuntu 22.04 上,文件与匿名映射区是从高地址往低地址增长的,所以 mmap 在寻找虚拟内存区域时是从高地址往低地址扫描的

知道这之后一切都可以解释了,简单调试一下,啥也不执行,看下内存布局:把随机化关了,方便调试
在这里插入图片描述
可以看到在 tls 前后存在 0x17e0000x11000 的空间,我们来验证一下:

#include <stdio.h>
#include <sys/mman.h>
int main() {
        void *p0 = malloc(0x17e000-0x1000);
        void *p1 = mmap(0, 0x11000, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
        printf("p0: %p\np1: %p\n", p0, p1);
        return 0;
}

我的机器上 mmap_threshold = 128kb,所以 malloc(0x11000-0x1000) 会走 brk,所以这里我直接使用 mmap

关于这里 malloc 分配为啥要减去 0x1000 请自行审计 sysmalloc 源码(大家应该比较熟悉)

调试结果如下:
在这里插入图片描述
可以看到 mmap0x11000 区域就是 tls 下方的区域,malloc0x17e000 就是 tls 前面的那块区域,这里的 gdb 插件把其当作 TLS 了似乎。当然这里可能就是 tls 预留的,我没有具体调试内核,仅仅静态分析了 mmap 的代码。当然我通过分配一些线程局部变量调整了一下 tls 区域的位置,然后也是这样的:

#include <sys/mman.h>
__thread char p0[0x17e000+0x1000];
int main() {
        void *p1 = mmap(0, 0x193000, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
        printf("p0: %p\np1: %p\n", p0, p1);
        return 0;
}

调试结果:
在这里插入图片描述

所以当我们 malloc 超过 0x17e000-0x1000 时,就会在 libc 前面映射一段空间,也就是大家打 CTF 时说的 malloc 一块大堆块,会使用 mmaplibc 前面分配一个堆块,一般网上都是说分配 0x200000,其实自己简单算一算就知道了,验证一下:

#include <stdio.h>
#include <sys/mman.h>
int main() {
        void *p0 = malloc(0x17e000);
        printf("p0: %p\n", p0);
        return 0;
}

调试结果如下:
在这里插入图片描述
一切都是吻合的

一个有趣的 demo

这里给大家看一个 demo,感兴趣的可以自行研究下背后的原因

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int show() {
    FILE *maps_file;
    char line[256];
    char pathname[256];

    maps_file = fopen("/proc/self/maps", "r");
    if (maps_file == NULL) {
        perror("Failed to open /proc/self/maps");
        return 1;
    }

    while (fgets(line, sizeof(line), maps_file)) {
        if (sscanf(line, "%*x-%*x %*s %*x %*x:%*x %*u %s", pathname) == 1) {
            if (strcmp(pathname, "[stack]") == 0 || strcmp(pathname, "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2") == 0) {
                printf("%s", line);
            }
        }
    }

    fclose(maps_file);
    return 0;
}

int main() {
        uint64_t addr;
        show();
        puts("==========================================");
        scanf("%llx", &addr);
        *(uint64_t*)addr = 0xdeadbeef;
        puts("==========================================");
        show();
        return 0;
}

输出如下:
在这里插入图片描述

总结

mmap 的源码还是比较复杂的,我只是看了我感兴趣的部分,有兴趣的同学可以自己去看看源码,本来想说搭建环境调调 mmap 的,最后还是算了,太累了,睡觉了(:

当然这个东西本身连技术都不算,之所以记录一下,也算是回答自己刚开始学习时的一些疑问,记得当时看网上说 malloc 要分配 0x20000 才能够保证分配的空间在 libc 前面,其实根本没有问过自己为什么?也没有想过 mmap 底层是如何进行虚拟内存分配的?

当然其实现在来解决这些问题也挺好的,毕竟有一些基础,如果最开始就去看 mmap 的源码,相信我早就被劝退了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据机器学习算法和计算机视觉应用07:机器学习

Machine Learning Goal of Machine LearningLinear ClassificationSolutionNumerical output example: linear regressionStochastic Gradient DescentMatrix Acceleration Goal of Machine Learning 机器学习的目标 假设现在有一组数据 x i , y i {x_i,y_i} xi​,yi​&…

【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 引言 图像增强API调用实践1. API选择与参数设置2. 在线调试与结果分析3. 响应结果具体实现代码 发票…

android studio更改应用图片,和应用名字。

更改应用图标&#xff0c;和名字 先打开AndroidManifest.xml文件。 更改图片文件名字&#xff08; 右键-->构建-->重命名&#xff08;R&#xff09;&#xff09;

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author&#xff1a;Once Day Date&#xff1a;2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档&#xff1a;GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…

代理模式(JDK,CGLIB动态代理,AOP切面编程)

代理模式是一种结构型设计模式&#xff0c;它通过一个代理对象作为中间层来控制对目标对象的访问&#xff0c;从而增强或扩展目标对象的功能&#xff0c;同时保持客户端对目标对象的使用方式一致。 代理模式在Java中的应用,例如 1.统一异常处理 2.Mybatis使用代理 3.Spring…

猪猪软件库

猪猪软件库&#xff0c;汇聚各类宝藏软件&#xff0c;宛如一座数字百宝箱。这里涵盖了实用工具、趣味游戏、高效办公软件等丰富资源&#xff0c;满足不同用户的多样需求。界面简洁直观&#xff0c;搜索便捷流畅&#xff0c;能让你迅速定位心仪软件。 所有资源都经过严格筛选&a…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前&#xff0c;咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

Swin transformer 论文阅读记录 代码分析

该篇文章&#xff0c;是我解析 Swin transformer 论文原理&#xff08;结合pytorch版本代码&#xff09;所记&#xff0c;图片来源于源paper或其他相应博客。 代码也非原始代码&#xff0c;而是从代码里摘出来的片段&#xff0c;配上简单数据&#xff0c;以便理解。 当然&…

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读

LLMs之rStar&#xff1a;《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读&#xff1a;这篇论文提出了一种名为rStar的自我博弈互推理方法&#xff0c;用于增强小型语言模型 (SLMs) 的推理能力&#xff0c;无需微调或依赖更强大的模型。rStar…

CS 144 check5: down the stack (the network interface)

Lectures Note 略 Exercises TCP片段传输到对等方的过程&#xff1a; TCP-in-UDP-in-IP. Linux 提供了一种接口&#xff08;即“数据报套接字”&#xff0c;UDPSocket&#xff09;&#xff0c;它允许应用程序仅提供用户数据报的有效载荷和目标地址&#xff0c;而内核则负责…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练&#xff08;Over-training&#xff09; 3. 计算训练预算 4. 如何逐步估算和确定最优模型&#xff1f; 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高

《港湾商业观察》施子夫 12月13日&#xff0c;深圳市越疆科技股份有限公司&#xff08;以下简称&#xff0c;越疆科技&#xff0c;02432.HK&#xff09;发布全球发售公告&#xff0c;公司计划全球发售4000万股股份&#xff0c;其中3800万股国际发售&#xff0c;200万股香港公开…

微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用

目录 画板创建canvas绘制及渲染画笔粗细功能实现画笔颜色选择画笔痕迹撤回、板擦、画布清空canvas解析微信小程序中 canvas 的应用场景canvas 与 2D 上下文、webgl 上下文的关系图像的加载与绘制说明代码说明画板创建 canvas绘制及渲染 在wxml添加对应的canvas标签代码,并在j…

混合精度训练说明

什么是混合精度训练&#xff1f;混合精度训练有什么用&#xff1f; 这里总结一下。 本文总结自kapathy的build gpt2 通常在训练过程中&#xff0c;model里面的数据默认都是torch.float32类型&#xff0c; 也就是用32bit的float型数据表示变量。 比如特征提取中提取的特征&…

draw.io 导出svg图片插入word后模糊(不清晰 )的解决办法

通常我们将图片从draw.io导出为svg格式后插入word, 会发现字体不清晰&#xff0c;特别是使用宋体时&#xff0c;折腾了半天&#xff0c;得到如下办法&#xff1a; 方法1: 在draw.io中导出pdf文件&#xff0c;使用 PDF转SVG转换器 - SVGConverter 将其转换为svg, 完美呈现。 …

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

【动手学运动规划】 5.2 数值优化基础:梯度下降法,牛顿法

朕四季常服, 不过八套. — 大明王朝1566 道长 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 上一节我们介绍了数值优化的基本概念, 让大家对最优化问题有了基本的理解. 那么对于一个具体的问题, 我们应该如何求解呢? 这一节我们将介绍几个基本的求解…

24-12-22 pytorch学习 基础知识 帝乡明日到,犹自梦渔樵。

文章目录 pytorch学习 基础知识pytorch学习(1) Tensors1.1 初始化Tensor1.2 Tensor 的属性1.3 Tensors 的操作1.4 与 NumPy 的桥梁1.4.1 Tensor 到 NumPy 数组1.4.2 NumPy 数组 到 Tensor pytorch学习(2) 数据集和数据加载器2.1 加载一个数据集2.2 迭代和可视化数据集2.3 为你的…

Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务

M3D: 基于多模态大模型的新型3D医学影像分析框架&#xff0c;将3D医学图像分析从“看图片“提升到“理解空间“的层次&#xff0c;支持检索、报告生成、问答、定位和分割等8类任务 论文大纲理解1. 确认目标2. 分析过程&#xff08;目标-手段分析&#xff09;核心问题拆解 3. 实…