21 brk 的初始化

news2024/11/16 3:42:49

前言 

这个问题是 衍生自 malloc 的问题的调试 

malloc 虚拟内存分配的调试(1)

malloc 虚拟内存分配的调试(2)

假设我们使用 gdb 或者 gdbserver 启动调试的该测试用例对应的可执行程序  

我们可以观察到的现象是 p1, p2, p3 的地址是固定的, 均是类似于 elf 中最大的虚拟地址 直接向上扩展 

(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x602010 - 0x602030 
p1 : 0x602010 - 0x602030 
p3 : 0x602440 - 0x602440 
[Inferior 1 (process 63076) exited normally]
(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x602010 - 0x602030 
p1 : 0x602010 - 0x602030 
p3 : 0x602440 - 0x602440 
[Inferior 1 (process 63080) exited normally]
(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x602010 - 0x602030 
p1 : 0x602010 - 0x602030 
p3 : 0x602440 - 0x602440 
[Inferior 1 (process 63081) exited normally]
(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x602010 - 0x602030 
p1 : 0x602010 - 0x602030 
p3 : 0x602440 - 0x602440 
[Inferior 1 (process 63082) exited normally]

但是 假设我们直接执行, 我们会发现 地址是在不断变化的, 呵呵 

这个就和 brk 的相关初始化机制存在关联了 

root@ubuntu:~/ClionWorkStations/HelloWorld# ./Test01Sum 
p1 : 0xc56010 - 0xc56030 
p1 : 0xc56010 - 0xc56030 
p3 : 0xc56440 - 0xc56440 
root@ubuntu:~/ClionWorkStations/HelloWorld# ./Test01Sum 
p1 : 0x67d010 - 0x67d030 
p1 : 0x67d010 - 0x67d030 
p3 : 0x67d440 - 0x67d440 
root@ubuntu:~/ClionWorkStations/HelloWorld# ./Test01Sum 
p1 : 0x7ec010 - 0x7ec030 
p1 : 0x7ec010 - 0x7ec030 
p3 : 0x7ec440 - 0x7ec440 
root@ubuntu:~/ClionWorkStations/HelloWorld# ./Test01Sum 
p1 : 0x1af9010 - 0x1af9030 
p1 : 0x1af9010 - 0x1af9030 
p3 : 0x1af9440 - 0x1af9440 

brk 的随机初始化 

我们这里 先来看 brk 的随机初始化相关, 因为 这个比较好构造 

brk 的初始化有几个地方, 加载 elf program headers 的地方 

elf 中各个 program headers 加载完成之后, 会有 start_brk, start_code, end_code, start_data, end_data 

之后会有一个 brk 的初始化, 初始化为 elf 中记录的最大的虚拟地址 按照分页上对齐之后的地址 

这个就是 我们 gdb 调试的时候, 看到的初始化的 brk, 我们演示的程序中经常为 0x602000 

然后 最后一个是 elf 加载过程中 有一个 brk 随机初始化的流程, 如下 

brk 的随机初始化具体的处理如下 

也就是在 初始化的 brk 之后的 [0 - 8192) 页, 每一页大小为 4k 

为什么是 8192?, 这是上面 arch_randomize_brk 传入的 range 为 0x2000000, 然后这里 range >>= PAGE_SHIFT 之后, range 为 8192 

我们这次执行, 初始化的 brk 为 0x130d000 

然后 测试用例 中 printf 调用 malloc 的时候会调用 brk 来分配空间 

看这里的 addr 即为 brk 初始化之后的值, 可以看一下 和上面 加载 elf 之后随机初始化的 地址是一致的, 均为 0x130d000 

再来一次, 初始化的 brk 为 0x762000 

printf 调用 malloc 分配空间的时候 brk 也是 0x762000  

gdb 或者 gdbserver 启动调试的 brk 初始化

 brk 在 加载 elf 的 program headers 完成之后的初始化 

elf 中映射的虚拟地址的末尾是 6295616 = 0x601040, ALIGN_UP(0x601040, PAGE_SIZE) 根据分页上对齐之后将 brk 初始化为 0x602000 

 brk 初始化为 6299648 = 0x602000 

为什么 gdb/gdbserver 未对 brk 进行随机初始化? 

有可能是没有进这个判断, 或者 有什么因素 影响到了 arch_randomize_brk 的计算??

这个是因为 alsr 机制 Linux下关闭ASLR(地址空间随机化)的方法

在启动 gdb 的时候, 默认 禁用aslr, 将这个配置置为 false, 即可以启动 aslr 

然后 这里相关, 影响到的应该是这个 random_va_

(gdb) set disable-randomization off
(gdb) show disable-randomization off
Disabling randomization of debuggee's virtual address space is off.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 

Breakpoint 1, main (argc=1, argv=0x7ffc8c89b608) at Test01Sum.c:9
9	char *p1 = (char *)malloc(20);
(gdb) c
Continuing.
p1 : 0x19bf010 - 0x19bf030 
p1 : 0x19bf010 - 0x19bf030 
p3 : 0x19bf440 - 0x19bf440 
[Inferior 1 (process 63432) exited normally]
(gdb) delete 1
(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x23d2010 - 0x23d2030 
p1 : 0x23d2010 - 0x23d2030 
p3 : 0x23d2440 - 0x23d2440 
[Inferior 1 (process 63433) exited normally]
(gdb) run
Starting program: /root/ClionWorkStations/HelloWorld/Test01Sum 
p1 : 0x1c93010 - 0x1c93030 
p1 : 0x1c93010 - 0x1c93030 
p3 : 0x1c93440 - 0x1c93440 
[Inferior 1 (process 63434) exited normally]

linux 系统上面关闭 ASLR  

echo 0 > /proc/sys/kernel/randomize_va_space

彩蛋[2022.11.06]

呵呵 为了测试 aslr, 妈的 安装 pwn 把虚拟机搞挂了

又要重新 安装环境啥的了, 悲剧 

参考

Linux下关闭ASLR(地址空间随机化)的方法



 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于vue3+pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面

使用vue3pinia2开发仿制chatgpt界面聊天实例Vue3-Chatgpt 基于Vue3.xPinia2VueRouterVue3-Markdown等技术构建仿ChatGPT网页端聊天程序。支持经典分栏界面布局、light/dark模式、全屏半屏显示、Markdown语法解析、侧边栏隐藏等功能。 技术框架 编辑工具:Cursor框架…

精炼计算机网络——物理层(二)

文章目录 前言2.4信道复用技术2.4.1 频分复用、时分复用和统计时分复用2.4.2 波分复用2.4.3 码分复用 2.5 数字传输系统2.6 带宽接入技术2.6.1 ADSL技术2.6.2 光纤同轴混合网(HFC网)2.6.3 FTTx技术 总结 前言 上篇文章,我们初步了解了物理层…

国考省考结构化面试:应急应变事件处理,宏观全面把控,措施有效具体,着眼当前放眼未来,标本兼治

国考省考结构化面试: 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到寒…

idea 创建java项目,引入第三方jar,打包jar包

目录 一、新建并运行项目二、下载第三方Jar三、引入第三方Jar四、将项目打成Jar包 一、新建并运行项目 前提:已安装好JDK,并且配置好了JDK环境变量。 直接点击create创建即可 刚创建完的项目可能是没有out目录的,当我们执行一次main方法&…

Gradio的web界面演示与交互机器学习模型,安装和使用《1》

如何快速地将机器学习模型,给创建和分享出去,让更多的人来体验?Gradio就是一种快速搭建web界面来演示机器学习模型的方式,任何人都可以在任何地方使用它。 官网地址:https://gradio.app/ 1、安装Gradio 前提条件:Gra…

YOLOv5:图解common.py常用模块

YOLOv5:图解common.py常用模块 前言前提条件相关介绍common.py基本模块ConvBottleneckBottleneckCSPC3SPPSPPFFocus未完待续 参考 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入YOLO系列专栏或我的个…

jieba分词(1):入门案例

1 场景介绍 大数据量的查询问题 假设我们要从商品的表里面查询一个商品 我们的数据库里面肯定有个t_goods的表,我们现在利用商品的名称做模糊查询 1.1 对于数据库的查询的 select * from t_goods where goodsName like “%手机%” ; 问题: 这个查询…

CSDN | 好久不见,甚是想念

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

JavaScript实现在键盘输入按键,浏览器进行显示的代码

以下为实现在键盘输入按键,浏览器进行显示的代码和运行截图 目录 前言 一、在键盘输入按键,浏览器进行显示 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找&#xf…

《灰盒模型在非侵入式体外估计糖化血红蛋白百分比和数字脉搏波形的推导和验证》阅读笔记

目录 一、论文摘要 二、论文十问 Q1:论文试图解决什么问题? Q2:这是否是一个新的问题? Q3:这篇文章要验证一个什么科学假设? Q4:有哪些相关研究?如何归类?谁是这一课…

84.python input输入函数知识拓展

文章目录 1. input函数知识回顾2. input常犯错误解析3. 用函数转换从终端输入的数据3.1 输入的数为整数,则用int转换为整数3.2 输入的数为浮点数,则用float转换为浮点数3.3 不考虑输入的数据类型,则用eval函数转换 4. 变量的多种赋值方式4.1 …

OpenCV教程——OpenCV环境配置及第一个测试代码

1.OpenCV简介 OpenCV是一个计算机视觉的开源库。英文全称是:Open Source Computer Vision Library。 常用的OpenCV的核心模块: Image ProcessCamera Calibration and 3D ReconstructionVideo AnalysisObject DetectionMachine LearningDeep LearningG…

【Linux】Linux安装Git(图文解说详细版)

文章目录 前言第一步,官网下载安装包第二步,解压安装包第三步,安装编译环境第四步,编译源码第五步,安装git第六步,配置环境变量 前言 服务器版本:CentOS7.8 git官网:https://git-sc…

汽车出租系统【纯控制台】(Java课设)

系统类型 纯控制台类型(没有用到数据库) 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Idea或eclipse 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87753364 更多系统…

Qt5.14.2安装教程

之所以选择安装Qt5.14.2,是因为从5.15.0起,对于开源用户,Qt官方不再提供独立安装文件,源码安装听说很繁琐,并且还要激活码。 官网下载链接:https://download.qt.io/archive/qt/5.14/5.14.2/ 1、Windows用户…

智能优化算法:基于驾驶训练的优化算法-附代码

智能优化算法:基于驾驶训练的优化算法 文章目录 智能优化算法:基于驾驶训练的优化算法1. 基于驾驶训练优化算法1.1 初始化1.2 阶段一:驾驶教练培训(探索阶段)1.3 阶段二:学员学习(探索阶段&…

Jupyter notebook 如何设定默认的保存目录?

前言: 做智能车的时候,Jupter Notebook的默认保存在可怜的C盘,本来就很紧张的C肯定受不了,要改到别的地方,网上找了一些参考,说变更一下配置地址就可以了,照着做,99%的博客说&#x…

Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130534343 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

算法和算法竞赛的知识点

2023年5月7日,周日早上: 虽然今天早上我作出了改变学习算法方式的决定,但是知识点有哪些、具体该怎么做还没搞清楚,于是去刷题网站截图了它们的标签。 或许看相关书籍的知识点和题单也不错。 LeetCode的知识点 力扣 蓝桥杯的知识…

2023招商Fintech数据赛道rank33 赛后分享

赛题需求: 本次比赛为参赛选手提供了两个数据集,即训练数据集(train)和测试数据集(test_A榜/test_B榜)。参赛选手需要基于训练数据集,通过有效的特征提取,构建客户进取类产品配置发生时点预测模型,并将模型应用于测试数据集上,输出…