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

例如,r2在位置bcmVlan_setDefaultAction处找到一个名为0x0800d318的函数:位于0x0000d2c8

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


我也尝试了其他一些功能。看来readelf和r2所显示的地址是相关的,但我找不到为什么存在这种区别的原因。

评论

如果地址相关,则可能是由于基地址不同。请比较readelf -l <​​文件名>的输出。 grep LOAD到radare2的f〜LOAD0的输出。您还可以使用e bin.baddr检查雷达的基址。要重新设置基准,请使用r2 -B <0xaddr> <文件名>。

r2或readelf未找到“ LOAD”的实例。看来r2使用的基址是0x0800000。这解释了部分问题。顺便说一句,我发现您有关“ Gameboy”和“ Simple Crackme”的帖子非常有用和有趣。

谢谢!介意分享二进制文件吗?这将有助于我们更好地理解。

该文件实际上是用于MIPS体系结构的Linux内核模块(.ko)。我从路由器上拉了它。 “ modinfo”显示文件许可证为“专有”。我不确定是否可以分享。有什么主意吗?

#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。 br />
$ readelf --sections <filename>


执行它时,您可能会看到类似以下的内容:可能位于.text部分中,其基址(Off列)为0x000050,即从文件开头开始的0x50字节。从从readelf获得的地址中减去从radare2获得的地址:

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