GNU/Linux >> Tutoriels Linux >  >> Linux

Comment extraire uniquement le contenu brut d'une section ELF ?

Hack plutôt inélégant autour de objdump et 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

Le objdump -h produit une sortie prévisible qui contient le décalage de section dans le fichier elf. J'ai fait le awk pour générer un dd commande pour le shell, depuis dd ne prend pas en charge les nombres hexadécimaux. Et envoyé la commande au shell.

Dans le passé, je faisais tout cela manuellement, sans créer de scripts, car c'est rarement nécessaire.


Utilisez le -O binary format de sortie :

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

Vient de vérifier avec avr-objcopy et le .text d'une image AVR ELF rubrique.

Notez que si, comme Tim le souligne ci-dessous, votre section n'a pas le drapeau ALLOC, vous devrez peut-être ajouter --set-section-flags .text=alloc pour pouvoir l'extraire.


objcopy --dump-section

Introduit dans Binutils 2.25, et produit un effet similaire à -O binary --only-section .

Utilisation :

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

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html le documente comme :

--dump-section nomsection=nomfichier

Placez le contenu de la section nommée sectionname dans le fichier filename, en écrasant tout contenu qui aurait pu s'y trouver auparavant. Cette option est l'inverse de --add-section. Cette option est similaire à l'option --only-section sauf qu'elle ne crée pas de fichier formaté, elle vide simplement le contenu sous forme de données binaires brutes, sans appliquer de déplacement. L'option peut être spécifiée plusieurs fois.

Exemple exécutable minimal

main.S

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

Assembler :

as -o main.o main.S

Extraire les données :

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

Sortie :

00000000  12 34 56 78                                       |.4Vx|
00000004

Extraire le texte :

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

Sortie :

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

Testé dans Ubuntu 18.04 amd64, Binutils 2.30.


Linux
  1. Comment extraire le fichier tar.gz sous Linux à l'aide de la ligne de commande

  2. Comment insérer du texte au début de chaque ligne dans Vim

  3. Où est la description du contenu des sections Man ?

  4. Comment insérer un texte au début d'un fichier ?

  5. Comment obtenir uniquement le nombre de lignes d'un fichier

Comment lister le contenu d'un paquet sous Linux

Comment afficher le contenu d'une archive ou d'un fichier compressé sous Linux

Comment extraire des adresses e-mail d'un fichier texte sous Linux

Comment ajouter du texte au début du fichier sous Linux

Comment installer la dernière version de l'éditeur de texte nano

Comment supprimer le texte sélectionné dans l'éditeur vi