linux - servidores - ¿Cómo desarmo el código x86 sin formato?
en linux (6)
La herramienta GNU se llama objdump , por ejemplo:
objdump -D -b binary -m i8086 <file>
Me gustaría desensamblar el MBR (primeros 512 bytes) de un disco x86 de arranque que tengo. He copiado el MBR a un archivo usando
dd if=/dev/my-device of=mbr bs=512 count=1
¿Alguna sugerencia para una utilidad de Linux que pueda desensamblar el archivo mbr
?
Me gusta ndisasm
para este propósito. Viene con el ensamblador NASM, que es gratuito y de código abierto e incluido en los repositorios de paquetes de la mayoría de las distribuciones de Linux.
Puedes usar objdump. Según este artículo, la sintaxis es:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
sudo dd if = / dev / sda bs = 512 count = 1 | ndisasm -b16 -o7c00h -
starblue y hlovdal tienen partes de la respuesta canónica. Si desea desmontar el código i8086 sin procesar, generalmente desea la sintaxis Intel, no la sintaxis 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 abreviada:
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 de 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 binutils de GNU (superconjunto de aquellos soportados por GCC), y su salida usualmente se puede alimentar a GNU ( ndisasm por lo general se puede alimentar a nasm
, por supuesto).
Peter Cordes sugiere que " el objconv de Agner Fog es muy bueno. Coloca etiquetas en los destinos de las ramificaciones, facilitando mucho más descubrir qué hace el código. Se puede desensamblar en sintaxis NASM, YASM, MASM o AT & T (GNU) ".
Multimedia Mike ya descubrió acerca de --adjust-vma
; el equivalente de ndisasm
es la opción -o
.
Para desmontar, digamos, código sh4
(utilicé un binario de Debian para probar), utilicé esto con binutils de 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
El -m
es la máquina, y -EL
significa Little Endian (para sh4eb
usa -EB
en -EB
lugar), que es relevante para las arquitecturas que existen en cualquiera de las endiancias.
ndisasm -b16 -o7c00h -a -s7c3eh mbr
Explicación - desde la página de manual de ndisasm
-
-b
= Especifica el modo de 16, 32 o 64 bits. El valor predeterminado es el modo de 16 bits. -
-o
= Especifica la dirección de carga nocional para el archivo. Esta opción hace que ndisasm obtenga las direcciones que enumera en el margen izquierdo, y las direcciones de destino de saltos y llamadas relativos a PC, a la derecha. -
-a
= Habilita el modo de sincronización automática (o inteligente), en el que ndisasm intentará adivinar dónde se debe realizar la sincronización, mediante el examen de las direcciones de destino de los saltos relativos y las llamadas que desensambla. -
-s
= Especifica manualmente una dirección de sincronización, de modo que ndisasm no generará ninguna instrucción de máquina que abarque bytes en ambos lados de la dirección. Por lo tanto, la instrucción que comienza en esa dirección se desmontará correctamente. -
mbr
= El archivo que se desmontará.