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

Facebook CTF Finalsに参加することになりました。

CTF 雑記

初めに、カンパを企画してくださったsyuu先生、カンパしていただいた皆さま、カンパを拡散してくださったフォロワーの方々、本当にありがとうございます...

 

1日で、これだけの金額が集まるとは夢にも思ってなかったので、感謝の意味も込めて、ブログに書かなければいけない気がしました(大人怖い...)。

 

一応この記事で、今までのCTF参加の回顧などをしようかなと思ったのですが、書いた後で記事の必要性がわからなくなり、更には日本語が未だにあやふやなので、伝わるか不安です。

 

 

 

まず、僕がCTFを始めたきっかけは、おそらく去年のLinuxCon2012の夜に宿泊したホテルでしょうか。

ホテルで暇をしていた僕は、先輩である@hiromu1996がksnctfというCTFサイトの問題を解いているのを見て、やってみようかなと思って始めました。

実際、初めはほとんど解けず、数問はほぼ正解に近いようなヒントを周りの人々にもらったのを覚えています。

 

そして、その数カ月後にセキュリティ・キャンプに「OS組」で参加しました。

正直、OS組として活動してきたと言えることが現時点で全く無いので、すごく恥ずかしいのですが(講師の方すいません、近日中に提出しますので、もう少しお待ちを...)、セキュリティ・キャンプで行われたCTFで、完全にチームのお荷物になりました。

 

今も出来ると言い張れるほどではないですが、その頃はお世辞にも、リバースエンジニアリング出来るとは言えず、CTFの知識が脳内に点在しているだけ、と言った感じでした。

 

その後は、ひたすらOnlineのJeopardy(問題回答)形式のCTFに出続けました。

 

キャンプ卒業後、初めて出たのは9月のCSAW CTF2012です。

EpsilonDeltaが結成されたのもこの大会からです。

CSAW CTF2012は、今思えば問題が比較的簡単なこともあり、

ほとんどアセンブラが読めるとはいえなかった僕でもBinaryを100 ~ 400まで解くことが出来、1000チーム中174位と、初参加にしては上出来だったかなと今でも思います。

 

こうして、徹夜、エナジードリンク服用を重ねながらずっとCTFに粘着していたのですが、OS組に参加するにあたって、事前課題で少し逆アセンブル結果を読むということをしていたので、段々Binaryの問題が解けるようになりました。

 

EpsilonDeltaというチームがなんとなくCTFの上位に入るようになったのは2013の春頃に入ってからだと思っています。

CTFのチームの成績はCTFtimeというサイトで確認できるのですが、

EpsilonDelta:https://ctftime.org/team/3050

自分のチームの成績を見ていると、やはりBoston Key Party CTF2013から際立って上位に入っている感じがします(それより前も入っているように見えますが、それらは基本的に分母が小さい大会です)。

 

Boston Key Partyはチームにとってはあまり重要ではなかったし、あまり記憶に無いCTFだと思います。

しかし、僕にとってはこのCTFがすごく重要でした。

 

CTFという競技にはジャンルがあるのはご存知かと思います。

例えば、Web, Network, Forensicsなどです。

一応僕はBinary(Reversing)が得意という体でやっています。

Binaryと似たジャンルにExploitation(Pwning)というのがあります。

 

Binaryがパスワード解析やソフトウェアクラッキングなのに対して、Exploitationは、いわばソフトウェアサービスへの攻撃です。

何故か、僕はそれまで全くもってExploitationが解けませんでした。

Exploitationも、基本的にはリバースエンジニアリングと同じ工程を踏んで、脆弱性を理解し、攻撃するという感じなのですが、経験が足りなかったのか、攻撃する箇所が分かっても攻撃が成功しない、ローカルの環境で実行したらうまく攻撃できてるのにリモートだと動かないという具合で、ほとんど得点できず、足を引っ張っている感じがしました。

 

Boston Key Partyは僕が初めてExploitationで得点したCTFです。

それも、最後の30分で400ptを得点したので、順位的には40位ぐらいから19位まで跳ね上がりました。

この時の出来事があったから、今でも楽しんで、徹夜をしてでもCTFをやれているんだと思っています。

 

その2週間ほど後にあったのがDEFCON CTF2013予選です。

DEFCON CTFはCTF大会の中で最も大きいと言っても過言ではない有名な大会です。

この大会だけは各国のメディアなどにも取り上げられます(NHKでもやってましたね)。

おそらく名前を聞いたことがある方もいらっしゃるのではないでしょうか。

 

最も大きい大会なこともあって、ウチのチームもかなり意気込んでいました。

DEFCONのために学校の公欠を取り(CTFで公欠を取れるのか)、部室にRedBullを30本ぐらい投入し、完全に2日徹夜で挑みました。

 

うちのチームは、結果としては、800チーム中79位でした。

上位20チームが本戦出場することを考えると、その差は近くも感じられ、程遠くも感じられました。

これは完全に僕のせいです。

何故なら、Web, PPC(プログラミング分野)は全問完答していましたから。

Binary, Exploitationは1問も解けませんでした。

完全に敗因は僕です。

 

Boston Key Partyで勢いづいていた僕には強烈にショックでした。

どうしようもなく、落ち込みました。

 

@ntddkと反省した結果、今まではx86-64しか読んだことがなく、ARM、PowerPCに対して非常に弱いということと、ニーモニックをちゃんと覚えられていないということが大きな原因であることで結論を得ました。

 

そこからは地道に勉強した成果もあってか、着実に、順位が上位で安定していきました。

 

そして1ヶ月前、CSAW CTF 2013に参加しました。

つまり、EpsilonDeltaを結成して、ちょうど一年立つ節目の大会です。

当然、うちのチームは異様(?)に意気込み、

何故か公欠を取り、Rockstarを部室に30本ほど投入し、徹夜で挑みました。

結果、全体で1300チーム中33位と、なかなか満足できる成績を残しました。

 

なんといっても、去年のCSAWでは手つかずだったExploitationが、100 ~ 400まで解け、Binaryも100 ~ 500まで解くことが出来、自分の成長を感じました。

 

そして、CSAW CTFでは、本戦の出場権はUndergraduateの上位10チームにしかありません。

やはり、上位のチームは院生、セキュリティ会社の社員など、セキュリティを専門にしているチームがほとんどなので、Undergraduateのチームとしては、8位でした。

従って、本戦に出る権利があったのですが、出場には「アメリカまたはカナダ在住の」大学生がチームにいないといけないらしく、出場はやむなく断念しました。

 

上位には食い込んでいたものの、本戦に出場できるほどの成績を残したことのない僕たちは、海外のCTFに出場できた経験もないので、海外のCTFに出場するというのは一つの目標でした。

 

Facebook CTFの予選は、本当に軽い気持ちで参加しました。

というのも、CTFのスタンダードなやり方と違い、あまりノリ気ではなかったからです。

 

普通のJeopardy形式のように

競技時間中にどれだけ問題を解けるか

                             を競うのではなく、

3問の問題をどれだけ早く解き、

どれだけ解法を綺麗に文書でまとめることができるのか

                    で順位を競う合うため、不満をグチグチ言いながら文書を提出しました。

 

時差の問題で競技開始時刻から解き始めなかったこともあり、正直メンバー全員が「これは予選落ちだろう」と思っていました。

 

しかし、何故か結果は13位。

上位12位が本戦に出られることを考えると、キャンセルが一つでも出れば出場する権利があるわけです。

実際、こうして今出場が決まったわけですが、未だに少し微妙な心境であることも確かです。

 

Facebook協賛の癖に、賞金が少なかったり、交通費が出なかったり、ケチな感じがするからです。

これは個人的な感想です。

 

基本的にCTFの本戦と言うのは、Attack/Defense形式です。

各チームには同じサービスが動いたサーバーが与えられ、

自分のサービスの脆弱性を塞ぎ、他のチームのサービスを攻撃することで点数を競い合います。

 

今まで参加したことのない僕たちはかなり不利だと思います。

攻防戦形式は展開が早く、実力で序盤から大きく差が出るからです。

慣れていないと手間取るでしょうし、うまくいかないかもしれません。

 

でも、僕はそれでも勝つつもりです。

CTFで1年を無駄にしてきたので、もう僕は負けたくないです。

頑張って優勝して帰ってくるつもりなので、皆さん応援よろしくお願いします。

長文失礼いたしました。