こんにちは、25Bのくあらんてぃんです。10/13に開催されたtraPの10周年イベント「traPavilion」において、CTF班展示としてCTFコンテストを開催しました。本記事は、その舞台裏の紹介と公式Writeupを兼ねた開催記としてお届けします。
traPavilionのイベント全体に関しては、公式サイトなどもご覧ください。
CTFについて知りたい方は以下の記事などを読むといいでしょう。


きっかけ
7月上旬のミーティングから準備が始まりました。企画の出発点は「CTF班もtraPavilionで何かでかいことをやりたい」というモチベーションでした。特に、オフラインイベントならではの問題で、より多くの人にCTFを楽しんでもらいたいという目標の下、準備が進んでいきました。

参加者の解いた問題の管理にはスタンプラリー方式を採用しました。これはオフラインイベントで参加者がスマホとにらめっこする状況をできるだけ減らしたいという理由から来ています。Capture The Flagということで、解けたら小さな旗などの物理トークンを渡すという案もありましたが、実現性の観点からスタンプに落ち着きました。
作問
作問はGitHubのissue機能とDiscordを併用して行いました。9月に入って原案を各担当に振り分けてからは個人での作問作業が中心でした。9月は夏休み期間であり、忙しいメンバーも多かったため、なかなか進捗が生まれませんでした。この時点でもう少し積極的に作問状況の確認を行ってもよかったと思います。
一部の問題が間に合わなそうだったため、直前になって@n3、@howard127、@Suimaをメンバーとして招き入れ、無事5問出揃わせることができました。特に@Suimaに関しては1日で原案作成から問題完成まで行ってくれて、とてもありがたかったです。ぎりぎりで助けを求めるのではなく、人手が足りないと感じた時点で早めに人を探すことが大切だと痛感しました。
結果的に作問部分に関してはほぼ25Bのみで完結させることができ、とてもよかったと思います。
これらの作問作業と同時並行で、景品やスタンプなどの手配も行いました。発注やデータ作成に関しては@sohokro先輩にとても尽力していただきました。予算を見積もると想定を大幅に超えてしまい、途中からは削れる部分をとにかく削る緊縮財政のようになっていました。
当日
当日はメインホール後方のスペースを使って展示を行いました。問題材料の一部は現地調達ということで、イベント開始ぎりぎりまで問題の準備をしている人もいました。
開会してからは、人の出入りが比較的多い場所ということもあり、多くの方々に参加していただくことができました。どの問題も複数人の正解者が出て、全問正解者もいる一方、2問以上正解した方への景品は想定よりも余ってしまいました。長く時間がかけられないリアルイベントに求められる難易度の難しさを実感しました。
公式WriteUp
traPavilionで実際に出題された問題やその解法、作問の意図などを各問題担当者から紹介します。
Target X
(担当者: yasako)
問題文は次の画像のとおりです。文面は前日の夜に確定していたのですが、実際に参加者に見せた次の画像は、当日の朝急いでFigmaで作りました

構想自体は結構初期からあった問題なのですが、実際に誰を探すのか決まったのは前日の夜〜当日の朝にかけてでした。発見すべき「X」は、@quarantineeeeeeeeee でした。本当は運営でない人から協力者を探そうとしたんですが、間に合わなかった....
ちなみに、使用した駅の写真は、実際に当日の朝 @quarantineeeeeeeeee に撮ってもらったものです。想定解法は
- 提示された写真から駅を特定
これはほとんどの人がクリアしていた印象です - Xでハッシュタグを探すことを考える
探す対象をアルファベットで表現したのは実はこれに気付いてもらうためでした。意味はあったんでしょうか? - #traPavilion とXに投稿している人を順番に見ていく
- ハッシュタグを含む投稿の一件前に、科学大湯島キャンパスの写真を投稿している人が見つかる
- 湯島キャンパスは写真の駅のそばであること、またそのアカウントはtraPavilion当日に上の写真の駅について言及していることから、このアカウントがXのものであるとわかる。
- その人の過去の投稿を探すと、CPCTFで3位になったという投稿が出てる
- 次の記事を見つける https://trap.jp/post/2585/
- くあらんてぃんを会場で探す
- くあらんてぃんは、ルービックキューブのキーホルダーを身に着けていました。これを解答すれば正解です。
QapRicious Code
問題文は次の画像の通りです。

filter, mosaic sheetという2つの小問を用意しました。mosaic sheetに関しては元データも載せておくので暇だったら重ねてみてください。




(担当者: quarantineeeeeeeeee)
以前何かで見かけたQRコードの脆弱性というものを題材に、CTFのセキュリティの部分の面白さに焦点を当てた問題を作りたいと思い、作問しました。小問ではシートを重ねることで文字が浮かび上がるVisual Cryptography問と赤セルシートを通してみることでQRコードが浮かび上がる広義Steganography問を作問しました。どちらも脆弱性を突くというよりは閃きとギミックを楽しむ謎解き問のようになりました。
filterの右側の文章は "Of course, It is not Piet!" と書いたつもりです。Piet という難解言語っぽいなーと思ったのですが、誰も気付いてくれなかった気がします。
mosaic sheet は重ねると以下のようになります。

ちなみに、この問題のために https://trapavillon.trap.show/ を取りました。(公式サイトじゃないよ!!) 詐欺サイトのようなことをしてごめんなさい。
以下クリア時に遷移するサイトからのコピペです。
縦のカギ - mosaic sheet
シートを重ねることで隠された情報が出現する暗号でした。
このような暗号を「Visual Cryptography」などと呼ぶらしいです。
横のカギ - filter
赤セルシートを使うことでカラフルな模様からQRコードを浮かび上がらせることができます。
おそらく広義でForensics (ファイルなどに隠された情報を探し出すジャンル) の問題でした。
最終問題 - QapRicious Code
QRコードにはデータ領域とは別に、誤り訂正領域があります。この誤り訂正領域の半分程度であれば、読み取ったデータが誤っていても正しい情報を復元できるのです。
今回のQRコードは、普通には作成できないような特殊な構造になっています。正規リンクと隠しリンク、それぞれの誤り訂正符号を大体半分ずつ組み合わせて作成されているのです。
雑な説明をすると、特定のモジュールを白から黒にすることで、正規リンクの誤り訂正符号の量を隠しリンクの誤り訂正符号の量が上回るため、隠しリンクへと遷移させることが可能になるのです。
この手法を悪用すると、低確率で悪意のあるサイトへ遷移するQRコードを生成することも可能です。
信頼できないQRコードを読み取るときは、その遷移先をよく確認することが重要でしょう。
参考:瀧田 愼, 大熊 浩也, 森井 昌克, "誤り訂正符号に基づく偽装QRコードの構成法とその脅威," 情報科学技術フォーラム講演論文集 (FIT), Vol. 17, pp. 1-6, 2018.
爆弾解除
問題文
爆弾(に見立てたArduinoと回路)が与えられ、30分のカウントダウンがスタートします。緑と赤のLEDはそれぞれ即時起爆とカウントダウン停止を意味します。与えられた4つの線のうちいくつかを正しい順番で切る(のはもったいないので抜く)ことで、緑を点灯させないまま赤を点灯させてください。

(担当者: uni_kakurenbo, howard127)
@howard127が書いてくれた回路探索器を弄って (適当な評価値によって) "最も難しい" と判断された 4 盤面のうちの一つを出題しました.
思っていたよりもたくさんの方に解いていただけて大変嬉しかったです.
TeX
問題文は以下の通りです。

(担当者: Suima)
なんやかんやあって、ピンチヒッターで作問をしたSuimaです!
作問RTAの経験になりました。
手で解く難易度ではなくなってしまっていて、申し訳ないなぁ…という反省。ヒントとか会場にちりばめておけば良かったですね。
作問担当による解説記事も公開されているので是非ご覧ください。

Treasure Box
細長い紙切れと実は未開封のエナジードリンクの缶が置いてあります。(写真は撮り忘れましたごめんなさい)

(担当者: o_o, n3)
私が愛してやまない不等号ナンプレを題材に問題を作りました(@n3 が)。 私が適当に出題して @n3 に解かせた問題はなんと答えがただ一つに定まらない最悪な問題だったんですが、いい感じにヒントを配置してくれて、問題として成立するようになりました。問題をモンスターの缶に巻き付けるというアイデアは @quarantineeeeeeeeee が出してくれました。巻き付けずに解いている人も多かった気がします。肝心な宝箱の置き場所ですが、2F にあったでっかいディスプレイの前に置き、 Discord の #gps にその写真を投稿しました。物理会場を活かしつつ、 Discord を開いてもらうという意味でいい選択だったと思います。

感想
CTFコンテスト運営メンバーに感想を書いてもらいました。
o_o
全体的に CTF というよりも謎解き色の強い問題構成になったと感じます。本来は初心者向けのコンテストの予定だったのですが、想定以上の難問が並びひやひやしました。traPavilion 終了後に traQ 上で楽しかったという声を聞けてとてもうれしかったです。
yasako
CTF(というよりかは謎解きに近いですが)の作問の難しさが良くわかりました。そもそもCTFコンテストに全然出ていないので、勉強しつついろいろな分野にチャレンジしていきたいです!
n3
急にヘルプに入った割には、結構問題制作に関われて楽しかったです。最終的にただの謎解きペンシルパズルになって、いわゆるCryptoの暗号って感じでは無かったかもしれないと思いました。でも、言葉を暗号化するなら文字を符号化して、ってなると計算量が増えて面倒くさくて...みたいな検討をした結果、最終的にこのような形になりました。この苦労を、CTFの作問経験の足しにしたいと思います。
uni_kakurenbo
爆弾解除は,もともと 10 倍くらいの難易度のものを用意していたのですが,流石に難しすぎるということで,当日にナーフされました.
全体的に当初の想定よりも難しい問題が多くなってしまったという危惧はあったものの,楽しかったといったような声も何度か伺うことができて,その点については良かったと思います.私としても大変楽しませていただきました.
quarantineeeeeeeeee
traPavilionに展示側として関わることができてとても良い経験になりました。企画運営の大変さと楽しさを知ることができたと思います。景品のクリアファイルにもとても分かりづらい小ネタが隠されているので、よかったら探してみてください。提案してくださったCTF班の先輩方、イベントの準備・開催をしてくださった運営の方々、そしてこの展示・記事に足を運んでくださった方々、本当にありがとうございました。
