【picoCTF】Disko 1 - ディスクイメージ解析で隠しフラグを復元

問題概要

picoCTFの「Disko 1」という問題の解説記事です。

  • カテゴリ: Forensics
  • 難易度: Easy

問題文

picoCTF Disko 1

解説

この問題では、与えられたディスクイメージファイル disko-1.dd.gzを解析して、隠されたフラグを見つけることが求められます。

ステップ1: ファイル形式の確認

まずはファイル形式の確認から始めます。fileコマンドを使って、disko-1.dd.gz の形式を確認します。
$ file disko-1.dd.gz
disko-1.dd.gz: gzip compressed data, was "disko-1.dd", last modified: Thu May 15 18:48:13 2025, from Unix, original size modulo 2^32 52428800
この出力から、disko-1.dd.gz は gzip で圧縮されたファイルであり、元のファイル名は disko-1.ddであることが分かります。


ステップ2: ファイルの解凍

次に、gunzipコマンドを使ってファイルを解凍します。
$ gunzip disko-1.dd.gz
これで、disko-1.dd というディスクイメージファイルが生成されます。

ステップ3: ファイル形式の再確認

解凍後の disko-1.dd の形式を再度確認します。
$ file disko-1.dd
disko-1.dd: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", Media descriptor 0xf8, sectors/track 32, heads 8, sectors 102400 (volumes > 32 MB), FAT (32 bit), sectors/FAT 788, serial number 0x241a4420, unlabeled
この出力から、disko-1.dd は FAT32 ファイルシステムのディスクイメージであることが分かります。

ステップ4: ファイルシステムの中身を確認

mtoolsを使って、FAT32ファイルシステムの中身を確認します。mdirコマンドを使用します。
$ mdir -i disko-1.dd
 Volume in drive : has no label
 Volume Serial Number is 241A-4420
Directory for ::/

BIN          <DIR>     2025-03-28   0:52  bin
        1 file                    0 bytes
                                  0 bytes free
ルートディレクトリに BIN というディレクトリが存在することが分かります。 通常のドキュメントや画像ファイルは見当たりません。
「0 bytes free」と表示されているため、ディスクがいっぱいで新しいファイルを保存できない可能性があります。


ステップ5: BINディレクトリの中身を確認

次に、BINディレクトリの中身を確認します。
 mdir -i disko-1.dd ::/BIN
 Volume in drive : has no label
 Volume Serial Number is 241A-4420
Directory for ::/BIN

.            <DIR>     2025-03-28   0:52
..           <DIR>     2025-03-28   0:52
SQLITE~1       6781664 2025-03-28   0:52  sqlitebrowser
X86_64~1 11-      3156 2025-03-28   0:52  x86_64-linux-gnu-python3.11-config
DBUS-D~1        244288 2025-03-28   0:52  dbus-daemon
DBUS-R~1         14568 2025-03-28   0:52  dbus-run-session
DBUS-C~1         14560 2025-03-28   0:52  dbus-cleanup-sockets
DBUS-M~1         30952 2025-03-28   0:52  dbus-monitor
DBUS-S~1         30944 2025-03-28   0:52  dbus-send
DBUS-U~1         14560 2025-03-28   0:52  dbus-update-activation-environment
DBUS-U~2         14560 2025-03-28   0:52  dbus-uuidgen

・・・
(中略)
・・・
PYDOC2   7          79 2025-03-28   0:52  pydoc2.7
PYGETT~1 7           0 2025-03-28   0:52  pygettext2.7
CVTSUD~1             0 2025-03-28   0:52  cvtsudoers
      293 files          51 520 570 bytes
                                  0 bytes free

※出力が非常に長いため、一部を省略しています。


上記の結果から以下のことが分かります。

  • BINディレクトリには293個のファイルが存在する
  • 合計サイズは約51MB
  • bash, python3, grep, curl などLinux環境でよく使われるコマンドが多数含まれている
  • X86_64~1のようなファイル名が使われている
つまりこのディスクイメージはLinux環境のコマンド群を FAT32 ファイルシステム上にそのまま格納したものと考えられます。

特にフラグが隠されていそうなファイルは見当たりません。


ステップ6: ファイル単位ではなく別のアプローチを検討

BINディレクトリには非常に多くのファイルが含まれており、1つずつのファイルを調査するのは非効率です。現実的ではありません。

Forensics問題では

  • ファイルとしては存在しない
  • ディスクイメージ内のどこかに文字列として隠されている というパターンがよくあります。

そのため、ファイル単位での調査は一旦断念し、ディスクイメージ全体を対象に文字列検索を行うことにします。


ステップ7: ディスク全体からの文字列検索

stringsコマンドを使うことで、バイナリファイルやディスクイメージに含まれる可読文字列を抽出できます。 grepコマンドと組み合わせて、フラグの形式である picoCTF を検索します。
$ strings disko-1.dd | grep picoCTF
picoCTF{xxxxxx}

※フラグはマスクしています。


フラグを取得できました。


使用したコマンドの簡単な説明

file

file <ファイル名>

fileコマンドは指定したファイルの種類を判別します。拡張子ではなく、ファイルの中身(マジックナンバー)を基に判別します。 ctfでは拡張子が偽装されていることが多いため、ファイル形式の確認に役立ちます。


gunzip

gunzip <ファイル名>.gz

gunzipコマンドはgzip形式で圧縮されたファイルを解凍します。解凍後は元のファイル名で保存されます。


mdir

mdir -i <ディスクイメージファイル> ::/<パス>
mdirコマンドはFATファイルシステムのディレクトリ内容を表示します。-iオプションを使用して、ディスクイメージファイルを指定します。

strings

strings <ファイル名>

stringsコマンドはバイナリファイルやディスクイメージに含まれる可読文字列を抽出します。ASCII文字列やUnicode文字列を検出します。


grep

grep <検索文字列>
grepコマンドは指定した文字列を含む行を検索して表示します。 ctfではフラグの形式(例: picoCTF{...})を検索する際に便利です。

まとめ

今回の問題では、FAT32ファイルシステムのディスクイメージを解析し、隠されたフラグを見つける方法を学びました。
▼ポイントは以下の通りです。
  • gzip形式のファイルを解凍してディスクイメージを取得する
  • mtoolsを使ってFAT32ファイルシステムの中身を確認
  • stringsコマンドを使ってディスク全体から可読文字列を抽出し、grepでフラグを検索する

閲覧ありがとうございました!

NEXT
次におすすめ

【picoCTF】RED - zstegでPNG画像のLSBに隠されたフラグを解析

カテゴリ: Forensics難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。