如何解释反汇编的 MIPS 代码?

逆向工程 拆卸 部件 linux 嵌入式 米普
2021-06-18 10:33:50

我用原始操作码反汇编了 MIPS 二进制文件。例如,如何解释这些行:

Disassembly of section .data:

00000000 <.data>:
    ... ...
    f864:   30a5ffff    sd  ra,-23248(ra)
    f868:   00804021    addi    zero,t2,-32768
    f86c:   10a00017    bnez    t8,0xffff78b0
    f870:   00004821    addi    t0,t2,0

和这 3 行:

25b8:   8c670000    syscall 0x19e
25bc:   8c680004    bltz    zero,0x1c7f0
25c0:   8c690008    j   0x1a630

每列中的平均数据是什么?

编辑:这些文件是 SPI 闪存区域的内存(十六进制)内容,转换为二进制形式 (.bin) 使用xxd -rfile命令将 file.bin 的文件类型确定为data文件类型。

我尝试将二进制转换为ELF

mips-linux-gnu-objcopy -I binary -O elf32-little --rename-section .data=.text --change-address +0x80000000 file.bin file.elf

然后反汇编一个 ELF文件

mips-linux-gnu-objdump -m mips -D file.elf

2个回答

.data 部分被映射到不可执行数据段这是因为它不包含可执行代码;相反,它包含数据(因此得名)。因此,当这些数据被当作代码处理并反汇编时,结果将没有意义。

列如下所示:

  address| bytes     | disassembly
---------|-----------|--------------------------
    f864:|  30a5ffff |  sd  ra,-23248(ra)

地址通常对应于结构化文件格式(例如 ELF)的执行地址,但对于原始二进制文件,它与纯文件偏移量相匹配(即假设文件在 0 处加载)。如果你想假装你的文件是在另一个地址加载的,你可以将--adjust-vma=OFFSET标志传递objdump.

.text在输出中看不到,因为原始二进制文件没有描述其结构的节头,因此objdump组成了一个伪节.data来表示文件的内容。通常数据段是不反汇编的,所以需要使用-D而不是-d强制反汇编。

您引用的反汇编看起来很荒谬,因此您可能将数据与代码混合在一起(嵌入式固件中的常见情况),或者二进制文件不是 MIPS 代码而是其他一些体系结构。

8c6700008c6700048c670008在第二个片段实际上看起来像我的地址表,所以也许它的数据。您需要查看反汇编并从代码中整理出数据。