[実践] “AIよ、その言葉は本当か?” 🤨 AI分析結果とアセンブリ(Assembly)コードのクロス検証

こんにちは、セキュリティの卵の皆さん! 🌱

前回は、AIに複雑なコードを投げかけ、「これはどんな機能?」と尋ねるチートキーを使いました。AIが「これはランサムウェアの暗号化ロジックです!」と教えてくれたので、本当に便利でしたよね?

しかし、ちょっと待って! ✋

「セキュリティアナリストの仕事は疑うことです。」

AIは本当に賢いですが、時々事実ではないことをでっち上げたり(Hallucination)、ニュアンスを誤って解釈したりすることがあります。AIが「暗号化」と言っても、実際には単なる「エンコーディング」だったり、「削除」と言っても「移動」だったりすることもあります。

そこで今日は、AIの説明を「参考資料」として、実際の「真実の部屋」であるアセンブリ(Assembly)コードと照合する方法を学びます。このプロセスを経て初めて、「分析完了!」の判子を押すことができるからです。

アセンブリ言語、難しくありません。たった3つのポイントだけ確認すれば大丈夫です! 🧐


1. なぜわざわざアセンブリを見る必要があるのですか? (Cコードもあるのに…)

Ghidraのデコンパイル(C形式)画面は、時々私たちを欺きます。

  1. 省略された情報: コンパイラの最適化過程で重要な変数が消えることがあります。
  2. AIの誤解: AIは変数名や関数構造だけを見て「これはAES暗号化ですね」と断定しますが、実際に分解してみると単純なXORであることが多いです。

「AIの主張をファクトチェック(Fact Check)すること」、それがリバースエンジニアリングの核心的な能力です。


2. 準備物: 画面設定 🖥️

Ghidraの画面をデュアルで表示します。

  • 左: リスティング(Listing)ビュー -> アセンブリ言語 (真実)
  • 右: デコンパイル(Decompile)ビュー -> C言語 (解釈版)
  • ウィンドウ外: AIとの会話ウィンドウ -> 要約版 (主張)

3. 実践検証: AIの主張 vs アセンブリの事実 🥊

前回のランサムウェアの例をそのまま持ってきて検証してみましょう。

💬 AIの主張 (前回の結果)

“この関数は繰り返し文(Loop)を回しながらファイルデータとキー値をXOR演算して暗号化を実行します。”

さあ、目を大きく開けて左のリスティングビュー(Assembly)で証拠を探してみましょう。

✅ Check Point 1. 本当に繰り返し文があるか? (Loop)

AIが「繰り返し文がある」と言いました。アセンブリで繰り返し文は通常、比較(CMP)とジャンプ(JMP/JNZ)の組み合わせで現れます。

  • アセンブリコードを探す:
LAB_1400012f0:              ; 반복 시작 지점 라벨
   ...
   INC  EAX                ; EAX (카운터 i) 값을 1 증가 (++i)
   CMP  EAX, ECX           ; EAX(i)와 ECX(파일크기)를 비교 (i < size ?)
   JL   LAB_1400012f0      ; i가 더 작으면(JL) 다시 라벨로 점프(Jump)
  • 検証結果: CMP(比較)とJL(Jump If Less)命令が見えますね。ぐるぐる回る構造が合っています。 (AIの説明と一致! ⭕)

✅ Check Point 2. 本当にXOR演算をしているか? (Logic)

最も重要な部分です。AIが「XOR暗号化」と言いました。もしここでADDやSUBが出てきたら、AIが間違っていることになります。

  • アセンブリコードを探す:
MOV  EDX, [RBP + local_var] ; 데이터를 레지스터로 가져옴
MOV  EAX, [RBP + key_var]   ; 키 값을 가져옴
XOR  EDX, EAX               ; ⭐ 여기다! XOR 연산 수행!
MOV  [RBP + local_var], EDX ; 결과를 다시 메모리에 저장
  • 検証結果: はっきりとXOR命令があります。もしここがAESENC(AES暗号化命令)だったら「高度な暗号化」、単なるXORだったら「単純な暗号化」です。目で確認したので確実ですね。 (AIの説明と一致! ⭕)

✅ Check Point 3. 関数呼び出しの確認 (API Call)

AIが「最後にファイルを上書きする」と言いました。ファイルを書き込むには、オペレーティングシステムに依頼する必要がありますよね?

  • アセンブリコードを探す:
PUSH ...                    ; 파라미터 넣기
CALL dword ptr [->WriteFile] ; ⭐ WriteFile API 호출!
TEST EAX, EAX               ; 성공했는지 확인
  • 検証結果: CALL命令の後にWriteFileというWindows API名が明確に見えます。ファイル書き込み行為が事実であることが証明されました。 (AIの説明と一致! ⭕)

4. もしAIが間違っていたら? (Hallucination事例) ⚠️

時々このようなケースが発生します。

  • AI: “このコードはRSA非対称キーを生成します。”
  • 実際のアセンブリ:
CALL rand      ; 랜덤 숫자 생성
MOV [key], EAX
  • 分析家の判断: “違うじゃないか?ただrand()関数を使ってランダムな数字を一つ作っているだけじゃないか?RSAのような大げさなものではない!”

👉 この瞬間こそ、皆さんがAIに勝つ瞬間です。 この内容を分析レポートに「AI誤診修正: RSAではない、単純なランダムキー生成である」と記載すれば良いのです。


5. 初心者のためのアセンブリマッピング表 📝

AIの説明を検証する際によく使われる命令のペアです。これだけ覚えても80%はカバーできます!

AIの説明 (C言語) 探すべきアセンブリ命令 (Opcode) 意味
— — —
関数呼び出し (Call) CALL 他の関数へ移動
条件文 (If) CMP, TEST + JZ, JNZ 比較してジャンプ
繰り返し文 (For/While) JMP, LOOP 特定の場所に戻る
変数代入 (=) MOV, LEA 値をコピー/アドレスを取得
算術演算 (+, -) ADD, SUB, INC, DEC 足し算、引き算
論理演算 (&, ^) AND, OR, XOR ビット演算 (暗号化で重要!)
終了 (Return) RET 関数を終了して戻る

—

🎉 実践のまとめ

今日は、AIという通訳者がしてくれた言葉を盲信せず、アセンブリという原文を確認しながらクロス検証(Cross Validation)する方法を学びました。

  1. AIから全体像を聞く。 👂
  2. アセンブリビューで主要な命令(XOR, CALL, CMP)があるか目で確認する。 👀
  3. 一致すれば合格、異なれば自分の目を信じる。 👁️

この習慣が身につけば、皆さんはもはや「ツールを回すだけのスクリプトキディ」ではなく、「コードの真実を見抜く真の分析家」になるのです。

次回は、このように静的分析で把握した内容を実際に実行して目で確認する動的分析(Dynamic Analysis)の段階に進んでみましょう。

アセンブリ、怖がらないでください!剥いてみれば大したことありません! ファイト! 💪



Comments

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です