AdventCalendarということで何か実用的な記事が書けたらよかったのですが、間に合わなかったのでSECCONオンライン予選SECCON 2017 Online CTFに初参加した話を書きます。
Team名:RICORAで参加しました。結果は100pt×5問=500ptでした。
解けた/解けないに関わらず僕が手をつけていた問題について書こうと思います。
どうやらWrite-upというものが12/10にあったらしく、この記事の公開時期的に完全に出遅れている感は否めないのですが、勘弁してください。
#Vigenere3d
ヴィジュネル暗号(wikipedia)というものがあるらしく、この問題のプログラムでは暗号化過程で3次元配列を使用しているみたいです。
SECCON{**************************}
という文字列を
**************
をキーにして暗号化すると
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9
になるので、元の文字列とキーを特定することが求められていました。
与えられたソースコードから暗号化の特徴を掴んだり、文字列を探索するプログラムを書くことができたらよかったのですが、知識的にも技術的にも未熟だった僕は地道に検証していくことにしました。
元の文字列をSECCON{AA...AA}
、
キーをAA...AA
にして適当な部分を変えたりして検証したところ
どうやらキーの前半分(7文字)だけ求めればよく、後ろ半分は全部Aでよいことがわかったので、SECCON{
とPOR4dny
に注目しながら元の文字列とキーを探索していました。
key:_KP2Za_AAAAAAA
flag:SECCON{Welc0me_to_SECCON_CTF_2017}
を求めることができました。
#Run me!
ソースコードをみる限りフィボナッチ数列の11011項目の先頭32桁が答えになるみたいです。
とりあえずソースコードを愚直に実行すると、終わる気配が一向に見えず、一時中断しました。再帰関数は深くなるにつれ時間計算量が半端ないことになることを思い出したのでループで回して結果を求めることにしました。
a=0
b=1
for i in range(11011):
a,b=b,a+b
print ("SECCON{" + str(a)[:32] + "}")
flag:SECCON{65076140832331717667772761541872}
を求めることができましたが、チームメンバーがすでに通していました。
#Log search
Elasticsearchを使う問題のようです。
Elasticsearchについては知識がnull状態だったのですが、他のチームの人たちが投げたリクエストのログを見ることができたのでそれっぽいリクエストに対して200が返ってきているものに便乗する作戦をとりました。
ダメでした。flag-XXXXに対して200が返ってきているものがあったのでこれじゃないかと思ってGETを投げてみたのですが、無事そのページのHTMLが返ってきてずっこけました。
参加した人の書いた記事を見たところ、どうやらそれでいけたチームがちらほらといたようなので正攻法ではないにせよ手段としては間違いではなかったと思います。
#Ps and Qs
"Mind your Ps and Qs"で日本語で「礼儀に気をつけなさい」的な感じの言葉だそうです。
公開鍵ファイルが2つと暗号化済みのファイルが1つあったので恐らく公開鍵の元となる2つの合成数の公約数を求めて秘密鍵を特定するのだろうというところまでは予想しましたが、肝心の方法は一切わからなかったのでハッシュをただ眺めてました。
#感想
全くこの系統の問題を解いていない中での初参加だったので、まともに解けたのがたとえ2問でも結構達成感を感じました。こういったコンテストには今後も出たいので精進したいと思います。あとツールの幅広さを考えるとそこそこのスペックのwindowsマシンが欲しいなあ・・・