分かりやす〜い
コンピュータ技術情報

TOPに戻る
▼Processor
バッファオーバーフロー
┣ 異常な動作
┣ 本当に怖い事
┣ プログラムを作る
┣ バッファオーバーフロ
┃ ーを発生させる

┣ スタック領域の構成
┣ 何故強制終了されるの
┃ か?

┣ 強制終了されないよう
┃ に作り変える

┣ 任意のコードを実行す
┃ る

┣ of1.cとof2.cとの違い
┣ 例外
┣ 例外ハンドラの行う事
┣ of3.cを作る
┣ of1.cとof3.cとの違い
┣ of3.exeの例外ハンド
┃ ラ

┣ of3.exeを強制終了す
┃ るのは?

┣ 例外ハンドラの特徴
┣ Blue Screen
┣ BufferOverFlow応用
┃ プログラム

┗ 機械語の説明

Copyright(C) 2001-2002.ugpop. All rights reserved.




■デジタル用語辞典:
■ バッファオーバーフローを発生させる ■

前回はバッファオーバーフローを行なわせる為の前準備のプロ
グラムを作成してみました。

以下に、前回作成したプログラムを示します。

─↓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」の範囲を溢れてコピー処理が
行われています。

それではこのプログラムをビルド&実行してみましょう。

【注意】
このプログラムはバグを含んでいるプログラムです。
実行する環境としては、必ず自分で責任が取れる環境、一時的
にシステムが不安定になっても大丈夫な環境で、自己責任にお
いて実行させてください。

このプログラムを実行する事において私は一切の責任を負いま
せんのでご了承ください。


以上の注意を守った上で、ビルド&実行してみましょう。


実行の結果、「不正な処理を行ったので強制終了します。」と
いうメッセージが表示されたと思います。
とりあえず「閉じる」を選択してプログラムを終了させましょ
う。

このメッセージが表示されたという事は、プロセッサの保護機
能が動作したという事を表しています。

ここで「あれっ?」と思われた方はいらっしゃらないでしょう
か?

前にも説明した通り、バッファオーバーフローは「エラーがあ
っても処理を続行してしまう。」という点が他のエラーと異な
るのでした。

しかし、このプログラムを実行すると、プロセッサの保護機能
が動作し、強制終了させられます。

何故、プロセッサの保護機能が動作したのでしょうか?

実は、バッファオーバーフローにより壊されてしまった場所に
は、とても重要な情報が格納されていたのです。

続きは次回に行います。




▲このページの上へ

▲このページの上へ

▲このページの上へ

←前に戻る    ▲このページの上へ    続きを読む→