Miasm - リバースエンジニアリングフレームワークチートシート
Miasm はバイナリの分析、生成、操作向けの無料でオープンソースの Python フレームワークです。多くのアーキテクチャ(x86/x64、ARM、MIPS、PPC など)にまたがって逆アセンブルでき、コードを独自の**中間表現(IR)**にリフトでき、JIT でエミュレーション実行でき、シンボリック実行を難読化解除と制約ソルバーのために実行できます。これはプログラマティックツールキット(Python から駆動)であるため、GUI ツールが簡単にはスクリプト化できないリバースエンジニアリングとアンパッキングタスクを自動化する際に強力です。
インストール
| 方法 | コマンド |
|---|
| pip | pip install miasm |
| ソースから | git clone https://github.com/cea-sec/miasm && cd miasm && pip install -e . |
| オプションJIT(LLVM) | pip install llvmlite(より高速なエミュレーションバックエンド) |
| Docker | リポジトリからdocker build -t miasm . |
| 検証 | python -c "import miasm; print('ok')" |
コアモジュール
| モジュール | 目的 |
|---|
miasm.analysis.binary | バイナリコンテナを読み込む(ELF/PE/raw) |
miasm.analysis.machine | アーキテクチャ抽象化(Machine("x86_64")) |
miasm.core.locationdb | 分析全体でアドレス・ラベルを追跡 |
miasm.ir | 命令の中間表現 |
miasm.analysis.dse | 動的シンボリック実行エンジン |
miasm.jitter | エミュレーション・JITエンジン |
逆アセンブル
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) # 再帰的逆アセンブル → CFG
for block in asmcfg.blocks:
print(block)
| 呼び出し | 説明 |
|---|
mdis.dis_block(addr) | 単一の基本ブロックを逆アセンブル |
mdis.dis_multiblock(addr) | CFG に再帰的に逆アセンブル |
asmcfg.blocks | 基本ブロックを反復処理 |
asmcfg.dot() | コントロールフローグラフを Graphviz にエクスポート |
中間表現(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)
IR はアーキテクチャ固有の命令を小さく型付けされた言語に正規化します。これが、クロスアーキテクチャ分析とシンボリック推論を可能にするものです。
エミュレーション(Jitter)
from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm") # または "python"、"gcc"
jitter.init_stack()
# コードをマップし、レジスタを設定してから:
jitter.run(0x401000)
| バックエンド | トレードオフ |
|---|
python | ポータブル、最も遅い |
gcc | より高速、コンパイラが必要 |
llvm | 最高速、llvmliteが必要 |
| 機能 | 使用 |
|---|
add_breakpoint(addr, cb) | アドレスで Python コールバックを実行 |
vm.set_mem(addr, data) | 実行前にメモリを書き込み |
| カスタムシステムコール・API | エミュレーション中のライブラリコールをフック |
シンボリック実行
from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols) # シンボリックレジスタ・メモリ状態
シンボリック実行は難読化解除、入力のソルバー、ジャンク・不透明述語の簡潔化の基盤です。
一般的なワークフロー
| 目標 | アプローチ |
|---|
| CFG をビューにエクスポート | asmcfg.dot() → Graphviz でレンダリング |
| アンパック・難読化解除 | jitter でエミュレート、OEP でメモリをダンプ |
| 入力のソルバー | シンボリック実行 + SMT ソルバー(z3) |
| クロスアーキテクチャ分析 | IR にリフト、アーキに関わらず同じパスを実行 |
Miasm 対 その他のREフレームワーク
| 側面 | Miasm | angr | Ghidra |
|---|
| 言語 | Python | Python | Java/GUI |
| IR | 独自IR | VEX | P-code |
| エミュレーション | 組み込みJIT | Unicorn ベース | エミュレーター API |
| シンボリック実行 | はい | はい(強み) | 限定的 |
| 最適用途 | スクリプト分析、難読化解除 | シンボリック・CTF | インタラクティブRE |
リソース