[詳細]「その関数、本当にただコピーしているだけ?」🕵️‍♂️アナリストが見落とす隠れたサブルーチンをAIで摘発

こんにちは、深層分析を目指すセキュリティ研究員の皆さん!🦅

マルウェアを分析する際に最もよく犯す間違いは何でしょうか?それは「仮定(Assumption)」です。

main関数で数多くのCALL命令に遭遇します。「ふむ、FUN_00401200?中を見るとパラメータを2つ受け取ってループしているな?strcpyやmemcpyのような文字列コピー関数だろう。パス!」

…と見過ごした瞬間、あなたはマルウェア作成者の罠に陥っているかもしれません。😱 マルウェア作成者は、アナリストが面倒がってスキップしそうな「単純に見えるサブルーチン」の中に、暗号解除ロジックやアンチデバッグコードを隠しておくことがあるからです。

今日は、アナリストがうっかり見過ごしがちなサブルーチン(Subroutine)の隠された爪を、AIとのクロス検証を通じて見つけ出す深層技術を実習してみましょう。


1. サブルーチンのジレンマ:「これを全部見なければならないのか?」😫

マルウェアは何百、何千もの関数で構成されています。これを一つ一つ全て分解して見るのは不可能です。そのため、私たちは経験的に「パターン」を見て判断します。

  • パターンA:ループを回しながら0になるまでカウント -> strlen(文字列長計算)だな。(スキップ)
  • パターンB:ソースからデスティネーションへバイトを移動 -> memcpy(メモリコピー)だな。(スキップ)

しかし、もしその関数がコピーと同時に悪性シェルコードをデコードしていたらどうでしょうか?💣


2. 実習シナリオ:偽装された関数 FUN_CopyOrNot 🎭

Ghidraで以下のようなC疑似コードを発見したと仮定してみましょう。

// アナリストが「単純なコピー」と誤解しやすいコード
void FUN_CopyOrNot(byte *dest, byte *src, int length) {
  int i;
  for (i = 0; i < length; i = i + 1) {
    byte bVar1 = src[i];
    // ... 何か複雑な変数割り当て ...
    if ((i % 5) == 0) {
        // アナリストがざっと見て見過ごしそうな条件文
        dest[i] = bVar1 ^ 0x41; 
    } else {
        dest[i] = bVar1;
    }
  }
  return;
}

人間の目でざっと見ると、srcをdestに移動するコピー関数のように見えます。途中にif文が少しありますが、「まあパディング処理かエンコーディングだろう」と見過ごしやすいでしょう。

しかし、ここには5番目のバイトごとにXOR 0x41(キー’A’)を実行する難読化解除ロジックが隠されています。これを見落とすと、後続のコードで誤ったデータを見ることになります。


3. AIクロス検証:「疑い、また疑え」🧐

次に、このコードをAIに投げかけてクロス検証を試みます。ここで重要なのは、「単純に要約して」ではなく「おかしな点を見つけて」と尋ねることです。

❌ 悪いプロンプト(一般的な要約)

「この関数は何をしているの?」 -> AIの回答:「与えられた長さだけソース配列をターゲット配列にコピーする関数です。特定の条件に基づいて値を変更します。」(あまりにも平凡で危険性を感じない)

✅ 良いプロンプト(クロス検証用)

[役割付与]

あなたはマルウェアの隠蔽技術を見つけ出すセキュリティ分析の専門家です。

>

[目標]

以下のコードは単純なメモリコピー関数(memcpy)のように見えます。しかし、私はこの関数が「副作用(Side Effect)」を持っていると疑っています。

>

[要請事項]

>

1. この関数が標準ライブラリ関数(strcpy, memcpyなど)と結果的に異なる点を正確に指摘してください。

2. データが変造(Modification)される行があれば見つけて、その意味(XOR, Shiftなど)を解釈してください。

3. この手法がマルウェアで主にどのような目的で使用されるかを推論してください。

>

[コード] (上記のコードを貼り付け)


4. AIの分析結果:「見つけたぞ!」🚨

適切なプロンプトを入力すると、AIは顕微鏡のようにコードを分解します。

🤖 AI分析レポート

>

1. 異常兆候の発見 (Anomaly Detection) この関数は単純なmemcpyではありません。標準のコピー関数はデータをそのまま転送しますが、この関数は条件付きデータ変造を実行します。

>

2. コアロジック分析

>

– if ((i % 5) == 0): インデックスが5の倍数であるたびに分岐が発生します。

– dest[i] = bVar1 ^ 0x41;: XOR 0x41演算が実行されます。これは単純なコピーではなく、「インライン復号化(Inline Decryption)」の過程です。

>

3. アナリストへの助言 この関数を経由したデータ(dest)は、元のデータ(src)と内容が異なります。もしsrcが暗号化されたシェルコードであった場合、destには実行可能な攻撃コードが含まれることになります。この関数を「単純なコピー」とラベリング(Labeling)して見過ごしては絶対にいけません!


5. 私たちの対応:関数名の変更 (Renaming) 🏷️

AIのおかげで、私たちは罠を回避できました。Ghidraに戻ってやるべきことはただ一つです。

  1. 関数名 FUN_CopyOrNot を右クリック
  2. Rename Function をクリック
  3. Decryption_Copy_XOR_41 に変更

これで、この関数が呼び出されるすべての場所で「ああ!あれは暗号を解除するものだったのか!」と直感的にわかるようになりました。このようにサブルーチン一つを正確に分析することで、プログラム全体の流れが魔法のように解き明かされることもあります。🗝️


💡 今日のヒント (Takeaway)

  • サブルーチンを無視しないでください:悪魔は細部(ヘルパー関数)に潜んでいます。
  • 標準関数と比較してください:「これはstrcpyと100%同じか?」とAIに尋ねてみてください。
  • マジックナンバーを探してください:コードの途中に0x41、0xFFのような定数が突然現れたら、必ず疑ってください。
  • AIを「レッドチーム」として使ってください:「私が見落とした脆弱性やトリックはないか?」と逆質問してみてください。

AIと共に皆さんの分析視野がより広く、より深くなることを願っています!次回は分析の華、「分析レポートの自動化」でお会いしましょう。

ハッピーリバーシング!💻✨



Comments

コメントを残す

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