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

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とof2.cとの違い ■

前回までで、バッファオーバーフローにより任意のコードが実
行出来てしまう事の説明が終了した事になります。
以下に、前回までのプログラムを示します。


─↓"of2.c"──────────────────────
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(void);
void sub(void);

void main()
{
  unsigned char* i;
  unsigned char b[]= { 0x10, 0x11, 0x12, 0x13,
             0x14, 0x15, 0x16, 0x17,
             0x18, 0x19, 0x1a, 0x1b,
             0xd9, 0x20, 0x40, 0x00,
             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(b));
  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));
  }
  printf("&sub:%08X\n", &sub);
}

void sub(void)
{
  printf("Overflow call!!\n");
  exit(0);
}
─↑ここまで──────────────────────

このプログラムはバッファ「b」をバッファ「a」にコピーす
るだけのプログラムの様に見えます。

しかしバッファをコピーする際の「サイズ指定」にバグがある
為にバッファオーバーフローが発生してしまいます。

以下にこのプログラムの動作イメージを示します。


┌──────────────────────────┐
│          OF2. EXE         │
│                          │
└───┬──────────────────────┘
    │                       スタック領域
    │call命令               格納 ┌──────┐
    ├─────────────────────→│ 呼出し元 │
    │    制御を移行┌────────┐   └──────┘
    ├────────→│ main関数 │
    │         │        │
    │         └───┬────┘
    │             │
               ┌──┴──┐
               │コピー処理│
               └──┬──┘
                  │×バッファオーバーフロー発生
                  │         スタック領域
                  │        ┌──────┐
                  ├───────→│sub 関数の │
                  │        │    場所│
                  │        └──────┘
                  │処理終了     スタック領域
                  │どこへ戻るか参照┌──────┐
                  │←───────┤sub 関数の │
                  │        │    場所│
                  │        └──────┘
                  │  ┌───────┐
                  └─→│ sub 関数  │
                     │ 実行開始  │
                     └───────┘


バッファオーバーフローの為、「呼出し元」の情報が格納され
ているはずの部分が「sub関数の場所」に書き換えられ、結果
としてsub関数が実行されてしまう事になるのでした。

一般に売られている雑誌などでは、ここまでの情報で終わって
しまう事が多いです。

ここまでの情報で終了してしまうのは、バッファオーバーフロ
ーの説明としては十分かもしれませんが、バッファオーバーフ
ローを利用して、「どのようにしてコンピュータがウィルスに
感染してしまうのか」という説明としては不十分です。

何故、一般の雑誌などでは不十分な説明のままで終わってしま
うのかというと、これから先の情報を知ってしまうと、実際に
他人のコンピュータに不正な命令を実行させてしまう事が可能
となってしまう場合があるからです。

今までこの講座では"of1.c"と"of2.c"という2つのプログラム
を作ってきました。
ちょっと、この2つのプログラムの動作の違いについてまとめ
てみましょう。

"of1.c"はバッファオーバーフローを発生させるだけのプログ
ラムでした。
このプログラムを実行させるとプロセッサの保護機能が動作し、
即、強制終了されます。

"of2.c"はバッファオーバーフローを利用して「sub」という関
数(任意のコード)を実行させてしまうプログラムでした。
このプログラムを実行させると「Overflow call!!」という文
字列を表示して終了するのでした。

ここで注目して頂きたいのは、"of2.c"というプログラムを作
成する過程において「何を行ってきたか」という事です。

このプログラムを作成する為にC言語で書かれたソースコード
を変更し、いったん実行させました。
何故実行させたのかと言うと、「sub」という関数が「メモリ
上のどこにあるのか」を調べたかったからです。

しかし、Windowsに感染するコンピュータウィルスというのは、
この様に任意のコードがどこにあるのかを調べたりする事はあ
りません。

それではどうするのでしょうか?

実は、一旦プログラムは強制終了するルートに入り込んでしま
います。

つまり"of2.c"というプログラムのようにプロセッサが怒らな
いようにするのではなく、プロセッサの怒るままに動作させて
しまう、という事です。

この点に関しては、"of2.c"というプログラムよりは実は"of1
.c"のプログラムの方が実際のコンピュータウィルスの動作に
近いのです。


それでは、"of1.c"というプログラムがどういう動きをしてい
たのか、もう1度その動作イメージを思い出してみましょう。

以下に"of1.c"の動作イメージを示します。


┌──────────────────────────┐
│         OF1.EXE          │
│                          │
└───┬──────────────────────┘
    │                       スタック領域
    │call命令               格納 ┌──────┐
    ├─────────────────────→│ 呼出し元 │
    │    制御を移行┌────────┐   └──────┘
    ├────────→│ main関数 │
    │         │        │
    │         └───┬────┘
    │             │
               ┌──┴──┐
               │コピー処理│
               └──┬──┘
                  │×バッファオーバーフロー発生
                  │         スタック領域
                  │        ┌──────┐
                  ├───────→│1F 1E 1D 1C │
                  │        └──────┘
                  │処理終了     スタック領域
                  │どこへ戻るか参照┌──────┐
                  │←───────┤1F 1E 1D 1C │
                  │        └──────┘
               ×××××××
               ×そんな所に×
               ×実行可能な×
               ×プログラム×
               ×ありません×
               ×××××××


バッファオーバーフローが発生し、プログラムが強制終了され
ています。

コンピュータウィルスの場合も、ここまでの動作であれば全く
同じ動きをします。

この後、"of1.c"のプログラムの場合は、「不正な処理を行っ
たので強制終了します。」というメッセージが表示されるので
すが、コンピュータウィルスの場合はそんな事はなく、ウィル
スとしての異常な処理が開始される事になります。

どうやって不正な処理を開始しているのでしょうか?

続きは次回に。



▲このページの上へ

▲このページの上へ

▲このページの上へ

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