【picoCTF】Flag in Flame - 巨大ログからBase64化されたPNGを復元してフラグ取得

問題概要

picoCTFの「Flag in Flame」という問題の解説記事です。

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

問題文

picoCTF Flag in Flame

解説

この問題では、与えられたファイル logs.txt を解析して、隠されたフラグを見つけることが求められます。

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

まずはファイル形式の確認から始めます。fileコマンドを使って、logs.txt の形式を確認します。
$ file logs.txt
logs.txt: ASCII text, with very long lines (65512), with no line terminators

この一文には、重要なヒントが3つ含まれています。

  1. ASCII text - ファイルはテキストファイルであること
  2. with very long lines (65512) - 行が非常に長い(65512文字)こと
  3. with no line terminators - 行の終端がないこと

ステップ2: ファイル内容の確認

次に、logs.txtの内容を確認します。headコマンドを使用して、ファイルの最初の100バイトを表示します。
$ head -c 100 logs.txt
iVBORw0KGgoAAAANSUhEUgAAA4AAAASACAIAAAAh8bSOAAEAAElEQVR4nOz919MsyZUniP3OcY+IFJ+6ouqWBqoautDYRmN6emfa
ここで出力されたデータの先頭の文字列iVBORw0KGgoに注目します。 この文字列iVBORw0KGgoは、ForensicsやCTFではほぼ暗記レベルで知られていて、Base64エンコードされた PNG ファイルの先頭部分です。


ステップ3: Base64デコード

logs.txt全体をBase64デコードして、PNGファイルを復元します。
$ base64 -d logs.txt > decode.png
これで、decode.pngというPNGファイルが生成されます。

生成された画像を開くと下部にBase64エンコードされていそうな文字列が見えます。

Decoded PNG

※文字列はマスクしています。


ステップ4: 画像内の文字列のデコード

画像内に表示されている16進数の文字列をデコードするとフラグが得られます。

$ echo "画像の文字列" | xxd -r -p


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

file

file <ファイル名>

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


head

head -c <バイト数> <ファイル名>
headコマンドは指定したファイルの先頭部分を表示します。-cオプションを使用すると、バイト数を指定して表示できます。

base64

base64 -d <入力ファイル> > <出力ファイル>
base64コマンドはBase64エンコードおよびデコードを行います。-dオプションを使用すると、Base64デコードが実行されます。

xxd

xxd -r -p
xxdコマンドはバイナリデータを16進数形式に変換したり、その逆を行ったりします。-rオプションは逆変換を意味し、-pオプションはプレーンな16進数形式を扱います。

まとめ

この問題では、Base64エンコードされたPNGファイルを復元し、画像内の16進数文字列をデコードしてフラグを取得しました。
ファイル形式の確認、Base64デコード、画像解析など、基本的なフォレンジクススキルを駆使する良い練習となる問題でした。 ▼ポイントは以下の通りです。
  • ファイル形式の確認にはfileコマンドを使用する
  • Base64エンコードされたデータをデコードしてファイルを復元する
  • 頻出のマジックナンバーを覚えておくと解析がスムーズになる
  • 画像内のテキストを抽出する際にはOCRツールを活用することも検討する

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

NEXT
次におすすめ

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

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