スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > SECCON 2015 CTF予選 Writeup 2

タイガーチームセキュリティレポート

SECCON 2015 CTF予選 Writeup 2

先日開催されたSECCON 2015のCTF予選のWriteupの続きです。 執筆者が変わりまして僕が解くことができた問題を解説します。

Steganography 1

問題にはイメージファイルからファイルを探せとあり、MrFusion.gpjbというファイルが配られます。 もちろん.gpjbなどという拡張子のイメージファイルは存在しませんので、バイナリエディタでファイル形式を特定します。

思いっきりGIFって書いてあるので拡張子を.gifに変換して開いてみます。

明らかにフラグの一部らしきものが見えます。 ここからどうしたものかと考えるのですが、実はこの時点でおかしな点に気がついていました。

僕としてはこのファイルの拡張子がbmpだと予測していました。なぜなら・・・。

お分かり頂けただろうか、GIFイメージにしてはどう考えてもファイルのサイズが大きすぎます。

しかし、バイナリのヘッダはGIF、これが意味することは別の形式のイメージファイルがバイナリレベルで連結されていると推測するのが自然です。

他のイメージファイルといえば、代表的なのはpng、jpeg、bmp辺りでしょうか。なのでとりあえずpngファイルがまぎれていないか探してみます。

見つけました。バイナリのヘッダが89 50 4E 47 0D 0A 1A 0AとなるのはPNGのマジックバイトのそれに該当します。

なので、GIFファイル部分を切り取り、拡張子をPNGに変更して開いてみます。

おおーって感じですよね!見事に別のファイルに変わりました。

そして、ここで1つひらめきます。

最初に配られたファイルはMrFusion.gpjbだったけど、この妙な拡張子はもしかして。。
g(if) p(ng) j(pg) b(mp)の順番でくっついてるんじゃないかなぁ、たまたまGIFの次にPNGを切り出したけどどう考えてもフラグの1文字目っぽかったし、と。

と、いうわけで次にjpg、bmpを順に切り出してみます。

これだ(確信)

たぶん次はPNGファイルでしょう。そんな感じでbmpファイルのバイナリの長さに泣きそうになりながら切り取り作業を続けた結果、こんな感じになりました。

フラグ、完成です!

SECCON{OCT 21 2015 0728}

Decrypt it

$ ./cryptooo SECCON{*************************}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
what's the key?

こんな問題です。一緒にcryptooというファイルが配布されるので試しに問題文の通りに実行してみます。

$ ./cryptooo SECCON{*************************}
Encrypted(44): waUqjjDGneViOT9RNQCQaOU6J+PVuI7FYsBFmBL/UU8S
$

問題文と応答が違います。
問題文通りの応答を返すコマンドラインパラメータがフラグであることは確実です。

それにしてもどうしたものかと考えつつも適当にポチポチ入力してみます。

$ ./cryptooo SECCON{}
Encrypted(12): waUqjjDGnbI=
$ ./cryptooo SECCON
Encrypted(8): waUqjjDG
$

うーん・・・。

$ ./cryptooo SEC
Encrypted(4): waUq
$ ./cryptooo SEB
Encrypted(4): waUr
$ ./cryptooo SEA
Encrypted(4): waUo
$

うーーー・・・、ん?

3文字目のアルファベットが
「C」の時に応答結果の4文字目が「q」
「B」の時は「r」
「A」の時は「o」になっています。

アルファベット順に見てみると「o」pq「r」st「u」とアルファベットが1文字ずれるごとに応答結果のアルファベットも等間隔で変化しています。
この法則を利用すればフラグ文字を1文字ずつ解読していくことができるかもしれません。

$ ./cryptooo SECCON{
Encrypted(12): waUqjjDGnQ==
$

とりあえず、今までのフラグの文法からここまで答えは推測できます。
正解の応答は「waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=」ですので、「waUqjjDGn」まではあってます。
次は応答が「waUqjjDGnY~~~~~」となる文字を探します。

$ ./cryptooo SECCON{1
Encrypted(12): waUqjjDGnf4=
$ ./cryptooo SECCON{a
Encrypted(12): waUqjjDGna4=
$ ./cryptooo SECCON{A
Encrypted(12): waUqjjDGnY4=
$

「SECCON{A」でビンゴです! 次は「waUqjjDGnYx~~~~~」を目指します!

$ ./cryptooo SECCON{A1
Encrypted(12): waUqjjDGnY5o
$ ./cryptooo SECCON{Aa
Encrypted(12): waUqjjDGnY44
$ ./cryptooo SECCON{AA
Encrypted(12): waUqjjDGnY4Y
$

おや・・・? 「waUqjjDGnY」の次が4や5とあまり変化せず、その次の文字が大きく変化しています。
もしかして・・・

$ ./cryptooo SECCON{A
Encrypted(12): waUqjjDGnY4=
$ ./cryptooo SECCON{B
Encrypted(12): waUqjjDGnY0=
$ ./cryptooo SECCON{C
Encrypted(12): waUqjjDGnYw=
$ ./cryptooo SECCON{D
Encrypted(12): waUqjjDGnYs=
$

次に目指すのが「waUqjjDGnYx~~~~~」となると「SECCON{C」の時の応答が「waUqjjDGnYw=」なのでかなり近いです!

$ ./cryptooo SECCON{C1
Encrypted(12): waUqjjDGnYwW
$ ./cryptooo SECCON{Ca
Encrypted(12): waUqjjDGnYxG
$ ./cryptooo SECCON{CA
Encrypted(12): waUqjjDGnYxm
$

「SECCON{Ca」の時に「waUqjjDGnYxG」となるので、やはり「SECCON{C」までは確定でしょう。
次は「waUqjjDGnYxV~~~~~」ですが「SECCON{Ca」の時点でちょっと近いのでその周辺を当たってみます。

$ ./cryptooo SECCON{Ca
Encrypted(12): waUqjjDGnYxG
$ ./cryptooo SECCON{Cb
Encrypted(12): waUqjjDGnYxF
$ ./cryptooo SECCON{Cc
Encrypted(12): waUqjjDGnYxE
$ ./cryptooo SECCON{Cd
Encrypted(12): waUqjjDGnYxD
$ ./cryptooo SECCON{Ce
Encrypted(12): waUqjjDGnYxC
$ ./cryptooo SECCON{Cf
Encrypted(12): waUqjjDGnYxB
$ ./cryptooo SECCON{Cg
Encrypted(12): waUqjjDGnYxA
$ ./cryptooo SECCON{Ch
Encrypted(12): waUqjjDGnYxP
$ ./cryptooo SECCON{Ci
Encrypted(12): waUqjjDGnYxO
$ ./cryptooo SECCON{Cj
Encrypted(12): waUqjjDGnYxN
$ ./cryptooo SECCON{Ck
Encrypted(12): waUqjjDGnYxM
$ ./cryptooo SECCON{Cl
Encrypted(12): waUqjjDGnYxL
$ ./cryptooo SECCON{Cm
Encrypted(12): waUqjjDGnYxK
$ ./cryptooo SECCON{Cn
Encrypted(12): waUqjjDGnYxJ
$ ./cryptooo SECCON{Co
Encrypted(12): waUqjjDGnYxI
$ ./cryptooo SECCON{Cp
Encrypted(12): waUqjjDGnYxX
$ ./cryptooo SECCON{Cq
Encrypted(12): waUqjjDGnYxW
$ ./cryptooo SECCON{Cr
Encrypted(12): waUqjjDGnYxV
$

案の定当たりました!「SECCON{Cr」の時に「waUqjjDGnYxV」となりますし、応答文字列には確実に法則性があることが見て取れます。これを利用すればそれなりに効率よくManual brute force attackが可能と考えられます。

さぁ、やったるでー!



…1時間半後・・・


俺の・・・勝ちだ…(ガクッ)

$ ./cryptooo SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
$



(フラグ)

SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}

Steganography 3

デスクトップのキャプチャに成功した!
秘密のメッセージを読み取ってほしい

こんな問題でした。
恐らく画像にあるバイナリを実行すると何かが起こるんだろうという匂いがものすごく漂っています。
OCRで変換してみるかーと思ったのですが上手く認識してくれず困っていたところ、一緒に参戦しているK氏がバイナリをくださったので実行してみました。

$ ./cap.bin
Rmxvb2QgZmlsbA0K $

何か起こった・・・のか?と思いつつ「Rmxvb2QgZmlsbA0K」をBase64でデコードしてみると「Flood Fill」(塗りつぶし)とヒントらしきものが!

他に何かヒントはないかと悩んでいると隣に居たU先輩が「画像の後ろに映っているサイトなんだけど、1=0、2=0、3=0、4=?、5=0、6=1、7=0、8=2、9=1、0=1として計算している問題だったよ」と教えてくれました。

なぜ8が2なんだろう、と妙な所に引っ掛かりつつ調べてみると、どうやら数字に含まれている○の数だということが発覚。

これはまさかバイナリに含まれてる数字の○を全部塗りつぶせってことじゃないだろうな・・・。と思った瞬間に「あ!」とひらめきました!

これがほんとのアハ体験かーと深い感慨を抱きながら答えに辿り着きました。でも絶対にK氏とU先輩からのヒントがなかったら答えに辿り着けなかったので、チームワークの勝利です!

フラグを読み解いた結果がこちら

SECCON{the_hidden_message_ever}

Writeupは以上です。

今回のSECCONではなんと問題を解くと、問題数に応じて優しいお姉さんから甘い粗品を頂ける素敵な特典がありました。
更に代休明けに出社すると上司がほめてくれるという追加の特典までありました。

僕はほめられるとのびる子なので、甘い粗品で糖分を補給しつつ次回も頑張ろうと思います。


タイガーチームサービス事業部 テクノロジー部 吉井