SECON 2016 Online CTF
SECON 2016 Online CTFにでた。 チームは、shioshiotaで参加した。2000ptで39位だった。
24時間の健康的なCTFだった。pwn担当が一人のチームだと48時間欲しいなぁー、と思った。 僕が解いたのは、以下の4問。
- [Exploit] cheer msg (100pt)
- [Exploit] jmper (300pt)
- [Exploit] checker (300pt)
- [Binary] ropsynth (400pt)
どれも面白かったです😀
運営のみなさまありがとうございました🙏
以下、コードは汚いのと解説する気はないですが、こんな感じで解きました。
[Exploit] cheer msg (100pt)
Message Length によって、espが変わる。
Message Length に負の値を指定することができ、名前を保持しておく変数を戻りアドレスを指すように調整して、ropするだけ。
攻撃コードは、これ👇
[Exploit] jmper (300pt)
なんか学生を追加したり、名前つけたり、メモをかける。
メモを書くところにoff-by-oneがあり、名前の文字列を指すポインタの1バイトを書き換えられる。これを使って任意のアドレスの書き換えが可能になる。
GOT は書き換えられず、setjmp/longjmp があり、いかにもこれを使って攻撃してくれといっている感じだった。
復帰に使われる、jmp_buf構造体には、復帰のアドレスとスタックポインタがエンコードがされて保持されている。
これをsystem("/bin/sh")を実行するようにすればよいだけ。
攻撃コードは、これ👇
[Exploit] checker (300pt)
メモリ上にのったフラグの文字列を読み出す問題。
jmper解いた後だったので、300点・・・?、という感じだったが、不備があって簡単になっていたらしい。
canary破壊した時に出るエラーメッセージのアレで、flag読み出す。
攻撃コードは、これ👇
[Binary] ropsynth (400pt)
rop のgadgetに使えるバイナリが降ってきて、そこからフラグを読み出すrop chainを送り返す問題。
5回連続で攻撃を成功させる必要があるが、各段階に難易度の変化はない。また、gadgetはちょっと面倒だが、そんな複雑ではないのでパースして組み立てるだけ。
攻撃コードは、これ👇
以上です。