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

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

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

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

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

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

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

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

┗ 機械語の説明

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




■デジタル用語辞典:
■ 例外ハンドラの特徴 ■

前回は"of3.exe"の動作について一通り説明を終了したところ
でした。

"of3.exe"は「そんな所に実行可能なプログラムありません。」
という例外が連続して繰返し発生することによりスタック領域
を消費し続け、最後は「スタック領域が無くなりました。」と
いう例外が発生する事により処理が強制終了されるのでした。

ここまで理解出来ていれば、コンピュータウィルスについて動
作原理を知る事はもう少しです。

今回から、いよいよコンピュータウィルスの動作原理について
具体的に説明します。

以前作成した"of3.exe"を実行すると、Windows9x系のOSでは
「このプログラムは不正な処理を行ったので強制終了されます。」
というメッセージを表示してプログラムが強制終了されます。
(Windows NT/2000/XPの方は残念ながらこのメッセージを見る
事は出来ません。)

そしてこの時、「閉じる」を押すのではなく、「詳細情報」の
ボタンを押すと、例外ハンドラが「制御を移行」しようとした
瞬間のレジスタ情報を見る事が出来ます。


★この瞬間のレジスタ情報          ┌──────────────┐
 を見る事が出来る。            │元々は「メッセージを表示する│
   ┃                  │プログラムの場所」情報だが、│
   ┃                  │バッファオーバーフローにより│
   ┃                  │書き換わっている。     │
   ┃                  └─────────────┬┘
   ┃        ・                       │
   ┃        ・                       │
   ┃        ・              ┌──────┐ │
   ┃        ・              │FF FF FF FF │←┘
   ┃        ・              └──┬───┘
   ┃     ×××××××              │
   ┃     ×そんな所に×              │
   ┃     ×実行可能な×              │
   ┃     ×プログラム×              │
   ┃     ×ありません×              │
   ┃     ×××××××              │
   ┃        │★例外発生            │
   ┃  ┌─────┴────┐            │
   ┃  │          │            │
   ┃  │例外ハンドラ動作開始│            │
   ┃  │          │            │
   ┃  └─────┬────┘            │
   ┃        │何を起動するか参照        │
   ┃        │←────────────────┘
   ┗━━→制御を移行↓
         ×××××××
         ×そんな所に×
         ×実行可能な×
         ×プログラム×
         ×ありません×
         ×××××××
            │★例外発生


以下にWindows98上で"of3.exe"を実行した際に表示される強制
終了の詳細情報を示します。


─●↓ここから─────────────────────

OF3 のページ違反です。
モジュール : KERNEL32.DLL、アドレス : 017f:bff8807c
Registers:
EAX=c00309e4 CS=017f EIP=bff8807c EFLGS=00010202
EBX=0063fe28 SS=0187 ESP=00540000 EBP=00540080
ECX=816a6cdc DS=0187 ESI=816b3ad8 FS=5cd7
EDX=bff768d5 ES=0187 EDI=00540098 GS=0000

─●↑ここまで─────────────────────


例外ハンドラが「制御を移行」しようとした瞬間のレジスタ情
報が見れると何か良い事でもあるの?
という方もいらっしゃるかもしれません。

しかし、この時表示される強制終了メッセージの詳細情報を見
る事により、Windowsの例外ハンドラの「ある特徴」を知る事
が出来ます。

上の詳細情報の中で、レジスタ「EBX」の値が「0063fe28」と
なっています。
この値を覚えておいてください。

"of3.exe"は、バッファbをバッファaにコピーするプログラ
ムですが、コピー処理を行う前とコピー処理を行った後のスタ
ック領域を表示するようにプログラムを作ってあります。

以下にWindows98上での"of3.exe"の実行結果を示します。
少し長いですが右側には分かり易くなるようにコメントを付け
ておきます。


─●↓"of3.exe"実行結果ここから────────────

0063FDAC:10 11 12 13┐
0063FDB0:14 15 16 17│
0063FDB4:18 19 1A 1B│
0063FDB8:1C 1D 1E 1F│
0063FDBC:FF FF FF FF│
0063FDC0:FF FF FF FF│
0063FDC4:FF FF FF FF│
0063FDC8:FF FF FF FF│
0063FDCC:FF FF FF FF│←バッファb
0063FDD0:FF FF FF FF│
0063FDD4:FF FF FF FF│
0063FDD8:FF FF FF FF│
0063FDDC:FF FF FF FF│
0063FDE0:FF FF FF FF│
0063FDE4:FF FF FF FF│
0063FDE8:FF FF FF FF┘
0063FDEC:38 FE 63 00
0063FDF0:00 01 02 03┐←バッファa
0063FDF4:04 05 06 07┘
0063FDF8:38 FE 63 00←EBP
0063FDFC:1E 21 40 00←呼出し元
0063FE00:01 00 00 00
0063FE04:D8 13 65 00
0063FE08:14 14 65 00
0063FE0C:00 00 00 00
0063FE10:00 00 00 00
0063FE14:B4 E5 69 81
0063FE18:00 00 53 00
0063FE1C:94 20 40 00
0063FE20:10 FE 63 00
0063FE24:20 90 F7 BF
0063FE28:68 FF 63 00
0063FE2C:D0 21 40 00←メッセージを表示するプログラムの場所
copy end      ←コピー処理実行完了
0063FDAC:10 11 12 13┐
0063FDB0:14 15 16 17│
0063FDB4:18 19 1A 1B│
0063FDB8:1C 1D 1E 1F│
0063FDBC:FF FF FF FF│
0063FDC0:FF FF FF FF│
0063FDC4:FF FF FF FF│
0063FDC8:FF FF FF FF│
0063FDCC:FF FF FF FF│←バッファb
0063FDD0:FF FF FF FF│
0063FDD4:FF FF FF FF│
0063FDD8:FF FF FF FF│
0063FDDC:FF FF FF FF│
0063FDE0:FF FF FF FF│
0063FDE4:FF FF FF FF│
0063FDE8:FF FF FF FF┘
0063FDEC:38 FE 63 00
0063FDF0:10 11 12 13┐←バッファa
0063FDF4:14 15 16 17┘
0063FDF8:18 19 1A 1B←EBP         ┐
0063FDFC:1C 1D 1E 1F←呼出し元      │
0063FE00:FF FF FF FF           │
0063FE04:FF FF FF FF           │
0063FE08:FF FF FF FF           │
0063FE0C:FF FF FF FF           │
0063FE10:FF FF FF FF           │バッファオーバーフロー
0063FE14:FF FF FF FF           │により破壊された部分。
0063FE18:FF FF FF FF           │
0063FE1C:FF FF FF FF           │
0063FE20:FF FF FF FF           │
0063FE24:FF FF FF FF           │
0063FE28:FF FF FF FF           │
0063FE2C:FF FF FF FF←メッセージを表示する┘
           プログラムの場所

─●↑"of3.exe"実行結果ここまで────────────


上の実行結果で、「メッセージを表示するプログラムの場所」
情報の1行上に、先ほど覚えて頂いた「0063fe28」の値が存在
しています。

★これ   ・
 ↓    ・
____  ・
0063FE28:FF FF FF FF
0063FE2C:FF FF FF FF←メッセージを表示する
           プログラムの場所


この「0063FE28」という値が、例外ハンドラが「制御を移行」
しようとした瞬間のレジスタ「EBX」の値と一致します。

実はWindowsの例外ハンドラが「制御を移行」しようとした瞬
間は、「必ず」レジスタ「EBX」は「メッセージを表示するプ
ログラムの場所」情報の「4バイト手前」を指しています。

これがWindowsの例外ハンドラの特徴です。


もう1度、先ほどと同じイメージを見て頂きますが、今度は例
外ハンドラが「制御を移行」しようとした瞬間の記述を変更し
てあります。

                      ┌──────────────┐
                      │元々は「メッセージを表示する│
                      │プログラムの場所」情報だが、│
                      │バッファオーバーフローにより│
                      │書き換わっている。     │
   例外ハンドラが制御を移行しようとした └─────────────┬┘
   瞬間は必ずここを指している。          ┌──────┐ │
   ┏━━━━━━━━━━━━━━━━━━━━━━→│FF FF FF FF │ │
   ┃        ・              ├──────┤ │
   ┃        ・              │FF FF FF FF │←┘
   ┃        ・              └──┬───┘
   ┃     ×××××××              │
   ┃     ×そんな所に×              │
   ┃     ×実行可能な×              │
   ┃     ×プログラム×              │
   ┃     ×ありません×              │
   ┃     ×××××××              │
   ┃        │★例外発生            │
   ┃  ┌─────┴────┐            │
   ┃  │          │            │
   ┃  │例外ハンドラ動作開始│            │
   ┃  │          │            │
   ┃  └─────┬────┘            │
   ┃        │何を起動するか参照        │
┌──┸──┐     │←────────────────┘
│     │制御を移行↓
└─────┘  ×××××××
レジスタEBX   ×そんな所に×
         ×実行可能な×
         ×プログラム×
         ×ありません×
         ×××××××
            │★例外発生


レジスタEBXが必ず「メッセージを表示するプログラムの場所」
情報の「4バイト手前」を指すという記述を追加しました。


今回はWindowsの例外ハンドラの特徴について説明しました。
次回はこの特徴を利用したプログラムを実際に作ってみる予定
です。



▲このページの上へ

▲このページの上へ

▲このページの上へ

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