SECON 2017 Online CTF JPEG file(Binary, 100pt)
1バイト壊れたjpegが渡されます。
何もせず開くと横長の全面グレーの画像です。
ググるとファイルフォーマットについて解説した記事が出てきます。
JPG ファイルフォーマット
1バイトしか壊れてないなら壊れているのはヘッダ部分とみて間違いないのでがんばって読み進めます。
すると本文が始まる部分(SOSの直後)に'FFFC'なる2バイトが現れます。
仕様通り解釈すると、この2バイトは拡張のための予備らしく無意味な文字列です。
ヘッダ部が終わってデータ本体なのかと思ったら、本体部分の解読方法がよくわからずしばしハマります。
「大体同じような形のjpgファイル作ったら大体同じバイト列になるのでは????」と思い立ち、mspaintで適当なjpgファイルを作ったところ、
問題の2バイトが'FDFC'となっていたためFFFC->FDFCに書き換え。するとフラグが現れます。
余談
jpeginfoという便利なツールがあり、フォーマットチェックまでしてくれるようです。
これ使えは怪しい箇所の特定は秒で終わりましたね。。。
$ jpeginfo -c tktk.jpg tktk.jpg 339 x 53 24bit JFIF N 11628 Corrupt JPEG data: premature end of data segment Unsupported marker type 0xfc [ERROR]
あとちょっと出所が怪しいですが勝手に復元までしてくれるソフトもあるみたいです。
Stellar Phoenix Repair for JPEG - Download
また、他の方のWriteupを読むと「FFFCがよくわからなかったのでFF消したらフラグ読めた」として以下のような画像を得ていた人も一定数見かけられました。
1バイトでまとまった矩形領域と全体の背景色が変わっており、
ピクセル単位でなく周波数分解したデータを持っていそうな様子が窺い知れます。
感想
コンテスト後にtwitterで「画像見た感じ離散コサイン変換かかってないっぽいから」とかいって秒殺した人が観測されて怖かったです。