关于Linux内核code段被改写的原因分析

news2024/11/24 13:56:09

本文基于Linux-4.19.125, ARM V7,dual core。

1 code 段

Linux的code段(或者说text段)自_stext开始,到_etext结束,这段内容一般情况下是只读的,在理论上来说,这段数据在设备上应该和kernel image中的内容完全一致。

symbol___|type_______|address____________|
_stext       |(char [0])    | P:C0008240
_etext       | (char [0])  | P:C02CA9A0

但在实测中发现,从设备中dump出来的这段数据,与kernel image中的数据存在多处不一致的情况:

2 数据对比

随机取几个差异点:

序号虚拟地址vmlinux内容板端内容
10xc0017f700x40010x4000
20xc00d21540x43010x4300
30xc00e895e0x40010x4000
40xc02852ca0x41010x4100

 通过trace32对比设备侧与vmlinux中的数据差异:

3. 数据何时被修改的

41 load boot image阶段

为方便调试,修改Linux内核源码arch/arm/kernel/head.S文件如下,让CPU停在SPL跳转到内核的第一条指令:

上电,CPU停止在0x40008000地址:

 

此时dump, 将_stext和_etext转换成物理地址分别是0x40008240和:0x402CA9A0

执行d.save.Binary text_dump_start.bin eaxi:0x40008240--eaxi:0x402CA9A0得到 text_dump_start.bin

对比text_dump_start.bin和text_vmlinux.bin文件发现二者完全一致,说明SPL加载boot image到内核过程中并没有修改code段内容。

3.2 __mmap_switched 阶段

__mmap_switched是开启mmu后的第一条语句,经过验证发现,进入到__mmap_switched时,监控的上述4个随机抽样点的数据已经被修改了,这说明修改动作发生在__mmap_switched之前。 

3.3 __fixup_pv_table阶段

经过调试发现,上述监控的4个随机抽样点的数据在__fixup_pv_table中被修改了。

__fixup_pv_table是在CONFIG_ARM_PATCH_PHYS_VIRT内核配置项打开的情况下才支持的,关于CONFIG_ARM_PATCH_PHYS_VIRT的作用,概括来说就是:
开发人员需要让内核在不重新编译的情况下,在不同内存配置的系统中能够正常运行。
内核可能被编译成在特定的虚拟地址(如 0xC0000000 )处执行,但实际可能被加载到 物理地址0x10000000、0x40000000或其他地址。
CONFIG_ARM_PATCH_PHYS_VIRT的作用就是实现同一kernel image被加载到不同物理地址后仍然能够正常运行这一目的的。
__fixup_pv_table的实现很复杂,其核心思想:
每当在内核中调用 __virt_to_phys() 或 __phys_to_virt() 时,被替换成一段内联汇编代码(位于arch/arm/include/asm/memory.h)
然后连接器就会将section 切换到一个名为 .pv_table 的section 上,然后在该section 中添加一个指针,指向刚刚添加的汇编指令的位置
这就是说,.pv_table 接会扩展成一个指针的表格,指向所有这些内联汇编代码所在的位置。
在__fixup_pv_table过程中,会遍历整个pv_table 表格,取出每一个指针,检查指针所指位置的指令,然后利用物理和虚拟内存之间的偏移量对这些指令打补丁。 

Patching phys to virt

4 检验

根据我们前面随机取的几4个取样点:

序号虚拟地址vmlinux内容板端内容
10xc0017f700x40010x4000
20xc00d21540x43010x4300
30xc00e895e0x40010x4000
40xc02852ca0x41010x4100

 0xc0017f70

 对应代码:

0xc00d2154

对应代码:

0xc00e895e

0xc02852ca

以上4个随机取样点,均验证被修改的代码确实都与pv_table有关,可以证实这些被修改的内容是在__fixup_pv_table过程中修改的。 

5 参考文档

  1. How the ARM32 kernel starts — linusw
  2. 万字长文揭秘 ARM 32 内核是如何启动的!

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

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

相关文章

Java设计模式—组合模式(Composite Pattern)

组合模式(Composite),将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 public class CompositeTest {public static void main(String[] args){// 创建主菜单MenuComponent mainMen…

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址,若有就直接返回。若无,则本地DNS服务器当DNS的客户,向其它根域服务器发送报文查询IP地址,简单来说就是帮助主机查找IP,所以递归查询就在客户端…

纯C语言手搓GPT-2,前OpenAI、特斯拉高管新项目火了

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 「Real men program in C.」 众所周知,大语言模型还在快速发展,应该有…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台,互联网家政是继打车、外卖后的又一个风口,创业者众多,比如:58到家,天鹅到家等,o2o(Online To Offline)是将线下商务的机会与互联网…

el-table实现表格内部横向拖拽效果

2024.4.2今天我学习了如何对el-table表格组件实现内部横向拖拽的效果,效果: 代码如下: 一、创建utils/底下文件 const crosswise_drag_table function (Vue){// 全局添加table左右拖动效果的指令Vue.directive(tableMove, {bind: function…

C/C++如何快速学习?少走3年弯路

于我而言,最开始学习就是 C,除了计算机专业,其他专业可能学习的第一门编程语言为 C 语言,还是谭浩强爷爷那本,当时想着有点 C 基础,无外乎就是 C 语言的升级版,于是开启了 C 的路程。 语言这个…

归档模式下,物理删除数据文件的完全的恢复

归档模式下,物理删除数据文件的完全的恢复 1、实验环境 环境归档模式 SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /arch/archivelog Oldest online log seq…

【STL】stack与queue的底层原理及其实现

文章目录 stack的介绍库中stack的使用栈的模拟实现queue的介绍库中queue的使用queue的模拟实现 stack的介绍 (图片来自知乎) 1.stack是一种容器适配器,模拟了栈的数据结构。数据只能从一端进去,另一端出来(先进后出&am…

需求分析及设计定义

背景 经过不断的折腾,一切过程都是为了呈现输出,这个阶段就是要交付需求和方案的环节了,很多失败的项目就是上来就到这个环节,倒着捣鼓,先写个文档,做个原型,甚至提出方案,然后再和…

Microsoft Visio 参与者 [actor] - 人的形状图标

Microsoft Visio 参与者 [actor] - 人的形状图标 1. 更多形状 -> 搜索形状2. 参与者References 1. 更多形状 -> 搜索形状 2. 参与者 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【Node】Node的配置文件的使用,dotenv框架的使用

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:Node.js 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇…

CodeMirror使用: 编写一个在线编辑HTML、JS、CSS文件,网页的模板页面-初实现

前言:前几天编写一个UI模板控制的功能,根据上传的前端模板更换跳转入口主题页面;在编写的时候,突发奇想能不能在列表页面进行在线编辑刚刚上传的模板zip压缩包里的页面...于是经过学习研究有了这篇文章;当日记本一样记…

鸿蒙开发面向对象的面试题~

鸿蒙开发面向对象的面试题是近年来在软件开发领域中备受关注的话题。作为一种新兴的操作系统,鸿蒙系统的开发者需要具备扎实的面向对象编程知识和丰富的开发经验。在面试中,面试官常常会通过一系列的问题来考察面试者对于鸿蒙开发面向对象的理解和应用能…

LeetCode 289.生命游戏————2024 春招冲刺百题计划

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 &am…

python-可视化篇-turtle-画爱心

文章目录 原效果替换关键字5为8,看看效果改下颜色 原效果 import turtle as tt.color(red,pink) t.begin_fill() t.width(5) t.left(135) t.fd(100) t.right(180) t.circle(50,-180) t.left(90) t.circle(50,-180) t.right(180) t.fd(100) t.pu() t.goto(50,-30) t…

[ritsec CTF 2024] 密码部分

这个比较密码这块还是比较简单的,经过问了N人以后终于完成。 [Warm Up] Words 给了个猪圈密码的图片,这东西好久不见的感觉。 [Warm Up] Emails MTP似乎也没多好的方法,猜更快,先给了几封email然后一个用MTP长度是32&#xff08…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景,博主所在的业务组有一个核心系统,需要同步两个不同数据源给过来的数据到redis中,但是每次同步之前需要过滤掉一部分数据,只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

MYSQL 8.0版本修改用户密码(知道登录密码)和Sqlyog错误码2058一案

今天准备使用sqlyog连接一下我Linux上面的mysql数据库,然后就报如下错误 有一个简单的办法就是修改密码为password就完事!然后我就开始查找如何修改密码! 如果是需要解决Sqlyog错误码2058的话,执行以下命令,但是注意root对应host是不是loca…

python的下载及安装

python的下载及安装 1,https://www.python.org 百度直接搜索python官网 2, 3,选择路径下载后,双击你下载的那个电脑图标应用程序 4. 1)勾选Add Python 3.6 to PATH是把Python的安装路径添加到系统环境变量的Path变…

关于Ansible模块 ④

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》与《关于Ansible的模块 ③》之后,继续学习ansible常用模块之…