¿Cómo puedo examinar el contenido de una sección de datos de un archivo ELF en Linux?


He estado usando objdump para ver el código ensamblador en los binarios ELF de Linux.

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

¿Cómo obtener objdump o cualquier otra herramienta para mostrarme el contenido de esta sección de datos?

Podría ejecutar el programa y examinar las direcciones relevantes en el depurador, pero no quiero hacerlo porque tiene que hacerse interactivamente.

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

3 answers

objdump -s -j .rodata exefile

Da un volcado hexadecimal/ASCII imprimible lado a lado del contenido 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 deshacer el maleficio y alimentar a od, supongo :)

 75
Author: hobbs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 09:09:36
readelf -x .rodata hello_world.o

Da:

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

Deberías preferir readelf cuando sea posible ya que objdump simplemente no muestra algunas secciones como .symtab: ¿Por qué no aparece objdump ?bss,.shstratab, .symtab y .¿secciones strtab?

También puede extraer los bytes crudos con las técnicas mencionadas en: Cómo extraer solo el contenido de una sección ELF y como se menciona por ysdx.

 16
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:36

Puede obtener la sección de ELFOS RAW (no hexdump-ed) 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 para forzar que stdout sea una tubería. /dev/stdout podría funcionar inesperadamente si stdout es un archivo. .text=- no envía a stdout sino al archivo -.

Sin embargo objcopy y objdump tienen algunas deficiencias (porque se basan en BFD que abstrae diferentes formatos ejecutables).

Actualización: Escribí una herramienta para hacer esto que no se basa en BFD.

 9
Author: ysdx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:43