# Cake Memory - CakeCTF 2022 ###### tags: `CakeCTF 2022` 想定難易度:hard ## 想定解 ### 1. 言語・フレームワークの調査 `string`などで確認すると、Rust製であることが分かる。 また、ggezを使って作られていることもわかるが、この情報は今回は使わない。 ### 2. 設計の調査 ラウンドごとにランダムな順番で色が表示されるが、1つのラウンドの中では、正解すると1つずつ新しい色が開示される。 したがって、各ラウンドで正しい順番の配列を持っていると考えるのが妥当である。 ラウンド1で4つの色が判明したら、うさみみでプロセスを停止する。ここで、正しい順番を持つ配列をメモリから検索する。 例えば「BLUE→GREEN→RED→RED」のとき、Cheat Engineの「Array of byte」で、ボタンの並びをもとに「00 03 01 01」や「0000000000000000 0300000000000000 0100000000000000 0100000000000000」などを検索する。 すると、`Vec<usize>`に一致する配列が見つかる。(正しいボタン・あるいは色情報のインデクスの配列と考えるとusizeは妥当である。) ![](https://i.imgur.com/n5X2TIf.png) 試しにこれを0に書き換えると、画面もすべて青に変わる。 ![](https://i.imgur.com/i2iLBjn.png) ### 3. ゲームインスタンスの特定 ラウンドごとに個数が増えることから、この配列を持つメモリアドレスも変わってしまうはずなので、配列へのポインタを持っている場所(ゲームインスタンス)を探す。(先ほどの図では0x0b467af0の8バイト値を探すと、1~2個見つかる。) ラウンドを進めると、配列を指すポインタが変化するので、それを差し替えることで答えを変えられる。(ポインタ自体を差し替える場合、free時にクラッシュしないようラウンドの終了前にもとに戻すよう注意する。) あとは全部固定の色に書き換え、最終ラウンドは制限時間に注意して実行速度を落とし、すべて答えるとフラグが出る。 ![](https://i.imgur.com/YRIP8A8.png) ## その他の想定解 - 全部覚える(天才) - 最終ラウンドを録画し、うさみみで実行速度を落として100個間違えずに答える(苦行) - 画面をキャプチャし、内容に応じてマウスクリックを自動化するマクロを組む(打つ手がなくなったらやるやつ)