NOiSE FEE CTF Challenge に参加し、1問目と6問目を解いて350点取りました。時間内に解けた問題のwriteupを書きます。
注意:解法のネタバレを含みます。
1. Process.Collect (50点)
(前略)
Q. FEE-NOiSEの画像を探し出し、通常と違う指を答えよ。
おなじみのhttp://chara.u-stella.co.jpを開いて、通常のフィーちゃんとノイズフィーちゃんで様子が違う指を答えます。
6. Process.Render (300点)
渡された画像からFlagを探し出す問題です。画像は妙に横長(1163x528)な上、何かが見切れており、写真の上半分だけを切り抜いたもののようにも見えます。
画像ファイルのサイズ情報が弄られて下半分が見えなくなっている可能性が最初に思い当たりました。もしそうならば、画像をバイナリファイルとして直接編集して高さの情報を書き換えればうまく行くはずです。
JPEGファイルの詳しいフォーマットは知りませんが、きっと 1163 や 528 という数値がそのまま書いてあるだろうと当たりをつけて、hexdump
してみます。
> hexdump -C key.jpg | grep "02 10" 00000090 08 02 10 04 8b 03 01 22 00 02 11 01 03 11 01 ff |......."........| 000228d0 ad 95 f8 75 de 3a 75 a7 47 6d 1a 11 b5 02 10 3f |...u.:u.Gm.....?|
上の出力から、画像ファイルの0x91バイト目に02 10 04 8b
という16進数の並びが存在することが分かります。0x0210=528, 0x048b=1163 なので、ここが画像サイズ情報で間違いなさそうです。ファイルをバイナリエディタで開いて、0x0210の方を適当な大きな値に書き換えてあげれば、めでたく画像(とても良い)が復元できます。