Zum Inhalt springen

Miasm - Reverse Engineering Framework Cheatsheet

Miasm - Reverse Engineering Framework Cheatsheet

Miasm ist ein kostenloses, Open-Source-Python-Framework zum Analysieren, Generieren und Manipulieren von Binärdateien. Es kann über viele Architekturen disassemblieren (x86/x64, ARM, MIPS, PPC und mehr), Code in seine eigene Intermediate Representation (IR) heben, Ausführung mit einem JIT emulieren und symbolische Ausführung für Deobfuskation und Constraint-Lösung durchführen. Es ist ein programmatisches Toolkit — Sie steuern es von Python aus — was es leistungsstark für die Automatisierung von Reverse-Engineering- und Unpacking-Aufgaben macht, die GUI-Tools nicht leicht skripten können.

Installation

MethodeBefehl
pippip install miasm
Von Quellegit clone https://github.com/cea-sec/miasm && cd miasm && pip install -e .
Optional JIT (LLVM)pip install llvmlite (schnellerer Emulations-Backend)
Dockerdocker build -t miasm . aus dem Repo
Überprüfungpython -c "import miasm; print('ok')"

Core-Module

ModulZweck
miasm.analysis.binaryLade einen Binary-Container (ELF/PE/raw)
miasm.analysis.machineArchitektur-Abstraktion (Machine("x86_64"))
miasm.core.locationdbVerfolgen Sie Adressen/Labels in der Analyse
miasm.irIntermediate Representation von Anweisungen
miasm.analysis.dseDynamic Symbolic Execution Engine
miasm.jitterEmulations-/JIT-Engine

Disassembly

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)   # rekursives Disassembly → CFG
for block in asmcfg.blocks:
    print(block)
CallBeschreibung
mdis.dis_block(addr)Disassemblieren Sie einen einzelnen Basic Block
mdis.dis_multiblock(addr)Rekursiv in ein CFG disassemblieren
asmcfg.blocksIterieren Sie über Basic Blocks
asmcfg.dot()Exportieren Sie den Control-Flow-Graph zu Graphviz

Intermediate Representation (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)

Die IR normalisiert architekturspezifische Anweisungen in eine kleine typisierte Sprache, die es macht Querschnitt-Architektur-Analyse und symbolisches Reasoning möglich.

Emulation (Jitter)

from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm")   # oder "python", "gcc"
jitter.init_stack()
# map code, set registers, then:
jitter.run(0x401000)
BackendAbwägung
pythonTragbar, am langsamsten
gccSchneller, benötigt einen Compiler
llvmAm schnellsten, benötigt llvmlite
FeatureVerwendung
add_breakpoint(addr, cb)Führen Sie einen Python-Callback unter einer Adresse aus
vm.set_mem(addr, data)Schreiben Sie Speicher vor dem Ausführen
Benutzerdefinierte Syscalls/APIsHook-Bibliotheksaufrufe während der Emulation

Symbolische Ausführung

from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols)        # symbolischer Register-/Speicherzustand

Symbolische Ausführung ist die Grundlage für Deobfuskation, Eingabelösung und Vereinfachung von Müll/opaken Prädikaten.

Häufige Workflows

ZielAnsatz
Exportieren Sie ein CFG zur Ansichtasmcfg.dot() → Renderon mit Graphviz
Entpacken/DeobfuskationEmulieren Sie mit dem Jitter, speichern Sie Speicher beim OEP
Lösen Sie für eine EingabeSymbolische Ausführung + ein SMT-Solver (z3)
Querschnitt-Architektur-AnalyseHeben Sie zu IR auf, führen Sie dieselben Passes unabhängig von der Architektur durch

Miasm vs andere RE-Frameworks

AspektMiasmangrGhidra
SprachePythonPythonJava/GUI
IREigene IRVEXP-code
EmulationIntegrierter JITUnicorn-basiertEmulator-API
Symbolische ExecJaJa (Kernstärke)Begrenzt
Beste EinsatzgebieteGeskriptete Analyse, DeobfuskationSymbolisch/CTFInteraktive RE

Ressourcen