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

TOPに戻る
▼Virus
Code REDウィルスとは?
┣ マイクロソフトの説明
┃ とIIS機能

┣ アプリケーションソフ
┃ トは機能の寄集め

┣ 呼出・復帰時に行わ
┃ れる事

┣ 復帰の場所を変え
┃ てみると・・

┣ 感染したCode R
┃ EDは何を行うか

┣ 異常データをサーバ
┃ ーのバッファに格納

┣ プロセッサの保護機
┃ 能

┣ ウィルスの場所を特
┃ 定する

┣ウィルスコードを実
┃ 行する

┣ CodeREDの正体1
┗ CodeREDの正体2

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




■デジタル用語辞典:

▲このページの上へ

■ ウィルスコードを実行する ■

前回はどのようにしてウィルスの場所を特定するのか解説を行
いました。
プロセッサの保護機能により動作開始するハンドラが別のプロ
グラムを起動するまでの間にプロセッサ内部レジスタEBXにウ
ィルスの場所が格納されるという事の説明を行いました。

今回はどのようにしてレジスタEBXに処理を移行させるのか解
説を行います。

まずはプロセッサの保護機能が動作し、別プログラムが起動す
るまでの図を見てみましょう。


            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                 プロセッサの保護機能動作      
                        │          
         ┌──────────────┘   バッファ   
         │                ┌───────┐
         ↓                │  変な値  │
   7.ハンドラ動作開始             └───────┘
     (OS起動時にあらかじめ登録されている)     ・    
         │                    ・    
         │ ここにウィルスの場所情報を      ・    
         │ 入れる事は出来ない。         ・    
         │ バッファオーバーフロー発生      ・    
         │ 時点ではまだウィルスの        ・    
         │ 場所が分からないから。        ・    
         │     │          ┌───────┐
         │     │          │メッセージを表│
         │     └─────────→│示するプログラ│
         │             ┌──┤ムの場所   │
         │             │  └───────┘
         │ 何を起動するか参照   │      ・    
         │←────────────┘      ・    
    プロセッサ内部レジスタEBX に            ・    
    バッファオーバーフローにより            ・    
    壊れてしまったバッファの場所            ・    
    情報が格納される                  ・    
         ↓                    ・    
   8.メッセージを表示するプログラム起動        ・    
         │                    ・    
         ↓                    ・    
   9.「一般保護例外が発生しました。」     ┌───────┐
     「ページ違反が発生しました。」      │       │
     等のメッセージを表示し、アプリケ     │ウィルス本体 │
     ーションソフトが強制終了された事     │       │
     をユーザーに伝える            └───────┘


上の図7項にて、「メッセージを表示するプログラムの場所」
を参照して、そして8項でそのプログラムを起動しています。

例えば、ここに「ウィルスの場所」を格納しておけばウィルス
が活動開始する事になります。しかし、以前に解説したように、
バッファオーバーフロー発生時点では「ウィルスの場所」は分
からない為、それは出来ないのです。

それでは、バッファオーバーフロー発生時点で分かっている事
はないのでしょうか?

例えば、バッファオーバーフロー発生時点では、当然OSは動
いているわけです。また、IIS機能も動作しているはずです。
(IIS機能が動作していなければバッファオーバーフローも発生
しないわけですから。。)
バッファオーバーフロー発生時点で、上記の2つの事は分かっ
ています。

それでは、その動作している「OSの場所」はどうでしょうか?
世界中で動作する全てのWINDOWS2000において「OSの場所」は
固定なのでしょうか?

実はほとんどの場合において、固定です。

頭の良い人は、この固定部分を利用してやろう、と思うわけで
す。

このOSの内部に、「EBXの処理を呼出し」という命令が入っ
ている部分があります。
この命令が入っている場所は、世界中で動作するWINDOWS2000
のほとんどの場合において、固定の場所にあります。

そして、「ウィルスの場所」情報はプロセッサ内部レジスタ
「EBX」に入っています。

上記2つの事を組み合わせてあげます。
「EBXの処理を呼出し」と
「ウィルスの場所はEBXに入っている」を組み合わせると、

「ウィルスを呼出し」

とする事が出来ます。

つまり、「EBXの処理を呼出し」(=ウィルスを呼出し)にプ
ロセッサの制御を移行させてあげればよいわけです。

その為に、ハンドラが別プログラムを起動する時に参照する
「起動するプログラムの場所」情報に「EBXの処理を呼出し」
の命令が入っている場所を指定してあげるわけです。

以下にその図を示します。

            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                 プロセッサの保護機能動作      
                        │          
         ┌──────────────┘   バッファ   
         │                ┌───────┐
         ↓                │  変な値  │
   7.ハンドラ動作開始             └───────┘
     (OS起動時にあらかじめ登録されている)     ・    
         │                    ・    
         │ ここにウィルスの場所情報を      ・    
         │ 入れる事は出来ない。         ・    
         │ バッファオーバーフロー発生      ・    
         │ 時点ではまだウィルスの        ・    
         │ 場所が分からないから。        ・    
         │     │          ┌───────┐
         │     │          │EBX を呼出す │
         │     └─────────→│命令が入ってい│
         │             ┌──┤る場所    │
         │             │  └───────┘
         │ 何を起動するか参照   │      ・    
         │←────────────┘      ・    
    プロセッサ内部レジスタEBX に            ・    
    バッファオーバーフローにより            ・    
    壊れてしまったバッファの場所            ・    
    情報(つまり、ウィルスの場所)           ・    
    が格納される                    ・    
         ↓                    ・    
   8.「EBX を呼出し」実行               ・    
         └─────────────────┐  ・    
                           ↓  ・    
                          ┌───────┐
                          │       │
                          │ウィルス本体 │
                          │       │
                          └───────┘

7項で、ハンドラが「何を起動するか参照」するバッファの中
に「EBXを呼出す命令が入っている場所」が格納されています。
ハンドラが別プログラムを起動する時には、レジスタEBXには
バッファオーバーフローにより壊れてしまったバッファの場所
が格納されます。

その為、8項で「EBXを呼出し」の命令が実行された時に処理
はバッファオーバーフローにより壊れてしまった場所へ移行し
ます。

バッファオーバーフローにより壊れてしまったバッファの場所
にはウィルス本体が格納されており、これでウィルスが実行さ
れます。

どうでしょうか。今までの解説、分かったでしょうか。
Code REDウィルスが実行されるまでの処理の流れの説明はこれ
で一通り終わりです。

Code REDウィルスだけでなく、バッファオーバーフローを利用
したウィルスのほとんどは今までに紹介したような動きをしま
す。

さて、次回は具体的なCode REDウィルスのコードも一部見てみ
ようと思っています。楽しみにしていて下さい。



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