在处理这个内核模块时,我注意到 IDA 以某种方式静态地解决了一些 ELF 重定位。考虑符号sys_renameat,其中,根据IDA,驻留在0x8000720在.bss段。
对应于mov指令的原始十六进制字节0x800328是A3 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 是否正确解决了重定位问题/如果是这样,有人可以解释一下这种行为吗?


