【 CTF実践編|第7話/全10話】メモリダンプから断片化したflagを拾う

⚡ CTF実践編|第7話/全10話

メモリダンプから断片化したflagを拾う

フォレンジック実践編の始まりです。実行中のプログラムのメモリを写し取った「メモリダンプ」は、ファイルと違って構造がなく、ノイズの中に意味のある文字列が埋まっています。今回はflagがさらに複数の断片に分割され、順番もバラバラに散らばっています。

🧠 メモリフォレンジック 🔍 strings抽出 🧩 断片の並べ替え ⭐ 難易度:★★★★☆
01

💭 前回の振り返り|フォレンジック実践編のはじまり

暗号実践編から、フォレンジック実践編へ

🔗

第5・6話は暗号、ここからはフォレンジック

第5話のRSA・第6話のECBは、暗号の数学的・運用上の弱点を扱いました。ここからの2話はフォレンジック実践編です。前作第15話では、ファイルのマジックバイトという「構造化されたデータ」からの証拠探しを学びました。今回はその対極にある、構造を持たない「メモリ」というデータを扱います。

📌

この話の前提知識

16進ダンプの読み方の基礎を前提にします。

前作第15話の課題は、ファイルの中に1つの連続した文字列として手がかりが埋まっていました。今回はその発展形として、手がかりが複数の断片に分割され、しかもバラバラの順序で散らばっているという、より実戦的な状況を体験します。

02

🧠 メモリダンプとは何か|stringsという基本技術

構造を持たない、生のデータの塊

「メモリダンプ」とは、実行中のプログラムが使っているメモリ(RAM)の内容を、ある瞬間にそのまま写し取ったデータです。ファイルには拡張子やヘッダーといった「構造」がありますが、メモリには本来そうした区切りがなく、プログラムのコード・変数の値・使われなくなった残留データなどが入り混じった、ただのバイトの塊として存在します。

実際のメモリには、起動中のプロセス名・読み込まれたDLLやライブラリの一覧・環境変数・直前に処理した通信内容の断片など、さまざまな情報が同時に存在しています。あるデータがすでに使われなくなっていても、その領域が別の用途に上書きされるまでは、古い内容がそのまま読み取れることも珍しくありません。これが「消したはずのデータがメモリには残っている」という現象の正体です。

メモリダンプ(ノイズの中に文字列が埋まっている) 文字列A decoy 文字列B 文字列C それ以外の部分(暗い色)はランダムなノイズ・無関係なデータ strings:4文字以上の「表示できる文字の連続」だけを自動的に抜き出す技術
💡

strings:printableな文字の連続を探す

このような構造のないデータから手がかりを探す代表的な手法がstringsです。バイト列を先頭から1バイトずつ確認し、「表示可能なASCII文字(0x20〜0x7e)」が一定数(通常4文字)以上連続している部分だけを抜き出します。今回のラボでも、このstringsと同じロジックをJavaScriptで実装しています。

03

🔍 ノイズの中から本物を見分ける

stringsは「文字列らしきもの」を全部出すだけ

stringsが抜き出すのは「表示可能な文字が並んでいる場所」であり、それが「意味のある手がかりかどうか」までは判断してくれません。実際の調査でも、本物の手がかりと、デバッグ用の変数名や設定値といった無関係な文字列が混在した状態で出力されることが普通です。

strings出力の例本物の手がかりか見分け方
DEBUG_MODE=true❌ ノイズ設定値らしき形式で、断片を示す印がない
FRAG1:CTF{...✅ 本物独自の接頭辞(タグ)と一貫した命名規則を持つ
heap_chunk_free❌ ノイズメモリ管理の内部用語っぽいが断片の印がない
⚠️

出現順は信頼できない

メモリ上のデータは、プログラムがメモリを確保した順序や内部構造によって配置されるため、論理的な順序とメモリ上の物理的な並び順が一致しない場合があります。「strings出力に出てきた順番」を手がかりの正しい順番だと思い込むと失敗します。断片それぞれに振られた番号など、内容そのものを見て正しい順序を判断する必要があります。

実際の調査でも、strings | grep -i passwdのように、出力をさらに絞り込むためのキーワード検索(grep)を組み合わせるのが定番の手法です。今回のチャレンジで言えば「FRAGという文字列を含む行だけに注目する」という行為自体が、まさにこのgrepの考え方にあたります。

04

🧪 実践チャレンジ:メモリダンプを解析する

約490バイトのダンプから4つの断片を見つけ出す

下のラボには、実際の490バイトのメモリダンプ(の一部を16進数で表示したもの)と、stringsを実行するボタンがあります。

🎯

チャレンジの手順

① 「stringsを実行する」を押す → ② 出力された文字列のうち、FRAG数字:という接頭辞を持つものだけに注目する → ③ 見つかった断片の総数をFOUND-N-FRAGMENTSの形式でステージ1に入力 → ④ 断片を番号順に並べ替え、接頭辞を取り除いて連結し、復元したflagをステージ2に入力。

メモリダンプ(先頭部分のプレビュー、16進数):

復元用の入力欄(断片を番号順に並べて、FRAGN:を除いた文字列を連結してください):

🎉 復元成功!

復元されたフラグ:CTF{M3M0RY_FOR3NS1CS_STR1NGS}

🧩 実践チャレンジ:2つのステージを繋いでフラグを掴め

ステージ1をクリアすると、ステージ2が解放されます。両方クリアした時点でスコアが確定します。

📊 ステージ進捗: 0/2|挑戦回数: 0回

1ステージ1:ノイズの中から断片を数える

本物のflag断片の総数をFOUND-N-FRAGMENTSの形式で入力してください。

05

🛡️ なぜメモリフォレンジックが実務で重要なのか

ディスクに何も残っていなくても、メモリには残る

マルウェアの中には、ディスク上にファイルを残さず、メモリ上だけで動作する「ファイルレス」と呼ばれる種類があります。このような攻撃は、ディスクを調べる従来のフォレンジックだけでは見つけられません。インシデント対応の現場では、感染が疑われる端末のメモリを保全し、Volatility(ボラティリティ)のような専用ツールでプロセス一覧・通信先・実行中のコードを解析するメモリフォレンジックが重要な手法になっています。

Volatilityのような専用ツールは、stringsよりはるかに高度な解析ができます。たとえば、メモリの構造を理解した上で「どのプロセスがどのメモリ領域を使っていたか」を正確に再構築したり、暗号化されていないパスワードやネットワーク接続の履歴を直接取り出したりできます。今回学んだstringsは、こうした専用ツールが使えない状況でも応用できる、最も基本的で汎用性の高い手がかり探しの技術です。

⚠️

メモリは「揮発性」の証拠

メモリの内容は端末の電源を切ると消えてしまうため、「揮発性(volatile)の証拠」と呼ばれます。インシデント対応では、慌てて端末の電源を切ってしまうと貴重な証拠が失われるため、まず適切な手順でメモリダンプを取得してから対応するという原則があります。

この優先順位の考え方は「揮発性の順序(Order of Volatility)」として知られ、メモリ・ネットワーク接続・実行中のプロセスのように消えやすい情報から先に保全し、ディスク上のファイルのように消えにくい情報は後回しにするという、フォレンジック調査全体の基本原則になっています。次回学ぶログファイルは、この中では比較的消えにくい情報に分類されます。

次回は、複数の異なる形式のログを時系列で統合し、1つの攻撃の流れを再構築する複合フォレンジックに挑戦します。

06

📝 まとめ+FAQ+次回予告

構造のないデータから、構造を見つけ出す

第7話では、メモリダンプという構造を持たないデータから、stringsの考え方でノイズを取り除き、さらに分断され順序の乱れた断片を正しく並べ替えてflagを復元する体験をしました。「出てきた順番が正しい順番とは限らない」という教訓は、実際のフォレンジック調査でもとても重要な視点です。

✅ 今回のまとめチェック

・メモリダンプは構造を持たない生のバイトの塊
・stringsは「表示可能な文字の連続」を自動的に抜き出す基本技術
・抜き出した文字列には本物の手がかりとノイズ(デコイ)が混在する
・出現順は正しい順序を保証しない。内容(番号タグなど)で判断する
・採点ルールは前話までと同じ(ヒント-15pt、両ステージ解決でスコア確定)

Q. 実際のstringsコマンドも、ブラウザのラボと同じ仕組みですか?

はい、基本的な考え方は同じです。Linux/macOSのstringsコマンドは、バイナリファイルやメモリダンプから表示可能な文字の連続(デフォルトで4文字以上)を抜き出します。本ラボのJavaScript実装も、このロジックをそのまま再現しています。

Q. 断片の数や順番を示すFRAG1・FRAG2のような印は、実際の攻撃やCTFにもあるのですか?

そのままの形では多くありませんが、データが分割されて保存される際に何らかの識別子やシーケンス番号が付与されるケースは実際にあります。CTFのフォレンジック問題では、学習のために分かりやすい印を付けることがよくあります。

Q. 本物のメモリダンプはどれくらいの大きさになりますか?

実際のプロセスのメモリダンプは数百MBから数GBに達することもあります。今回のラボは学習用に490バイトという極めて小さいサイズにしていますが、実務では巨大なダンプから効率的に手がかりを絞り込むためのツールや検索テクニックが必要になります。正規表現を使った高度な検索(例えばメールアドレスやIPアドレスの形式に一致する文字列だけを抜き出す)も、実務のメモリ解析では頻繁に使われます。

Q. ノイズの中に偶然4文字以上のアルファベットが並んでしまうことはありますか?

あります。ランダムなデータの中にも、偶然printableな文字が連続することがあります。実際のstrings出力にも、こうした「意味のないノイズの文字列」が紛れ込むことは多く、すべてが手がかりとは限らないと心得ておく必要があります。

次回・第8話

3つのログを時系列で繋ぐ|複合フォレンジック

Webアクセスログ・認証ログ・ファイアウォールログという異なる形式のログを時系列で統合し、1つの攻撃の流れを再構築します。

📚 参考情報

  • SANS FOR526 — Memory Forensics In-Depth
  • Volatility Foundation — オープンソースのメモリフォレンジックツール

コメント