コンテンツにスキップ

Miasm - リバースエンジニアリングフレームワークチートシート

Miasm - リバースエンジニアリングフレームワークチートシート

Miasm はバイナリの分析、生成、操作向けの無料でオープンソースの Python フレームワークです。多くのアーキテクチャ(x86/x64、ARM、MIPS、PPC など)にまたがって逆アセンブルでき、コードを独自の**中間表現(IR)**にリフトでき、JIT でエミュレーション実行でき、シンボリック実行を難読化解除と制約ソルバーのために実行できます。これはプログラマティックツールキット(Python から駆動)であるため、GUI ツールが簡単にはスクリプト化できないリバースエンジニアリングとアンパッキングタスクを自動化する際に強力です。

インストール

方法コマンド
pippip 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フレームワーク

側面MiasmangrGhidra
言語PythonPythonJava/GUI
IR独自IRVEXP-code
エミュレーション組み込みJITUnicorn ベースエミュレーター API
シンボリック実行はいはい(強み)限定的
最適用途スクリプト分析、難読化解除シンボリック・CTFインタラクティブRE

リソース