Подтвердить что ты не робот

Как извлечь только сырое содержимое раздела ELF?

Я пробовал следующее, но полученный файл по-прежнему является ELF, а не только содержимым раздела.

$ objcopy --only-section=<name> <infile> <outfile>

Мне просто нужно содержимое раздела. Есть ли какая-нибудь утилита, которая может это сделать? Любые идеи?

4b9b3361

Ответ 1

Скорее неэлегантный взломать objdump и dd:

IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text

objdump -h $IN_F |
  grep $SECTION |
  awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
  bash

objdump -h производит прогнозируемый вывод, который содержит смещение в файле эльфа. Я создал awk для создания команды dd для оболочки, поскольку dd не поддерживает шестнадцатеричные числа. И подал команду в оболочку.

В прошлом я делал все это вручную, без каких-либо скриптов, так как он редко нужен.

Ответ 2

Используйте выходной формат -O binary:

objcopy -O binary --only-section=.text foobar.elf foobar.text

Просто подтвержден с помощью avr-objcopy и раздела AVR ELF .text.

Обратите внимание, что если, как указывает Тим ​​ниже, ваш раздел не имеет флага ALLOC, вам может потребоваться добавить --set-section-flags .text=alloc, чтобы извлечь его.

Ответ 3

objcopy --dump-section

Представлен в Binutils 2.25 и достигает эффекта, аналогичного -O binary --Only-section.

Использование:

objcopy --dump-section .text=output.bin input.o

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html документирует это как:

--dump-section sectionname = имя файла

Поместите содержимое раздела с именем sectionname в имя файла, перезаписав любое содержимое, которое могло быть там ранее. Эта опция является обратной к --add-section. Эта опция похожа на опцию - -O nly-section, за исключением того, что она не создает отформатированный файл, она просто выгружает содержимое в виде необработанных двоичных данных без применения каких-либо перемещений. Опция может быть указана более одного раза.

Минимальный исполняемый пример

main.S

.data
    .byte 0x12, 0x34, 0x56, 0x78
.text
    .byte 0x9A, 0xBC, 0xDE, 0xF0

Собрать:

as -o main.o main.S

Извлечь данные:

objcopy --dump-section .data=data.bin main.o
hd data.bin

Выход:

00000000  12 34 56 78                                       |.4Vx|
00000004

Извлечь текст:

objcopy --dump-section .text=text.bin main.o
hd text.bin

Выход:

00000000  9a bc de f0                                       |....|
00000004

Протестировано в Ubuntu 18.04 amd64, Binutils 2.30.

Ответ 4

Сбросить все разделы в отдельные файлы.

readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash