2009-11-06 15 views
48

Ho utilizzato objdump per esaminare il codice assembly nei file binari ELF di Linux.Come posso esaminare il contenuto di una sezione di dati di un file ELF su Linux?

A volte c'è un salto indiretto attraverso una tabella di salto che viene memorizzata nella sezione rodata (dati di sola lettura).

Come ottenere objdump o qualsiasi altro strumento per mostrarmi il contenuto di questa sezione di dati?

Potrei eseguire il programma ed esaminare gli indirizzi rilevanti nel debugger, ma non voglio farlo perché deve essere fatto in modo interattivo.

La risposta ideale identificherà uno strumento che non solo mi mostrerà il contenuto ma mi consentirà di controllare il formato di visualizzazione, proprio come fa od.

risposta

67
objdump -s -j .rodata exefile 

dà un esagono/stampabile scarico ASCII side-by-side dei contenuti della sezione rodata come:

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

Non sembra che ci sia qualcosa in là per controllare la formattazione, ma è un inizio. Si può sempre undump l'esagono e dei mangimi a OD, suppongo :)

+2

Brillante! Ho provato questo, ma non pensavo di includere il punto sanguinante ... –

+3

Come si può ottenere il dump dei dati in formato binario da una sezione ELF? Qualcosa come objdump -s -j -binary

sarebbe fantastico. – Bogatyr

+0

@Bogatyr: cf. la mia risposta. – ysdx

13
readelf -x .rodata hello_world.o 

dà:

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

si dovrebbe preferire readelf, quando possibile, dal momento che objdump semplicemente non mostra alcune sezioni come .symtab: Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?

È inoltre possibile estrarre i byte non elaborati con le tecniche indicate in: How do you extract only the contents of an ELF section e come indicato by ysdx.

7

È possibile ottenere il RAW sezione ELF (non Hexdump-ndr) con:

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

Qui sto usando | cat al fine di costringere stdout ad essere un tubo. /dev/stdout potrebbe funzionare in modo imprevisto se stdout è un file. .text=- non invia allo stdout ma al file -.

Tuttavia objcopy and objdump have some deficiencies (perché sono basati su BFD che astrae diversi formati eseguibili).

Aggiornamento: Ho scritto un tool per fare ciò che non si basa su BFD.

+0

'--dump-section' è un po 'recente. È stato aggiunto a: http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html Perché è meglio di '--only-section'? –

+0

Hai un voto da parte mia per trovare (e scrivere!) Uno strumento più costruito di quello della mia risposta. – hobbs