web-dev-qa-db-fra.com

Comment puis-je examiner le contenu d'une section de données d'un fichier ELF sous Linux?

J'ai utilisé objdump pour regarder le code d'assembly dans les binaires ELF Linux.

Parfois, il y a un saut indirect dans une table de sauts qui est stockée dans la section rodata (données en lecture seule).

Comment obtenir objdump ou tout autre outil pour me montrer le contenu de cette section de données?

Je pourrais exécuter le programme et examiner les adresses pertinentes dans le débogueur, mais je ne veux pas le faire car cela doit être fait de manière interactive.

La réponse idéale identifiera un outil qui non seulement me montrera le contenu mais me permettra de contrôler le format d'affichage, tout comme od.

64
Norman Ramsey
objdump -s -j .rodata exefile

donne un hexagone côte à côte/imprimable ASCII vidage du contenu de la section rodata comme:

Contents of section .rodata:
 0000 67452301 efcdab89 67452301 efcdab89  gE#.....gE#.....
 0010 64636261 68676665 64636261 68676665  dcbahgfedcbahgfe

Il ne semble pas y avoir quoi que ce soit pour contrôler le formatage, mais c'est un début. Vous pouvez toujours vider l'hexagone et le nourrir à od, je suppose :)

82
hobbs
readelf -x .rodata hello_world.o

donne:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

Vous devriez préférer readelf lorsque cela est possible car objdump n'affiche tout simplement pas certaines sections comme .symtab: Pourquoi objdump n'affiche pas les sections .bss, .shstratab, .symtab et .strtab?

Vous pouvez également extraire les octets bruts avec les techniques mentionnées à: Comment extraire uniquement le contenu d'une section ELF et comme mentionné par ysdx .

Vous pouvez obtenir la section ELF RAW (pas hexdump) avec:

# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat

Ici, j'utilise | cat pour forcer stdout à être un tuyau. /dev/stdout peut fonctionner de manière inattendue si stdout est un fichier. .text=- n'envoie pas à stdout mais à - fichier.

Cependant objcopy et objdump ont quelques défauts (car ils sont basés sur BFD qui résume différents formats exécutables).

Mise à jour: J'ai écrit un outil pour ce faire qui ne repose pas sur BFD.

11
ysdx