SECCON Beginners 2020 Write-Up
About
SECCON Beginners CTF 2020にチーム r0bu5t の一員として参加させていただきました。
今回はあえてWebやCryptoなどに手を付けず、最初からPwnとRevをそれぞれ一問ずつ
解くことを目標にして見事達成できました。
チームとしての結果は44位という高順位で、正直私はそこまで貢献していませんがとても嬉しいです。
チームメンバーの皆様、ありがとうございました。
この記事では自分が解いた yakisoba
というRev問と Beginner's Stack
というPwn問のWriteupを書いていきたいと思います。
Beginner's Stack (Pwn, 134pts)
とても簡単なスタックオーバーフローの問題です。
実際、Return Addressを書き換えること自体はすぐできました。
しかし、RSPがAlignされていないよ!というエラーメッセージを出されました。
自分はここでかなり詰まって、色々調べて勉強する必要がありました。 調べた内容をまとめると以下の通りです。
(x86-64環境において) `libc-2.27` 以降の `system` 関数などは `movaps` という命令を使用する この命令は 0x10 の倍数のアドレスに `rsp` があることを前提としている その為、スタックの中の値を書き換えるとそれらがズレてしまう そこで本来は `オフセット+書き換えたいアドレス` とするシェルコードを `オフセット+適当なret+書き換えたいアドレス` とすることで ズレを無理矢理修正するすることができる
(参考: スタックのアラインメント スタックのアラインメント · GitHub など)
というのが私の現時点での理解です。
ちなみに私は適当なretを入れるとシェルコードが動作するようになる、ということ自体は早期に知ることができたのですが、「なぜretを使えばシェルコードがうまく動くのか」に気づくことに相当な時間を費やしました。
ここまでの流れをExploitコードにまとめると.......
このようになります。
スクリプトを実行するとInteractiveモードに入るので、
cat flag.txt
でFlagがわかります。
Flagは ctf4b{u_r_st4ck_pwn_b3g1nn3r_tada}
でした。
yakisoba (Rev, 156pts)
この問題の一問前のMaskが解けなくて、頭を痛めていた時に問題文を読んで
「あれ?これangrを回せば解けるのでは??」
という事実に気づきまして、脳死でangrを回したら解けた問題です。
このスクリプトを実行すると
b'ctf4b{sp4gh3tt1_r1pp3r1n0}\x00\xd9\xd9\xd9\xd9'
と出力されるので、Flagを無事入手できます。
angrってやはり最高に面白いな、と思える問題でした。
感想
本当に運営とチームメンバーの皆様には感謝しかありません。
次回はもっといっぱいRevとPwnの問題が解けるように頑張りたいと思います。
参加された皆様もお疲れさまでした。最後まで読んでくださり、ありがとうございます。