backdoor CTF 2014 Misc 250a Writeup
ユーザ名とパスワードによるログインには少々飽きてきた。我々は独自に画像ベースのログインシステムを開発した。ログインシステムにはここでアクセスできる。
以下の画像はbackdoorというユーザとしてログインするのに利用できる。この画像にはそれ以外の目的はない。
趣向を変えて、sdslabsユーザとしてログインしてみてくれ。
ヒント : 本気か?我々が真面目に文字認証をしているとでも思っているのか?
注 : ログインシステムに張られていたリンクは404になっていたため、ここではリンクしていません。
ヒントから、真面目に表示されている文字をどうにかする問題でないことがわかります。CTFに慣れている人ならば、ヒントがなくと想像はつくでしょうが、この手の問題は画像の”どこか”に秘密のデータが埋め込まれていて、それを何とかするというパターンがほとんどです。
BMP形式の画像のフォーマットを紐解いて行くのが王道なんでしょうが、私でもBMP形式の画像はGIFやJPEGのような圧縮がされていない”生の”画像であり、RGB形式で1ピクセル単位の情報が順番に格納されているということくらいは知っています(簡単な圧縮が入ることもあるので正確には異なりますが)。画像系の問題ということで、とりあえずおなじみのStegSolveで調べてみたものの特に怪しい点がなかったので、バイナリエディタで開いて目grepしてみました。すると、0x02BAA6あたりにあからさまに怪しい01パターンがあるのに気が付きました(下図の赤線枠内)。
ちなみに、ここで利用しているB’zというバイナリエディタについているビットマップ表示という機能を利用するとバイナリパターンを画像として見ることができます。BMP画像で黒い部分はすべて0で埋め尽くされるため、ビットマップ画像も真っ白になるのですが、最後の方に少しだけ色がついている部分があるのがわかります(上記画像左下青枠の部分)。これで気が付くこともできます。
さて、どこからどこまでが見るべきデータなのかについて若干の試行錯誤がありましたが、結果的に以下のように読み取ることができました。
00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00,00,00,01,01,01,00,00,00, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00,00,00,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,01,01,01,00,00,00,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,00,00,00,00,00,00, 00,00,00,01,01,01,01,01,01,00,00,00,01,01,01,01,01,01,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,01,01,01,01,01,01,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,00,00,00, 01100010 b=98 01100001 a=97 01100011 c=99 01101011 k=107 01100100 d=100 01101111 o=111 01101111 o=111 01110010 r=114
0か1かの3回の繰り返しを1ビットとして読むと、”backdoor”という言葉が埋め込まれていることがわかります。後でよくよく考えてみたら、BMPのデータだから3バイトだったのですね(BMPでは1ピクセルをRGB = Red / Green / Blueのそれぞれを1バイト使って表現するので)。
ここまでわかったら、あとはこれをsdslabsに書き換えるだけです。sdslabsは7文字なので、不足する一文字の埋め方を少し試行錯誤しましたが、最終的に以下のように書き換えたデータをsubmitすることでflagが取れました。
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 00,00,00,01,01,01,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,00,00,00,00,00,00, 00,00,00,01,01,01,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,01,01,01,01,01,01,00,00,00,00,00,00, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01, 00,00,00,01,01,01,01,01,01,00,00,00,00,00,00,00,00,00,01,01,01,00,00,00, 00,00,00,01,01,01,01,01,01,01,01,01,00,00,00,00,00,00,01,01,01,01,01,01, 00000000 (null) 01110011 s=115 01100100 d=100 01110011 s=115 01101100 l=108 01100001 a=97 01100010 b=98 01110011 s=115
ちなみに、実際に取れたflagは”practice_makes_one_perfect”でした。