駒場祭CTF3日目の裏話

この記事は、
adventar.org
の17日目の記事として書かれました。
昨日の記事は、fiordさんの`segmentation fault`

概要

tsg.ne.jp の3日めでやっていた
CTF (https://ctf-day3.tsg.ne.jp) の作問をやったのでその話をします。
このCTF、未だに登録して参加可能ですし、moratorium君が新たに問題作ったりしているので、まだ解いていない皆さんは是非ネタバレ(下にある)を見る前に解いていってください。

問題とその(プレイヤーの)解答については、
moraprogramming.hateblo.jp

cookies.hatenablog.jp
などを参考にしてください。
以下ネタバレです。

問題製作に使ったファイルを雑にまとめて
github.com
にあげました。

今回、五月祭の作問を反省して、全体的に"問題文が短く"なるように意図して作問しました。

LeapIt(100pt)

10分で倒せる問題枠です。問題文が短いといいつつそれなりにありますが、Cでかつ実行できるので見かけほど面倒ではないはずです。当初は自分自身を出力するELFバイナリにするつもりだったんですが、解析が面倒になりそうなので諦めました。
Quine作るの大変だったのでは?みたいな質問をもらったりしましたが、実際にはCのコードを出力するPythonコード
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/master/LeapIt/quine_generate.py
を書いているので面倒ではないです。というか僕がQuineとかこういうの大好きなので作問楽しかったです。

www.slideshare.net の50枚めのA+B+Cの考え方を使えばわりと簡単にかけるので皆さんもぜひ好きな言語でquineをかいてみましょう。
あと、作問時に注意したこととして、Leap回数を±1間違えた場合には、ちゃんとフラグ形式を満たさない文字列が出るようにパラメタを調整したりしました。

TSG shooter(150pt)

本質がrevevrsingなので、これもあんまり短くしてはいけませんね...
出題バイナリは
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/master/TSG%20shooter/shooter.cpp
コンパイルしたものです。
出題意図としては、実際に解いている様子が実況として画面映えしそうだと思った*1ということと、個人的にWindowsバイナリの動的解析が好きなのがあります。

RSA modoki (150pt)

問題文が短いcryptoシリーズです。想定解はもらくんの解き方で、くっきーのは非想定解でした。
当初は
 e^M\ mod\ N,\ e^N\ mod\ M,\ M^N\ mod\ e,\ M^e\ mod\ N,\ N^e\ mod\ M,\ N^M\ mod\ e
の6つの値を与えて、想定解として
 e^N\ mod\ M,[ N^e\ mod\ M
からくっきーの解き方をやる、というのを考えていたんですが、これgcdとるのに無限に時間がかかってしまうのでunsolvableだと思って27個にしました。
6個でも解けた方はご一報ください。

Repeat64 (200pt)

たしか最初に完成した問題です。問題のイメージが先にできて、存外解くのがむつかしかったので200ptになった感じです。
以下は僕のソルバです。
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/master/Repeat64/solver.py
作問者としては、「問題が多重解であってはならない」ので、それを確認できるような解き方をするソルバにしました。
解き方は、問題の左のビットから順番に決定して、「10回base64した結果として正しいビット列」のみを持っていく感じです。これだと正しいbit列の集合、がたかだか200程度までしか膨らまないので、十分早く復元できます。
ちなみに、これによると`TSG{Ba5e64^1s_r0bus7}` というのも正しいフラグになりうるので、これを除くために問題文でフラグに使用される文字を制限しています。あと別解が生じないようにフラグを調整したりしました。

simplepwn(100pt)

"簡単な"pwnを作ってみました。作問時の注意としては、stackのアラインメントをいいかんじにしないといけないので、
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/b019dfc514f5628021b4ee97f75ed25e4e9de20f/simplepwn/problem.c#L28
みたいなかんじにする必要がありました。あと`-fno-stack-protector`。

ROP4, ROP1(150pt,200pt)

ペイロードを送り込むところがRWXになっていないといけないので、
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/b019dfc514f5628021b4ee97f75ed25e4e9de20f/ROP1/compile.sh#L2
こういうオプションつけてリンクする必要があります。ほかにも、stackが実行可能にならないように
https://github.com/satos---jp/TSGCTF_2018_komabasai_day3/blob/b019dfc514f5628021b4ee97f75ed25e4e9de20f/ROP1/probrem.s#L4
つけたりとかですね。



明日の記事は、JP3BGYさんの 「OVMFを使った簡単なLinux on UEFI環境の構築」だそうです。TSG新部長の記事、楽しみですね!!

*1:残念ながら本番では誰も手をつけてくれなかった...