フォレンジックLevel 3★★★☆☆50 pts

削除されたSQLiteレコードを復元せよ
Recover Deleted SQLite Records
今回のミッション社内チャット「kinoco-msg」の SQLite データベース `/challenge/app.db` を渡します。「機密メッセージ」として送られた本文は、次の形で保存されます。
body = "enc:v1:" + hex(本文 XOR 鍵ストリーム)
鍵ストリーム = SHA-256("<salt>|<sender>|<sent_at>|0") || SHA-256("<salt>|<sender>|<sent_at>|1") || ...
salt = settings テーブルの secure_msg_salt(sender と sent_at は、そのメッセージの列の値)
管理者がワンタイムのアカウントリカバリートークンを機密メッセージで送り、すぐに削除しました。SELECT では見えない削除済みのレコードを復元し、本文を復号してトークン(フラグ)を取り出してください。
使えるツール: sqlite3, python3, xxd, strings, grep
ヒント
ヒント 1見る
SELECT に出ない削除済みのレコードも、app.db の生のバイト列には残っていることがあります。strings や xxd で眺めて、件名に [secure] とあるものを探します。
ヒント 2見る
削除されたセルはページ内の空き領域(freeblock)に残り、セルの先頭 4 バイト(ペイロード長と rowid)だけが上書きされます。残ったレコードヘッダー(列の型と長さの並び)から、sender・recipient・subject・body・sent_at を切り分けます。
ヒント 3見る
sender と sent_at は、削除されたセル自身の列の値です。salt は settings テーブルにあります。鍵ストリームを作って、body の hex を XOR で戻します。