Ghidra 在这个反汇编中使用这个字节的任何原因?

逆向工程 拆卸 米普 吉德拉
2021-07-05 10:57:09

我正在浏览一些 PS2 ELF,我发现了一个奇怪的问题,其中 Ghidra 似乎出于某种原因将该字节的值加倍。

以下是 Ghidra 展示的内容:

                             undefined Money_get()
             undefined         v0_lo:1        <RETURN>
                             Money_get                    XREF[1]:   Entry Point(*)
001bcb90 ec 00 01 3c     lui        at,0xec
001bcb94 98 00 03 3c     lui        v1,0x98
001bcb98 e8 aa 25 8c     lw         a1,-0x5518(at)=>DAT_00ebaae8

以及 IDA 显示的内容:

main:001BCB90 Money_get:                          # CODE XREF: plmove_find_02+178↑p
main:001BCB90                                     # Item_get+70↑p
main:001BCB90                 lui     $at, 0x76
main:001BCB94                 lui     $v1, 0x98
main:001BCB98                 lw      $a1, 0x7657A8

IDA 显示的是正确的反汇编。第一行应该是

lui $at, 0x76  

但出于某种原因,Ghidra 已将 0x76 加倍到 0xEC。因此,第 3 行加载的地址不正确。我已经仔细检查过输入文件是否相同,我知道 IDA 是正确的,因为这个特定游戏的 gameshark 代码修改了该地址。

我什至在十六进制编辑器中确认该字节应该是 0x76,但在 Ghidra 自己的十六进制输出中,它显示为 0xEC。因此,在输入期间,出于某种原因,它会加倍。

那么 Ghidra 这样做的原因是什么?我尝试重新加载文件并作为通用 MIPS 进行分析(认为它是我使用的 PS2 ELF 加载器)并且它做了同样的事情。

所以我做了一些更多的测试,当我去除 ELF 标头并将文件作为原始二进制文件加载时,Ghidra 正确加载它。所以我想知道 ELF 标头中的什么会导致 Ghidra 修改该字节?

1个回答

这与 Ghidra 处理重定位的方式有关。SLUS_204.99禁用以下处理器选项和重定位的情况下加载二进制文件。

Processor: MIPS
Variant: 64-32addr
Size: 32
Endian: little
Compiler: default

在此处输入图片说明

拆解和IDA一样。

在此处输入图片说明


usingreadelf表明R_MIPS_26在所述地址处有类型的重定位

$  mipsel-linux-gnu-readelf --relocs SLUS_204.99 | grep "Money_get"

 Offset     Info    Type            Sym.Value  Sym. Name

...

0014b3b8  004add04 R_MIPS_26         001bcb90   Money_get
001bc290  004add04 R_MIPS_26         001bcb90   Money_get
011432c8  004add04 R_MIPS_26         001bcb90   Money_get
01144af0  004add04 R_MIPS_26         001bcb90   Money_get
01144b0c  004add04 R_MIPS_26         001bcb90   Money_get
01145090  004add04 R_MIPS_26         001bcb90   Money_get
01145204  004add04 R_MIPS_26         001bcb90   Money_get
0114527c  004add04 R_MIPS_26         001bcb90   Money_get
01145ae8  004add04 R_MIPS_26         001bcb90   Money_get
01145b24  004add04 R_MIPS_26         001bcb90   Money_get
01145b68  004add04 R_MIPS_26         001bcb90   Money_get
01145b9c  004add04 R_MIPS_26         001bcb90   Money_get
01140e3c  004add04 R_MIPS_26         001bcb90   Money_get
01140e5c  004add04 R_MIPS_26         001bcb90   Money_get
010063d4  004add04 R_MIPS_26         001bcb90   Money_get
01006bfc  004add04 R_MIPS_26         001bcb90   Money_get
010081e4  004add04 R_MIPS_26         001bcb90   Money_get
0102b93c  004add04 R_MIPS_26         001bcb90   Money_get
0102c454  004add04 R_MIPS_26         001bcb90   Money_get
0102d3e8  004add04 R_MIPS_26         001bcb90   Money_get
0102dc90  004add04 R_MIPS_26         001bcb90   Money_get
...

所以错误很可能出现在处理 type 重定位代码R_MIPS_26