CTFのpoteti問題まとめ

どうも、binjaリーダーのpotetiです。あまりしたくはありませんが、Twitterを見ていて必要性を感じたのでCTFの話をします。

 

CTFのExploitation(Pwnable)ジャンルで、過去にpotetiが作問した問題はいくつかあって、通称bataリスト(だっけ?)と呼ばれる例のあれにも数問載っています。

しかし、それらの問題を提供したED CTFやburning CTFは公開を終了してしまっていて問題を参照しづらいのと、起動時に注意が必要な問題が数問あるんですが、その問題に関する注意書きがどこにも存在していないので、このブログを使ってまとめておくことにしました。

なんか自分で言うのも何ですが、一部を除いて良問なのでやって損はないと思います。

 

My Sandbox おすすめ度: ★★★

www.dropbox.com

なんかそこそこ初期に作った問題で、かなり簡単なはず(作問者の実力が低いので)。村人Bが解ける人はおそらく十分に挑戦する資格があるのでやってみると良いかもしれません。ちなみに想定解は4つあって、4つとも典型テクなので考えてみると良いです。

もうちょっと難しく出来るしbinja CTFが開催できるなら改題を出したいなあ。

 

Heap is a tomodachi of mine おすすめ度: ★★

www.dropbox.com

分かる人には分かるかもしれないんだけど、これ途中までは全く別の方針で解けるようにしようとして作っていたんだけど、最終的に上手くまとまらなかったから適当にごまかしてしまってこの形に至ってしまったので、個人的にはクソ問の部類に入ります。ですが、一応今時のheap問題に比べると特殊なテクニックが必要なく極々典型的なテクニックで解くことが出来るため、入門には良いかもしれないということでおすすめ度を2にしました。が、まあやはりやらなくていいと思います。

 

Local Only 64 おすすめ度: ★★★★★

www.dropbox.com

個人的に、Local Onlyシリーズは多分僕が今まで公開した問題の中だと最も難しくて面白いと思っています。

 

で、「起動時に注意が必要な問題」というのは、Local Onlyシリーズのことです。まず1つには、これらは起動時に大量のopenシステムコールを発行するので、ulimit -nコマンド等で1つのプロセスが開くことの出来るfdの最大数をunlimitedなどにしておいてください。また、この問題には、ローカルから接続することが想定されています。意味不明な状況かもしれませんが、問題サーバー上のxinetdで問題が動いていて、更に問題サーバーにはssh接続が出来るという状態でした(だから"Local" Onlyという名前なんですよね)。これは、他の問題を解いた人間にしか挑戦権がないという意図でした(まあこの問題は難しいので)。

 

また、この問題に限りlibcの配布がありませんが、これは意図的です。何故かというと、libcが配布されてない状況に対処するのも問題の一部だからです。実際にこれがED CTFで稼働している時は、この問題に限り、自前ビルドしたlibcで動いていました。想定解は頑張って特定をするとかそういうクソ解法ではないので、ちゃんと考えましょう。

 

裏話としては、元々自分の研究課題として、Windows側でExploitを書いていた時期があったんですが、一定の成果が出たので、同じことをLinuxでやらせるような問題を作ろうと考えた結果この問題になりました。当時は僕がゴミだったので、「カーネルのコンフィグなどを適切にいじれば、returnするfdの番号をランダムに出来る」ということを知らなかったため、このようなランダム回数/dev/nullを開いて連番のfdを消費するというゴミ実装になっています。ごめんね。

 

Local Only 32 おすすめ度: ★★★★★★

www.dropbox.com

これもLocal Onlyシリーズです。32や64というのはbitを表していて、つまり、Local Only 32はx86の問題です。注意事項は64と同様です。

 

一般的にROPは呼び出し既約などの観点からx86_64上の方がx86上よりも難しいと考えられていますが、Local Only 64よりLocal Only 32の方が難しいという皮肉が、この問題の面白いところです。

 

このシリーズが解ければROPに関しては不安はないと言っていいでしょう。まあ本番でこれだけのROPを思いつけるかは保証できないけど。

発展課題としては、SECCONのいつぞやの予選に、ROP:Impossibleという良問があって(これにはとても面白い別解としてめちゃくちゃ楽な解き方があるんですが)、正攻法で解いてみるのがROPの実力を試すには良いと思います。個人的には大会中数時間で解けるレベルなのでやるだけです。それぐらいの時間で解けなければ反省すべきです。

 

Under Debugging おすすめ度:

www.dropbox.com

おすすめ度はバグではありません。0です。これはクソ問なのでやらなくて良いです。

どれぐらいクソ問かというと、解いてくれたint03さんやbataさんやhorityさん(解いてたか怪しい)には土下座しないといけないレベルのゴミカス問です(bataさんはポジティブな評価をくれた覚えがあって、聖人か?みたいな気持ちになった気がする。int03さんにはボロカスに言われましたが、それが正しい評価だと思う)。

 

言い訳すると、これもHeap is a tomodachi of mineと同様で、作問案はあったんだけど、思うように実装が出来ず妥協した結果、ゴミ面倒なだけの問題になりました。まあ面倒なExploitationの問題はたまに出るので、練習には良いかもしれない?俺はやりたくない。

 

binja CTFではこれも改題を出したいなあ。一応当時考えていた作問案は実現したし、いい感じで綺麗になったので。

 

Ninja no Aikotoba おすすめ度:★★★★

www.dropbox.com

burning CTFのExploitationの300pt(3問あった問題の内真ん中の難易度)だった問題です。これはかなり非典型というか、ad-hocで、しかも解法にはExploitationらしいExploitationテクニックは全く必要ないので、個人的には好きな問題です。現実性はかなり低いし途中のパートはうざいけど。

 

まあネタバレになるのであまり裏話とか意図は言うべきじゃない気がするんだけど、僕のポリシーとして、「Exploitationに関しては、初心者はまず仕様に強くなれ」というのがあって、それを体現した問題です。皆さん仕様には詳しくなろうね。

 

craSH(実際には2問として出題されフラグは2つある) おすすめ度:★★★

www.dropbox.com

これは完全に名前から作問に入った問題なんですが、かなり完成度は高くて、きれいな問題に仕上がったという自負を持っています。

一応、burning CTFの問題の中では最も難しい問題だったのですが、個人的にはこの程度は解けないと今時のCTFではやっていけないですし、今時のCTFにこの問題が出たらボーナス問題の部類です。

 

この問題の面白いところは、SEGVなどを引き起こすと片方のflagは取得することが出来るという点です。これは、burning CTFの運営の人から、作問の注文として「初心者でも解けるようなめちゃくちゃ簡単な問題を作って欲しい」と言われて考えた結果、この形式になりました。実際、普通のExploitationの問題は脆弱性を見つけるだけでは全く点数にならず、初心者にとってはどちらかといえばExploitを書くことが難しいわけなので、こういった形で部分点を設けるのはとても良いと思うし、もっとこの形で問題を作る大会は多くてもいいのになと思います。

 

以上が僕はExploitationジャンルでまともに作問した問題集でした。

解いてくれると、作った甲斐があったなと感じるので、もちろん嬉しいですし、感想や質問などは歓迎です。