Shi0shishi0

汐鹿生

CTF for ビギナーズ 2015 東京のバイナリ問題に(今更ながら)挑んでみた。

外付けハードディスクの整理をしていたら、1年前に参加したCTF for ビギナーズ 2015 東京 の問題ファイルらしきものが出てきた。
自分がブログに書いたWriteUp的なものによると、バイナリ問題は1問目しか解いていなかったらしい。

ecoha0630.hatenablog.com

せっかく見つけたので、他のバイナリ問題も(今更ではあるが)ちょっと触って見ることにしました。
各フォルダに「binary100」とか書いてあったので、これが多分配点だと思う。
問題画面もスクショがあったので、一応問題名も書いてみた。

binary200 : 読めますか?

画像ファイルが渡されて、開くと以下の様な感じに。

f:id:echoha610:20160608231128p:plain

普通に開けるので、ファイル形式は本当にPNG形式のようだ。

それならstringsコマンド + grepコマンドで何かヒントになる情報は出ないかなと調べてみると、FLAGが出た。

f:id:echoha610:20160608231447p:plain

binary300 : READ and BURST

問題文には、表示に使っているライブラリ関数名と表示される文字列をくっつけたものがFLAGになると書かれている。

fileコマンドでファイル形式を確認すると、txt形式のファイルだった。

f:id:echoha610:20160608231551p:plain

開いてみると、以下の様なアセンブリ言語っぽいものが表示された。

f:id:echoha610:20160608231846p:plain

13行目のCALL命令で呼ばれているprintf()で何らかの値を出力するっぽいので、そこに至るまで計算をしてみる。

EAX = 1337
EDX = 23
EAX = EAX * EDX = 30751
EAX = EAX + 586 = 31337

この結果を表示すると思われるので、FLAGは ctf4b{printf_Hello_31337} かな?

binary400 : DETECTIVE IDA

名探偵相田君。とりあえずfileコマンドでファイル形式を確認する。

f:id:echoha610:20160608233120p:plain

ファイル形式はWindowsの32bit exeファイルだった。拡張子を.exeに変更して実行すると、パスフレーズの入力を求められた。
適当に文字列を入力してみたが、ヒントになりそうな情報は入力後に表示された "Wrong passphrase..." ぐらいだった。

問題文には「IDAはズッ友だょ」というようなニュアンスの文章が書かれているので、IDA Freeにファイルを食わせてみた。

IDA Viewでアセンブリを眺めていると、文字列を入力した時に出た "Wrong passphrase..." と書かれているところが見つかった。
また、正解を入力した際に出力されるであろう文字列も近くに見つかった。

f:id:echoha610:20160608233458p:plain

f:id:echoha610:20160608235631p:plain

"Wrong passphrase..." を出力する部分には、0x0040176Cからジャンプしていることがわかる。jnz命令なので、直前の比較処理の結果、ZF(ゼロフラグ)が1になった時に "Wrong passphrase..." を出力する道筋に飛ぶようだ。

文字列の長さが14h(10進数で20)かどうかを比較処理でチェックし、14hではない場合にジャンプを実行している。
文字列の長さが14hの場合はジャンプせずに処理が進むようだ。

注目するべきところはなんとなく見えたので、今度はデバッガで実際に動かして見ることにした。

Immunity Debuggerでexeファイルを開き、ステップ実行していく。0x00401710 で "Enter passphrase: " という文字列をmovし、printf()をCALLしている。

f:id:echoha610:20160608233935p:plain

もう少し下まで進めていくとfgets()で文字列の入力を行うところがあった。

f:id:echoha610:20160608233946p:plain

先ほどIDAで確認した時にも見えていたが、これらの処理の流れの中に "tTnybDdn@Rev1tav0nn" というASCII文字列がある。
この文字列は19文字で、さっきの比較で求められていた文字数にかなり近い。そこで、適当に1文字(とりあえずはAとか)を末尾に付け加えて20文字にして入力してみる。

14hとの比較を通過し、そのまま処理を進めていくと 0x0040178E で入力した文字列の20文字目(末尾)をEAXにコピーし、その下位2ビット(AL)と31を比較している。
これが一致すれば正解の方へ処理が進みそうだ。

f:id:echoha610:20160608234049p:plain

31は"1"のASCIIコードなので "tTnybDdn@Rev1tav0nn" の末尾に1を付け加え、 "tTnybDdn@Rev1tav0nn1" をパスフレーズとして入力する。

ステップ実行を進めていくと無事"Authorization SUCCESS!"と出力されて…

f:id:echoha610:20160608234623p:plain

FLAGが出力された。

f:id:echoha610:20160608234701p:plain

f:id:echoha610:20160608234709p:plain

ctf4b{IDA_discloses_everything!}


FLAGを見て改めて思いましたけど、この問題はやっぱりIDAだけで解くのが正攻法なんですかね…?(震え声)
仕事でマル○ェアの解析をする時も、IDAでざっと眺めてアタリをつけてデバッガで動かす、というやり方をしているのでついついこういう解き方をしてしまいました。

もっとIDA君とも仲良くなりたい。

binary500 : 5394

fileコマンドでファイル形式を確認すると、txt形式ファイルとのこと。

f:id:echoha610:20160608235946p:plain

f:id:echoha610:20160609001210p:plain

拡張子を付けて開くと、またしてもアセンブリ言語のコードらしきものが表示された。ただし、今回のものはさっきよりも長い。
これもおそらくは1行ずつ処理を進めていき、最終的にprintf()で出力される値を取り出せば良いかと思われる。
(ちょっと面倒なのでこれはまた時間のあるときに…)

久しぶりに1年前の問題を解いてみましたが、結構楽しかったです。初めてCTFに挑戦した時からもう1年経つって時間の流れ早い… 成長の進捗だめです。
そしてたまにはリアルで集まってわいわいCTFをやりたいなと感じました。Katagaitai CTF勉強会(easy)に参加させていただく予定なのですが、いまからちょっと楽しみです。