/BOFDemo

A simple buffer overflow vulnerability demo for IA-32

Primary LanguageCMIT LicenseMIT

BOFDemo

A simple buffer overflow vulnerability demo for IA-32

32ビットLinuxを対象にした,バッファオーバーフロー脆弱性の簡単なデモプログラムです.

テスト環境

  • CPU: Intel Core i7
  • OS: Linux (Ubuntu 14.04LTS), 32-bit
  • C-compiler: gcc 4.8.4
  • libc: glibc 2.19

ビルド

make

問題なくコンパイルできれば,demo および mkattack という実行形式と, shellcode.bin というバイナリファイルが作成されるはずです.なお, shellcode.bin の作成に objcopy を使用しています.これは通常 binutils というパッケージに含まれています.

実行

実行前にスタックアドレスのランダム化機能を無効にします.

sudo sysctl -w kernel.randomize_va_space=0

プログラム demo は,ファイルに書き込まれた10進数値の二乗を出力するだけの簡単なプログラムです.以下のようにすると 1522756 が出力されます.

echo 1234 > normal.dat
./demo normal.dat

実行オプション -d で関数 f 実行中のスタックを出力することができます.

./demo -d normal.dat

スタック出力は例えば以下のようになります.この出力では,関数 f 内で定義されたバッファ buf の先頭アドレスからスタックの下(高位アドレス)に向かって表示します.1行は4バイト(32ビット)分の表示です.

----------------------------------------------
 #  |   addr  |  uint    | +0 +1 +2 +3 | 0123 
----------------------------------------------
  0 | bfffeb7c| 34333231 | 31 32 33 34 | 1234
  1 | bfffeb80| 0804000a | 0a 00 04 08 | ....
  2 | bfffeb84| 080481f8 | f8 81 04 08 | ....
  3 | bfffeb88| 08048aeb | eb 8a 04 08 | ....
                ........
 18 | bfffebc4| 00000000 | 00 00 00 00 | ....
 19 | bfffebc8| bfffeff8 | f8 ef ff bf | ....
 20 | bfffebcc| 08048981 | 81 89 04 08 | ....
 21 | bfffebd0| bfffebe0 | e0 eb ff bf | ....
 22 | bfffebd4| 00000400 | 00 04 00 00 | ....

この例の場合,バッファの先頭アドレスは 0xbfffeb7c です.バッファは64バイトなので,15行までがバッファの内容です.それ以降は他の変数やスタックサイズを調整するためのスタブ,そしてベースポインタおよびリターンアドレスと続きます.この例では20行目がリターンアドレスです.ここの内容をバッファの先頭アドレスに置き換えることで,関数から戻る際にバッファ内に格納されたコードを実行させることができます.

では,スタックの出力を参考にして攻撃用データを作成しましょう.作成を簡単にするためのプログラム mkattack を用意してあります.このプログラムの第1引数は shellcode.bin,第2引数はバッファ(buf)の先頭からリターンアドレスまでのオフセット(32ビットワードの個数),第3引数は buf の先頭アドレスです.上の例の場合,以下のようになります.

./mkattack shellcode.bin 20 0xbfffeb7c > attack.dat

こうして作られた攻撃用データを与えるとシェルが起動してプロンプトが表示されるはずです.

./demo attack.dat

注意

実験が終わったら,スタック/ヒープアドレスのランダム化機構の設定を戻してください.Ubuntu等最近のLinuxディストリビューションではデフォルトで2(スタックおよびヒープの両方ともランダム化)になっていると思います.

sudo sysctl -w kernel.randomize_va_space=2