
■ バッファオーバーフローを発生させる ■
前回はバッファオーバーフローを行なわせる為の前準備のプロ
グラムを作成してみました。
以下に、前回作成したプログラムを示します。
─↓of1.c ───────────────────────
#include <stdio.h>
#include <string.h>
void main(void);
void main()
{
unsigned char* i;
unsigned char b[]= { 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b,
0x1c, 0x1d, 0x1e, 0x1f,
0xff, 0xff, 0xff, 0xff,
};
unsigned char a[]= { 0x0, 0x1, 0x2, 0x3,
0x4, 0x5, 0x6, 0x7,
};
// スタック領域を表示する。
for(i=&b[0];i<=&a[7];i+=4)
{
printf("%08X:%02X %02X %02X %02X\n", i, *i, *(i+1), *(i+2), *(i+3));
}
// バッファbをバッファaにコピーする。
strncpy((char*)a, (char*)b, sizeof(a));
printf("copy end\n");
// スタック領域を表示する。
for(i=&b[0];i<=&a[7];i+=4)
{
printf("%08X:%02X %02X %02X %02X\n", i, *i, *(i+1), *(i+2), *(i+3));
}
}
─↑ここまで──────────────────────
このプログラムはバッファ「b」をバッファ「a」にコピーす
るプログラムである事は前回説明しました。
このプログラムを実行すると以下のような結果なります。
─↓実行結果──────────────────────
0063FDDC:10 11 12 13┐
0063FDE0:14 15 16 17│
0063FDE4:18 19 1A 1B│
0063FDE8:1C 1D 1E 1F│←●コピー処理実行前のスタック領域
0063FDEC:FF FF FF FF│
0063FDF0:00 01 02 03│
0063FDF4:04 05 06 07┘
copy end←───────●コピー処理実行
0063FDDC:10 11 12 13┐
0063FDE0:14 15 16 17│
0063FDE4:18 19 1A 1B│
0063FDE8:1C 1D 1E 1F│←●コピー処理実行後のスタック領域
0063FDEC:FF FF FF FF│
0063FDF0:10 11 12 13│
0063FDF4:14 15 16 17┘
 ̄ ̄ ̄ ̄ ̄ ̄
↑
書き換わっている
─↑ここまで──────────────────────
コピー処理実行後は、バッファ「a」の値が書き換わっていま
す。
前回作成したプログラムは正常な動作を行うプログラムなので、
何の問題も無くコピー処理が完了しています。
今回はこのプログラムにあえてバグ(プログラムの誤り)を仕
込みます。
バグを仕込むと言っても大した事はしません。
前回作成した"of1.c"ファイルの以下の部分を書き換えてくだ
さい。
●変更前
// バッファbをバッファaにコピーする。
strncpy((char*)a, (char*)b, sizeof(a));
~
●変更後
// バッファbをバッファaにコピーする。
strncpy((char*)a, (char*)b, sizeof(b));
^
↑
ここを変更。
たったこれだけです。
下線が無ければぱっと見、気付かないかもしれませんが、バグ
という物はこんな物です。
正常なプログラムでは、コピーサイズを指定する部分に正常な
サイズが指定してありますが、変更後はコピーサイズを異常な
値に書き換えました。
この時のコピー処理のイメージを以下に示します。
●バッファオーバーフローのバグを仕込んでみた
スタック領域
┌┌────┐┐
││ 10 ││
││ 11 ││
││ 12 ││バッファ「b」のサイズ分
バッファb││ 13 │├─┐  ̄
││ 14 ││ │
││ 15 ││ │
││ 16 ││ │
││ 17 ││ │
││ 18 ││ │
││ 19 ││ │
││ 1A ││ │コピー
││ 1B ││ │
││ 1C ││ │
││ 1D ││ │
││ 1E ││ │
││ 1F ││ │
││ FF ││ │
││ FF ││ │
││ FF ││ │
││ FF ││ │
├├────┤┤ │
││ 10 ││ │
││ 11 ││ │
││ 12 ││ │
││ 13 ││ │
バッファa││ 14 ││ │
││ 15 ││ │
││ 16 ││ │
││ 17 ││ │
└└────┘│ │
× 18 ×│ │
× 19 ×│←┘
× 1A ×│
× 1B ×│
× 1C ×│
★オーバーフロー× 1D ×│
× 1E ×│
× 1F ×│
× FF ×│
× FF ×│
× FF ×│
× FF ×┘
コピーサイズを異常な値に書き換えたので、バッファオーバー
フローが発生し、バッファ「a」の範囲を溢れてコピー処理が
行われています。
それではこのプログラムをビルド&実行してみましょう。
【注意】
このプログラムはバグを含んでいるプログラムです。
実行する環境としては、必ず自分で責任が取れる環境、一時的
にシステムが不安定になっても大丈夫な環境で、自己責任にお
いて実行させてください。
このプログラムを実行する事において私は一切の責任を負いま
せんのでご了承ください。
以上の注意を守った上で、ビルド&実行してみましょう。
実行の結果、「不正な処理を行ったので強制終了します。」と
いうメッセージが表示されたと思います。
とりあえず「閉じる」を選択してプログラムを終了させましょ
う。
このメッセージが表示されたという事は、プロセッサの保護機
能が動作したという事を表しています。
ここで「あれっ?」と思われた方はいらっしゃらないでしょう
か?
前にも説明した通り、バッファオーバーフローは「エラーがあ
っても処理を続行してしまう。」という点が他のエラーと異な
るのでした。
しかし、このプログラムを実行すると、プロセッサの保護機能
が動作し、強制終了させられます。
何故、プロセッサの保護機能が動作したのでしょうか?
実は、バッファオーバーフローにより壊されてしまった場所に
は、とても重要な情報が格納されていたのです。
続きは次回に行います。