Block(緑枠2C)が交互に連続している。Blockの数から35フレームあると分かる。Tableに該当するバイナリを適当な値でいじってみる。保存して画像を開いてみると。下記のような中央の図形が素早く変化するアニメーションが画面に現れた。アニメーションを眺めていると、中央の図は、8角形の幾つかの頂点を結んだ多角形、または2つの頂点を結ぶ線、または特定の1つの頂点であることがわかった。図形は全部で35枚ある。ALPHABETとかいう、いかにもな32文字。CTFに携わる人なら、全員がピンとくるであろう、8角形の頂点を8bitのゼロイチに置き換えてみることにします。GIFアニメを見て置き換えるのは大変なので、画像処理ソフトでレイヤ分割して、目測でゼロイチに置き換えます。ちなみに、画像は、1フレーム毎にわずかに左に回転しているので、注意が必要です。各フレームの図形の頂点をゼロイチに置き換えて、(いまや私の業務上のメインツールになりつつある)エクセルでまとめたものがこちら。各フレームをbit列にする際、どの頂点を最初にするかでbitの並びが変わるので、8通りのパターンがある(正確には回転方向を考慮すると16通り)という、気持ち悪さを感じつつも、とりあえず、1フレーム目の図形の左上を頂点0として、時計回りに並べてみた。ALPHABETと紐づけて、法則を見つけてフラグを導けば終わり。楽勝!と、思っていました。ここから何時間も泥沼にハマる事になるのです。16進数にしたり、アスキーコードに変換したり色々試してみる。2時間ほど格闘したけれど、糸口すら見つけられない。いう時は、発想を切り替えることが定石です。問題タイトルに「puzzle」とあるとおり、これは、幾つかのフレームを組みあわせて8角形を作る(正確には8つの頂点をすべて1にする)パズルなのではないか?と思いつきます。上の図のオレンジ色で示した3つのフレームは、ビット毎に足し算するといずれの頂点も1が1つだけ存在する組み合わせです。この組み合わせを全て洗い出せば、何か糸口がつかめるかもしれません。これなら、前述の8パターンの全てで同じ結果になるので、bit列を開始する頂点の位置や、回転方向にとらわれること無く、気持ち悪さも払しょく出来ます。フラグへの匂いがします。机上でこの組み合わせを探すのは大変なので、pythonで適当にコードを組みました。{}".format(ans_list))結果は、(1,10,13)フレーム、(4,12,14)フレーム、(5,6,10)フレームの組み合わせの3通りしかありませんでした。このたった3通りから、フラグをどうやって導くのか?直観的にこの解法は違うと思いました。その後、当初の誓いを破り他の問題に浮気をしつつ、やっぱりこの問題が忘れられずに戻ってくるという状況が数時間続きました。大会も終盤に差し掛かりました。ファーストカテゴリ?のそれぞれの問題の正解チーム数を見ると、redacted-puzzleは比較的正解チーム数が少ないようで、実はこの問題は単純ではなく、私の凝り固まった脳では解けないのではないか?とネガティブ思考になりつつあります。見つけたフラグの形式は、OOO{xxx......xxxx}と開示されています。いうことは、最初の3文字は同じ文字で、4文字目に異なる文字が出現するパターンがどこかにあるはずです。ALPHABETは32文字です。1フレーム1文字とするならば、5bitの文字を表す列と、3bitの何らかの制御を表す列に分かれているのではないか?と仮定してみます。仮に制御を表す3bitがフラグ文字の順序を表すのであれば、一見、ランダムに見えるbit列の中に、同じ文字3つが連続するパターンが見いだせるのではないか、と思いました。3つの連続する文字が見えました。私の仮定は外れましたが、結果が出せれば良いんです。ALPHABETでは31番目つまり"11111")ですので、すかさず、35フレーム目の最後に目をやると...勝利を確信すると同時に、たまたま頂点0を先頭に持ってきたラッキーを噛み締めます。{}".format(n,ans))結果はこのようになりました。FXVUBF{=QVNRVZAXF=IAPANBXISQLR{FIW-J-UAHQSQUPA{LZQOYBA{Mやはり頂点0からで正解のようです。これ、bit列の開始を頂点0以外で考えた人は、かなり辛い戦いだったんじゃないかな(いきなり余裕を見せ始める)、と思いつつ、フラグを入力して得点をGET。slack上で仲間たちからの拍手が嬉しかったです。チームのリーダを経て、現在は同社ホワイトハッカーチームのマネージャ業に従事。アドバイザリーボードなどを歴任する。国内大会に出場しました。国内大会に出場しました。