読者です 読者をやめる 読者になる 読者になる

CSCamp CTF Writeup

CSCamp CTFに出場し、一応全問題を解きました。 始めるのが遅かったので、ボーナス点のせいで全体では6位でした(CTFTime順位反映してくれ...)。

少し前からEpsilonDeltaとしてWriteupを書くようにはなったのですが、個人個人でwirteupを書いたほうがいいんじゃないかという話になったので、メンバーごとに段落分けして書く方式を採用したいと思います。 非同期になることをお許し下さい。

@potetisensei

皆さん、こんにちわ。

僕は基本的にはバイナリ担当なのですが、CSCampのバイナリは全て簡単で骨がなかったですね。 ということで、僕はバイナリのWriteupを書こうと思います。

crackme1.exe

何の変哲も無い.NETバイナリですね。 適当に読んでやると、環境変数からUSERNAMEを取得し、saltをつけた状態でMD5を取り、3byteおきに値をチェックしているようです。 passwordなどはResource内に平文で保存されているので、USERNAMEさえ分かればFlagは手に入りそうですね。

Flag: e6169c0c7b8841649ca0e22cba82353a

crackme2.elf

CTFにおいてバイナリの関数を全て読む必要はないタイプの典型的な例ですね。 見たところ、実行するたびに関数sub_400FB0からランダムな数値が返ってきて、 それによってXORされるデータが変化し、表示される文字列が変わるようです。

実行する限り、sub_400FB0から帰ってくるのは0~6までの値ですが、実際にはXORされて保存されているデータは8つあり、おそらく7が帰ってきた時、Flagが表示されるのでしょう。

Flag: c816a8eab33a67947cd647a7fc9fb254

kaizen.elf

これは中々面白い問題でしたね。 まず、UPXでpackされているのでunpackします。

実行すると「Flagのdecodeには数年かかるだろう」と表示されるので、 decodeを遅延させている原因を突き止めてパッチを当てるタイプの問題だろうと推測できます。

f:id:Epsilon-Delta:20131121224910p:plain

gdbで実行すると強制終了されるので、まずDebuggerの検知をしている部分を突き止めましょう。 突き止めるのは面倒臭いですが、exitへの条件分岐に使われているFlag、0x6E01F0を0にしてしまえばいいようです。

f:id:Epsilon-Delta:20131121224915p:plain

次に、実行して適当なタイミングでSIGINTを送ってやり、backtraceを行うと、ある場所でずっと止まっているのがわかります。 0x23のsyscall、つまりnanosleepで止まっています。 ここをNOPにしてやりましょう。

f:id:Epsilon-Delta:20131121224927p:plain

後はdecodeルーチンを回すだけなのですが、ループを1周するのに1秒程度かかり、Streamの生成には0x7A69回ループを回す必要があるのでとても現実的ではない時間がかかります(といっても8時間ですが)。

ここで、decodeルーチン内にいつ呼び出しても結果が変わらない、あるいは戻り値が使用されておらず、影響をおよぼすようなグローバル変数への代入がなされていない関数の呼び出しが無駄であるということに注目します。 これら関数へのcallもNOPに書き換えてやり実行すると、15分程度でFlagが得られます。

f:id:Epsilon-Delta:20131122014143p:plain

Flag: eef1b732251bcdd4f085ce78300b252e

challenge.exe

この中では一番難しかったですね。

challenge.exe自体はただの.NETバイナリですが、ソースを読んでみると内部でDLLを復号化し、そのDLLを実行していることが分かります。 DLLはほとんどのメソッドが文字化けしており、逆コンパイルもできないため、可読性は全くと言っていいほどありません。 読んでいった結果、もう一つDLLが復号化されており、そちらはJSONを.NETでいじるためのライブラリのようでした。 どうにかしてJSON側をフックしてやることでFLAGを抜き出すのか、と考えていましたが、明らかに150ptに見合わない労力です。

そこで、内部でJSONを使っているのであれば、メモリ内にFLAG, ないしSerial Numberが存在しているのではないかと考えました。 つまり、動的にメモリをダンプすることで解けないかという考え方です。 ダンプにはうさみみハリケーンを使いました(便利)。

この問題の面白いところは、Usernameには自分のチーム名を入れなければ正解が出ないという点です。 どういう仕組になっているのか非常に興味深い(Download時にチームごとのバイナリを渡してるとは思えないので、バイナリ自体にチーム名などのデータが存在しているはず)ですね。

さて、UsernameにEpsilonDeltaと入力した状態で文字列検索してみます。

f:id:Epsilon-Delta:20131122002114p:plain

この周辺にSerial Number、あるいはFlagが落ちてないか探します。

お、お、お、それっぽいのがある。

f:id:Epsilon-Delta:20131122002234p:plain

やったー。

f:id:Epsilon-Delta:20131122002727p:plain

このWriteupを書いてる時にわかったのですが、Authが成功してから運営のサーバーにFlagを取得しに行ってるようです。 正しいチーム名を入れないとFlagがもらえない理由が納得出来ました。

僕からは以上です。

@hiromu1996

トリビアは割愛.

stega1.png

f:id:Epsilon-Delta:20131123210145p:plain

RGBのRだけ見てやると以下の文字列が.やるだけ.

The Flag is {Are_you_color_blind}

stega2.txt

以下の文章が与えられる.

The kangaroo it a marsupial from the famihy Macrepodidae (macropods, meaning 'large foot'). In common use fhe term is used to descrlbe the largest species from this family, especially those of the ganus Macropus, rgd kangaroo, antilopine kangaroo, iastern grey kangaroo and western grey kangaroo. Kangaroos are endemic to Australia. The smaller macrodods are found in Australia and New Guinoa.

Kangaroos have large, powerful hind legs, large feet adapted for leaping, a long muscular tail for balance, and a small head. Like most narsupials, femate kangaroos have a pouch called a marsupium in which joeys complete postnatal Bevelopment.

Larger kengaroos aave adapted much better[which?] to changes brought to the Australian landscape by humans and fhough many of their smallor cousins are endangered, they are plentifol. They are not farmed to any extent, but wild langaroos are shot for meat, leather hides, and to protect grazing land for sheep and cattle. Although there is some controversy, harvesting kangaroo meat has many environmental and health benefits over traditional meats.

The kangaroo is an unofficial symbol of Australia, and appears as an emblem on the Australian coat of arms, on some of its currency, and is used by some of Australia's well known organisations, including Qantas and the Royal Australian Air Force. The kangaroo is important to both Australian culture and the national image, and consequently there are numerous popular culture references.

Wikipediaのカンガルーの記事とdiffを取ると以下の文字がでてくる.

dontBeafool

これで通らなかったが,Hintのaを取り除けというのをみて,dontBefoolで正解. どうやら作問ミス?

stega3.txt

gist7613922

少し調べるとSams Big Play Makerというステガノグラフィツールのものと分かる. Webサイトがなくなっていたので,Web Archiveからバイナリを落とした. デコードすると,以下のURLが.

http://www.mediafire.com/download/5fppbkaujddijuk/bruteme.rar

ファイル名の通りブルートフォースするとFlag.txtがでてくる.

The Flag is {fb7df6e9ea6a5eb47263734fc158aceb}

stega4.wav

Nyan Catの10秒動画が渡される. Youtubeで元動画を見つけ,データを比べてみると高周波数のデータが増えているという事がわかったが,糸口がつかめなかった.

あとで,運営のアーカイブを抽出しろみたいなヒントをみて,いろいろ試してみるとsteghideだということがわかった. ブルートフォースで"flag"というパスフレーズが正しいと知り,flag.zipを抽出. あとは,もう一度ブルートフォースで5文字のパスワードを探しだすと以下のFlagが.

The Flag is {a57085396f9200c6d38ff66ffa1d3c71}

Crypto 400

message.encとpublic.pemが渡される.

openssl rsa -pubin -in public.pem -text -noout

とすると,RSA 768bitであることがわかる. RSA-768は素因数分解できることで有名なので,あとは対応した秘密鍵を作るだけ. なお,類似のRSA-768を利用した問題がCodegate 2010にSSL通信を見る問題として出題されているので,詳しくはそちらを参照されたい.

デコードすると以下の文字列が出てくる.

F4ct0r!zaTi0N

Crypto

以下のテキストが渡される.

Cipher:3521344454511323 141523 5542233521432351543442 242155 15 132342241334 53212134 5143 53423442525515353344 53331553 15343421144222 34425353425523 5321 5442 421523513444 2351524315344222 1323514352 15 431345425551321534 234423534245 53335123 51224215 15342321 3442432223 515323423424 5321 32554435532152551535335132 451543513513341553512143 154322 2353 4252154321525515353344

一目で「ポリュビオスの暗号表」だと分かる.このままでデコードしてくれるいいツールが見つからなかったので,隣接する2つの数字に応じて一意な文字に置換して,換字式暗号のソルバーに流した.やるだけ.

polybius was responsible for a useful tool in telegraphy that allowed letters to be easily signaled using a numerical system this idea also lends itself to cryptographic manipulation and steganography

あとはこれをmd5とって

dc7100ae6c0e1292908411c2db67decb

Crypto

gist7614059

One Time Padと呼ばれる形式.この記事を読めばあとは実装して,地道に解読するだけだった.

簡単に説明しておくと,同じキーでXORした暗号文同士をXORすると,それは平文同士をXORしたものと同じになるという仕組みを利用したもの. あとは,ある平文の1文字を特定すると,他の平文の同じ位置の文字を特定できることから地道に解読する. 今回は,一番最後の文のいずれかにkeyという単語が入ってそうという事がわかるので,場所を全探索して,他の平文も英語らしくなる場所を見つけてやるというようなことを繰り返した.

解読するとこんな感じ.

And God saw the light that it was good an

So God created man in his own image in th

But we are sure that the judgment of God

And God called the dry land Earth and the

For there is no respect of persons with G

His head and his hairs were white like wo

And the evening and the morning were the

Let fall also some of the handfuls of pur

The LORD heard the voice of your words an

The LORD your God which goes before you h

But as for you turn you and take your jou

Maybe youjustfoundmanykeys is the answer

答えは,youjustfoundmanykeys

Crypto

Zc duwcievvohpxqv uf bue xw iuzmgwtpthshon. Xpby wg tzx bak eikdxqht; wh'y sse rui ru tx bagh agexmky. Hvk qpiz og hnp pwpkfqgdi mfs rsk qmdx nogn zj bak yse tr thcsfilwm.

換字式暗号だと思いこんだので,かなり悩まされた.sseとかeelしかないだろとか思っていたが,調べるとヴィジュネル暗号だとわかった.あとはオンラインの解読ツールに投げるだけ.

解読すると,googleitというkeyで以下の文字列がでてきた.

to polyalphabetic or not to polyalphabetic. this is not the question; it's how you do it that matters. the flag is the lowercase emm dee five hash of the key in lowercase.

Flagは,36a2b79e4c40eabc3824b2bb433978f4

Crypto

Dhvgr n irel fvzcyr bar gb qrpbqr, unfu gur bevtvany grkg gb trg lbhe synt. Gnxr vagb pbafvqrengvba gur chapghngvba naq pnfvat.

換字式暗号.

Quite a very simple one to decode, hash the original text to get your flag. Take into consideration the punctuation and casing.

Flagは,e75b63e0332049ec5f9df4e5e3d1295d

Crypto

MD5 the original plaintext, no spaces, lowercase.

Hint: generate keys

14324425224113142433434443214155311452242534424432141454

いろいろ悩んだ末に,Bifid Cipherというものを見つける. Hintの7文字づつというのにしたがって並び替え,もうひとつのHintによって与えられたi, a, t, g, eを当てはめると以下の通りに.

1432442 1424334 4155311 3442443

5224113 3444321 4522425 2141454

i_a_t__ ge_____ _______ _______

地道に解読すると,以下の通りに.

1432442 1424334 4155311 3442443

5224113 3444321 4522425 2141454

iwantto generat ei__s_i atekeys

残りの部分に当てはまる単語はないので,困っていたが,試しに入れてみたiwanttogenerateimmediatekeysのmd5で正解になった.作問ミス.

Flagは,d2cfdb800d3243aa91299b7218b410c0

Web 400

Webなので簡潔に.

WAFが使われていると書かれていて,クオートとか全く使えなかったので困っていたが,調べてみると.ASCIIコードで変な文字に動かしているだけという事が分かる. Pythonで書くと以下のような感じ

waf = ''
for i in query:
    waf += chr(ord(i) + 32)

あとは,SQLインジェクションするだけ. Flagは,91114d86ac92d7f074295c6258bdf5df

Forensics 1

以下のSQL Dumpが渡されて,侵入者によって追加されたユーザーを見つけろというもの.

gist7614235

よく見ると,一部の行だけ改行がCRLFになっているので,その次の行のユーザーを全部見つけるだけ.

追加されたユーザーを上から順にカンマでつないでmd5にすると,Flag: 71284b9edd33e4141952b325a9c6acdaが得られる.

Forensics 2

vmem形式でメモリダンプが与えられるので,volatilityで開く.

vol.py pslist -f file.vmem --profile=WinXPSP2x86

gist7614334

怪しいdecryptpastebinのmemdumpを抽出して,眺める.

Pythonのプロセスっぽい文字列がたくさんあるなかに,以下のような文字列が.

Welcome to pastebin decryptor v0.1beta


id:KEY=


さらに,チャットの痕跡を見つけ,そのなかに以下のような会話が.

PRIVMSG [DDS]ahmed :yeaah, finally we got the correct flag

PRIVMSG [DDS]ahmed :take this enc-bin dpAtnvCB:looool

PRIVMSG [DDS]ahmed :oupsss

PRIVMSG [DDS]ahmed :sorry

PRIVMSG [DDS]ahmed :this one V5BvcN64:LtqK_tRU7YlF

つまり,decryptorでV5BvcN64:LtqK_tRU7YlFをdecryptするとFlagが出てくるようだ.

適当にdumpを眺めていると,プロセスがhttp://pastebin.com/raw.php?i=V5BvcN64にアクセスして,RSAでLtqK_tRU7YlFという文字列を使って復号化していることがわかる. 出てきた変数名などで検索すると,これをそのまま流用していることがわかったので,後は復号化するだけ.

Flagは,d99cbe01e4b0c0da0e4711e7c0114e79