开启内核地址随机化KASLR后, qemu 调试 kernel 不能设置断点

2023-05-16

#1 问题: gdb 断点异常

这几天更新了 qemu, 然后在进行 gdb 调试的时候, 发现断点断不住了.
问题: gdb 断点异常

之前都是正常的, 从来没有出现过这种情况啊. 继续分析下看看是哪里出现的异常.

#2 原因分析

难道是 gdb 或者 QEMU 出现 BUG 了, 我们先看下断点的位置是否正确.

  • vmlinux 中符号的地址(gdb插入断点的位置)

gdb 是直接读取 vmlinux 中的符号的加载地址去添加断点的, 那么 0xffffffff81aa1800 应该就是 vmlinux 中 schedule 的函数地址

#objdump -d ./vmlinux| grep "<schedule>:"
ffffffff81aa1800 <schedule>:

问题1

可以看到没有问题, 但是为什么没有断到呢, 难道当前内核镜像中的地址不是这个么?

  • 当前内核镜像的符号地址
# cat /proc/kallsyms | grep -E " schedule$"
ffffffffb0ca1800 T schedule

图片3

  • 原因分析

schedule 在 vmlinux 镜像中的符号地址(ffffffff81aa1800)与 qemu 启动的内核中虚拟地址(ffffffffb0ca1800)不一样, 貌似发现问题所在了. 所以 gdb 根据 vmlinux 中的地址插入断点, 其实插入的位置并不是我们想要的, 这也就解释了为什么断点断不到.

可以看到两个地址刚好差了一个偏移 0x2f200000L.

图片4

这让我们想到了什么? 地址随机化?

内核启用 kaslr 这项特性之后, 内核启动时会随机化内核的各个 section 的虚拟地址(VA), 导致 gdb 断点设置在错误的虚拟地址上, 内核执行时就不会触发这些断点。

新版本的 qemu 竟然已经支持了地址随机化, 好事情.

#3 问题解决

##3.1 方法1 disable KASLR

最直接了当的方法(也是官方提供的方法) 是关闭地址随机化,

  • 重新编译内核关闭地址随机化
  • 或者在cmdline 里面直接添加 nokaslr

图片5

现在可以看到我们断点成功了, 内核的符号也没有偏移.

图片6

##3.2 方法2 重新加载内核镜像

###3.2.1 重新加载内核 text 段

我们找到内核加载的起始地址, 这个一般是 _text 符号的地址.

# echo 0x$(cat /proc/kallsyms | egrep -e "T _text$" | awk '{print $1}')
# cat /proc/kallsyms | grep -E " _text$"
ffffffff9ee00000 T _text

# cat /proc/kallsyms | grep -E " schedule$"
ffffffff9f8a1800 T schedule

此时 KASLR 的偏移量为 0xffffffff9ee00000 - 0xffffffff81000000 = 0x1de00000L

然后通过 add-symbol-file 将 vmlinux 的起始地址指定到 0xffffffff9ee00000 位置处.

add-symbol-file ./vmlinux 0xffffffff9ee00000

图片7

可以看到断点断到了实际位置.

但是由于开启 KASLR 之后内核各个段的地址都是分别映射的, 这段我们只重新指定了内核代码段的位置.

###3.2.2 进阶用法

objdump -h ./vmlinux | grep -E " .text| .data "
  0 .text 00e010f1 ffffffff81000000 0000000001000000 00200000 2**12
 11 .data 0014c540 ffffffff82400000 0000000002400000 01600000 2**13

之前算出来 KASLR 的偏移是 0x1de00000L, .data 在 vmlinux 中的地址为 0xffffffff82400000, 加上偏移后实际的加载地址就是 0xffffffffa0200000. 这个地址就是 init_stack 的地址

使用 add-symbol-file 指定其他段(比如 data) 的地址.

# add-symbol-file ./vmlinux 0xffffffff9ee00000 -s .data 0xffffffffa0200000

add symbol table from file "./vmlinux" at
 .text_addr = 0xffffffff9ee00000
 .data_addr = 0xffffffffa0200000
(y or n) y
Reading symbols from ./vmlinux...done.

但是如此读取后, 再去读取数据段的值, 依旧失败, gdb 还是寻找错误的地址.
我们在 StackOverFlow 中找到了类似的例子, GDB can’t load kernel symbol correctly with KASLR enabled

图片8

这个感觉应该是 gdb 的问题, 记录在此, 等待问题解决后, 更新

#4 参考资料

gdb-qemu-cant-put-break-point-on-kernel-function-kernel

gdb-kernel-debugging

Using kgdb, kdb and the kernel debugger internals

Commands to specify files

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开启内核地址随机化KASLR后, qemu 调试 kernel 不能设置断点 的相关文章

  • ubuntu 20.04安装mysql 8.0.28

    最近在ubuntu20 04安装配置mysql 8 0 28 时遇到了一点小麻烦 xff0c 而这些问题应该是高手不屑一顾 xff0c 而新手又无从下手的 xff0c 现在我把我的解决过程写下来 xff0c 以备后用 1 安装 span c
  • 手写插件:使 Chrome 增加 右键菜单项 实现多搜索

    参考 xff1a https www cnblogs com kevin Y p 10119838 html 1 随地创建一个文件包并命名 2 文件包内创建以下文件 xff1a 2 1 manifest json 34 manifest v
  • Mac上使用clion基于cmake 开发gtk gtk+

    gtk gtk 43 度娘介绍 xff1a GTK 43 xff08 GIMP Toolkit 是一套源码以LGPL许可协议分发 跨平台的图形工具包 最初是为GIMP写的 xff0c 已成为一个功能强大 设计灵活的一个通用图形库 xff0c
  • Mac上使用clion基于cmake 开发qt

    安装软件 清华 在线安装的qt安装器 https mirror tuna tsinghua edu cn qt archive online installers 3 0 里面选择项如下 xff1a 红色区域必选一项 xff0c 紫色区域自
  • docker make

    FROM debian 10 RUN apt get update amp amp apt get install y no install recommends curl python3 vim python3 distutils sql
  • U-SEM体验模型——让游戏交互设计的维度更加清晰

    U SEM体验模型 让游戏交互设计的维度更加清晰 U SEM体验模型 让游戏交互设计的维度更加清晰游戏交互设计的定位游戏交互设计的场景游戏对玩家输出玩家对游戏输入 游戏交互体验的维度 U SEM体验模型游戏交互的复杂度游戏交互设计的应用 游
  • Android 12 WiFi 连接状态轮转

    WiFi 学习资料整理 gt nbsp nbsp Android WiFi 目录 WiFi 学习资料整理 gt nbsp nbsp Android WiFi 1 nbsp WifiClientModeImpl和WPA Supplicant状
  • 扩展卡尔曼滤波(EKF)算法详细推导及仿真(Matlab)

    扩展卡尔曼滤波 xff08 EKF xff09 算法详细推导及仿真 xff08 Matlab xff09 扩展卡尔曼滤波算法是解决非线性状态估计问题最为直接的一种处理方法 xff0c 尽管EKF不是最精确的 最优 滤波器 xff0c 但在过
  • Linux中线程的同步与互斥、生产者消费模型和读者写者问题、死锁问题

    线程的同步与互斥 线程是一个存在进程中的一个执行控制流 xff0c 因为线程没有进程的独立性 xff0c 在进程内部线程的大部分资源数据都是共享的 xff0c 所以在使用的过程中就需要考虑到线程的安全和数据的可靠 不能因为线程之间资源的竞争
  • 解决The following packages have unmet dependencies问题!!!

    1 安装包的时候出现如下情况 xff08 缺少依赖 xff09 xff1a 2 解决方案 xff1a 尝试多种方法无果 xff0c 最终借助一个强大的包管理工具 xff08 aptitude xff09 终于成功了 xff01 xff01
  • linux的开机过程

    1 主机加电自检 xff0c 加载 BIOS 硬件信息 2 读取 MBR 的引导文件 GRUB LILO 3 引导 Linux 内核 4 运行第一个进程 init 进程号永远为 1 5 进入相应的运行级别 6 运行终端 xff0c 输入用户
  • Ubunt 20.04 使用CDROM或ISO作为安装源

    有些项目由于安全性的要求 xff0c 需要部署在没有互联网环境的内网中 xff0c 那么如何在离线环境中给ubuntu安装相关的软件就是考验大家的linux基础知识的时候了 本文就带领大家利用CDROM或者挂载ISO镜像两种方式配置ubun
  • 关于Intellij idea 报错:Error : java 不支持发行版本5的问题

    在Intellij idea中新建了一个Maven项目 xff0c 运行时报错如下 xff1a Error java 不支持发行版本5 本地运行用的是JDK9 xff0c 测试Java的Stream操作 xff0c 报错应该是项目编译配置使
  • Spring之配置类源码深度解析

    这篇文章是继 Spring之启动过程源码解析之后 xff0c 对Spring启动过程中用到的几个重要的方法进行详细的解读 目录 一 invokeBeanFactoryPostProcessors xff0c 执行BeanFactoryPos
  • 20210702剑指Offer03(数组中重复数字)

    找出数组中重复的数字 输入 xff1a 2 3 1 0 2 5 3 输出 xff1a 2 或 3 span class token keyword class span span class token class name Solutio
  • react异步数据如ajax请求应该放在哪个生命周期?

    对于同步的状态改变 xff0c 是可以放在componentWillMount xff0c 对于异步的 xff0c 最好好放在componentDidMount 但如果此时有若干细节需要处理 xff0c 比如你的组件需要渲染子组件 xff0
  • RabbitMQ exchange交换机机制

    目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding xff1f Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机R
  • 解决open-vm-tools无法复制粘贴文件问题

    在使用vmware kali linux时一直忍受着一个情况 xff1a open vm tools Error when getting information for file 34 tmp VMwareDnD 3jTONh xxx N
  • mipmap 和 drawable 的区别

    Android 在 API level 17 加入了 mipmap 技术 xff0c 对 bitmap 图片的渲染支持 mipmap 技术 xff0c 来提高渲染的速度和质量 mipmap 是一种很早就有的技术了 xff0c 翻译过来就是纹
  • LSTM与GRU

    LSTM 与 GRU 一 综述 LSTM 与 GRU是RNN的变种 xff0c 由于RNN存在梯度消失或梯度爆炸的问题 xff0c 所以RNN很难将信息从较早的时间步传送到后面的时间步 LSTM和GRU引入门 xff08 gate xff0

随机推荐

  • Pytorch 实战RNN

    一 简单实例 span class token comment coding utf8 span span class token keyword import span torch span class token keyword as
  • Pytorch : Dataset和DataLoader

    一 综述 Dataset 对数据进行抽象 xff0c 将数据包装为Dataset类 DataLoader 在 Dataset之上对数据进行进一步处理 xff0c 包括进行乱序处理 xff0c 获取一个batch size的数据等 二 Dat
  • 特征工程

    一 数据读取 1 1 读取CSV文件 1 1 1 原文件内容 1 1 2 读取csv span class token keyword import span csv csv file span class token operator 6
  • 代码命名规范

    代码命名规范 现在是2016年12月30日中午12点35分 xff0c 这是我第一次写博客 xff0c 用的是markdown编辑器 xff0c 还不太会用 今天就先简单的写一下 xff0c 看看写出来的效果是什么样的 xff01 xff0
  • Ubuntu18.04 离线安装nginx

    由于服务器位于内网环境且无法访问互联网 xff0c 需要离线安装nginx xff0c ubuntu18 04离线安装软件也并不复杂 xff0c 只是需要较大的耐心去搜集所需的包 xff0c 不过大家不用担心 xff0c 我已经为大家准备好
  • easyui combobox动态绑定数据

    1 jsp上的写法 lt input span class hljs keyword class span 61 span class hljs string 34 easyui combobox 34 span id 61 span cl
  • Echarts(二、柱状图(各参数详细描述))

    1 jsp页面 span class hljs tag lt span class hljs title body span gt span span class hljs tag lt span class hljs title div
  • js中级脚本算法

    1区间求值算法挑战 span class hljs function span class hljs keyword function span span class hljs title sumAll span span class hl
  • 常用easyUI -icon 图标

    1 样式 代码 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt Ea
  • vue与后台交互数据(vue-resource)

    需要引入库 xff1a vue resource lt script src 61 34 https cdn jsdelivr net vue resource 1 0 3 vue resource min js 34 gt lt scri
  • Tensorflow——jupyter notebook调用某个库时,出现找不到这个库情况的解决方案

    1 激活tensorflow环境 终端下输入 xff1a source activate tensorflow 2 进入jupyter notebook 出现如下问题 xff1a 没有找到matplotlib库 3 解决方法 在tensor
  • 组合排序题目汇总(排列组合、卡特兰数和递归思想)

    组合排序题目汇总 排列组合矩阵走法A必须在B左边站队互不相邻站队分糖果球放入桶吃糖 卡特兰数括号匹配进出栈顺序 售票顺序二叉树不同的结构数高矮排列 递归思想信封装信 排列组合 矩阵走法 在6 9的方格中 xff0c 以左上角为起点 xff0
  • java.lang.IllegalStateException 错误原因及解决方法小记

    java lang IllegalStateException Cannot perform this operation because the connection pool has been closed at android dat
  • 架构设计三原则

    1 简单原则 xff1b 分析完业务场景的结构复杂性和逻辑复杂性后 xff0c 从业务场景和解决问题的角度出发 xff0c 选择和设计能够满足需求的方案 在简单架构和复杂架构都能满足要求的时候 xff0c 优先选择简单架构 xff0c 因为
  • mybatis的resultMap property爆红

    span class token tag span class token tag span class token punctuation lt span resultMap span span class token attr name
  • Ubuntu20.04 rc-local 配置开机自启动脚本

    1 rc local服务简介 Linux中的rc local服务是一个开机自动启动的 xff0c 调用开发人员或系统管理员编写的可执行脚本或命令的 xff0c 它的启动顺序是在系统所有服务加载完成之后执行 ubuntu20 04系统已经默认
  • zynq7000 linux axi-gpio驱动:重置axi-gpio驱动方法

    linux gpio 从内核空间导出到用户空间 petalinux 在制作 Linux 系统时 xff0c 会自动的将 gpio 从内核空间导出到用户空间 xff0c 在用户空间下可以通过 sysfs 方式控制 gpio xff1b 用户空
  • AndroidManifest的理解

    最近做二次开发 xff0c 修改别人代码的时候发现清单文件中多了很多奇怪的属性和标签 xff08 自己以前没见过的 xff09 xff0c 在不明白的情况下直接开发出现了很多奇怪的问题 所以痛下决心 xff0c 重新复习下这些基础知识 以下
  • 使用 zsh 后HOME/END 键以及小键盘失效

    1 问题描述 zsh是一款超赞的shell工具 xff0c 但是配置复杂 xff0c 有个闲着没事的程序员 xff0c 弄了一个开源项目 robbyrussell oh my zsh 截止目前 xff0c 58 8k 43 star就知道有
  • 开启内核地址随机化KASLR后, qemu 调试 kernel 不能设置断点

    1 问题 gdb 断点异常 这几天更新了 qemu 然后在进行 gdb 调试的时候 发现断点断不住了 之前都是正常的 从来没有出现过这种情况啊 继续分析下看看是哪里出现的异常 2 原因分析 难道是 gdb 或者 QEMU 出现 BUG 了