くれなゐの雑記

例を上げて 自分で手を動かして学習できる入門記事を多めに書いています

作問、動画作成の風景

はじめに

この記事は、CTF Advent Calendar 2022 の9日目の記事です。

8日目はbata24さんの「bata24/gefの機能紹介とか」でした。

すごい技術的な話の後にポエムみたいな話です。

この記事では普段kurenaifがどのようにして動画や問題を作っているのかを紹介します。
作問や教育コンテンツ作成の手助けになると嬉しいです

ネタ集め

ネタがなければ何も始まりません。まずはネタ集めをします。
とは言え、動画や問題を作りたい!と思ってからネタを集めるのではなく、普段から緩やかにネタを集め続けています。
例えば以下のようなものがネタになります。

  • CTFの問題やそのwriteup
  • 公開されている脆弱性情報やそのPoC
  • 素朴な疑問
  • アルゴリズムやその実装(OSSなどが実装しているものを読む)
  • 仕様書、RFC、NISTなど

身の回りにある「これってなんでこうなるんだろう?」「これをこう変えてみたら何がおきるんだろう?」というのが、特に動画や問題の原泉になることが多いですね。
SECCON2022の this_is_not_lsb は、「RSAのLSB Oracleは有名だけど、じゃあ逆にMSBはできないの?」と思ったことがきっかけでした。
その他具体的には以下のようなネタがありました。

  • CORSではCSRFを守れそうな機能があるけど、実際どれくらい守れるの?
  • AES-GCMはどうやって実装されているんだろう?
  • 線形代数RSAで面白いことできないかな?
  • RSAのLSB Oracleが面白い!問題にしたい!

自分はアウトプットをしてまとめることが好きなので、こう思ったらだいたい動画や問題にしようと思うことができます。

ネタから問題原案へ

動画のようなアウトプットや教育に振り切ったコンテンツでは既存のアルゴリズムそのままを出せば良いのですが、SECCONのような競技の場では多少変形させたほうが良いです。「RSA LSB Oracleが面白かったからそのままだそう!」とはいかないのが難しいところですね。問題にするときはいくつか方法があります。自分がよく使う手段は以下です。

  • 攻撃手法を組み合わせる
  • 問題を簡単にする
  • 問題を難しくする
  • 問題を変形する
  • 天啓を待つ
  • めちゃめちゃ数式を変形して面白い形にならないか試す

「攻撃手法を組み合わせる」はとてもよく使われますね。例えば、SECCON 2022の「Wiches symmetric exam」では Padding Oracle AttackとAES-GCMの攻撃(名前知らん)の組み合わせですし、pqpqはGCDやらTonelli-Shanks algorithmやら色々組み合わせたものです。

「問題を簡単にする」は問題にする価値有るの?と思うかもしれませんが、解くことが難しい問題を解きやすくすることで、CTFに落とし込むことができます。「this is not lsb」はbleichenbacherを簡単にした問題とも考えることができますね。https://zenn.dev/kurenaif/articles/f9d3f56e1d3235 出だした「the_onetime_pad」も実はrsaのlsb oracleを簡単にした問題ですが、writeupを見る限り途中の過程も丁寧に解説されていてとても良かったなと思った記憶があります。

「天啓を待つ」は、問題そのものが降ってくるケースがあるので、それを待つケースです。SECCON2021の「oOoOoO」は大文字小文字からなんかいい感じに解けないかなぁと考えたら作れた問題です。時々こういう事があるので、思いついたら忘れないようにしないといけないですね。

「めちゃめちゃ数式を変形して面白い形にならないか試す」これはSECCON 2021の「pppp」がそうですね。「線形代数xRSA」のテーマで作問をしていて、固有値周りで色々実験してたら行列ごとできるRSA暗号を発見したので出題してみました。皆さんの驚きの声が印象に残っています。(嬉しかったですね)

問題のターゲット層を決める、誘導を作る

kurenaif的良問は、その問題を解く知識を持っていない人がコンテスト中に学習でき、学べるものです。

解ける人が瞬殺で解いてしまって、それ以降一切解かれない問題はちょっと悲しいですね。
じわじわ正解数が増えていく様子を見るのは運営の毎回の楽しみです。その点、SECCON 2022の「pqpq」は100チーム以上解けていて、それもじわじわ増えていったので目的は達成したのかなと思っています。

問題を解いてもらうためには、脆弱性のある箇所に注目させる必要があるのですが、そのためには脆弱性のある箇所以外はしっかりと安全に作り込むことが重要かなと思います。whiches symmetric examでは、「AES-GCMは正しく使われているので、AES-GCMではなく、その他のものを使って、となるとAES-OFBをつかってAES-GCMを突破できるのかな?」と思うことを期待しています。問題を解く上で、どこに気づくと解法に気づけるのかをシミュレーションしてみましょう。テスターがいるのであれば解いてもらうのが一番いいですね。

誘導が不足している場合は、コメントで補強したり、露骨に危険な実装にしたり、あえて中途半端なフィルターを実装するとそこに注目してくれると思います。

また、できることを減らすということも強力な誘導になります。例えば、リクエストをして「YesかNo」しか帰ってこないような問題は、それ以外は使えないということなので、考えることが非常に少なくなります。
SECCON 2021のcase_insensitve は問題そのものは単純ですが、誘導が少なく、solves数が少なかったのかなと思います。

動画を作る際も基本的には同じで、動画を見てくれるレベル層を設定し、最初数分はその人が分かる話を、残り20分くらいは知っていることから徐々に知らない内容にシフトさせていくようにレベルを調整しています。

(動画を作るとき)その問題に興味を持ってもらうためにはどうすればよいか?を考える。

例えば、prototype pollutionを説明するときは、そのアルゴリズムを説明するわけではなく、kibanaのRCEの画面を最初に見せ、興味を引くように工夫しました。LLLで乱数予測をする動画では、CTFの問題ではなくJavaの乱数という実際にあるものを使いました。

紹介したいアルゴリズムで検索してくる人はおそらくそのアルゴリズムを知っている人で、できれば知らない人に見てもらいたいです。
あ、これを知らないとこういう事になってしまうんだ、どうしてこうなってしまうんだろう。という興味を引く時間を最初に2,3分設けています。(実際にうまく行っているかは知りません。動画の視聴者維持率があるので、どれくらい維持できているかを指標に普段は調整しています。)

(動画を作るとき)その解説で動画特有のものを含ませることができないかを考える。

正直、ブログや書面はわかっている部分は流し読みができますし、構造も把握しやすいですし、わからなかったところは振り返りやすいですし、自分のペースで読めますし様々な利点があることはわかっています。動画よりブログのほうが良いという人が多くいることもわかっていて、自分もそう感じることは少なくないです。

ですが、文章で理解できない人が、動画という新しいアウトプットをすることで理解できるようになるかもしれません。今後の技術の発展でこういった負の側面が解消されるかもしれません。5Gになりつつある現代では、動画の視聴も気楽にできるようになりました。今後は動画のコンテンツの可能性は感じています。

こういった可能性は感じていきたいのですが、今現在負の側面があるのも事実です。負の側面を感じさせないために、できる限り普段の動画では動画特有の利点を盛り込み、動画もいけるじゃん!と思ってほしいですね。具体的には、以下のような要素を取り入れようと努力しています。

  • デモと解説をシームレスに移動する
  • 音、イラスト、文字をすべて利用し、複雑な情報を効率よく得る
  • 今なんの話をしているのかをわかりやすくする(これはシークバーで飛ばし飛ばし見る人が、止めたいところで止めるためです。具体的には字幕を入れる、タイトルを表示するのが良いです)
  • アニメーションを使う、図の変化をわかりやすくする
  • 今の進捗をわかりやすくする(時間が経てばたつほど完成していく様子は楽しいですよね)

でもまだ1万再生動画はないので、まだまだ動画としては改善余地あり、ですね。

問題が正しいかを確認する

以下のことをして問題の確認をしています

  • テスターがいるのであればテスターに解いてもらって問題が解けることを確認
  • ランダムなフラグの値でも解けることを確認
  • 問題文が与えられていて、問題を開発した環境でない環境でもとけることを確認
  • 途中過程が正しいことを確認し、パラメータ等が妥当であることの確認

動画であれば、できる限りなにか主張をするのであれば似た主張をしているものを探して引用をつけるよう努力をしています。

当日は祈る

当日は非想定解放で異常に解かれてしまうことがないことを祈ります。
動画の場合は再生数が伸びることを祈ります

writeupを調べる

writeupを調べて自分の想定通りに解けてるかを確認します。このときに「楽しかった」等の意見があればとても嬉しい気持ちになります。

動画特有のこと

YouTubeでは一度投稿した動画はカットやモザイクはできるのですが、訂正することが難しいです。
なので基本的には「設定した問題が解けたかどうか」に焦点を絞り、このアルゴリズムを使えば問題が解けるという事実をできる限り紹介できるようにしています。
例えば「脆弱性とはなにか」みたいな曖昧な話をしてしまうと、嘘が混入する確率が高くなるため、動画を非公開にしないといけなくなる確率が高くなると考えています。
でも今後はこういう話もしていきたいんですよね、自分ひとりだと怖いので、僕と一緒に情報発信をしたい人、いたら教えてください!

次は ゼオスTT さんより 「evilなnpmパッケージでRCE」 です。最近サプライチェーンアタックが何かとホットなので、気になるトピックですね、お楽しみにミ★