ctf-crypto について
ctf-cryptoは、CTF向けにコンパイル済みバイナリ内の暗号処理を調査するスキルです。アルゴリズムの特定、鍵素材の追跡、実装上の弱点の発見を通じて、鍵や平文の復元を支援します。
主な機能
- 01暗号アルゴリズムの特定
- 02鍵とデータフローの追跡
- 03実装上の弱点の分析
- 04鍵の抽出と暗号処理の再現
- 05調査結果の記録と検証
活用シーン
- 01バイナリ内の暗号処理の確認
- 02ハードコードされた鍵や弱い鍵導出の特定
- 03独自暗号を再現して平文を復元
MCP 対応
ReVaのMCPツールを使った文字列・シンボル検索、逆コンパイル結果とメモリの確認、参照関係の追跡、暗号分析結果の記録方法を説明します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cyberkaida/ reverse-engineering-assistant --skill ctf-cryptoインストール後、Claude Code で/ctf-cryptoを入力して読み込まれたか確認します。
同梱ファイルpatterns.md
詳細
CTF 暗号
目的
CTF チャレンジにおける暗号実装の調査担当者として行動します。目標は、コンパイル済みバイナリに含まれる暗号実装を特定、分析、悪用して、フラグや鍵を復元したり、データを復号したりすることです。
数学的基盤を攻撃する現実世界の暗号解析とは異なり、バイナリを対象とする CTF 暗号では、次の点に注目します。
- 実装上の弱点:不適切な鍵管理、脆弱な RNG、欠陥のある独自暗号
- 暗号ロジックのリバースエンジニアリング:バイナリが暗号処理で何を行っているかを理解する
- 鍵の抽出:ハードコードされた鍵の発見、脆弱な情報源からの鍵導出
- 独自暗号の分析:標準外の暗号方式を解読する
- 暗号プリミティブの特定:標準アルゴリズム(AES、RSA、RC4 など)を識別する
このスキルは、バイナリに埋め込まれた暗号を対象とし、純粋な数学的チャレンジを対象とするものではありません。
概念的なフレームワーク
バイナリを対象とする CTF 暗号チャレンジの解決には、体系的な調査フレームワークを用います。
フェーズ 1:暗号の検出
目標:暗号が使用されているか、使用されている場合はどこかを特定します
調査アプローチ:
- 暗号関連の文字列や定数を検索する
- 数学的な演算パターン(XOR、ローテーション、置換)を特定する
- 標準アルゴリズムの特徴(S-box、鍵スケジュール、マジック定数)を識別する
- 暗号 API のインポート(CryptEncrypt、OpenSSL 関数など)を探す
重要な問い:「暗号は使われているか。使われているなら、どのような種類か?」
フェーズ 2:アルゴリズムの特定
目標:使用されている暗号アルゴリズムを特定します
調査アプローチ:
- 定数を既知の暗号定数(初期化ベクトル、S-box など)と比較する
- 演算パターン(ラウンド、ブロックサイズ、データフロー)を分析する
- コード構造を既知のアルゴリズムパターンと照合する
- ライブラリの使用か独自実装かを確認する
重要な問い:「これはどのアルゴリズムか。それとも独自のものか?」
フェーズ 3:実装の分析
目標:暗号がどのように実装されているかを理解し、弱点を見つけます
調査アプローチ:
- 鍵素材の取得元(ハードコード、導出、ユーザー入力)を追跡する
- 鍵の生成・導出ロジックを分析する
- 動作モード(ECB、CBC、CTR など)を特定する
- 実装上の誤り(IV の再利用、脆弱な RNG など)を探す
- 標準アルゴリズムへの独自の変更を確認する
重要な問い:「どのように実装されていて、弱点はどこか?」
フェーズ 4:鍵の抽出または解読
目標:データを復号するために、鍵を復元するか実装を解読します
調査アプローチ:
- バイナリデータからハードコードされた鍵を抽出する
- 脆弱な鍵導出を悪用する(予測可能な RNG、低いエントロピーなど)
- 独自暗号を解読する(頻度分析、既知平文攻撃など)
- 実装上の欠陥を利用する(タイミング、サイドチャネル、ロジックエラー)
- 復号ルーチンをリバースエンジニアリングし、変換処理を理解する
重要な問い:「平文または鍵をどうすれば復元できるか?」
中核となる手法
手法 1:文字列と定数の分析
使用する場面:初期調査段階
アプローチ:
- 文字列内の暗号関連キーワードを検索する
- 暗号化データを受け取る可能性のある URL や API エンドポイントを検索する
- 大きな定数配列(S-box やルックアップテーブルの可能性があるもの)を特定する
- 定数を既知の暗号定数データベースと比較する
- 文字列や定数からのクロスリファレンスをたどって、暗号関数を特定する
ツール:
- 暗号関連キーワードには
regexPatternを指定してget-stringsを使用する - アルゴリズム名には
searchStringを指定してget-stringsを使用する - 定数配列の調査には
read-memoryを使用する - 使用箇所の追跡には
find-cross-referencesを使用する
Methodology 2: パターン認識
使用する場面:アルゴリズムの種類を特定する場合
アプローチ:
- 特徴的なループ構造(ラウンド数)を探します
- 置換操作(テーブル参照)を特定します
- 順列パターン(ビットのシャッフル)を認識します
- モジュラー算術(公開鍵暗号)を見つけます
- 既知のアルゴリズムパターンと照合します(patterns.md を参照)
ツール:
- アルゴリズムの構造を確認するには、コンテキスト付きで
get-decompilationを使用します - 操作パターンを調べるには
search-decompilationを使用します - 認識にはパターンリファレンス(patterns.md)を使用します
Methodology 3: データフロー分析
使用する場面:鍵管理とデータフローを理解する場合
アプローチ:
- 平文/暗号文がシステムのどこから入力されるかを追跡します
- 鍵素材の取得元から使用箇所までをたどります
- 変換処理(暗号化、復号、導出)を特定します
- 関数間のデータ依存関係をマッピングします
- 復号された出力の使用先や保存先を見つけます
ツール:
- データフローを調べるには、コンテキスト付きで
find-cross-referencesを使用します - データの役割(平文、鍵、iv)を明確にするには
rename-variablesを使用します - 暗号関連の型(uint8_t* など)を反映するには
change-variable-datatypesを使用します
Methodology 4: 脆弱性の発見
使用する場面:実装に含まれる悪用可能な欠陥を見つける場合
CTF チャレンジでよく見られる実装上の脆弱性:
- バイナリ内のハードコードされた鍵(直接抽出可能)
- 脆弱な鍵導出(時刻ベースのシード、単純な XOR)
- 不適切な乱数生成(予測可能、定数をシードとして使用)
- ECB モード(ブロックの分析や改変が可能)
- IV の再利用、または予測可能な IV
- 数学的な弱点を持つ独自暗号
- 不完全な鍵スケジュール、またはラウンド数の削減
- 暗号処理を迂回するデバッグ/テストモード
調査戦略:
- 鍵がハードコードされているか確認します(鍵ポインターが指すメモリを読み取ります)
- RNG の初期化を分析します(シードは予測可能でしょうか?)
- 利用モードの脆弱性を確認します(ECB のパターンなど)
- テスト用/デバッグ用のバックドアを探します
- 標準アルゴリズムに加えられた独自の変更を特定します
Methodology 5: 復号処理のリバースエンジニアリング
使用する場面:暗号処理のロジックを理解または再現する必要がある場合
アプローチ:
- 復号ルーチンを見つけます(暗号化を逆方向に実行している場合があります)
- 変数名を体系的に変更します(鍵、平文、暗号文、状態)
- 適切なデータ型を適用します(バイト配列、ワード配列)
- 各変換ステップをコメントで記録します
- Python スクリプトでロジックを再現し、理解を確認します
- 可能であれば、バイナリ自体の復号ルーチンを使用します
ツール:
- 分かりやすくするには
rename-variablesを使用します - 正確性を高めるには
change-variable-datatypesを使用します - 理解した内容を記録するには
set-decompilation-commentを使用します - 重要な暗号関数に印を付けるには
set-bookmarkを使用します
柔軟なワークフロー
CTF の暗号チャレンジは多岐にわたるため、個々のチャレンジに合わせてこのワークフローを調整してください。
初期評価(5 分)
- 検出:暗号関連の文字列、インポート、定数を検索します
- 特定:既知のアルゴリズムとパターンをすばやく照合します
- 評価:標準暗号か独自暗号か、また強度は十分かを判断します
詳細調査(15~30 分)
- 理解:暗号関数を逆コンパイルし、データフローを追跡します
- 改善:変数名を変更し、型を修正して、動作を記録します
- 分析:鍵の取得元を見つけ、脆弱性を確認します
- 悪用:鍵を抽出するか、脆弱な実装を突破するか、ロジックを再現します
悪用(所要時間は状況によって異なります)
- 抽出:バイナリデータからハードコードされた鍵を取り出します
- 突破:脆弱な RNG、独自暗号の欠陥、または不適切な鍵導出を悪用します
- 復号:復元した鍵または再現したロジックを使ってフラグを取得します
検証
- テスト:復号によって読み取れるフラグが得られることを確認します
- 記録:調査結果をブックマークとコメントに保存します
パターン認識
暗号アルゴリズムのパターンと認識手法の詳細については、patterns.md を参照してください。
主なパターンのカテゴリ:
- ブロック暗号:AES、DES、Blowfish(S ボックス、ラウンド、鍵スケジュール)
- ストリーム暗号:RC4、ChaCha(状態遷移、鍵ストリーム生成)
- 公開鍵暗号:RSA、ECC(剰余演算、大きな整数)
- ハッシュ関数:MD5、SHA ファミリー(圧縮、マジック定数)
- 単純な方式:XOR、置換、独自暗号
CTF 特有の考慮事項
CTF チャレンジの設計パターン
よくある CTF の暗号シナリオ:
- 脆弱な独自暗号:暗号解析(頻度分析、既知平文攻撃)で解読する
- ハードコードされた鍵:.data セクションから抽出する
- 脆弱な RNG:時間ベースまたは定数シードから鍵を予測する
- 標準的な暗号と脆弱な鍵:小さな鍵空間を総当たりする
- 実装上のバグ:ロジックエラーを悪用して暗号を回避する
- 難読化された標準暗号:コードが難読化されていても認識する
CTF の暗号ではないもの:
- 純粋な数学的暗号解析(AES-256 を数学的に破ること)
- ハードウェアに対するサイドチャネル攻撃(タイミング、電力解析)
- ネットワークプロトコルへの攻撃(ただし、バイナリ暗号と組み合わせる場合があります)
- 最新の TLS/SSL 実装を破ること
時間管理
難易度に応じて優先順位を付けます:
- ハードコードされた鍵(数分):.data を検索し、バイト列を抽出する
- 脆弱な RNG(10~15 分):シードを分析し、シーケンスを予測する
- 単純な独自暗号(20~30 分):頻度分析、既知平文攻撃
- 実装上のバグ(15~30 分):ロジックエラーを見つけ、エッジケースをテストする
- 複雑な独自暗号(30~60 分):徹底的にリバースエンジニアリングし、解読する
次に進むタイミングを見極めましょう:30 分間進展がなければ、いったん立ち止まって状況を見直すか、別のチャレンジに取り組んでください。
ツールの使用パターン
発見フェーズ
get-strings regexPattern="(AES|RSA|encrypt|decrypt|crypto|cipher|key)"
get-symbols includeExternal=true → Check for crypto API imports
search-decompilation pattern="(xor|sbox|round|block)"
分析フェーズ
get-decompilation includeIncomingReferences=true includeReferenceContext=true
find-cross-references direction="both" includeContext=true
read-memory at suspected key/S-box locations
改善フェーズ
rename-variables: {"var_1": "key", "var_2": "plaintext", "var_3": "sbox"}
change-variable-datatypes: {"key": "uint8_t*", "block": "uint8_t[16]"}
apply-data-type: uint8_t[256] to S-box constants
set-decompilation-comment: Document crypto operations
ドキュメント化フェーズ
set-bookmark type="Analysis" category="Crypto" → Mark crypto functions
set-bookmark type="Note" category="Key" → Mark key locations
set-comment → Document assumptions and findings
他のスキルとの連携
バイナリのトリアージ後
binary-triage で暗号の兆候が見つかった場合は、ブックマークした場所から調査を始めます:
search-bookmarks type="Warning" category="Crypto"
search-bookmarks type="TODO" category="Crypto"
詳細分析との連携
体系的に暗号関数を分析するには、deep-analysis の調査ループを使用します:
- READ → デコンパイル結果を取得する
- UNDERSTAND → 暗号パターンと照合する
- IMPROVE → 分かりやすくなるように名前や型を変更する
- VERIFY → 再度読み直して確認する
- FOLLOW → 鍵の取得元をたどる
- TRACK → 調査結果を記録する
単独での使用
ユーザーが暗号について明示的に尋ねている場合:
- 「どの暗号化方式が使われていますか?」
- 「ハードコードされた鍵を見つけてください」
- 「独自暗号はどのように動作しますか?」
- 「暗号化鍵を抽出してください」
出力形式
調査結果を構造化して返します:
Crypto Analysis Summary:
- Algorithm: [Identified algorithm or "custom cipher"]
- Confidence: [high/medium/low]
- Key Size: [bits/bytes]
- Mode: [ECB, CBC, CTR, etc. if applicable]
Evidence:
- [Specific addresses, constants, code patterns]
Key Material:
- Location: [address of key]
- Source: [hardcoded/derived/user-input]
- Value: [key bytes if extracted]
Weaknesses Found:
- [List of exploitable weaknesses]
Exploitation Strategy:
- [How to break/bypass crypto to get flag]
Database Improvements:
- [Variables renamed, types fixed, comments added]
Unanswered Questions:
- [Further investigation needed]
忘れないでください
- 汎用的なアプローチ:概念的なフレームワークをあらゆる暗号実装に適用する
- パターン照合:アルゴリズムの認識には patterns.md を使用する
- 実装に注目:数学的に破るのではなく、実装の弱点を探す
- 鍵の抽出:多くの CTF チャレンジでは、鍵を抽出または導出できる
- 調査しながら記録する:暗号解析では、変数名を分かりやすくすることが役立つ
- 作業時間を区切る:鍵の抽出が簡単なら、暗号解析に何時間も費やさない
- 仮説を検証する:暗号ロジックを再現して、自分の理解を確認する
目標はフラグを抽出することであり、暗号研究者になることではありません。数学的な攻撃ではなく、実装の弱点を利用してください。