Распаковать ELF-движок без заголовков секций (только заголовки программ) с использованием objdump

Вопрос или проблема

У меня есть ELF-файл, который содержит только два сегмента LOAD в таблице заголовков программы: один для кода и один для данных. readelf -a говорит мне, что нет заголовков секций.

Если я попытаюсь дизассемблировать ARM бинарник на своем amd64 компьютере с помощью кросс-компиляторов ARM, он не даст мне правильного вывода. Однако, насколько я понимаю, архитектура бинарника не имеет отношения к этому вопросу, так как проблема связана с ELF.

$ file ./binary
./binary: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), статически связанный, обрезанный

$ arm-linux-gnueabi-objdump -d ./binary 

./binary:     file format elf32-littlearm

$ arm-linux-gnueabi-objdump -x ./binary 

./binary:     file format elf32-littlearm
./binary
architecture: arm, flags 0x00000102:
EXEC_P, D_PAGED
start address 0x0004c8d8

Program Header:
    LOAD off    0x00000000 vaddr 0x00010000 paddr 0x00010000 align 2**16
         filesz 0x0003d27e memsz 0x0003d27e flags r-x
    LOAD off    0x00005c78 vaddr 0x00085c78 paddr 0x00085c78 align 2**16
         filesz 0x00000000 memsz 0x00000000 flags rw-
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
         filesz 0x00000000 memsz 0x00000000 flags rw-
private flags = 5000400: [Version5 EABI] [hard-float ABI]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
SYMBOL TABLE:
no symbols

Есть ли способ заставить objdump дизассемблировать ELF-сегменты?

Тем, кто столкнулся с этой проблемой, как и я, можно обойти отсутствие секций, указав целевую платформу как двоичный исполняемый файл с заданной архитектурой; пример с кросс-компиляторами x86_64, пытающимися дизассемблировать исполняемый файл i386:

x86_64-elf-objdump -D -b binary -mi386 <файл>

Ответ или решение

Как дизассемблировать ELF бинарный файл без заголовков секций с помощью objdump

Работа с ELF бинарными файлами может быть сложной задачей, особенно когда отсутствуют заголовки секций. Давайте разберемся, как можно выполнить дизассемблирование таких файлов, используя objdump, и что нужно учитывать в процессе.

Проблема

Вы столкнулись с ELF бинарным файлом, который содержит только два сегмента LOAD в таблице заголовков программы: один для кода и один для данных. При попытке использовать objdump для дизассемблирования на вашей машине AMD64 с помощью ARM кросс-библиотек, не удается получить корректный вывод. Это связано с тем, что бинарный файл не включает заголовки секций, что делает типичные методы дизассемблирования неэффективными.

$ file ./binary
./binary: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, stripped

$ arm-linux-gnueabi-objdump -d ./binary 

./binary:     file format elf32-littlearm

$ arm-linux-gnueabi-objdump -x ./binary 

./binary:     file format elf32-littlearm
./binary
architecture: arm, flags 0x00000102:
EXEC_P, D_PAGED
start address 0x0004c8d8

Решение

Чтобы обойти отсутствие секций, можно указать objdump работать с бинарным файлом без секций, задав соответствующую архитектуру. Использование параметра -b binary вместе с правильной архитектурой позволит вам дизассемблировать код правильно. Ваша команда будет выглядеть следующим образом:

arm-linux-gnueabi-objdump -D -b binary -marm ./binary
  • -D — флаг для дизассемблирования всего файла.
  • -b binary — указывает, что файл нужно рассматривать как сырой бинарный файл.
  • -marm — указывает архитектуру, которую нужно использовать для дизассемблирования.

Дополнительные рекомендации

  1. Проверка архитектуры: Убедитесь, что указаны правильные архитектурные параметры, которые соответствуют вашему бинарному файлу. В вашем случае это arm, но для других архитектур команды могут меняться.

  2. Использование других инструментов: Если objdump не дает удовлетворительных результатов, вы можете также рассмотреть использование таких инструментов, как radare2 или Ghidra, которые могут предложить дополнительную функциональность и более продвинутые возможности анализа бинарного кода.

  3. Анализируйте вывод: Обратите внимание на полученный вывод, поскольку он может содержать ошибки или предупреждения, которые могут указывать на проблемы в бинаре или неправильную настройку инструментов.

Таким образом, правильно задавая целевые архитектуры и параметры, вы сможете успешно дизассемблировать ELF бинарные файлы, даже когда отсутствуют заголовки секций.

Оцените материал
Добавить комментарий

Капча загружается...