【问题标题】:Extracting assembly instructions from ELF ARM /bin binaries从 ELF ARM /bin 二进制文件中提取汇编指令
【发布时间】:2020-04-25 14:40:30
【问题描述】:

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

我所做的是首先做一个对象复制: 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/ 所遵循的教程

【问题讨论】:

  • 尝试objdump -d binary,其中binary 是您拥有的二进制文件。 objdump 理解 ELF 二进制文件。无需先将它们转换为不同的格式。
  • 请注意,ARM 二进制文件通常包含散布着代码的文字池。如果缺少适当的元数据(例如,如果二进制文件被剥离),则 objdump 无法将它们与指令区分开来,并会尝试反汇编它们,从而导致无意义的结果。您需要手动猜测什么是文字池,什么不是。
  • @old_timer 你确定吗?根据我对 ELF 的理解,它遵循带有部分的结构。该命令的目的是提取应该是代码的 .text 部分(例如,参见 ELF wiki 页面:en.wikipedia.org/wiki/Executable_and_Linkable_Format#/media/…)。 /bin 中的大多数文件实际上不是二进制文件,而是 ELF
  • @Dominus 这通常很容易看到,因为出来的说明通常相当荒谬。
  • @Dominus objdump 理解 ELF。使用选项-d 它只反汇编那些通常包含代码的部分。无需先提取部分。

标签: assembly arm qemu


【解决方案1】:

试试吧:

所以.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

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

【讨论】:

  • 试试-d 而不是-D
  • 如果您想查看其他部分,为什么不-sd。无论如何,拆卸它们并没有多大意义。
  • 很好,我会尝试对 -D 非常满意 15-20 年,只有 x86 是我对 -D 有问题的地方,所以会在那里尝试。
  • 你可以在 OP 选择这个之前用 -d 得到你的答案,你仍然可以把你的答案放进去,OP 可以改变他们的选择。
  • 你的回答已经很好了。除了我评论的内容之外,我没有什么可以补充的。
猜你喜欢
  • 2014-12-27
  • 2016-11-07
  • 1970-01-01
  • 2016-10-28
  • 2017-01-25
  • 2016-07-06
  • 2017-07-11
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多