Ir al contenido

Miasm - Hoja de Referencia del Framework de Ingeniería Inversa

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étodoComando
pippip install miasm
Desde el código fuentegit 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)
Dockerdocker build -t miasm . desde el repo
Verificarpython -c "import miasm; print('ok')"

Módulos Principales

MóduloPropósito
miasm.analysis.binaryCarga un contenedor binario (ELF/PE/raw)
miasm.analysis.machineAbstracción de arquitectura (Machine("x86_64"))
miasm.core.locationdbRastrea direcciones/etiquetas en análisis
miasm.irRepresentación intermedia de instrucciones
miasm.analysis.dseMotor de ejecución simbólica dinámica
miasm.jitterMotor 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)
LlamadaDescripción
mdis.dis_block(addr)Desensambla un único bloque básico
mdis.dis_multiblock(addr)Desensambla recursivamente en un CFG
asmcfg.blocksItera sobre bloques básicos
asmcfg.dot()Exporta el grafo de flujo de control a Graphviz

Representación Intermedia (IR)

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)
BackendIntercambio
pythonPortátil, más lento
gccMás rápido, necesita compilador
llvmMás rápido, necesita llvmlite
CaracterísticaUso
add_breakpoint(addr, cb)Ejecuta una llamada Python en una dirección
vm.set_mem(addr, data)Escribe memoria antes de ejecutar
Syscalls/APIs personalizadosEngañ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

ObjetivoEnfoque
Exporta un CFG para verasmcfg.dot() → renderiza con Graphviz
Desempaqueta/deofuscaEmula con el jitter, vuelca memoria en OEP
Resuelve para una entradaEjecución simbólica + un solucionador SMT (z3)
Análisis entre arquitecturasEleva a IR, ejecuta los mismos pases independientemente de arquitectura

Miasm vs Otros Frameworks de RE

AspectoMiasmangrGhidra
LenguajePythonPythonJava/GUI
IRIR propioVEXP-code
EmulaciónJIT integradoBasado en UnicornAPI de emulador
Ejecución simbólicaSí (fortaleza principal)Limitado
Mejor paraAnálisis scripteado, deofuscaciónSimbólico/CTFRE interactivo

Recursos