Rootme #Stack buffer overflow 1# Writeup
-
問題に入る
まず、隠しファイルがあるかどうかを確認します。
.passwd というファイルが見つかり、名前からFLAGが入っている可能性が高いと思われます。
案の定開く権限がありません。この問題の突破口は、Buffer Overflowの脆弱性を利用し、管理者権限を不正に取得して.passwdファイルを表示するところにあります。
隣のxxx.cに注目してみると、
となっています。
-
メモリはどうなっている?
スタックの中に、
-------------------------0xffffffff
|.............................|
|------------------------|
| var |
| check |
| buf |
|.............................|
|.............................|
-------------------------0x00000000
というようになっています。
-
Payloadを作る
bufの部分のサイズは40となっているので、それを超えた部分がcheckに入ってしまいます。
つまり、変数checkの中身が書き換えられます。
次に、ルート権限を取得するためのコードを入力します。
Buffer Overflow攻撃の原理を詳しく知りたい方は、こちらの動画をご覧ください:
まず、40文字の0(bufのサイズ)とexploitコードを入力します。
checkが0xdeadbeefになっている際にシェルdashが起動されるので、exploitの部分をdeadbeefにしてdashを起動します。(exploitの部分=bufから溢れ出る部分)
Linuxで使うデータ形式はリトルエンディアン形式なので、0xdeadbeefは「\xef\xbe\xad\xde」というように表現されます。
また、\x...が16進数として解釈されるようにオプションeを付けました。(nは改行のオプション)
そこで、取得できたルート権限で/bin/dashを起動し、cat コマンドで.passwdの内容を表示します。
dashが起動される前に若干時間がかかるので、ここでsleepコマンドを使って1秒だけ待ってもらいます。
FLAGが出ました。
ちなみにechoの-eオプションは文字列の途中で\\nを入力すれば改行することができます。-nオプションは出力の最後に改行しないようにすることができます。
また、ここでなぜ敢えてechoコマンドを使うかというと、そのままプログラムに入力された文字は、文字として認識されるので、バイナリの0xdeadbeefを入力したくても0x6465616462656566となってしまいますのでご注意ください。
ASCIIテーブル: