linux - ¿Cómo extraer solo los contenidos en bruto de una sección ELF?
shell binutils (3)
Más bien poco elegante hackear alrededor de objdump
y 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
El objdump -h
produce una salida predecible que contiene el desplazamiento de sección en el archivo elf. Hice el awk
para generar un comando dd
para el shell, ya que dd
no admite números hexadecimales. Y alimentó el comando de shell.
En el pasado hice todo eso manualmente, sin hacer ningún script, ya que rara vez es necesario.
He intentado lo siguiente, pero el archivo resultante sigue siendo un ELF y no solo el contenido de la sección.
$ objcopy --only-section=<name> <infile> <outfile>
Solo quiero los contenidos de la sección. ¿Hay alguna utilidad que pueda hacer esto? ¿Algunas ideas?
Utilice el formato de salida -O binary
:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Solo se verificó con avr-objcopy
y la sección .text
de una imagen AVR ELF.
Tenga en cuenta que si, como Tim señala a continuación, su sección no tiene el indicador ALLOC, es posible que tenga que agregar --set-section-flags .text=alloc
para poder extraerlo.
objcopy --dump-section
Introducido en Binutils 2.25, y logra un efecto similar a -O binary --only-section
.
Uso:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html documenta como:
--dump-section sectionname = nombre de archivo
Coloque el contenido de la sección denominada nombre de sección en el nombre de archivo del archivo, sobrescribiendo cualquier contenido que haya estado allí anteriormente. Esta opción es la inversa de --add-section. Esta opción es similar a la opción --only-section, excepto que no crea un archivo con formato, simplemente descarga los contenidos como datos binarios sin procesar, sin aplicar ninguna reubicación. La opción se puede especificar más de una vez.
Ejemplo ejecutable mínimo
como:
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Montar y extraer:
as -o a.o a.S
objcopy --dump-section .data=data.bin a.o
objcopy --dump-section .text=text.bin a.o
hd data.bin
hd text.bin
Salida:
00000000 12 34 56 78 |.4Vx|
00000004
00000000 9a bc de f0 |....|
00000004
Probado en Ubuntu 18.04 amd64, Binutils 2.30.