【picoCTF】Corrupted file - マジックナンバー修復で壊れたファイルからフラグ復元

問題概要

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

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

問題文

picoCTF Corrupted file

解説

この問題では、与えられた破損したファイルfileを修復し、隠されたフラグを見つけることが求められます。

ステップ1: ファイルの種類を確認する

まずは、fileコマンドを使ってファイルの種類を確認します。
$ file file
file: data
file: dataと表示されました。これは、fileコマンドがファイルの種類を特定できなかったことを意味します。
fileコマンドはマジックナンバーを参照してファイルタイプを判別しますが、破損しているため認識できなかった可能性があります。

ステップ2: ファイルのマジックナンバーを調べる

ステップ1で file コマンドを実行したところ、ファイル形式は単に data と表示されました。 これは、ファイル先頭のマジックナンバーが壊れており、形式を判別できない状態である可能性が高いことを意味します。
ファイル形式は通常、先頭数バイト(マジックナンバー)によって識別されます。
そこで、16進数ダンプを使ってファイルの先頭を直接確認します。xxdコマンドを使用します。

$ xxd file | head -n 1
00000000: 5c78 ffe0 0010 4a46 4946 0001 0100 0001  \x....JFIF......

この結果を見ると、ファイルの先頭付近に JFIF という文字列が含まれていることが分かります。 JFIF は JPEG 画像ファイルで使われるフォーマット識別子の一部であり、JPEG ファイルであることを示す重要な手がかりになります。

一方で、本来 JPEG ファイルは FF D8 から始まるはずですが、 先頭バイトがそれと一致していません。 このことから、ファイルの先頭部分(マジックナンバー)が破損していると考えられます。



ステップ3: 破損したマジックナンバーを修復する

JPEG ファイルの正しいマジックナンバーは以下の通りです。

FF D8 FF E0 00 10 4A 46 49 46 00 01
この情報をもとに、printf と dd コマンドを使ってファイルの先頭を修復します。 printf コマンドで正しいマジックナンバーをバイナリ形式で出力し、dd コマンドで file の先頭に上書きします。

$ printf '\xFF\xD8' | dd of=file bs=1 seek=0 count=2 conv=notrunc
2+0 records in
2+0 records out
2 bytes copied, 0.00643777 s, 0.3 kB/s
このコマンドにより、file の先頭2バイトが FF D8 に修正されました。
先ほどのダンプ結果から、FF D8 のみが欠損していることが分かるため、今回は先頭2バイトだけを修復すれば十分です。

ステップ4: 修復したファイルを確認する

マジックナンバーを修復した後、再度 file コマンドでファイルの種類を確認します。
$ file file
file: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 800x500, components 3
JPEG image data と表示され、ファイルが JPEG 画像であることが確認できました。

ステップ5: 拡張子を変更して画像を表示する

最後に、ファイルの拡張子を .jpg に変更し、画像ビューアで開きます。
$ mv file file.jpg

画像ビューアで file.jpg を開くと、隠されたフラグが表示されます。
picoCTF Corrupted file - Flag

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


使用したコマンドの軽い解説

file

file <ファイル名>

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


xxd

xxd <ファイル名>

xxdコマンドは、バイナリファイルの16進数ダンプを表示します。 ファイルの中身を直接確認したい場合に便利です。


dd

dd if=<入力ファイル> of=<出力ファイル> bs=<ブロックサイズ> seek=<オフセット> count=<バイト数> conv=notrunc
ddコマンドは、ファイルの一部をコピー・変換するためのコマンドです。
seekオプションで指定したオフセット位置にデータを書き込みます。
conv=notruncオプションは、出力ファイルのサイズを変更せずにデータを書き込むために使用します。

printf

printf '<フォーマット>' 
printfコマンドは、指定したフォーマットに従って文字列を出力します。
バイナリデータを生成する際に便利です。

まとめ

この問題では、破損したファイルのマジックナンバーを修復することで、正しいファイル形式を特定し、隠されたフラグを見つけることができました。
ファイルの中身を直接確認することの重要性と、基本的なバイナリ操作のスキルが求められる問題でした。

▼ポイントは以下の通りです。

  • ファイルの種類を確認する際は、拡張子に頼らず file コマンドを使用する
  • マジックナンバーを確認するために xxd コマンドを活用する
  • 破損したファイルの修復には dd コマンドを使用する

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

NEXT
次におすすめ

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

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