Miasm - Hoja de Referencia del Framework de Ingeniería Inversa
Miasm es un framework Python gratuito y de código abierto para analizar, generar y manipular binarios. Puede desensamblar en muchas arquitecturas (x86/x64, ARM, MIPS, PPC y más), elevar código a su propia representación intermedia (IR), emular ejecución con un JIT y ejecutar ejecución simbólica para deofuscación y resolución de restricciones. Es un toolkit programático — lo diriges desde Python — lo que lo hace poderoso para automatizar tareas de ingeniería inversa y desempaquetamiento que las herramientas GUI no pueden scripts fácilmente.
Instalación
| Método | Comando |
|---|
| pip | pip install miasm |
| Desde el código fuente | git clone https://github.com/cea-sec/miasm && cd miasm && pip install -e . |
| JIT Opcional (LLVM) | pip install llvmlite (backend de emulación más rápido) |
| Docker | docker build -t miasm . desde el repo |
| Verificar | python -c "import miasm; print('ok')" |
Módulos Principales
| Módulo | Propósito |
|---|
miasm.analysis.binary | Carga un contenedor binario (ELF/PE/raw) |
miasm.analysis.machine | Abstracción de arquitectura (Machine("x86_64")) |
miasm.core.locationdb | Rastrea direcciones/etiquetas en análisis |
miasm.ir | Representación intermedia de instrucciones |
miasm.analysis.dse | Motor de ejecución simbólica dinámica |
miasm.jitter | Motor de emulación/JIT |
Desensamblaje
from miasm.analysis.binary import Container
from miasm.analysis.machine import Machine
from miasm.core.locationdb import LocationDB
loc_db = LocationDB()
cont = Container.from_stream(open("target.bin", "rb"), loc_db)
machine = Machine(cont.arch)
mdis = machine.dis_engine(cont.bin_stream, loc_db=loc_db)
asmcfg = mdis.dis_multiblock(cont.entry_point) # desensamblaje recursivo → CFG
for block in asmcfg.blocks:
print(block)
| Llamada | Descripción |
|---|
mdis.dis_block(addr) | Desensambla un único bloque básico |
mdis.dis_multiblock(addr) | Desensambla recursivamente en un CFG |
asmcfg.blocks | Itera sobre bloques básicos |
asmcfg.dot() | Exporta el grafo de flujo de control a Graphviz |
lifter = machine.lifter_model_call(mdis.loc_db)
ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)
for lbl, irblock in ircfg.blocks.items():
print(irblock)
El IR normaliza instrucciones específicas de arquitectura en un pequeño lenguaje tipado, lo que es lo que hace posible el análisis entre arquitecturas y el razonamiento simbólico.
Emulación (Jitter)
from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm") # o "python", "gcc"
jitter.init_stack()
# mapea código, establece registros, luego:
jitter.run(0x401000)
| Backend | Intercambio |
|---|
python | Portátil, más lento |
gcc | Más rápido, necesita compilador |
llvm | Más rápido, necesita llvmlite |
| Característica | Uso |
|---|
add_breakpoint(addr, cb) | Ejecuta una llamada Python en una dirección |
vm.set_mem(addr, data) | Escribe memoria antes de ejecutar |
| Syscalls/APIs personalizados | Engaña llamadas de biblioteca durante emulación |
Ejecución Simbólica
from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols) # estado de registro/memoria simbólico
La ejecución simbólica es la base para deofuscación, resolución de entradas y simplificación de basura/predicados opacos.
Flujos de Trabajo Comunes
| Objetivo | Enfoque |
|---|
| Exporta un CFG para ver | asmcfg.dot() → renderiza con Graphviz |
| Desempaqueta/deofusca | Emula con el jitter, vuelca memoria en OEP |
| Resuelve para una entrada | Ejecución simbólica + un solucionador SMT (z3) |
| Análisis entre arquitecturas | Eleva a IR, ejecuta los mismos pases independientemente de arquitectura |
Miasm vs Otros Frameworks de RE
| Aspecto | Miasm | angr | Ghidra |
|---|
| Lenguaje | Python | Python | Java/GUI |
| IR | IR propio | VEX | P-code |
| Emulación | JIT integrado | Basado en Unicorn | API de emulador |
| Ejecución simbólica | Sí | Sí (fortaleza principal) | Limitado |
| Mejor para | Análisis scripteado, deofuscación | Simbólico/CTF | RE interactivo |
Recursos