LCSAJdump は、Return-Oriented Programming (ROP) および Jump-Oriented Programming (JOP) のガジェットを発見するために設計された静的解析フレームワークです。従来のスキャナーとは異なり、LCSAJdump はアーキテクチャ非依存であり、グラフベースのアプローチを採用して、一般的な線形ツールでは見えない脆弱性を明らかにします。
一般的な ROP スキャナーは、バイナリの実行可能バイトに対して線形の「スライディングウィンドウ」方式を使用します。この方法は、無条件ジャンプや条件付き分岐によって接続された非連続メモリブロックを横断する実行チェーンであるシャドウガジェットを体系的に識別できません。
LCSAJdump は、LCSAJ(Linear Code Sequence and Jump) 分析を通じて制御フローグラフ(CFG) を再構築することで、この制限を克服します。バイナリを基本ブロックの有向グラフとしてモデル化することにより、このツールは以下を識別します。
.text セクションを LCSAJ 基本ブロックに分割し、カスタム構築の逆制御フローグラフ(軽量な隣接表現、重いグラフ依存関係なし)を介してフロー関係を再構築。--depth ホップ内でガジェットテールから到達可能なノードのみを保持し、大規模バイナリ(例:libc)のメモリとビルド時間を劇的に削減しつつ、同一の結果を生成。(ベンチマークを参照)。
LCSAJdump はユニバーサルに設計されています。現在サポートされているアーキテクチャ:
config.py で新しいプロファイルを定義することで簡単に実装可能。pip install lcsajdump
git clone [https://github.com/Chris1sFlaggin/LCSAJdump.git](https://github.com/Chris1sFlaggin/LCSAJdump.git)
cd LCSAJdump
pip install -r requirements.txt
LCSAJdump は、正確なバイナリ解析のための強力な CLI を提供します。
標準解析(デフォルト RISC-V):
python LCSAJdump.py <path_to_binary>
高度な解析(アーキテクチャと出力ファイルの指定):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
不良文字フィルター付き JSON エクスポート:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <path_to_binary>
注:
--jsonの後に-oを使用して JSON をファイルに保存します。--jsonなしの場合、-oはプレーンテキストを保存します。
プレーンテキスト出力の保存:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
すべての実行可能セクションの解析:
lcsajdump --all-exec -d 25 -k 10 -l 30 <path_to_binary>
厳密にアルゴリズムによるランキングを強制(ML をバイパス):
lcsajdump --algo <path_to_binary>
LCSAJdump は、benchmarkTests/ ディレクトリにある厳格かつ段階的に検証されたテストスイートによって支えられています。
14 回にわたる主要なセマンティック特徴エンジニアリングの反復を通じて、ハイブリッドモデルは、純粋に構文上のヒューリスティックではなく、実際のメモリ副作用(angr シンボリック実行を介して抽出)に基づいてガジェットを識別することを学習しました。
グループ認識型 5 分割交差検証(訓練中に見たことのないテストバイナリ)で評価したところ、ランカーは NDCG@1 = 0.914 ± 0.047 および NDCG@10 = 0.922 ± 0.052 を達成し、最も有用なガジェットが常に出力の先頭に配置されることを意味します。2 段階エンジンは、クリーンなスタックポップシーケンスや ret2csu のような呼び出しを優先的にランク付けし、従来の静的スキャナーを欺くクラッシュしやすい固定オフセットジャンプに大きなペナルティを課すことに成功しています。
リポジトリは、エンドユーザーと ML 研究者の両方をサポートするように構成されています。
lcsajdump/ml_study/ ディレクトリには、モデルのトレーニングに使用される完全なパイプラインが含まれています。
build_dataset.py:CTF バイナリのコーパスから構造的特徴と意味的特徴を抽出します。train_model.py:LightGBM LambdaRank モデルをトレーニングし、.pkl モデルを出力します。kfold_cv.py:K 分割交差検証を使用してデータセットを検証します。フレームワークは新しい実装に対して開放されています。新しいアーキテクチャを追加するには:
lcsajdump/core/config.py を開きます。ARCH_PROFILES ディクショナリに新しいプロファイルを追加します。このプロジェクトは MIT ライセンスのもとで公開されています。詳細については LICENSE ファイルを参照してください。
プロジェクトのウェブページをご覧ください:LCSAJdump web page
| フラグ | タイプ | デフォルト | 説明 |
|---|
-a, --arch | TEXT | auto | 対象アーキテクチャ(auto、riscv64、x86_64、arm64)。ELF ヘッダーから自動検出。 |
-d, --depth | INTEGER | 20 | LCSAJ ブロック内の最大検索深度。チェーン長を制御。 |
-k, --darkness | INTEGER | 5 | 剪定しきい値 — ノードあたりの最大訪問回数。高いほどガジェットが多く、スキャンが遅くなる。 |
-l, --limit | INTEGER | 10 | 出力に表示するガジェットの最大数。 |
-s, --min-score | INTEGER | 0 | 結果に表示されるガジェットの最小ヒューリスティックスコア。 |
-i, --instructions | INTEGER | 15 | 単一の LCSAJ ノードに含まれる命令の最大数。 |
-v, --verbose | FLAG | — | 詳細なガジェットごとの結果を出力するための詳細出力を有効化。 |
-o, --output | PATH | — | 出力をファイルに書き込む。デフォルトはプレーンテキスト。JSON 出力の場合は --json と組み合わせて使用。 |
-b, --bad-chars | TEXT | — | ガジェットアドレスからフィルタリングする 16 進バイト(例:"000a0d")。 |
--json | FLAG | — | ガジェットを構造化 JSON として出力。-o と組み合わせてファイルに保存。 |
--all-exec | FLAG | — | .text だけでなく、すべての実行可能セクションを解析。 |
-al, --algo | FLAG | — | 厳密にアルゴリズムによるランキングを使用(ML をバイパス)。 |
--version | FLAG | — | インストールされているバージョンを表示して終了。 |
--help | FLAG | — | ヘルプメッセージを表示して終了。 |