Вопрос или проблема
У меня есть 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
— указывает архитектуру, которую нужно использовать для дизассемблирования.
Дополнительные рекомендации
-
Проверка архитектуры: Убедитесь, что указаны правильные архитектурные параметры, которые соответствуют вашему бинарному файлу. В вашем случае это
arm
, но для других архитектур команды могут меняться. -
Использование других инструментов: Если
objdump
не дает удовлетворительных результатов, вы можете также рассмотреть использование таких инструментов, какradare2
илиGhidra
, которые могут предложить дополнительную функциональность и более продвинутые возможности анализа бинарного кода. -
Анализируйте вывод: Обратите внимание на полученный вывод, поскольку он может содержать ошибки или предупреждения, которые могут указывать на проблемы в бинаре или неправильную настройку инструментов.
Таким образом, правильно задавая целевые архитектуры и параметры, вы сможете успешно дизассемблировать ELF бинарные файлы, даже когда отсутствуют заголовки секций.