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.

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 :)


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 .


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.


--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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.