日記帳

CTFのWriteupや雑記など

SECCON Beginners 2020 Write-Up

チームバナー
r0bu5t チーム

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されていないよ!というエラーメッセージを出されました。

RSP is misaligned!
RSP_Misaligned

自分はここでかなり詰まって、色々調べて勉強する必要がありました。 調べた内容をまとめると以下の通りです。

 (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の問題が解けるように頑張りたいと思います。
参加された皆様もお疲れさまでした。最後まで読んでくださり、ありがとうございます。