我在四处查看一些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。因此,第三行中加载的地址不正确。我已经仔细检查了输入文件是否相同,并且我知道IDA是正确的文件,因为此特定游戏的游戏代码会修改该地址。

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

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

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

评论

我对mips格式并不完全熟悉,但是您检查过堆栈大小吗?还可以期待吗?

可以共享文件吗?

由于它已受版权保护,所以我认为我不能上传它。但这是PS2的《火龙之息呼吸区》的主要可执行文件。游戏光盘根目录上的文件名为SLUS_204.99。 PS2游戏是光盘上的标准ELF,但我之所以特别使用它,是因为它们出于某种原因将调试符号保留在可执行文件中。

#1 楼

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

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




反汇编与IDA相同。




使用readelf表示在该地址存在R_MIPS_26类型的重定位。 />因此,在处理R_MIPS_26类型的重定位的代码中可能会出现错误。