binary-lifting について
バイナリを LLVM IR に変換する技術とツールを扱うスキルです。バイナリ解析、リバースエンジニアリング、再コンパイルに携わる人向けに、変換フレームワーク、制御フロー復元、シンボリック実行との連携、難読化解除を解説します。
主な機能
- 01バイナリから LLVM IR への手順
- 02各種バイナリリフティングフレームワーク
- 03制御フロー復元手法
- 04シンボリック実行と Triton の連携
- 05最適化と難読化解除の手順
活用シーン
- 01バイナリの静的・動的挙動の解析
- 02脆弱性調査や難読化解除
- 03既存バイナリの再コンパイルや最適化
- 04アーキテクチャ間のコード変換の検討
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gmh5225/ awesome-llvm-security --skill binary-liftingインストール後、Claude Code で/binary-liftingを入力して読み込まれたか確認します。
詳細
バイナリリフティングのスキル
このスキルでは、バイナリ実行ファイルを LLVM IR にリフティングするための手法とツールを紹介します。これにより、既存のバイナリの高度な解析、変換、再コンパイルが可能になります。
基本概念
バイナリリフティングとは?
バイナリリフティングとは、低レベルのマシンコード(x86、ARM など)を高レベルの中間表現(LLVM IR)に変換するプロセスです。これにより、次のことが可能になります。
- 静的解析と動的解析
- 難読化解除と脆弱性の調査
- コードの再コンパイルと最適化
- アーキテクチャ間の変換
リフティングのパイプライン
Binary → Disassembly → IR Generation → Optimization → Analysis/Recompilation
主なリフティングフレームワーク
実運用向けツール
- RetDec(Avast):C コードを出力する完全な逆コンパイラーで、複数のアーキテクチャをサポートします
- McSema(Trail of Bits):x86/x64 から LLVM IR への変換、関数の復元に対応します
- revng:QEMU をベースとし、複数のアーキテクチャをサポートします
- reopt(Galois):正確性と形式手法を重視します
研究用/特化型ツール
- Rellume:JIT の用途向けに、x86-64 から LLVM への高速リフティングを行います
- fcd:最適化パスを備えた、パターンベースの逆コンパイラーです
- bin2llvm:QEMU ベースのバイナリから LLVM へのトランスレーターです
- llvm-mctoll:Microsoft のマシンコードから LLVM へのリフターです
言語特化型リフター
- llvm2c/IR->C:LLVM IR を C コードに変換します
- llvm2cranelift:LLVM IR を Cranelift IR に変換します
- Leaven:LLVM IR を Go 言語に変換します
- masxinlingvonta:JVM バイトコードを LLVM IR に変換します
実装手法
命令の意味論の変換
// Example: Translating x86 ADD to LLVM IR
Value* translateADD(IRBuilder<> &builder, Value* op1, Value* op2) {
Value* result = builder.CreateAdd(op1, op2, "add_result");
// Update flags (CF, OF, SF, ZF, etc.)
updateCarryFlag(builder, op1, op2, result);
updateOverflowFlag(builder, op1, op2, result);
updateSignFlag(builder, result);
updateZeroFlag(builder, result);
return result;
}
制御フローの復元
- 線形スイープ:単純ですが、データが埋め込まれたコードを見落とします
- 再帰下降:制御フローをたどるため、より広い範囲をカバーできます
- 推測的逆アセンブル:間接ジャンプ/呼び出しに対応します
- 機械学習:ML を使って関数の境界を特定します
間接制御フローへの対応
- 値集合解析(VSA)
- ジャンプ先の解決に向けたシンボリック実行
- 仮想関数テーブルの再構築に向けた型の復元
Triton との連携
Triton シンボリック実行エンジンをリフティングと組み合わせて使用できます。
from triton import TritonContext, ARCH, Instruction
ctx = TritonContext(ARCH.X86_64)
# Symbolically execute and extract AST
inst = Instruction(b"\x48\x01\xd8") # add rax, rbx
ctx.processing(inst)
# Convert Triton AST to LLVM IR
ast = ctx.getRegisterAst(ctx.registers.rax)
llvm_ir = triton_ast_to_llvm(ast)
リフティングによる難読化解除
アプローチ
- 難読化されたバイナリを LLVM IR にリフティングします
- 最適化パスを適用して簡素化します
- 特定の難読化パターンに対応するカスタムパスを使用します
- クリーンアップしたコードを再出力します
役立つ最適化パス
- デッドストアの削除(DSE)
- グローバル値番号付け(GVN)
- 定数伝播
- 命令の結合
- ループの簡素化
VMP/VM ハンドラーの復元
- ディスパッチャーのパターンを特定します
- VM バイトコードの意味論を抽出します
- ハンドラーをネイティブ IR に変換します
- 例:VMProtect の解析に使う TicklingVMProtect
ベストプラクティス
- アーキテクチャのサポート:エンディアン、呼び出し規約、ABI の違いに対応します
- メモリのモデル化:グローバル変数/スタック変数のメモリレイアウトを正確に扱います
- 外部依存関係:ライブラリー呼び出しとシステムコールに対応します
- 検証:元のコードとリフティング後のコードの実行トレースを比較します
- 段階的なリフティング:プログラムの部分的な解析に対応します
動的バイナリリフティング
ランタイム変換
- Instrew:LLVM による高速なインストルメンテーション
- QBDI:QuarkslaB Dynamic Binary Instrumentation
- binopt:バイナリコードのランタイム最適化
JIT 再コンパイル
頻繁に実行されるコードパスをリフティングし、ランタイムで最適化します。
- プロファイル誘導型リフティング
- ホットパスの検出
- 投機的最適化
リソース
リフティングツールと研究論文の完全な一覧については、メインの README.md にある LIFT セクションを参照してください。
詳細情報の取得
最新のリソースへのリンク、ツール一覧、プロジェクトの参照情報が必要な場合は、次の場所から最新のデータを取得してください。
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
この README には、次の包括的な厳選リストが含まれています。
- バイナリリフティングのフレームワークとツール(LIFT セクション)
- 関連する研究論文とドキュメント
- 実装例とチュートリアル
コメント
Markdown 対応