Wie kann ich den Inhalt eines Datenabschnitts einer ELF-Datei unter Linux untersuchen?

77

Ich habe verwendet objdump, um Assembler-Code in Linux ELF-Binärdateien zu betrachten.

Manchmal gibt es einen indirekten Sprung durch eine Sprungtabelle, die im rodataAbschnitt (schreibgeschützte Daten) gespeichert ist .

Wie bekomme ich objdumpoder ein anderes Tool, um mir den Inhalt dieses Datenabschnitts zu zeigen?

Ich könnte das Programm ausführen und die relevanten Adressen im Debugger untersuchen, aber ich möchte das nicht tun, weil es interaktiv erfolgen muss.

Die ideale Antwort identifiziert ein Tool, mit dem ich nicht nur den Inhalt anzeigen, sondern auch das Anzeigeformat steuern kann od.

Norman Ramsey
quelle

Antworten:

95
objdump -s -j .rodata exefile

Gibt einen nebeneinander angeordneten hexadezimalen / druckbaren ASCII-Speicherauszug des Inhalts des rodataAbschnitts wie folgt an:

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

Es sieht nicht so aus, als ob irgendetwas drin ist, um die Formatierung zu steuern, aber es ist ein Anfang. Du könntest das Hex jederzeit entleeren und od zuführen, nehme ich an :)

Hobbs
quelle
3
Wie können Sie die Daten im Binärformat aus einem ELF-Abschnitt sichern? So etwas wie objdump -s -j -binary <section> <file> wäre großartig.
Bogatyr
@ Bogatyr: vgl. meine Antwort.
Ysdx
30
readelf -x .rodata hello_world.o

gibt:

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

Sie sollten es vorziehen, readelfwenn dies möglich ist, da objdumpeinige Abschnitte wie .symtab: Warum zeigt objdump keine .bss-, .shstratab-, .symtab- und .strtab-Abschnitte an?

Sie können auch das rohe Bytes mit den Techniken extrahieren erwähnt: Wie kann man nur den Inhalt eines ELF Abschnitt extrahiert und wie bereits erwähnt durch ysdx .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
12

Sie können den RAW-ELF-Abschnitt (nicht hexdumped) erhalten mit:

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

Hier benutze ich, | catum stdout zu zwingen, eine Pipe zu sein. /dev/stdoutfunktioniert möglicherweise unerwartet, wenn stdout eine Datei ist. .text=-sendet nicht an stdout, sondern an die -Datei.

Jedoch objcopy und objdump einige Mängel haben (weil sie auf BFD beruhen , die verschiedenen ausführbaren Formate abstrahiert).

Update: Ich habe dazu ein Tool geschrieben , das nicht auf BFD basiert.

ysdx
quelle
--dump-sectionist ein bisschen neu. Es wurde hinzugefügt unter: sourceware-org.1504.n7.nabble.com/… Warum ist es besser als --only-section?
Ciro Santilli 4 冠状 病. 事件 4
2
@CiroSantilli well 事件 法轮功 纳米比亚 威 视, nun, das objcopy -jerstellt eine ganze ELF-Datei (die ein ELF-Header, eine Abschnitts-Header-Tabelle mit einem .shstrtab-Abschnitt, eine Programm-Header-Tabelle), während objcopy --dump-sectionder Inhalt eines Abschnitts (und sonst nichts) ausgegeben wird. zu einer Datei.
ysdx