問題概要
picoCTFの「Corrupted file」という問題の解説記事です。
- カテゴリ: Forensics
- 難易度: Easy
問題文
解説
この問題では、与えられた破損したファイル
fileを修復し、隠されたフラグを見つけることが求められます。ステップ1: ファイルの種類を確認する
まずは、
fileコマンドを使ってファイルの種類を確認します。$ file file
file: data
file: dataと表示されました。これは、fileコマンドがファイルの種類を特定できなかったことを意味します。fileコマンドはマジックナンバーを参照してファイルタイプを判別しますが、破損しているため認識できなかった可能性があります。
ステップ2: ファイルのマジックナンバーを調べる
ステップ1で
file コマンドを実行したところ、ファイル形式は単に data と表示されました。
これは、ファイル先頭のマジックナンバーが壊れており、形式を判別できない状態である可能性が高いことを意味します。ファイル形式は通常、先頭数バイト(マジックナンバー)によって識別されます。
そこで、16進数ダンプを使ってファイルの先頭を直接確認します。
そこで、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 を開くと、隠されたフラグが表示されます。
※フラグはマスクしています。
使用したコマンドの軽い解説
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での表示順が近い記事を優先しておすすめしています。