El utilitario objdump, parte del paquete binutils de GNU, permite volcar todo tipo de información desde archivos binarios. Sin embargo, tiene un uso interesante que consiste en desensamblar el código binario. Es decir, traducir las instrucciones máquina del binario de vuelta a código ensamblador.

objdump sirve para mostrar información de archivos objeto. Las diferentes opciones que posee controlan qué tipo de información mostrar (cabeceras, símbolos, formatos, arquitecturas, etc.). Generalmente es de utilidad para los programadores que desarrollan las propias herramientas de compilación, mas que aquellos que sólo las utilizan para compilar sus programas. Sin embargo puede ser de gran utilidad para analistas de seguridad informática o especialistas que necesiten hacer ingeniería reversa sobre programas compilados.

Para desensamblar un binario ejecutable basta con utilizar la opción -d. Por ejemplo:

emi@hal9000:~$ which pwd
/bin/pwd
emi@hal9000:~$ objdump -d /bin/pwd | head -n 20

/bin/pwd:     file format elf64-x86-64


Disassembly of section .init:

0000000000002000 <.init>:
    2000:	48 83 ec 08          	sub    $0x8,%rsp
    2004:	48 8b 05 dd 7f 00 00 	mov    0x7fdd(%rip),%rax        # 9fe8 <__cxa_finalize@plt+0x7c78>
    200b:	48 85 c0             	test   %rax,%rax
    200e:	74 02                	je     2012 <getenv@plt-0x1e>
    2010:	ff d0                	callq  *%rax
    2012:	48 83 c4 08          	add    $0x8,%rsp
    2016:	c3                   	retq   

Disassembly of section .plt:

0000000000002020 <getenv@plt-0x10>:
    2020:	ff 35 e2 7f 00 00    	pushq  0x7fe2(%rip)        # a008 <__cxa_finalize@plt+0x7c98>
    2026:	ff 25 e4 7f 00 00    	jmpq   *0x7fe4(%rip)        # a010 <__cxa_finalize@plt+0x7ca0>

Por cada línea se observa la dirección de memoria, el contenido en formato hexadecimal, y la instrucción desensamblada:

    2000:	48 83 ec 08          	sub    $0x8,%rsp

Los 4 bytes en las locaciones de memoria 2000, 2001, 2002 y 2003 contienen los valores hexadecimales 48, 83, ec, y 08 respectivamente. Lo cual corresponde con la instrucción sub $0x8,%rsp.

En cada sección se observa la dirección de comienzo junto con su nombre:

0000000000002000 <.init>:

Una herramienta para tener a mano a la hora de realizar ingeniería reversa o análisis forense de archivos binarios ejecutables.

Para más información, consultar la página de manual:

man objdump

Compartí este artículo