Destripando una instrucción en lenguaje ensamblador X86

CheatSheet.png

La función más importante en un desensamblador es la conversión o recomposición de las instrucciones en lenguaje ensamblador a partir de los códigos de operacion (OP / operation code).

En la arquitectura X86, a diferencia de otras, la longitud en bytes de una instrucción, varía dependiendo de la instrucción en sí y de los operandos sobre las que ésta actúa.

Últimamente, gracias en entre otros a proyectos como Capstone hemos visto el lanzamiento de desensambladores de todo tipo, así como la migración o adaptación de desensambladores previamente existentes a este motor.

Ni que decir tiene, que si quieres escribir tu propio desensamblador debes tener un buen conocimiento de cómo se componen (ensamblan) o descomponen (desensamblan) las instrucciones, pero estos conceptos también son muy importantes a la hora de por ejemplo explotar una vulnerabilidad, o más bien, a la hora de escribir tu propio exploit.

Möbius Strip Reverse Engineering, sacado de su curso SMT-Based binary program analysis from the ground up, ha liberado el contenido de la sección X86 Assembly/Disassembly del mismo. Dicho contenido explica los detalles del ensamblado y desensamblado de una instrucción en lenguaje ensamblador de arquitectura X86. El contenido viene en forma de archivo .zip y contiene tres PDFs: teoría sobre dicho tema (114 páginas), ejercicios y una introducción a python enfocada al tema. Además, dicho archivo también contiene un framework ya implementado en python listo para ser usado.

La información tiene muy buena pinta y si te interesa este tema, seguro que te aportará bastante.