
■ 例外ハンドラの行う事 ■
前回は「割り込み」について説明しました。
「割込み」というのは、ある処理を行っている時に、何らかの
理由により別の処理を行わなければならなくなった時の為に用
意されているのでした。
前回のイメージをもう1度見てみましょう。
┌──────────────────────────┐
│ OF1.EXE │
│ │
└───┬──────────────────────┘
│ スタック領域
│call命令 格納 ┌──────┐
├─────────────────────→│ 呼出し元 │
│ 制御を移行┌────────┐ └──────┘
├────────→│ main関数 │
│ │ │
│ └───┬────┘
│ │
┌──┴──┐
│コピー処理│
└──┬──┘
│×バッファオーバーフロー発生
│ スタック領域
│ ┌──────┐
├───────→│1F 1E 1D 1C │
│ └──────┘
│処理終了 スタック領域
│どこへ戻るか参照┌──────┐
│←───────┤1F 1E 1D 1C │
│ └──────┘
×××××××
×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│
┌─────┘★例外発生
│
↓
┌──────────┐
│ │
│例外ハンドラ動作開始│
│ │
└──────────┘
バッファオーバーフローが発生し、インテルプロセッサは次に
どこに制御を移行させれば良いのか分からなくなっています。
この様に、どうにも動きようの無くなってしまった時に動作す
る割込みの事を特に「例外」と呼ぶのでした。
また、例外発生時に動作するプログラムの事を「例外ハンドラ」
という事も前回説明しました。
今回は、「例外ハンドラ」起動後にどの様なことが行われるの
か説明します。
UNIXなどの場合、例外が発生した場合はcore(コア)ダンプと
いうデバッグ用のファイルを出力してアプリケーションソフト
を強制終了する処理が行われます。
Windowsの場合、「不正な処理が行われたので強制終了します。」
などのメッセージを表示する為のプログラムが起動されます。
以下に、例外発生後に「メッセージを表示するプログラム」が
起動されているイメージを示します。
┌─────┘★例外発生
│
↓
┌──────────┐
│ │
│例外ハンドラ動作開始│
│ │
└─────┬────┘
│
│
↓
┌──────────┐
│ │
│メッセージを表示する│
│プログラム起動 │
│ │
└──────────┘
ここで、「メッセージを表示するためのプログラム」が起動さ
れると書きましたが、実はこのプログラムはただ単にメッセー
ジを表示するだけのプログラムではなく、割込み発生時点のア
プリケーションソフトウェアのさまざまな情報を取得する処理
も行っているようです。
そしてVisual Studioなどをインストールしている方であれば
お分かりになるかと思いますが、アプリケーションソフトウェ
アが強制終了される時に、自動的にデバッガが起動されたりす
ると思います。
このデバッガを起動したりするのもこのプログラムが行うよう
です。
上のイメージでは、「メッセージを表示するプログラム」とだ
け書いていますが、この様にさまざまな処理も行われている、
という事も認識しておきましょう。
そして、ここからが今回1番大切なところなのですが、例外ハ
ンドラが起動するプログラムはそれぞれのアプリケーションソ
フトウェア毎に指定でき、「何を起動するか」という情報は
「スタック領域」に格納されています。
以下に例外ハンドラがスタック領域を参照して、指定された場
所へ制御を移行させているイメージを示します。
┌─────┘★例外発生
│
↓
┌──────────┐
│ │
│例外ハンドラ動作開始│
│ │
└─────┬────┘ スタック領域
│何を起動するか参照 ┌──────┐
│←─────────────┤メッセージを│
↓ │表示するプロ│
┌──────────┐ │グラムの場所│
│ │ └──────┘
│メッセージを表示する│
│プログラム起動 │
│ │
└──────────┘
上のイメージの様に、例外ハンドラは「どこに制御を移行させ
れば良いか」という情報を、スタック領域から得ているのです。
鋭い方であればここですぐに気が付いたと思いますが、バッフ
ァオーバーフローのバグを利用する事により、「スタック領域
を書き換えてしまう」事が出来ます。
という事は、つまり上のイメージにある「メッセージを表示す
るプログラムの場所」情報も書き換えてしまう事が出来るとい
う事です。
コンピュータウィルスは、「メッセージを表示するプログラム
の場所」情報を書き換えてしまう事により、プログラムを意図
した場所へ移行させようとします。
次回は「メッセージを表示するプログラムの場所」情報を書き
換えてしまうプログラムを実際に作成し、どの様に動作するの
か、確認してみましょう。