2009-11-06 7 views
48

He estado usando objdump para ver el código ensamblador en los binarios ELF de Linux.¿Cómo puedo examinar el contenido de una sección de datos de un archivo ELF en Linux?

A veces hay un salto indirecto a través de una tabla de salto almacenada en la sección rodata (datos de solo lectura).

¿Cómo obtener objdump o cualquier otra herramienta que me muestre el contenido de esta sección de datos?

Podría ejecutar el programa y examinar las direcciones relevantes en el depurador, pero no quiero hacer eso porque tiene que hacerse de forma interactiva.

La respuesta ideal identificará una herramienta que no solo me mostrará los contenidos, sino que me permitirá controlar el formato de visualización, como lo hace od.

Respuesta

67
objdump -s -j .rodata exefile 

da un volcado hexadecimal ASCII de lado a lado/imprimible de los contenidos de la sección rodata como:

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

No parece que haya nada allí para controlar el formato, pero es un comienzo. Siempre se puede undump el hexágono y alimentar a OD, supongo :)

+2

Brilliant! Intenté esto pero no pensé incluir el punto sangriento ... –

+3

¿Cómo puedes obtener los datos volcados en formato binario de una sección ELF? Algo como objdump -s -j -binary

sería genial. – Bogatyr

+0

@Bogatyr: cf. mi respuesta. – ysdx

13
readelf -x .rodata hello_world.o 

da:

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

se debe preferir readelf cuando sea posible, ya objdump simplemente no muestra algunas secciones como .symtab: Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?

También puede extraer los bytes sin procesar con las técnicas mencionadas en: How do you extract only the contents of an ELF section y como se menciona by ysdx.

7

Puede obtener el RAW (no Hexdump-ed) sección ELF 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 

Aquí estoy usando | cat con el fin de forzar la salida estándar a ser un tubo. /dev/stdout podría funcionar inesperadamente si stdout es un archivo. .text=- no envía a stdout sino al archivo -.

Sin embargo, objcopy and objdump have some deficiencies (porque están basados ​​en BFD que abstrae diferentes formatos ejecutables).

Actualización: Escribí un tool para hacer esto que no depende de BFD.

+0

'--dump-section' es un poco reciente. Fue agregado en: http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html ¿Por qué es mejor que '--only-section'? –

+1

@CiroSantilli 视 j j 视 视 视 视 视, así el 'objcopy -j' crea un archivo ELF completo (que un encabezado ELF, una tabla heater de sección con una sección .shstrtab, una tabla de encabezado de programa) mientras que' objcopy --dump -section' volca el contenido de una sección (y nada más) a un archivo. – ysdx

+0

Usted obtiene un voto mío por encontrar (¡y escribir!) Una herramienta más específica que la de mi respuesta. – hobbs

Cuestiones relacionadas