セキュリティ探検家の皆さん、こんにちは! 🕵️♀️🕵️♂️
前回までで、私たちは分析環境を構築し、AIに「適切に」質問するためのプロンプトエンジニアリングの基礎を固めました。もう理論は十分です。実践に入る時が来ました! 🔥
実際のマルウェアを分析していると、main関数だけが単独で存在するケースはほとんどありません。数十、数百もの関数が蜘蛛の巣のように絡み合っています。🕸️ その中で「本当に重要な機能を持つ関数(Key Function)」を見つけ出し、その機能を素早く把握することが分析官の腕の見せ所です。
しかし、アセンブリ言語や複雑なCの擬似コード(Pseudo-code)を目で追うだけでは、すぐに疲れてしまいます。😵💫
今日の演習では、Ghidraで核心となる関数を「ピンポイントで」特定し、AIに投げかけて「的確に」要約してもらう、分析速度を10倍向上させるルーチンを実際に試してみましょう。
準備はできましたか? Let’s Dive in! 🤿

🎯 実習目標
- Ghidraで分析価値の高い主要関数ブロックを識別する。
- 該当関数のデコンパイルコードを抽出(Copy)する。
- 前回学んだプロンプトエンジニアリングを適用してAIへの入力を構成する。
- AIが要約してくれた機能に基づいて分析方向を決定する。
STEP 1. 「犯人はこの中にいる!」主要関数を識別する 🧐
マルウェアには数多くの関数がありますが、すべてが重要ではありません。私たちは「悪意のある行為」に関連する核心関数を見つける必要があります。
💡 ヒント:どの関数を選べばよいでしょうか?
- 怪しい文字列を参照する関数:「Encrypt」、「Cmd.exe」、「Password」、IPアドレス文字列を使用する関数は強力な容疑者です。(GhidraのWindow -> Defined Stringsを活用)
- 危険なAPIを呼び出す関数:VirtualAlloc(メモリ割り当て)、CreateRemoteThread(インジェクション)、connect(ネットワーク)、WriteFile(ファイル作成)のようなAPIを呼び出す関数を追跡してみてください。(GhidraのSymbol Tree -> Importsを活用)
- 複雑な演算を実行する関数:繰り返し文(for/while)やXOR、Shift演算が多ければ、暗号化または難読化解除ルーチンである可能性が高いです。
[実習状況の仮定] 分析中にランサムウェアと疑われるサンプルから、ファイルを開き、何か複雑な繰り返し処理を実行した後、ファイルを再度書き込む関数を一つ発見しました!名前はGhidraが任意に付けたFUN_1400012a0です。
STEP 2. コード抽出:「Ctrl+C、コピーの美学」 📋
Ghidraのデコンパイラ(Decompiler)ビューに表示されるコードが私たちの分析対象です。
- 関数選択:分析したい関数(FUN_1400012a0)の内部をクリックします。
- コード全体選択:デコンパイラウィンドウでマウスでドラッグするか、Ctrl + Aを押して関数コード全体を選択します。
- コピー:Ctrl + Cを押してクリップボードにコピーします。
⚠️ 注意:関数が長すぎる場合(例:数千行)、AIの入力制限(Token limit)を超える可能性があります。このような場合は、核心的な繰り返し文や条件文ブロックのみを部分的にコピーするセンスが必要です!
STEP 3. AI尋問:「さあ、学んだ通りに質問してみよう!」 🗣️
これでコピーしたコードを持ってAI(ChatGPT、Claudeなど)の元へ行きます。前回学んだ魔法の公式を覚えていますか?
[ペルソナ] + [コンテキスト] + [データ(コード)] + [指示事項(目標)]
この公式を適用してプロンプトを作成してみましょう。
🧑💻 [私のプロンプト入力]:
**역할 (Persona):** 당신은 시니어 악성코드 리버스 엔지니어입니다.
**컨텍스트 (Context):** 나는 현재 랜섬웨어로 의심되는 윈도우 실행 파일(.exe)을 분석 중입니다. 기드라(Ghidra)를 통해 파일을 열고 쓰기 작업을 수행하는 것으로 보이는 의심스러운 함수 하나를 추출했습니다.
**지시사항 (Goal):**
1. 아래 제공된 C언어 의사 코드(Pseudo-code)의 핵심 기능을 **3줄 이내로 요약**해주세요.
2. 이 함수가 악성 행위(예: 파일 암호화, 데이터 유출 등)와 관련이 있을 가능성을 '상/중/하'로 평가하고 그 이유를 설명해주세요.
3. 코드 내에서 주목해야 할 중요한 지역 변수나 파라미터가 있다면 지적해주세요.
**코드 (Data):**
c
// (ここに先ほどGhidraからコピーしたコードを貼り付けてください)
// 例示コード(実際にははるかに複雑ですが、雰囲気だけ見てください!)
void FUN_1400012a0(char *filePath, byte *key, int keyLen) {
HANDLE hFile = CreateFileA(filePath, …);
// … ファイル読み込み省略 …
byte *fileBuffer = VirtualAlloc(…, fileSize, …);
ReadFile(hFile, fileBuffer, …);
// 怪しい繰り返し文開始
for (int i = 0; i < fileSize; i++) {
fileBuffer[i] = fileBuffer[i] ^ key[i % keyLen]; // XOR演算
}
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
WriteFile(hFile, fileBuffer, …); // 上書き
CloseHandle(hFile);
}
“`
STEP 4. 結果分析:AIの回答を検証せよ! ✅
AIが回答を出しました。結果を確認し、私たちの分析方向と合致するか検証する必要があります。
🤖 [AIの回答例]:
📝 主要機能の要約:この関数は、指定されたファイルパス(filePath)のファイルを開き、メモリに割り当て(VirtualAlloc)た後、渡されたキー(key)を使用してバイト単位でXOR演算を実行し、結果を元のファイルに上書きします。
>
🚨 悪性可能性評価:[高] 理由:ファイルの内容を読み取り、XOR演算(最も基本的な暗号化/難読化手法)で変調した後、元のファイルに上書きする行為は、ランサムウェアのファイル暗号化ルーチンで非常に典型的に見られるパターンです。正常なプログラムがファイルをこのように上書きすることは稀です。
>
👀 注目すべき変数:
>
– filePath(パラメータ1):どのファイルが暗号化の対象となるか確認が必要です。
– key(パラメータ2):暗号化に使用されるキー値です。このキーがどこで生成されたかを追跡することが重要です。(復号ツール作成の核心!)
🎉 実習終了:分析速度の革命
どうでしたか?複雑に見えるコードの塊をAIに投げかけると、わずか数秒で「ああ、これはランサムウェアの暗号化ルーチンだ。キーを見つけるのが重要だな!」と核心を把握しました。⚡
もしこれを一人で一行ずつ解釈していたら、20~30分はゆうに費やしたでしょう。AIは私たちの時間を節約し、森全体を見る手助けをしてくれます。
今日の核心ルーチンを忘れないでください:
- Ghidraで怪しいやつを見つける。 🕵️
- コードをコピーする。 📋
- AIにペルソナを与えて質問する。 🗣️
- 回答を見て次の分析対象を決める。(例:keyパラメータを誰が渡しているか追跡しよう!)
次回は、AIが「怪しい」と指摘した関数が実際に動作する際にどのようなデータをやり取りするのかを確認する「動的分析」との連携方法について学びます。
分析の楽しさを感じる一日をお過ごしください!ファイト! 💪
コメントを残す