Fetch the Flag CTF 2022の解説:Treasure Trove
Luke Watts
2022年11月10日
0 分で読めますFetchに参加してくれてありがとう! 参加してくれた数千人の皆さん、 Fetch the Flag CTFへの参加、おめでとうございます。また、チャレンジを作成し、テストし、解説を書いてくれたSnykerの皆さんにも心から感謝します!
今年のFetch the Flagは最高に楽しく、同時に大変な作業でもありました!16個のチャレンジと限られた時間の中で、すべてをクリアできたチームばかりではありません。時間内に解けなかった皆さんに向けて、私たちのチームがTreasure Troveに挑んだ方法をご紹介します。
解説
チャレンジの説明は「最新のTreasure Troveが公開されたけれど、ライセンスキーをどこに置いたっけ!」というものでした。まず、リバースエンジニアリングというタグがあり、obfuscator.jsファイルが提供されています。
リンク先のWebサイトには、5×5文字の入力欄とボタンがあり、Curse of Monkey Islandをプレイした頃を思い出させてくれる素晴らしいアートワークもあります。

提供されたコードを確認すると、人が読めるコードを意味不明な文字列に変換するツールが見つかります。
次にWebサイトを見てみましょう。swashbuckle.jsエンドポイントにはvalidateというメソッドがあります。中のコードは、obfuscatorが生成する出力と一致しているようです。うーん……
もう少し詳しく見ると、validateメソッドはwindow上で利用でき、フォームの送信時に呼び出されることがわかります。なるほど、validateをリバースエンジニアリングするしかなさそうです……ブラウザーを使えば何かわかるかも?ブラウザーのコンソールからvalidate.toString()を実行してみましょう。ビンゴ!
どうやら、コードは次の処理を行っています。
HTMLの入力欄から値を取得する
各文字が
A-Z0-9の範囲にあることを確認する文字をループ処理し、
charCodeに変換して値を合計する。charCodeAt()メソッドは、指定したインデックスにあるUTF-16コード単位を表す、0~65535の整数を返します。 出典値が1800でなければエラーをスローする
値が1800の場合、元の入力値がAPIエンドポイントに送信される
ここで最も重要なのは、値が1800でない限り、コードは無効だということです。
1800 ÷ 25(入力可能な文字数の合計)
72
String.fromCharCode(72)Hを返す
それぞれの入力欄にHHHHHを入力する

ダブルビンゴ!

obfuscatorのコードベースを調べることなく、このチャレンジを解くことができました。おかげで次のチャレンジに取りかかる時間もたっぷり取れました!
ほかのフラグをどう見つけたのか知りたいですか?Fetch the Flagの解答ページで、その方法をご覧ください。
