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