kuji!最初に問題の概要を把握するのに苦労するが、最初の並びが与えられるので、それを昇順に並び替えるあみだくじを指示された数重複なく与えるとフラグがもらえる模様。JSファイルを見るとあみだの線をどの場所に何度置いたかでフラグを生成しており、与えられた回数作るというよりは全種類作る必要があって作者が数を明示してくれているという雰囲気。並び替える問題が登場し、また、一つの正解が最初から入力されている。手で線をずらしながら適当に入力すると次のステージに進めた。ソートするあみだくじを62個(先ほどの考察の通りすべて)作る必要がある。正解も明示されていない。紙で試行錯誤して一つ発見し、そこから線を上下にずらしたりしてみても20通りくらいでしかない。全探索は現実的でなさそうだった。右端に送り込むこと、縦の線が10本程度しかないため、この程度は必要になる(開始位置が少し違うものもあるが、制約条件としての強さは同じ)。あみだくじとして有効なすべてのパターンは、下の図かその上下反転のいずれかの部分あみだくじ(この状態を仮に「基本あみだくじ」とする。部分あみだくじとは元のあみだくじのうち横線を0本以上取り除いたものと定義する。)を元に、「線を上下にずらす」「開いている場所に上下に連続した二本の線を入れる」の操作のみで作ることができることがわかる。これよりも高密度にすることはできず、一本でも上下にずらした状態は単に使用可能な線が減るだけだからである。この二つの制約を整理する、まず基本あみだくじを全探索できることに気づく。基本あみだくじに使用可能な線45本のうち17本は必須のため、2^29程度の探索空間を二つ探索すればよい。これで、8通りの基本あみだくじが見つかったので、これらを一旦印刷(比喩表現ではなく、プリンタを用いて紙に出力すること)する。これらのほとんどは数本上下にずらしたり開いた空間に二本の連続した線を入れるだけだが、多くの模様を持つものが2通り見つかる。同時に、この二つはそれぞれ、高々29本の線に自由度があるだけであることに気づいた。そのため、これらについても全探索可能である(それぞれ20通りあった)。これで62通り発見した。function!!!」とあるが、印刷して手書きで発見した情報も含めて全部コードに起こすのもこの関数のシミュレーション結果を検証するのも面倒なので、全探索で発見した20通り×2をコピペできるようにし、あとは手打ちでブラウザで打ち込んでフラグを得た。超文書転送術GIFアニメ生成サイト接続すると、画像をアップロードすることでGIFアニメを生成するウェブサイトが登場する。色々なURLパターンを試しているうちに、新規画像の生成時に渡されるURLのパス「/movies/newgif/:id」のID部分を1にするとID=1である最初のGIFアニメが閲覧でき、しかもフラグを言いたげな内容が表示されている。待つと一瞬だけフラグが表示される。タイミングよくスクリーンショットをよることでフラグの獲得に成功。Toolsネットワーク系の色々なコマンドをオプションを指定して叩けるサイトが出てくる。コマンドインジェクションかと思うが、オプションががっちり制限されていてインジェクションはおろか普通にネットワーク系のコマンドで遊ぶことすらできない。コメントに利用可能なオプション一覧があるが、ヌルインジェクションなども含め任意のコマンドを動かすことは難しいようだ。脆弱性を抱えたバージョンだった。lessなどとしてみると、lsが見つからない旨が表示される。箱庭XSS実行ファイルが渡され、ウェブのフォームが表示されており、入力すると下に入力したものが大文字に変換されて表示される。試しに<b>a</b>などと入力してみると、まさに太字になった。scriptタグを入れてみるが、動かない。代わりにフラグが表示された。メモが保存できるウェブサイト「YamaToDo」から、ユーザー「yamato」のメモを盗み出すというもの。言われるしてはいけないパターンであることがわかる。sweeeeeeeeeet’であった。dictionary)で引くと、技術水準に言及する場合では円滑にことを運ぶことなどを意味するようであるため、「sjis?やるなああああああ(阻止)」という雰囲気であり、近いところまで来ていると判断できるともいえる。あり、こちらは使えることがわかる。そのため、その状態で「ソ’」などとすると’をエスケープする\がソの2バイト目で打ち消され、好きな文字をSQL文の続きとして入れられる。サブクエリとしてSELECTを入れて他人のメモを自分のメモにINSERTすることができた。あとはそれに従って解けばよかったが、エラーメッセージが表示されず、「同じテーブルを二回参照するときはテーブル名を指定しないとたいてい動かない」ことに気づかずはまっていた。手元で実行してようやく気づいてフラグらしき文字列を入手、ブラウザのエンコーディングを修正してフラグを得た。Yamatooなかなか楽しかった問題。構築された検索サイトからフラグを盗み出す問題。いうカラムがあることが判っている。{$where}");とあり、エスケープもしていないので注入箇所をみつけることそのものは容易だった。いくつかの関門がある。以下のように定義されている。$return;(必要に応じて字下げがずれているのを修正すると)流し込んだ文字列はここでズタズタにされてしまうことが判る。前半部分にあるためコメントアウトによる無効化もできない。”」となり、エスケープされたアポストロフィー二つとなってそれ以後も文字列とみなされるが、後半部では「”’」となり、エスケープされたアポストロフィーのあとのアポストロフィーでクオート部分が終了して外に出ることができる。(なお、最初、「\\’」を試してうまくいかず、SQLiteのドキュメントを見てSQLiteでは「”」とエスケープすることを知った。)第二の関門は、彼らが導入したとしているWAFだった。しようとしてもわふーされてしまう。SELECTを見ても、抜け道は思いつかない。情報を密輸できるので、これを繰り返すしかない。Substring!」と同様の作戦が使える。substrやlikeを使って部分文字列を検索しようとするとわふーされてしまうという第三の関門にあたった。lengthは使えたので文字数を調べてみると、フラグは59文字あるようだった。がまだわふーされていないことに気づく。いったことをすると55文字になることに気づく。Substring!」と同様の作戦でフラグを得た。YamatonoteYAMLでノートをアップデートできるメモサイト「Yamatonote」からメモを奪う問題。ソースコードを見ると、とりあえずデータベースへのアクセスのクラスにプレイスホルダらしき概念が導入されているのに、なぜか手で処理していることに気づく。いえ全体を見ている最中だったので続けて他のコードを見るが、YAMLの処理はSQLに流し込まれるだけであり、SQLへのエスケープが適切になされればとりあえずSQLから何かが漏洩するようなものはないと思われた。'ほげ'となり、クオートからの脱出まで完了してあとは流しこむだけ状態になっていることがわかる。難易度は低いと感じた。PHPの連想配列でどの順でキーが登場するか調べつつ、新規メモを生成する部分に流し込んで自分のメモに呼び出したいメモを登場させてフラグを得た。2箱庭XSSのコードをそのまま流し込むとフラグが登場。違いがわからないまま完了。兵法術まさかの詰将棋問題。CTFっぽくないし、脳内で探索するとしか言いようがないので省略。電車の中で解いて時間を潰しつつCTFっぽくない問題を潰そうと思っていたら乗り過ごした。所感などCTFにまともに個人参加するのは初でしたし、全体の戦果はそれなりに健闘できたと考えています。読んで勉強しようと思える問題でした。返り値の処理についての考察が甘すぎたために答えに辿りつけなかった(そして恐らく然るべき考察には自分では辿りつけなかった)ことが明らかになりました。一方で、得点を見れば10位であり、周囲と比較しても一応まともに戦えた順位であると言えると思います。CTFと云うものに手を付けてからの経験はまだまだ浅いので、今後この方面も楽しんでいきたい、と感じました。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。miniOrange。