小编col*_*cc8的帖子

跟踪和反汇编与内核映像文件不匹配的 Linux 内核指令

我正在尝试验证和理解在模拟框架中执行的指令。模拟步骤如下:

  1. 在主机 x86 机器中使用 gcc(带有 -fPIC 标志)交叉编译二进制文件
  2. 然后将二进制文件移动并在名为 SimNow 的虚拟机 x86 中执行(AMD 用于测试其处理器)
  3. SimNow 机器生成一个已执行指令列表,这些指令将传递给框架,其中包括有关每条指令的信息:虚拟地址、物理地址、大小、操作码。
  4. 由于使用 x86 反汇编器(名为 distorm),该框架生成了执行指令的跟踪,包括助记符和操作数。这是跟踪输出的示例: 在此处输入图片说明

执行指令列表包括包含在二进制和可能的内核指令中的指令。

我正在通过使用二进制文件上 objdump 的输出来验证跟踪的用户指令。它们是相等的,确认了执行的正确性。

这是上图中指令的 objdump 输出:

在此处输入图片说明

对于内核指令,我必须应用初步步骤:

  1. 我将内核头文件安装到虚拟机中,并提取了 linux 映像以在其上执行 objdump。
  2. 我通过将内核指令的虚拟地址与 /proc/kallsysms 中包含的虚拟地址进行比较,将内核符号添加到跟踪输出中。

对于验证步骤,我使用与用户指令相同的方法,将 linux 内核映像的 objdump 与跟踪输出进行比较。但是,我注意到了一些差异……主要是在发现内核符号指令时。这是跟踪的输出:

在此处输入图片说明

这是 linux 内核映像的对应部分:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

从这些图片中可以看出,每个对应于内核符号的 callq(将 linux 映像的虚拟地址与 /proc/kallsyms 进行比较)在跟踪输出中被替换为 NOP DWORD(nopl 指令)。

我想要做的是理解为什么内核符号有一个 NOP DWORD 而不是 callq 。

是因为搬家吗?如果是,我如何重建此类指令的重定位?

注意:我使用 objdump-dr来检查 Linux 映像上的重定位,但输出没有改变。

我的内核指令验证方法错误?

x86 assembly trace gcc linux-kernel

4
推荐指数
1
解决办法
99
查看次数

标签 统计

assembly ×1

gcc ×1

linux-kernel ×1

trace ×1

x86 ×1