当前位置: 首页 > news >正文

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 的源码,相信我早就被劝退了

相关文章:

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

前言 一次意外执行了 malloc(0x5000)&#xff0c;结构使用 gdb 调试发现其分配的位置在 TLS 区域&#xff0c;这令我不解&#xff08;&#xff1a;最后去看了下 malloc 源码和 mmap 源码实现&#xff0c;发现似乎可能是 gdb 插件的问题&#xff0c;乐 场景复现 #include <…...

Android -- 双屏异显之方法二

Android – 双屏异显之方法二: DisplayManager PS: 1. 使用改方法主板需连接至少两个输出显示屏&#xff1b; 2. 副屏内部实现与MediaRouter下一样&#xff1b;使用方法 # 主屏activity内&#xff1a; private SecondDisplay secondDisplay;private void dualScreen3288() {D…...

电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?

电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误&#xff1a;原因与解决方案 在日常电脑使用中&#xff0c;我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件&#xff0c;如CorelDRAW&#xff08;简称CDR&#xff09;时&#xff0c;可能会遇到“计算…...

使用RDMA技术构建无损网络

如何使用RDMA构建无损网络&#xff1f; 在深入研究RDMA和无损网络领域后&#xff0c;会经常遇到两个基本问题&#xff1a;为什么采用无损网络至关重要&#xff1f;这些先进技术有什么优势&#xff1f; 无损网络是一种新型的网络技术&#xff0c;它可以在不丢失数据包的情况下传…...

vscode 识别git目录

vscode 偶尔无法识别使用git 新托管的项目。 以下是我提供的解决方案——重启 git.enabled VS Code配置问题&#xff1a; 有时候&#xff0c;VS Code的配置可能会导致无法识别.git文件夹。确保你的VS Code配置中启用了Git的相关功能。你可以通过”Settings”&#xff08;设置…...

OpenCV相机标定与3D重建(26)计算两个二维点集之间的部分仿射变换矩阵(2x3)函数 estimateAffinePartial2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个2D点集之间的具有4个自由度的最优有限仿射变换。 cv::estimateAffinePartial2D 是 OpenCV 库中的一个函数&#xff0c;用于计算两个二维…...

StarRocks 生产部署一套集群,存储空间如何规划?

背景&#xff1a;StarRocks 3.2&#xff0c;存储一体 使用场景&#xff1a;多分析、小查询多单但不高、数据量几百T FE 存储 由于 FE 节点仅在其存储中维护 StarRocks 的元数据&#xff0c;因此在大多数场景下&#xff0c;每个 FE 节点只需要 100 GB 的 HDD 存储&#xff0c…...

JVM执行引擎JIT深度剖析

前端编译与后端编译 Java 程序的编译过程是分两个部分的。一个部分是从java文件编译成为class文件&#xff0c;这一部分也称为前端编译。另一个部分则是这些class文件&#xff0c;需要进入到 JVM 虚拟机&#xff0c;将这些字节码指令编译成操作系统识别的具体机器指令。这一部…...

【DOCKER】基于DOCKER的服务之DUFS

文件上传下载服务器&#xff1a;https://github.com/sigoden/dufs # 拉取镜像 docker pull sigoden/dufs# 创建数据卷文件夹 mkdir -p /data/.docker/volumes/dufs# 创建容器 docker run -id --restartalways --name dufs \-p 51080:5000 \-v /data/.docker/volumes/dufs:/dat…...

加密货币地址的基本概念

什么是地址&#xff1f; 在日常生活中&#xff0c;地址可能指房屋、电子邮件或官网的位置&#xff0c;用来精确定位在系统中的特定位置或端点。在加密货币领域&#xff0c;地址也起着类似的基础作用&#xff0c;只不过是在数字环境中。 加密货币地址是区块链网络中使用的唯一…...

如何在 Linux 服务器上部署 Pydio Cells 教程

简介 Pydio Cells 是一个开源的文档共享和协作平台&#xff0c;专为你的组织设计。它允许你在组织内部分享文档和文件&#xff0c;并让你完全掌控文档共享环境。 在本教程中&#xff0c;我们将向你展示如何在 Alma Linux 9 服务器上安装 Pydio Cells。你将使用 MariaDB 数据库…...

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…...

Selenium 全面指南

Selenium 是一个强大的 Web 自动化工具&#xff0c;支持多种浏览器和语言绑定。 1. Selenium 的基本概念 WebDriver&#xff1a;Selenium 提供的核心接口&#xff0c;用于控制浏览器操作。显式等待&#xff1a;等待特定条件满足后再执行操作。隐式等待&#xff1a;全局设置一个…...

#error: WinSock.h has already been included解决方案

原因&#xff1a; 在工程中使用了 Boot 库之后&#xff0c;使用了socket、tcp 相关的头文件&#xff0c;在其他地方还是包括了头文件<windows.h>&#xff0c;该头文件内包含了<winsock.h>。导致遇到报错问题&#xff1a;WinSock.h has already been included 解决…...

2.Couchbase 的增量查询优化

在 Couchbase 中实现增量查询的优化是关键&#xff0c;尤其当数据量庞大时。通过合适的策略&#xff0c;可以显著提高增量查询的效率&#xff0c;确保系统在处理实时数据时的响应速度和性能。下面是一些针对 Couchbase 增量查询的优化策略。 1. 使用索引优化查询 为了提升增量…...

汽车IVI中控开发入门及进阶(46):FFmpeg

概述: FFmpeg 是领先的多媒体框架,能够解码、编码、 转码、复用、解复用、流、过滤和播放 几乎所有人类和机器创建的东西。它支持最模糊的古老格式,直到最前沿。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的可移植性:FFmpeg 在各种构建环境、机器架构…...

Spring Boot 中的 @Scheduled 定时任务以及开关控制

Scheduled注解是Spring框架&#xff08;包括Spring Boot&#xff09;中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析&#xff1a; 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解&#xff0c;S…...

服务器证书原理

CA&#xff08;Certificate Authority&#xff09;证书是由 证书颁发机构&#xff08;CA&#xff09;本身签名的。具体来说&#xff0c;这取决于 CA 的类型和其在信任链中的位置&#xff1a; 1. 自签名证书 根 CA 证书 是信任链的起点&#xff0c;由 CA 自己签名。它们是信任链…...

重温设计模式--代理、中介者、适配器模式的异同

文章目录 1、相同点2、不同点 1、相同点 目的都是为了更好地处理对象之间的关系&#xff1a;这三种模式都是在软件设计中用于处理对象之间的关联和交互&#xff0c;以达到优化系统结构、增强可维护性等目的。它们都在一定程度上隐藏了对象之间的某些细节或者复杂性&#xff0c…...

2024第十六届蓝桥杯模拟赛(第二期)-Python

# 2024第十六届蓝桥杯模拟赛&#xff08;第二期&#xff09;-Python题解 # 自己改注释# -----------------------1------------------------ # def prime(x): # if x < 2: # return 0 # for i in range(2, int(x ** 0.5) 1): # if x % i 0: # …...

分布式系统中的防抖策略一致性与性能优化

目录 引言分布式系统的挑战防抖策略简介确保多实例间一致性的方法 幂等操作TTL缓存 分布式一致性事件总线或消息队列异步任务调度器客户端或API网关层面的防抖一致性哈希与分区限流和熔断机制 避免锁竞争导致的性能瓶颈Java示例代码结论 引言 在现代软件架构中&#xff0c;…...

项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”

一、UpdownController.cs 1、前端传入 当用户在下图的“记录查询”中的 两个界面选项 中,点击“导出”功能时,向后端发起请求,请求服务器下载文件的权限 【权限是在Program.cs中检测的,这个控制器里只需要进行“谁在哪个接口下载了文件”的日志记录】 【导出:是用户把…...

【计算机视觉基础CV-图像分类】03-深度学习图像分类实战:鲜花数据集加载与预处理详解

本文将深入介绍鲜花分类数据集的加载与处理方式&#xff0c;同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向&#xff0c;为读者提供从数据组织、预处理、加载到可视化展示的完整过程&#xff0c;并为后续模型训练打下基础。 前言 在计算机视觉的深…...

大模型应用技术系列(一):大模型应用整体技术栈浅析

RAG相关的技术学习暂时告一段落了,接下来尝试探索新的学习方向。这就引入一个问题:接下来该做什么?为了能进一步推进,我需要有一个整体的视角,从更上层来看整个技术栈,从而确定接下来感兴趣的方向。本文主要探索从更上层的视角来看构建大模型的技术栈,从而进一步确定研究…...

绿色环保木塑复合材料自动化生产线设计书

《绿色环保木塑复合材料自动化生产线设计书》 一、项目概述 随着全球对环境保护和可持续发展的日益重视,绿色环保材料的研发与生产成为了热门领域。木塑复合材料作为一种新型的绿色环保材料,它将木材纤维与塑料通过特定工艺复合而成,兼具木材与塑料的双重特性,具有防水、…...

Sourcegraph 概述

Sourcegraph 报告 Sourcegraph 是一款强大的代码搜索和智能导航工具&#xff0c;专为大型代码库、分布式系统和跨多个仓库的开发环境设计。它能显著提高开发者对复杂系统的理解和维护效率&#xff0c;帮助团队在庞大的代码库中快速找到关键信息。本文将详细讲解 Sourcegraph 的…...

c 保存 csv格式的文件

在C语言中保存数据为CSV&#xff08;逗号分隔值&#xff09;格式的文件&#xff0c;你可以使用标准I/O库函数&#xff0c;如fprintf&#xff0c;来将数据写入文件&#xff0c;并确保每个字段之间用逗号分隔。以下是一个简单的示例&#xff0c;说明如何在C语言中创建一个CSV文件…...

C语言扫雷游戏教学(有图形界面)(提供源码+实验报告)(计时+排行榜+难度选择+登录注册+背景音乐)(涉及easyX库)

前言&#xff1a; 本篇文章篇幅较长&#xff0c;请根据自己的需求在目录上跳转对应内容哦&#xff01;源码及实验报告的获取在文章的后面哦&#xff01;本人代码水平不佳&#xff0c;希望本文章和项目能带给大家帮助&#xff01; 目录 前言&#xff1a; 一.成果预览&#x…...

第五节:GLM-4v-9b模型model加载源码解读(模型相关参数方法解读)

文章目录 前言一、GLM-4v-9b模型model加载源码解读1、GLM-4v-9b模型model加载主函数源码2、GLM-4v-9b模型model加载源码源码解读3、GLM-4v-9b自定义模型类源码解读 二、基于GLM-4v-9b模型获取模型输入参数等内容源码解读(from_pretrained-->huggingface)1、from_pretrained函…...

面试经验分享 | 北京渗透测试岗位

更多大厂面试经验的视频经验分享看主页 目录&#xff1a; 所面试的公司&#xff1a;安全大厂 所在城市&#xff1a;北京 面试职位&#xff1a;渗透测试工程师 面试方式&#xff1a;腾讯会议线上面试线下面试 面试过程&#xff1a; 面试官的问题&#xff1a; 1、说一下XSS有哪…...