首页 > 解决方案 > 从 ELF ARM /bin 二进制文件中提取汇编指令

问题描述

我正在使用 QEMU 运行 ARM 虚拟机,我想从一些标准/bin函数(例如mount等)中反汇编字节码mkdir以获取汇编指令。

我所做的是首先做一个对象复制: objcopy -O binary --only-section=.text mkdir mkdir.bin 然后反汇编: objdump -m ARM -b binary -D mkdir.bin

但是,我得到的汇编代码是垃圾,有几个未定义的指令错误。我也尝试过反汇编强制拇指模式: arm-linux-gnueabi-objdump -m ARM -b binary -D -Mforce-thumb mkdir.bin 再一次,说明似乎是垃圾。

我所说的垃圾是指虽然在技术上是正确的,但毫无意义的指令。

我不知道为什么会这样,我不确定问题出在哪里。是错误的命令吗?我不应该期望得到 ARM 汇编指令吗?

注意:这是我安装 QEMU 的教程https://translatedcode.wordpress.com/2016/11/03/installing-debian-on-qemus-32-bit-arm-virt-board/

标签: assemblyarmqemu

解决方案


就试一试吧:

所以.s

.globl _start
_start:
add r0,r1,r2
add r1,r2,r3
ldr r3,=skip
bx r3
.word 0x12345678
.hword 0xaaaa
.thumb
.thumb_func
skip:
add r0,r1,r2
add r1,r2,r3

并尝试一下:

arm-linux-gnueabi-as so.s -o so.o
arm-linux-gnueabi-objdump -D so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:   e0810002    add r0, r1, r2
   4:   e0821003    add r1, r2, r3
   8:   e59f300c    ldr r3, [pc, #12]   ; 1c <skip+0x6>
   c:   e12fff13    bx  r3
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}

00000016 <skip>:
  16:   1888        adds    r0, r1, r2
  18:   18d1        adds    r1, r2, r3
  1a:   00000000    andeq   r0, r0, r0
    ...

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:   00001541    andeq   r1, r0, r1, asr #10
   4:   61656100    cmnvs   r5, r0, lsl #2
   8:   01006962    tsteq   r0, r2, ror #18
   c:   0000000b    andeq   r0, r0, fp
  10:   01080206    tsteq   r8, r6, lsl #4
  14:   Address 0x0000000000000014 is out of bounds.

是的,objdump 会反汇编所有内容,包括数据和其他部分,但是很好。注意它是如何得到拇指与手臂的......

也可以是链接的二进制文件。

arm-linux-gnueabi-ld -Ttext=0x8000 so.o -o so.elf
arm-linux-gnueabi-objdump -D so.elf

so.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_start>:
    8000:   e0810002    add r0, r1, r2
    8004:   e0821003    add r1, r2, r3
    8008:   e59f300c    ldr r3, [pc, #12]   ; 801c <skip+0x6>
    800c:   e12fff13    bx  r3
    8010:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
    8014:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}

00008016 <skip>:
    8016:   1888        adds    r0, r1, r2
    8018:   18d1        adds    r1, r2, r3
    801a:   80170000    andshi  r0, r7, r0
    ...

是的,这通常会是一团糟:

arm-linux-gnueabi-objcopy -O binary so.elf so.bin
arm-linux-gnueabi-objdump -m ARM -b binary -D so.bin

so.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   e0810002    add r0, r1, r2
   4:   e0821003    add r1, r2, r3
   8:   e59f300c    ldr r3, [pc, #12]   ; 0x1c
   c:   e12fff13    bx  r3
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}
  18:   000018d1    ldrdeq  r1, [r0], -r1   ; <UNPREDICTABLE>
  1c:   00008017    andeq   r8, r0, r7, lsl r0

它得到了正确的手臂,但不是拇指,而且不会。只做拇指,它会得到拇指,但不会得到手臂,永远不会。


推荐阅读