Извлечение инструкций по сборке из ELF ARM / bin bin - PullRequest
0 голосов
/ 25 апреля 2020

Я использую виртуальную машину ARM, используя QEMU, и я хотел разобрать байт-код из некоторых стандартных функций /bin, таких как mount, mkdir et c, чтобы получить инструкции по сборке.

Сначала я сделал копию объекта: objcopy -O binary --only-section=.text mkdir mkdir.bin Затем дизассемблировал: objdump -m ARM -b binary -D mkdir.bin

Однако полученный код сборки - rubbi sh, с несколькими неопределенными ошибками инструкций. Я также попытался разобрать форсированный режим большого пальца: arm-linux-gnueabi-objdump -m ARM -b binary -D -Mforce-thumb mkdir.bin И здесь снова инструкции вроде rubbi sh.

Что я имею в виду под rubbi sh - это инструкции, которые, хотя и технически правильны, не имеет смысла.

Я заблудился относительно того, почему это происходит, и я не уверен, откуда возникла проблема. Это команды, которые не так? Разве я не ожидаю получить инструкции по сборке ARM?

Примечание. Это руководство, которому я следовал при установке QEMU https://translatedcode.wordpress.com/2016/11/03/installing-debian-on-qemus-32-bit-arm-virt-board/

1 Ответ

2 голосов
/ 25 апреля 2020

Просто попробуйте ....

so.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

он получил правильные руки, но не большие, и не будет. сделай это большим пальцем только он получит большой палец, а не руку и никогда не будет ...

...