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

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.




■デジタル用語辞典:
■ 本当に怖い事 ■

前回はバッファオーバーフローについて概要を説明しました。
バッファオーバーフローというのは、バッファの限界を超えて
(オーバーフローして)他の用途で使っているバッファまでも
書き換えてしまうバグの事をいうのでした。

ちょっと復習してみましょう。

例えば、以下のイメージの様に「a」「b」「c」という3つ
のバッファがあるとします。
そしてバッファ「c」は「1+1の答え」を格納する用途に使
用されていたとします。
また、バッファ「b」には「12345678」という値が格
納されていたとします。

以下にそのイメージを示します。


●バッファオーバーフローが発生する前

  バッファa   バッファc  
┌───────┬───────┐
┌───────┬───────┐
│       │   2   │
└───────┴───────┘
            ↑
           1+1の答え
┌───────────────┐
│1 2 3 4 5 6 7 8│
└───────────────┘
└───────────────┘
      バッファb


バッファ「c」には「1+1の答え」である「2」が格納され
ていますね。
それでは、ここでバッファオーバーフローのバグが発生したと
します。

以下にそのイメージを示します。


●バッファオーバーフローが発生した後

  バッファa   バッファc  
┌───────┬───────┐
┌───────┬───────┐
│1 2 3 4 5 6 7 8│
└───────┴───────┘
    ↑コピー    ↑コピー
┌───────────────┐
│1 2 3 4 5 6 7 8│
└───────────────┘
└───────────────┘
      バッファb


バッファ「a」の大きさの限界を超えてバッファ「c」が異常
な値で上書きされてしまいました。

これだけでもバッファオーバーフローの異常な動作がお分かり
頂けると思いますが、本当に怖いところはここからです。


通常、ある「バグを含んだプログラム」が、決められた領域外
のデータに書き込みを行なおうとすると、プロセッサの保護機
能が動作して、その「バグを含んだプログラム」は強制終了さ
せられます。

つまり、異常な処理を行なおうとするプログラムに対しては、
異常な処理を行なわせないように常にプロセッサが監視してい
てくれるのです。

Windows等のOSを使用している方であれば、しょっち
ゅう「一般保護例外が発生しました。」とか、「ページ違反が
発生しました。」等というメッセージが表示されてプログラム
が強制終了されるのを見かけるのではないでしょうか。

これらのメッセージが表示されるという事は、何らかの異常を
プロセッサが検出し、強制終了させているという証拠になりま
す。

しかしバッファオーバーフローの場合は違います。


バッファオーバーフローの場合、そのプログラムは「何事も無
かったかのように処理を続行」してしまいます。

つまり先ほどの例で言うと、「1+1の答え」が格納されるは
ずの場所に「5678」という訳の分からない値が格納されて
しまっても、「1+1=5678」として処理を続けてしまう
のです。

ここがバッファオーバーフローの本当に恐ろしいところです。

「1+1=5678」と勘違いしたまま処理を続行してしまう
事により、この後、いつ、どこで、どんなエラーが発生してし
まうのか、全く予測不能になります。

何のエラーも発生せずに、正常終了してしまう可能性だってあ
るのです。

例えばこれが簡単な計算を行なう電卓ソフトだとして、ユーザ
ーが「1+1=」と入力すると、答えは「5678」と表示さ
れてしまうのです。

「1+1」などの簡単な計算であれば、表示された結果を人が
見て何かおかしいという事はすぐに気付きますが、複雑な計算
を行なった場合には間違いに気付かないかもしれません。

まして、このソフトがどこかの銀行で使われた場合、とんでも
ない社会問題に発展する可能性もあるのです。

バッファオーバーフローと他のバグとの違いは、この「エラー
があっても処理を続行してしまう」という事につきます。

そしてこの事は開発者にとって、エラーの原因を特定する事を
非常に困難な物にしてしまっているのです。

何故、プロセッサは「バッファオーバーフロー」が発生した時
に気付いてくれないのでしょうか?

それは、バッファオーバーフローというバグは、「同じ領域内」
で発生してしまうバグだからです。

「同じ領域内」について少し説明します。

さまざまなアプリケーションソフトを実行する時、ハードディ
スク等からメモリにプログラムが読み込まれます。

このメモリですが、使用用途によって複数の「領域」に分けら
れています。

例えば、「プログラム実行コード」を格納する領域、「データ」
を格納する領域、「一時的に使用されるデータ」を格納する領
域等です。

プロセッサの保護機能は、ある領域から、別の領域へアクセス
した場合など、「異なる領域」へのアクセスが行なわれる時に
は働いてくれるのですが、「同じ領域内」でのアクセスの場合
は機能してくれないのです。


今回はバッファオーバーフローの怖さについて説明しました。
バッファオーバーフローのバグは他のバグと異なり、「エラー
があっても処理を続行してしまう。」という点が怖いところな
のでした。

次回は実際にバッファオーバーフローを起こす為のプログラム
を作成してみる予定です。



▲このページの上へ

▲このページの上へ

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