IDA 是否正确解析 ELF 重定位?

逆向工程 艾达 小精灵
2021-06-28 09:39:27

在处理这个内核模块时,我注意到 IDA 以某种方式静态地解决了一些 ELF 重定位。考虑符号sys_renameat,其中,根据IDA,驻留在0x8000720.bss段。

在此处输入图片说明

对应于mov指令的原始十六进制字节0x800328A3 20 07 00 08

但是,使用十六进制编辑器查看该特定偏移量处的字节会显示A3 00 00 00 00. 显然,IDA 正在以某种方式解决重定位问题。

在此处输入图片说明

readelf -r rootkit 证实了这一点。

Relocation section '.rel.init.text' at offset 0x119c contains 26 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
.
00000059  00001701 R_386_32          00000000   sys_renameat
.

返回的符号信息 readelf -s rootkit

Symbol table '.symtab' contains 44 entries:
Num:    Value  Size Type    Bind   Vis      Ndx Name
.
23: 00000000     4 OBJECT  GLOBAL DEFAULT   15 sys_renameat
.

但是,如果我strip使用二进制文件,IDA 突然无法再解析(处的mov指令0x800328)重定位。

在此处输入图片说明

我的理解是,解决动态重定位从不依赖于strip删除的符号信息我试图计算 IDA 如何根据ELF 规范计算R_386_32类型重定位,但无法弄清楚发生了什么。sys_renameat

在这种情况下,IDA 是否正确解决了重定位问题/如果是这样,有人可以解释一下这种行为吗?

1个回答

Linux 内核模块不是共享对象,也不使用动态重定位,尽管它们可能看起来有点相似。

file

rootkit:ELF 32 位 LSB可重定位,Intel 80386,版本 1 (SYSV),BuildID[sha1]=5552f893cf02ce13e9a183af3b6717e884493ead,未剥离

readelf -h

Type: REL (Relocatable file)

所以它是一个可重定位的对象,通过剥离它,您可以删除其功能所需的信息。

Linux 可加载内核模块 HOWTO

Linux 2.4 和 Linux 2.6 之间发生这种重定位的方式有着根本的不同。在 2.6 中,insmod几乎只是将 LKM 文件(.ko 文件)的逐字内容传递给内核,然后内核进行重定位。

关于 IDA 的搬迁决议:

由于符号的真实地址直到运行时才知道,但用户希望在反汇编中看到好的名称,IDA 的 ELF 加载器创建了一个假段(“extern”)并用外部符号的占位符填充它。然后修补可重定位的字节以指向那些假符号。