SECCON2014
オンライン予選(英語) CTF
- crypt200 -
今回の解説について
• 模範解答はできる人たちがWeb上に公開済み。
• 今回は、オンライン予選当日に実際どうアプローチしたかを共有する。
ただし、
この問題、途中までしか解いていないので、最後の一押しはぐぐってく
ださい。m(__)m
まずは問題を確認
crypt1.zipを解凍すると
readme.txtの中身
rndは2つの引数を要求する実行ファイルのようだ。
何を問われているのかわからない…。
まずは実行してみる
• 実行環境が無いので、VirtualBoxにUbuntuを入れる。
• とりあえず、readme.txtの記載の通りに実行してみる。
• crypt1.pngが無いので、手持ちの適当なpngファイルで実行。
実行結果
• 第1引数のファイルに変化は無い。
• 第2引数のファイルは書き換えられた。(md5sumを確認。)
• 第2引数のファイルは実行するたびに違うファイルに書き換えられた。
僕 チームメンバ
./rnd実行すると、第2引数が変わるんだけど、
何を問われているかわかんないです。
./rndのエンコードアルゴを解析して、
ecrypt1.binからcrypt1.pngを
デコードする問題だと思うよ。
!?
この問題は…
./rnd [入力ファイル] [暗号化したファイル]
./rnd crypt1.png ecrypt1.bin
rndによって暗号化されたファイルecrypt.binから
元のファイルcrypt1.pngを復元することを
要求されている。
ここで問題を把握
暗号化のアルゴリズムを解析
• 元に戻すためには、暗号化のアルゴリズムを理解する必要がある。
• rndを逆アセンブルして、アルゴリズムを解析してみる。
fread
fwrite
暗号化のアルゴリズム解析結果
rand_num = rand(); /* ランダムな数字を取得する */
rand_num &= 0xff; /* rand_numは0~255のランダムな数字になる */
fread(&ch, sizeof(char), 1, fp1); /* 第1引数のファイルから1バイト取得 */
result = ch ^ rand_num; /* chとrand_numのXORをとる */
fwrite(&result, sizeof(char), 1, fp2); /* 第2引数のファイルに書き込み */
解析結果にあまり自信がなかったので…
• 一応gdbでデバッグ実行して、解析どおりの動きをするかを確認。
• disassembleコマンドでアセンブラを表示。
• stepiコマンドでアセンブラ1行実行。
• info registerコマンドでレジスタの値を表示。
結果、まぁ、合ってるっぽい。
改めて暗号化のアルゴリズム解析結果
rand_num = rand(); /* ランダムな数字を取得する */
rand_num &= 0xff; /* rand_numは0~255のランダムな数字になる */
fread(&ch, sizeof(char), 1, fp1); /* 第1引数のファイルから1バイト取得 */
result = ch ^ rand_num; /* chとrand_numのXORをとる */
fwrite(&result, sizeof(char), 1, fp2); /* 第2引数のファイルに書き込み */
freadした値をランダムな値とXORして、
fwriteしている
改めて暗号化のアルゴリズム解析結果
rand_num = rand(); /* ランダムな数字を取得する */
rand_num &= 0xff; /* rand_numは0~255のランダムな数字になる */
fread(&ch, sizeof(char), 1, fp1); /* 第1引数のファイルから1バイト取得 */
result = ch ^ rand_num; /* chとrand_numのXORをとる */
fwrite(&result, sizeof(char), 1, fp2); /* 第2引数のファイルに書き込み */
ランダムな値が分かれば、
もう一度XORして元に戻せる!
この問題の解き方
./rnd crypt1.png ecrypt1.bin
./rnd ecrypt1.bin crypt1.png
ecrypt1.binは、
crypt1.pngに何かを
XORしたもの
ecrypt1.binに何かを
XORしたらcrypt1.png
が得られる
ランダムな値をどう再現すればいいかわからない。
ランダムの法則性を探す
• とりあえず、1万回ループ実行してみる
ランダムの法則性を探す
• 1000回くらいずつ、全く同じファイルが出力される (md5sum値が一致)
• 同じファイルはファイルの作成日時が秒単位で同じ (ls –full-time)
./rndの実行時間によって、ランダムな値が決まる
ecrypt1.binの更新日時を確認
• ls –full-timeコマンドで確認
• 2014年11月22日23時46分30秒であることがわかる。
時間を合わせてrndを実行
• date –sコマンドで時間を合わせてrndを実行
• 一応前後5秒でも実行(計11回実行)
結果
• 2014年11月22日23時46分30秒だけpngファイルになった
• このpngファイルに、きっと答えが書かれているはず!
答えじゃねーーーーーーーーー
僕 チームメンバ
画像出てきたけど意味がわからないです。
どうもRabin暗号の式らしい。
!?
Rabin暗号について調べる
∩___∩
| ノ ヽ
/ ● ● | クマ──!!
| ( _●_) ミ
彡、 |∪| 、`\
/ __ ヽノ /´> )
(___) / (_/
| /
| /\ \
| / ) )
∪ ( \
\_)
ぐぐれば割と簡単に答えの出し方がわかるんじゃなかろうか
無理。
ここまでが当日解けたところ
続きはWebで。

SECCON2014 crypt200