“readelf”和“radare2”地址之间的区别

逆向工程 小精灵 雷达2 地址
2021-07-02 22:34:29

我有一个要分析的 MIPS 二进制文件。我在理解 elfread 和 r2 从二进制文件中解释寻址方案的方式时遇到了一些麻烦。

例如, r2 查找名为bcmVlan_setDefaultActionlocation的函数0x0800d318

[0x0800fbb8]> s sym.bcmVlan_setDefaultAction  
[0x0800d318]>

而根据 .symtab 表,此函数位于 0x0000d2c8

$ readelf -a bcmvlan.ko | grep bcmVlan_setDefaultAction
123: 0000d2c8   616 FUNC    GLOBAL DEFAULT    2 bcmVlan_setDefaultAction

我也尝试了一些其他功能。readelf 和 r2 显示的地址似乎是相关的,但我找不到为什么会存在这种差异。

问候。

1个回答

.symtab

readelf ( .symtab)的符号表显示了每个符号相对于该符号所在节的基址的偏移量。

正如您向我们展示的那样,当您列出表格时,您会得到类似的信息:

$ readelf --symbols <filename>
Symbol table '.symtab' contains 471 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 SECTION LOCAL  DEFAULT    2
     2: 00000000     0 SECTION LOCAL  DEFAULT    4
     3: 00000000     0 SECTION LOCAL  DEFAULT    6
     4: 00000000     0 SECTION LOCAL  DEFAULT    8
     5: 00000000     0 SECTION LOCAL  DEFAULT   10
     6: 00000000     0 SECTION LOCAL  DEFAULT   12
       ...    ... Truncated for readability ...   ...
   462: 0000d2c8   616 FUNC    GLOBAL DEFAULT    2 bcmVlan_setDefaultAction

有一个专栏让我们特别感兴趣,那就是Ndx专栏。readelf通过整数索引标识每个部分。这就是 Ndx 所代表的意思。的输出.symtab显示我们的函数bcmVlan_setDefaultAction属于 Ndx 编号 2。

节表

要查看哪个部分的索引号为“2”,您应该执行:

$ readelf --sections <filename>

当您执行它时,您可能会看到如下内容:

There are ?? section headers, starting at offset 0x????:
Section Headers:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] <section name>    <type>          00000000 0000?? 0000?? ??   A  0   0  4
  [ 2] .text             <type>          00000000 000050 00???? 00  AX  0   0 16

您的函数可能位于.text其基地址(Off列)所在的部分0x000050,即距文件开头的 0x50 字节。

然后,这一切都应该有意义,因为这是从您获得的地址中减去您获得的地址时readelf得到的radare2

0x0d318 - 0x0d2c8 = 0x50.