GNU/Linux >> Linux Esercitazione >  >> Linux

Come estrarre solo i contenuti grezzi di una sezione ELF?

Hack piuttosto poco elegante intorno a objdump e 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

Il objdump -h produce un output prevedibile che contiene l'offset della sezione nel file elf. Ho fatto il awk per generare un dd comando per la shell, poiché dd non supporta i numeri esadecimali. E ha dato il comando alla shell.

In passato ho fatto tutto questo manualmente, senza creare alcuno script, dato che è raramente necessario.


Usa il -O binary formato di output:

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

Appena verificato con avr-objcopy e .text di un'immagine AVR ELF sezione.

Nota che se, come Tim sottolinea di seguito, la tua sezione non ha il flag ALLOC, potresti dover aggiungere --set-section-flags .text=alloc per poterlo estrarre.


objcopy --dump-section

Introdotto in Binutils 2.25, ottiene un effetto simile a -O binary --only-section .

Utilizzo:

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

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html lo documenta come:

--dump-section nomesezione=nomefile

Posiziona il contenuto della sezione denominata sectionname nel file filename, sovrascrivendo eventuali contenuti che potrebbero esserci stati in precedenza. Questa opzione è l'inverso di --add-section. Questa opzione è simile all'opzione --only-section tranne per il fatto che non crea un file formattato, scarica semplicemente il contenuto come dati binari grezzi, senza applicare alcuna rilocazione. L'opzione può essere specificata più di una volta.

Esempio eseguibile minimo

main.S

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

Assemblare:

as -o main.o main.S

Estrai dati:

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

Uscita:

00000000  12 34 56 78                                       |.4Vx|
00000004

Estrai testo:

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

Uscita:

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

Testato in Ubuntu 18.04 amd64, Binutils 2.30.


Linux
  1. Come estrarre il file tar.gz in Linux utilizzando la riga di comando

  2. Come inserire del testo prima della prima riga di un file?

  3. Dov'è la descrizione dei contenuti delle sezioni uomo?

  4. Come inserire un testo all'inizio di un file?

  5. Come ottenere solo il numero di righe di un file

Come elencare il contenuto di un pacchetto in Linux

Come visualizzare il contenuto di un archivio o di un file compresso in Linux

Come estrarre indirizzi e-mail da file di testo in Linux

Come aggiungere testo all'inizio del file in Linux

Come installare l'ultima versione di nano text editor

Come eliminare il testo selezionato nell'editor vi