Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

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攻撃の原理を詳しく知りたい方は、こちらの動画をご覧ください:

 

www.youtube.com

 まず、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テーブル:

www.asciitable.com

Copyright Mars 2019