IDA 中的内存段 - ARM 内核

逆向工程 linux 内核模式 分割
2021-06-20 10:08:09

我刚刚将 ARM 内核映像加载到 IDA 中。当我启动 ARM 内核并检查内核符号时,我可以看到以下内容:-

/ $ cat /proc/kallsyms | head -n 10
00000000 t __vectors_start
80008240 T asm_do_IRQ
80008240 T _stext
80008240 T __exception_text_start
80008244 T do_undefinstr
80008408 T do_IPI
8000840c T do_DataAbort
800084a8 T do_PrefetchAbort
80008544 t gic_handle_irq
800085a0 T secondary_startup

当我将内核映像加载到 IDA 中时,我会看到带有加载在 0x8000 处的内存段的函数。由于内核符号不存在于 ARM 内核中,这使得分析变得困难。

如何将我在 ARM 映像中看到的地址(我在 Qemu 中运行它,并且可以使用 gdb-multiarch 调试内核)与我在 IDA 中看到的地址进行映射?我猜想重新调整.textIDA 中部分将是要走的路。如果是这样,我怎样才能找到我必须重新定位该段的地址?

1个回答

我想出了一个解决方案。这是我所做的。

  1. 将 /proc/kallsyms 的内容导出到文本文件。
  2. 从 zImage 内核文件中查找 gz 文件格式标头,将其复制并提取。将文件加载到 IDA。
  3. 由于该文件是二进制文件,您需要告诉 IDA 如何使用它。您将架构设置为 ARM(就像我的情况一样),将 RAM 段设置为在 0x80008000 处加载。
  4. 编写一个 IDApython 脚本来读取 [1] 中的文本文件并执行 MakeName(address, name)。