reverse engineering - Desmontar un archivo binario plano usando objdump
reverse-engineering disassembly (3)
Encontré la solución a mi propia pregunta en un foro diferente. Se ve algo como esto:
objdump -b binary --adjust-vma=0xabcd1000 -D file.bin
He probado esto y funciona.
¿Puedo desmontar un archivo binario plano usando objdump?
Estoy familiarizado con el desmontaje de un ejecutable binario estructurado como un archivo ELF usando:
objdump -d file.elf
Pero si tengo un archivo binario plano que sé que se debe cargar, por ejemplo, en la dirección 0xabcd1000, ¿puedo pedirle a objdump que lo desarme? Intenté proporcionar opciones como ''--start-address = 0xabcd1000'', pero objdump solo indica que no reconoce el formato.
Tengo otras ideas sobre cómo desensamblar el archivo, pero quería saber si objdump podría proporcionar una solución simple.
No, no puede hacerlo si no es reubicable, como si contiene un OPCODE "ljmp" (o "jmp far [addr]").
starblue y hlovdal tienen partes de la respuesta canónica. Si desea desensamblar el código i8086 en bruto, por lo general también desea la sintaxis de Intel, no la sintaxis de AT&T, así que use:
objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin # for 64-bit code
Si su código es ELF (o a.out (o (E) COFF)), puede usar la forma corta:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
Para el código de 32 bits o 64 bits, omita el ,8086
; El encabezado ELF ya incluye esta información.
ndisasm
, como lo sugiere jameslin , también es una buena opción, pero objdump
generalmente viene con el sistema operativo y puede tratar con todas las arquitecturas soportadas por GNU binutils (superconjunto de aquellas soportadas por GCC), y su salida generalmente se puede alimentar a GNU as
ndisasm''s puede ser alimentado en nasm
, por supuesto).
Peter Cordes sugiere que “ el objconv de Agner Fog es muy bueno. Pone etiquetas en los objetivos de las sucursales, haciendo que sea mucho más fácil averiguar qué hace el código. Puede desmontarse en sintaxis NASM, YASM, MASM o AT&T (GNU) ".
Mike ya se enteró de --adjust-vma
; ndisasm
equivalente ndisasm
es la opción -o
.
Para desmontar, digamos, el código sh4
(usé un binario de Debian para probar), use esto con binutils GNU (casi todos los demás desensambladores están limitados a una plataforma, como x86 con ndisasm
y objconv
):
objdump -D -b binary -m sh -EL x
La -m
es la máquina, y -EL
significa Little Endian (para sh4eb
usa -EB
en -EB
lugar), lo que es relevante para las arquitecturas que existen en cualquiera de los dos sh4eb
-EB
.