2019でいくつか作問を担当しました。今回は簡単な問題だけ出題するということで、CTF初心者だった頃を思い出しつつ、初心者の勉強になるような問題を心がけて作りました。その結果、難易度を押さえつつ良い感じの問題もできたのですが、やはり非想定解が大量に発生してしまいました。簡単だから非想定解があっても難易度は簡単なままなんですけどね。自分が作った分について軽く想定解というかお気持ち的なものを書きます。tutorial一番最初に作った問題です。pwn初心者にヒープ問題のお気持ちを知ってほしかったので作りました。fastbinなので同じ領域を2回連続でfreeすると落ちてしまいます。freeをしてfdを用意されたフラグのアドレスにつなげればOKです。fastbinなのでフラグのアドレス-0x10を指定しないといけません。間違えてフラグのアドレスを繋いだ場合は「ヘッダ忘れてない...?」みたいなメッセージが出力されるようになってます。結果として30チームに解いてもらい、アンケートでもfastbinの勉強になったという声が上がっていたので出題して良かったと思ってます。shopkeeper単純なBOF問題です。変数を書き換えるだけの一番簡単な部類のBOFですが、単に"AAAAA..."みたいに打ったら解けるのはつまらないので、理解した上でのみ解ける設計にしました。あとプログラムをやや大きめにしたので、読んで脆弱性を見つける能力も問われるんじゃないかな?アイテムとしてHopesを選択するとシェルが取れますが、お金が無いのでHopesを選びつつBOFでお金を増やす必要があります。readで改行コードが来るまで読み続けるので"Hopes\x00AAAA..."みたいなデータをリターンアドレスを書き換えない程度に書き込めばシェルが取れます。こちらも23チームに解いてもらい、妥当な結果かなーと思ってます。bullsh単純なFSB問題です。x64なのでpwntoolsのfsb機能は対応してないと思います。x64だとアドレスにnull文字が入るので、アドレスリストは後ろに持って来ないとだめなんですよね。ちなみにptrlibのfsbを使うとx64でも勝手に書式文字列を作ってくれます。(宣伝)15チームに解いてもらいました。stegoropこの辺からpwn初心者は苦しくなってくると思います。こちらも100バイトのバッファに0x100バイト書き込めるのでBOFがあります。普通にROPでlibcのアドレスをリークしてret2vulnすれば良さそうですが、一度main関数を呼び出すとロックが掛かってもう一度呼び出せません。chainを送るでした。考えるとreadでlockを書き換えれば済みますね......。lockはmmapで確保してsyscallのmprotectで読み込み専用にすれば良かったなぁ。難しくしてもアレなんで、これくらいの難易度で良いでしょう。kittentcache問題1つ欲しいなぁと思って作った問題です。pwnが多かったのでWinterKosenCTFに回すか悩みましたが、Winterに出すにしては簡単すぎるので今回出題しました。stegoropよりは難しいかなぁという判断で難易度はlunaticにしました。pwn強い人からすればwarmupなんで解いてみて拍子抜けした方もいるかもしれません.......IDAとかで読むと一見脆弱性がなさそうに見えるかもしれませんが、よく見ると負のインデックスを確認していないので範囲外参照できます。nameの後ろにkittensがあるので、負のインデックスを渡すとnameに書き込んだ値をアドレスとして認識し、printfやfreeできます。Poisoningで__free_hookを書き換えるでした。overreadで取る予定だったので、使う前にnameが初期化されていなかったりstrcpyでヒープに書き込んだりしています。そのため、readで読んだサイズだけmallocで確保するのにstrcpyで書き込むので、ヒープオーバーフローがあります。運営中にパケットを見ていると多くの方がヒープオーバーフローで解いていました。これに関してはどちらの解き方でも難易度は変わらないのでまぁいっかなーという感じです。作問中にヒープオーバーフローがあることに気づいていなかったのはpwnerとしてヤバイ。functionなんかフラグを出力するn次関数を作りたいという思いだけで作った問題です。正整数xを渡すとx文字目のフラグのasciiコードを返してくれる多項式f(x)が実装されています。初心者にとってはこれを読むのはつらいですが、入力したコードと比較しているのでgdbなどで動かして比較対象を見ればフラグが求まります。Extractorの作問チェックをしているときに思いついた問題です。インターフェースから問題文まで丸パクリしました。意図としては、zipコマンドの検証用オプションで任意のコマンドが実行できますよー、という内容です。zip"してマニュアルを読めば解けます。Loaderの方が難しいと思ったのですが、案外解かれませんでした。ちなみに私がWeb問を作るとかなり高い確率でRCE問になります。LoaderPHPのincludeで外部URLを参照する問題を作ろうと思って作った問題です。httpが読める本当にシンプルなinclude問題だったのですが、作問チェックで簡単すぎる判定が出たので作り直しました。なんかftpも読めるとマニュアルに書いてあったのでhttpは通らないようにしました。サーバー持ってない人が解けるか不安だったのですが、ふるつきの作問チェックで"php://"でも解けることが分かったのでそのまま出題しました。safermディスク系forensics問題です。Kitとかで削除されたzipを取り出せます。それだけでは簡単なのでXORしてから削除した、という問題設定にしました。それでも簡単なので、最後の数バイトはXORされない、というプログラムにしました。́・ω・`)最後の数バイトがXORされないことに気づかなくても、最後の方が壊れたzipはFFオプションで修復できるので、それで解いても構いません。Timeパケット系forensics問題です。SQLiなら面白いんじゃね?と思って作りました。SQLiを使っている、という想定です。この問題は思った以上に多くのチームが解いてくれたので嬉しかったです。おわりに本当は難しい問題を作る方が好きなんですが、参加者から頂いたフィードバック的には今回の難易度が良かったようです。2020を開きたいので、その時は今回参加者からあがった意見を参考にしつつ、問題設計をしていくつもりです。4のwriteupなんかtwitterで流れてたのでzer0ptsで参加しました。2019が開催されました。Writeup月別アーカイブはてなブログをはじめよう!ptr-yudaiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。