・アーキごとにホームディレクトリとユーザIDを作成する. ・各ホームディレクトリには size.txt というファイルを置く. 各 size.txt はHTTP経由で誰でも見ることができる. (誰でもリアルタイムで確認できる) ・複数アーキでサーバを起動する.サーバプログラムにはバッファオーバーランの 脆弱性があり,shellcode実行できる.(size.txtやフラッグページを改変できる) ・サーバはホームディレクトリのsize.txtに書いてあるサイズまでしか受け付けない. つまり,size.txtを小さめに改変することで,他チームがExploitしてくるのを妨害 できる. (size.txtはユーザごと(つまりアーキごと)にあるので,他のアーキのsize.txtを 改変することはできない) ・サーバは接続を一定時間で強制切断する. (シェルの起動後に繋ぎっぱなしにすることはできない) ・一定周期で各ホームディレクトリのsize.txtに書いてある値を,自動インクリメント する. (このためsize.txtに「0」を書き込んでExploitが不能になっても,待っていれば いずれ復旧する) ・各ユーザ権限で,フラッグページを更新することができる. (どのアーキのユーザIDでも可能) つまりどのアーキでもいいので攻略できれば,防御ポイントを得ることができる. 上のような構成にしておけば,まずサイズゼロを書き込んでも自動インクリメントに よりいずれ復旧する. また接続は強制切断されるため,size.txtがデフォルト値に戻って他チームがExploit しやすくなるのを防ぐために,定期的に接続して,size.txtを更新しなければならない ことになる. (ゼロを書き込んで勝ち逃げで放置,ということができない) 定期的にExploitして自分がExploitできたサイズをsize.txtに書き込んでそれを維持 しつづけなければならないが,他チームがそれ以下のExploitコードを作成して size.txtを書き換えれば,主導権はそっちに移る. また,どのアーキでも攻略できれば,フラッグワードを書き換えて防御ポイントを得る ことができる. そのためにもどれかのアーキの主導権を握り続けていたいわけだが,強制切断と 自動インクリメントがあるので放置はできず,基本的にExploitし続けなければ ならないことになる. さらに防御ポイントを得るためにはやはり定期的にExploitしてフラッグページを更新 しなければならないわけだが,他チームがあるアーキの主導権を奪ってしまって主導権 を得るのが難しい場合には,じゃあまだ攻略されきっていなくてsize.txtが緩くなって いる他アーキでExploitしよう,というふうにして,ターゲットを変えていくことに なる.(どのアーキでもフラッグページを更新できる,というのがミソ) またあるアーキですでに主導権を得ているチームにしても,他アーキでも主導権を 得られればそれはそれで他チームが防御ポイントを取れなくすることができるから, 引続き他アーキを攻略していくモチベーションにもなる. よって最終的にはすべてのアーキで他のチームよりも小さなExploitコードを作成し 続けなければならない,ということになる. (フラッグワードの更新について,追記) size.txtとflag.txtの操作用のExploitにサイズ的な差が出てしまうため,もともとは OK入力待ちを利用して接続をためこんで一気に処理することを可能にするという考え だった.(bof-serverのsample.cのコメント参照) が,truncate攻撃(O_TRUNCでのopen()で無限ループを行い,ひたすらファイルクリアを 行う.open()のみで済むので小さなサイズのExploitで可能になってしまう)の対策の ため,以下のように方針変更する. ・サーバ切断のタイムアウトを短くし,連続接続を受け付けない時間を長くすること で,たとえtruncate攻撃を行ってもプログラムが強制終了され,size.txt復旧スク リプトにより復旧し,さらに連続で接続できないためtruncate攻撃を不能にする 時間タイミングを作る. ・タイムアウトが短くなるためにOK待ちでためこんで一気に処理を行うような操作は 不可能になるが,フラッグワードの追加は,O_APPENDで部分的に追加することを 繰り返すことで長い文字列も追加できるので,size.txtとflag.txtのExploitは それほどサイズ的な差異無く実現できるので,OK待ちでためこむことが必ずしも 必要ではないので不可能になっても問題無しと判断.