(57)【要約】【課題】標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することを課題とする。【解決手段】バッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）が組み込まれたコンピュータシステムのＲＡＭ内には、対象関数から処理が戻った際に実行される命令が記憶されているコード領域１０と、作業領域であるスタック領域１１とが割り当てられる。そして、対象関数がＣＰＵにより実行された場合に、スタック領域１１に記憶されているリターンアドレス１２の値の変化を検知し、値が変化したことを検知した場合に、当該対象関数の実行を停止する。【選択図】        図１
2007148529.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知装置であって、
前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知手段と、
前記検知手段により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止手段と、
を備えたことを特徴とするバッファオーバーフロー検知装置。
【請求項２】
前記検知手段は、前記スタック領域に記憶されているリターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知することを特徴とする請求項１に記載のバッファオーバーフロー検知装置。
【請求項３】
前記検知手段は、前記プロセッサが一つの命令または一つの関数を実行するたびに前記値の変化を検知することを特徴とする請求項１または２に記載のバッファオーバーフロー検知装置。
【請求項４】
前記検知手段は、前記値の変化を検知した場合にあらかじめ定められたイベントを発生させ、
前記実行停止手段は、前記イベントを検出した場合に前記関数の実行を停止することを特徴とする請求項１〜３のいずれか一つに記載のバッファオーバーフロー検知装置。
【請求項５】
少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知方法であって、
前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知工程と、
前記検知工程により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止工程と、
を備えたことを特徴とするバッファオーバーフロー検知方法。
【請求項６】
少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知プログラムであって、
前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知手順と、
前記検知手段により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止手順と、
をコンピュータに実行させることを特徴とするバッファオーバーフロー検知プログラム。
【請求項７】
前記検知手順は、前記スタック領域に記憶されているリターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知することを特徴とする請求項６に記載のバッファオーバーフロー検知プログラム。
【請求項８】
前記検知手順は、前記プロセッサが一つの命令または一つの関数を実行するたびに前記値の変化を検知することを特徴とする請求項６または７に記載のバッファオーバーフロー検知プログラム。
【請求項９】
前記検知手手順は、前記値の変化を検知した場合にあらかじめ定められたイベントを発生させ、
前記実行停止手順は、前記イベントを検出した場合に前記関数の実行を停止することを特徴とする請求項６〜８のいずれか一つに記載のバッファオーバーフロー検知プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、バッファオーバーフロー検知装置、バッファオーバーフロー検知方法およびバッファオーバーフロー検知プログラムに関する。
【背景技術】
【０００２】
従来より、コンピュータの制御を行うプロセッサ（中央処理装置、ＣＰＵ）は、プログラムを構成する関数を実行する場合に、ＲＡＭなどの記憶媒体の記憶領域内に当該関数を実行するための作業領域として、最後に記憶領域に格納された情報が最初に取り出されるスタック領域を割り当てる。プロセッサによって割り当てられたスタック領域には、関数から処理が戻った際に実行される命令が記憶された位置を示すリターンアドレスと、関数の呼び出し元のスタック領域の開始位置を示すフレームポインタと、関数を実行する際に用いられるローカル変数などが格納されている。
【０００３】
そして、プロセッサが、割り当てた領域を超えるデータ長の値をローカル変数にコピーしたことで、リターンアドレスが変更されてプロセッサが誤動作を起こすバッファオーバーフローが発生する。このバッファオーバーフローを検知するものとして、様々な技術が開示されている。
【０００４】
例えば、特許文献１（特開２００５−１５１４９２号公報）では、標準的なメモリコピー関数の呼び出しをプログラム実行時にフック（関数が呼び出されるときの制御の横取り）して、コピー先のバッファサイズをあらかじめチェックすることで、バッファオーバーフローを検知する技術が開示されている。
【０００５】
また、特許文献２（特開２００１−２１６１６１号公報）では、プログラムをコンパイルする際にリターンアドレスなどを保護するガード変数を挿入して、関数から処理を戻す直前にガード変数が破壊されているか否かを判断することで、バッファオーバーフローを検知する技術が開示されている。
【０００６】
【特許文献１】特開２００５−１５１４９２号公報
【特許文献２】特開２００１−２１６１６１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１に開示された従来の技術では、標準的なメモリコピー関数のコピー先のバッファサイズをあらかじめチェックするので、標準的なメモリコピー関数以外の関数を含んだプログラムには適用できないという問題点があった。
【０００８】
また、特許文献２に開示された従来の技術では、プログラムをコンパイルする必要があるので、プログラムがソースコードで提供されていなければならず、既にバイナリ化されたプログラムには適用できないという問題点があった。さらに、この従来の技術では、関数から処理を戻す直前にガード変数が破壊されているか否かを判断するので、関数が終了するまでバッファオーバーフローを検知できないという問題点があった。
【０００９】
そこで、この発明は、上述した従来技術の課題を解決するためになされたものであり、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能であるバッファオーバーフロー検知装置、バッファオーバーフロー検知方法およびバッファオーバーフロー検知プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、請求項１に係る発明は、少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知装置であって、前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知手段と、前記検知手段により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止手段と、を備えたことを特徴とする。
【００１１】
また、請求項２に係る発明は、上記の発明において、前記検知手段は、前記スタック領域に記憶されているリターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知することを特徴とする。
【００１２】
また、請求項３に係る発明は、上記の発明において、前記検知手段は、前記プロセッサが一つの命令または一つの関数を実行するたびに前記値の変化を検知することを特徴とする。
【００１３】
また、請求項４に係る発明は、上記の発明において、前記検知手段は、前記値の変化を検知した場合にあらかじめ定められたイベントを発生させ、前記実行停止手段は、前記イベントを検出した場合に前記関数の実行を停止することを特徴とする。
【００１４】
また、請求項５に係る発明は、上記の発明において、少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知方法であって、前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知工程と、前記検知工程により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止工程と、を備えたことを特徴とする。
【００１５】
また、請求項６に係る発明は、上記の発明において、少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するバッファオーバーフロー検知プログラムであって、前記関数がプロセッサにより実行された場合に、前記スタック領域に記憶されている値の変化を検知する検知手順と、前記検知手段により前記値が変化したことを検知した場合に、前記関数の実行を停止する実行停止手順と、をコンピュータに実行させることを特徴とする。
【００１６】
また、請求項７に係る発明は、上記の発明において、前記検知手順は、前記スタック領域に記憶されているリターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知することを特徴とする。
【００１７】
また、請求項８に係る発明は、上記の発明において、前記検知手順は、前記プロセッサが一つの命令または一つの関数を実行するたびに前記値の変化を検知することを特徴とする。
【００１８】
また、請求項９に係る発明は、上記の発明において、前記検知手手順は、前記値の変化を検知した場合にあらかじめ定められたイベントを発生させ、前記実行停止手順は、前記イベントを検出した場合に前記関数の実行を停止することを特徴とする。
【発明の効果】
【００１９】
請求項１、５または６の発明によれば、関数がプロセッサにより実行された場合に、スタック領域に記憶されている値の変化を検知し、値が変化したことを検知した場合に、関数の実行を停止するので、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能である。
【００２０】
また、請求項２または７の発明によれば、スタック領域に記憶されているリターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知するので、例えば、リターンアドレスの値の変化のみを検知する、フレームポインタの値の変化のみを検知する、または、両方の値の変化を検知することができ、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能である。
【００２１】
また、請求項３または８の発明によれば、設定手段は、プロセッサが一つの命令または１つの関数を実行するたびに値が変化したか否か検知するので、バッファオーバーフローが起こった瞬間を検知することができ、バッファオーバーフローの原因を特定させることが可能である。
【００２２】
また、請求項４または９の発明によれば、監視値の変化を検知した場合にあらかじめ定められたイベントを発生させ、イベントを検出した場合に関数の実行を停止するので、異常時の処理を統一化することが可能である。例えば、実行している関数を停止するとともに、バッファオーバーフローを検知した旨をコンピュータのモニタに表示させることが可能である。
【発明を実施するための最良の形態】
【００２３】
以下に添付図面を参照して、この発明に係るバッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）の実施例（実施例１〜２）を詳細に説明する。
【実施例１】
【００２４】
以下の実施例１では、本発明に係るバッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）が組み込まれたコンピュータシステムの概要および特徴、コンピュータシステムの構成および処理の流れ、実施例１による効果等を順に説明する。
【００２５】
［コンピュータシステムの概要および特徴］
まず最初に、図１を用いて、本実施例に係るコンピュータシステムの概要および特徴を説明する。図１は、本実施例に係るコンピュータシステムが使用するメモリ中のスタック領域を示す構成図である。
【００２６】
本実施例に係るコンピュータシステムは、プログラムを実行した際にスタック領域に起こるバッファオーバーフローを検知することを概要とするものであり、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能である点と、関数の終了を待たずにバッファオーバーフローを検知することが可能である点とに主たる特徴がある。
【００２７】
図１を用いてこの主たる特徴を説明する。プロセッサは、プログラムに記載されている関数を実行する際にメモリであるＲＡＭの記憶領域内に当該関数を実行するための作業領域として、最後に格納された情報が最初に取り出されるスタック領域を割り当てる。
【００２８】
具体的には、関数が実行されると、図１（１）に示すように、ＲＡＭ内には、当該関数から処理が戻った際に実行される命令が記憶されているコード領域１０と、作業領域であるスタック領域１１とが割り当てられる。また、当該関数が実行されると、スタック領域１１には、コード領域１０内の位置を指すリターンアドレス１２と、関数の呼び出し元のスタック領域の開始位置を指すフレームポインタ１３と、関数を実行する際に用いられるローカル変数１４〜１６とが格納される。
【００２９】
ここで、通常、それぞれの領域は、あらかじめ割り当てられた領域であるため、関数の実行途中または終了した際も、それぞれの領域に収まるデータが書き込まれる。しかしながら、これらの領域を超えたデータが書き込まれると、領域に収まらない溢れたデータにより他の領域が上書きされてしまい、その上書きされた領域の値が変化して、バッファオーバーフローが発生する。具体的に説明すると、図１（２）に示すように、関数の実行途中または終了した際にローカル変数１４に割り当てられた領域を超えたデータが、ローカル変数１４に書き込まれると、領域に収まらない溢れたデータ１４ａによりフレームポインタ１３に割り当てられた領域が上書きされ、そして、さらにフレームポインタ１３が溢れて、溢れたフレームポインタにより、リターンアドレス１２に割り当てられた領域が上書きされてしまい、リターンアドレス１２の値が変化する。
【００３０】
そこで、本実施例に係るバッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）が組み込まれたコンピュータシステムは、関数がプロセッサにより実行された場合に、スタック領域に記憶されている値の変化を検知し、値が変化したことを検知した場合に、関数の実行を停止する。
【００３１】
例えば、本実施例に係るコンピュータシステムは、関数を実行する際に、リターンアドレス１２の値の変化を監視しておき、そして、図１（２）に示すように、関数の実行途中または終了した際にローカル変数１４に割り当てられた領域を超えたデータが、ローカル変数１４に書き込まれて、フレームポインタ１３の値が変化し、そして、リターンアドレス１２の値が変化したことを検知すると、本実施例に係るコンピュータシステムは、当該関数の実行を停止する。
【００３２】
このように、本実施例に係るコンピュータシステムは、対象関数がプロセッサにより実行された場合に、スタック領域１１に記憶されているリターンアドレス１２の値の変化を検知し、リターンアドレス１２の値が変化したことを検知した場合に、関数の実行を停止するので、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能である点と、関数の終了を待たずにバッファオーバーフローを検知することが可能である。
【００３３】
［コンピュータシステムの構成］
次に、図２を用いて、バッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）が組み込まれたコンピュータシステムの構成を説明する。図２は、本実施例に係るコンピュータシステムの構成を示すブロック図である。同図に示すように、本実施例に係るコンピュータシステムは、表示部２１と、入力部２２と、ハードディスク２３と、ＲＯＭ２４と、ＲＡＭ２５と、ＣＰＵ２６とから構成される。
【００３４】
このうち、表示部２１は、バッファオーバーフローを検知した際のイベントを出力する出力手段であり、モニタ（若しくはディスプレイ、タッチパネル）やスピーカを備えて構成され、例えば、バッファオーバーフロー検知により関数を停止したことなどを表示する。
【００３５】
入力部２２は、各種の情報の入力を受付ける入力手段であり、キーボードやマウス、マイクなどを備えて構成される。また、ハードディスク２３は、各種の情報を記憶する手段であり、例えば、ソフトウエアなどを記憶する。
【００３６】
ＲＯＭ２４は、プログラムなどを記憶する手段であり、具体的には、対象プログラム２４ａと、バッファオーバーフロー検知プログラム２４ｂとを記憶する。このうち、対象プログラム２４ａは、バッファオーバーフローの検知を行う対象のプログラムであり、少なくとも一つの命令を有する関数から構成される。また、バッファオーバーフロー検知プログラムは、図３に示したように、Ｓｔａｒｔ関数と、ＡｆｔｅｒＣａｌｌ関数と、ＣｈａｎｇｅＥＳＰ関数と、ＣｈａｎｇｅＲＡ関数とから構成される。
【００３７】
具体的に説明すると、Ｓｔａｒｔ関数は、対象プログラム２４ａに記載されている関数（以下、対象関数と呼ぶ）が実行される直前にＰＯＳＴ＿ＥＸＥＣ＿ＩＮＳＮという定数で識別されるイベントを発生させて、後述するＡｆｔｅｒＣａｌｌ関数を実行するように設定し、対象関数の実行が終了してスタック領域の割当てが変動したときにＰＯＳＴ＿ＣＨＡＮＧＥ＿ＲＥＧという定数で識別されるイベントを発生させて、ＣｈａｎｇｅＥＳＰ関数を実行するように設定を行う関数である。
【００３８】
また、ＡｆｔｅｒＣａｌｌ関数は、対象関数のリターンアドレス１２が変化した際に、ＰＯＳＴ＿ＷＲＩＴＥ＿ＭＥＭという定数で識別されるイベントを発生させて、後述するＣｈａｎｇｅＲＡ関数を実行するように設定する関数である。
【００３９】
そして、ＣｈａｎｇｅＥＳＰ関数は、これら対象関数に対して発生するように設定されたイベントを解除する関数であり、また、ＣｈａｎｇｅＲＡ関数は、バッファオーバーフローが検知された際に、検知された旨や、後述するＣＰＵ２６の各レジスタの値などにより本実施例に係るコンピュータシステム２０の状態を表示部２１に出力する関数である。
【００４０】
ＲＡＭ２５は、一時的にプログラムおよびプログラムの実行に必要な値を記憶する手段である。具体的には、ＣＰＵ２６によりＲＯＭ２４に記憶されている対象プログラム２４ａまたはバッファオーバーフロー検知プログラム２４ｂが実行されると、ＲＯＭ２４より、その実行されたプログラムを読み出して記憶する。また、ＣＰＵ２６により対象関数が実行された際に、作業領域としてスタック領域２５ａを割当てられ、ＲＡＭ２５は、その関数の実行に必要な値を記憶する。
【００４１】
また、ＲＡＭ２５内には、対象関数から処理が戻った際に実行される命令が記憶されているコード領域１０と、作業領域であるスタック領域１１とが割り当てられる。そして、対象関数が実行されると、スタック領域１１には、コード領域１０内の位置を指すリターンアドレス１２と、対象関数の呼び出し元のスタック領域の開始位置を指すフレームポインタ１３と、対象関数を実行する際に用いられるローカル変数１４〜１６とが格納される。
【００４２】
ＣＰＵ２６は、プログラムの実行およびスタック領域の割当てを行う手段であり、特に本発明に密接に関連するものとしては、検知部２６ａと、実行停止部２６ｂとを備える。なお、ＣＰＵ２６は特許請求の範囲に記載の「プロセッサ」に対応し、検知部２６ａは同じく「検知手段」に対応し、実行停止部２６ｂは「実行停止手段」に対応する。
【００４３】
このうち、検知部２６ａは、ＲＯＭ２４に記憶されているバッファオーバーフロー検知プログラム２４ｂのＳｔａｒｔ関数と、ＡｆｔｅｒＣａｌｌ関数とを実行する手段である。具体的には、ＣＰＵ２６により対象プログラム２４ａが実行されると、検知部２６ａは、バッファオーバーフロー検知プログラム２４ｂのＳｔａｒｔ関数を実行して、対象関数のリターンアドレス１２の値の変化を監視する。また、リターンアドレス１２の値が変化した際に、検知部２６ａは、ＡｆｔｅｒＣａｌｌ関数を実行して、ＰＯＳＴ＿ＷＲＩＴＥ＿ＭＥＭという定数で識別されるイベントを発生させて、後述するＣｈａｎｇｅＲＡ関数を実行させる。
【００４４】
また、実行停止部２６ｂは、対象関数を停止するとともに、ＲＯＭ２４に記憶されているバッファオーバーフロー検知プログラム２４ｂのＣｈａｎｇｅＲＡ関数を実行する手段である。具体的には、対象関数の実行途中または終了した際に、バッファオーバーフローが検知されると、実行停止部２６ｂは、対象関数を停止するとともに、ＣｈａｎｇｅＲＡ関数を実行して、バッファオーバーフローが検知された旨や、後述するＣＰＵ２６の各レジスタの値などにより本実施例に係るコンピュータシステム２０の状態を表示部２１に出力させる。
【００４５】
さらに、ＣＰＵ２６は、図示しないレジスタと制御部とを備える。具体的には、対象プログラムをデバッグ状態にするか否かを記憶するレジスタと、デバッグ状態にある対象プログラムをステップ実行状態にするか否かを記憶するレジスタと、ステップ実行状態にあるプログラムの命令を一つ実行するたびにデバッガに制御を戻す制御部を備える。なお、デバッガとは、一般的にはプログラムのバグを発見または修正する作業を支援するソフトウエアであり、本実施例では特許請求の範囲に記載の「バッファオーバーフロー検知プログラム」に対応する。
【００４６】
［コンピュータシステムによる処理］
次に、図４を用いて、バッファオーバーフロー検知装置（バッファオーバーフロー検知プログラム）が組み込まれたコンピュータシステムによる処理を説明する。図４は、本実施例に係るコンピュータシステムの流れを示すフローチャートである。
【００４７】
図４に示すように、コンピュータシステム２０が、入力部２２より対象プログラム２４ａの実行指示を受け付けると（ステップＳ４０１肯定）、ＣＰＵ２６の検知部２６ａは、バッファオーバーフロー検知プログラム２４ｂのＳｔａｒｔ関数を実行して、対象関数のリターンアドレス１２の値の監視を開始する（ステップＳ４０２）。そして、ＣＰＵ２６は、対象関数の一命令を実行する（ステップＳ４０３）。
【００４８】
続いて、ＣＰＵ２６の検知部２６ａは、対象関数の命令が実行されるたびに、対象関数が変化したか否かを判断する（ステップＳ４０４）。そして、対象関数が変化した場合（ステップＳ４０４肯定）、検知部２６ａは、監視するリターンアドレスとして新たな対象関数のリターンアドレスの値を追加する（ステップＳ４０５）。そして、上記のステップＳ４０３に戻り、ＣＰＵ２６は、対象関数の次の一命令を実行する。
【００４９】
一方、対象関数が変化した場合（ステップＳ４０４否定）、検知部２６ａは、リターンアドレス１２が変化したか否かを判断する（ステップＳ４０６）。そして、リターンアドレス１２が変化した場合、バッファオーバーフローを検知したこととなり（ステップＳ４０７）、ＣＰＵ２６の実行停止部２６ｂは、実行している関数を停止するとともに、ＣｈａｎｇｅＲＡ関数を実行させて、バッファオーバーフローが検知された旨や、ＣＰＵ２６の各レジスタの値などコンピュータシステム２０の状態を表示部２１に出力する（ステップＳ４０８）。
【００５０】
また、リターンアドレス１２が変化していない場合（ステップＳ４０６否定）、上記のステップＳ４０３に戻り、ＣＰＵ２６は、対象関数の次の一命令を実行する。
【００５１】
［実施例１による効果］
上述してきたように、実施例１によれば、対象関数がＣＰＵ２６により実行された場合に、スタック領域に記憶されているリターンアドレス１２の値の変化を検知し、値が変化したことを検知した場合に、関数の実行を停止するので、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能である。
【００５２】
また、実施例１によれば、ＣＰＵ２６が一つの命令を実行するたびにリターンアドレス１２の値の変化を検知するので、バッファオーバーフローが起こった瞬間を検知することができ、バッファオーバーフローの原因を特定させることが可能である。
【００５３】
また、実施例１によれば、リターンアドレス１２の値の変化を検知した場合にあらかじめ定められたイベントを発生させ、イベントを検出した場合に関数の実行を停止するので、異常時の処理を統一化することが可能である。具体的には、バッファオーバーフローを検知した旨をコンピュータのモニタに表すと同時に、実行している関数を停止することが可能である。
【実施例２】
【００５４】
さて、これまで実施例１に係るバッファオーバーフロー検知装置について説明してきたが、本発明は上記した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では実施例２として、種々の異なる形態について説明する。
【００５５】
例えば、上記した実施例１において、リターンアドレスの値の変化を検知する場合について説明したが、本発明はこれに限定されるものではなく、リターンアドレスおよびフレームポインタのうち少なくとも一方の値の変化を検知するようにすればよい。具体的には、リターンアドレスの値の変化のみを検知する、フレームポインタの値の変化のみを検知する、または、両方の値の変化を検知することができる。このことより、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能である。
【００５６】
また、上記した実施例１において、ＣＰＵ２６が一つの関数を実行するたびにリターンアドレスの値の変化を検知する場合を説明したが、本発明はこれに限定されるものではなく、一つの命令を実行するたびにリターンアドレスの値の変化を検知するようにしてもよい。
【００５７】
また、上記した実施例１において、バッファオーバーフロー検知プログラム２４ｂをＲＯＭ２４に記憶させておき、ＣＰＵ２６が当該プログラムを実行する場合を説明したが、本発明はこれに限定されるものではなく、バッファオーバーフロー検知プログラム２４ｂをハードディスク２３に記憶させてもよく、また、あらかじめＣＰＵ２６に内蔵させてもよい。
【００５８】
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００５９】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００６０】
なお、上記の実施例で説明した各種の処理手順は、あらかじめ用意されたプログラムをコンピュータ上で実行することによって実現することができる。そして、これらのプログラムは、インターネットなどのネットワークを介して配布することができる。さらに、これらのプログラムは、ハードディスク、フレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行することもできる。つまり、例を挙げれば、実施例に示したようなバッファオーバーフロー検知プログラムを格納したＣＤ−ＲＯＭ（装置ごとに別個のＣＤ−ＲＯＭであってもよい）を配布し、このＣＤ−ＲＯＭに格納されたプログラムを各コンピュータが読み出して実行するようにしてもよい。
【産業上の利用可能性】
【００６１】
以上のように、本発明に係るバッファオーバーフロー検知装置、バッファオーバーフロー検知方法およびバッファオーバーフロー検知プログラムは、少なくとも一つの命令を有する関数の実行に必要な値を保存するスタック領域に発生するバッファオーバーフローを検知するのに有用であり、特に、標準的なメモリコピー以外の関数を含んだプログラムおよび既にバイナリ化されたプログラムにも適用することが可能であるとともに、関数の終了を待たずにバッファオーバーフローを検知することが可能であることに適する。
【図面の簡単な説明】
【００６２】
【図１】実施例１に係るコンピュータシステムが使用するメモリ中のスタック領域を示す構成図である。
【図２】実施例１に係るコンピュータシステムの構成を示すブロック図である。
【図３】実施例１に係るバッファオーバーフロー検知プログラムを示す概要図である。
【図４】実施例１に係るコンピュータシステムの流れを示すフローチャートである。
【符号の説明】
【００６３】
１０  コード領域
１１  スタック領域
１２  リターンアドレス
１３  フレームポインタ
１４  ローカル変数
１４ａ  溢れたデータ
１５  ローカル変数
１６  ローカル変数
２０  コンピュータシステム
２１  表示部
２２  入力部
２３  ハードディスク
２４  ＲＯＭ
２４ａ  対象プログラム
２４ｂ  バッファオーバーフロー検知プログラム
２５  ＲＡＭ
２５ａ  スタック領域
２６  ＣＰＵ
２６ａ  検知部
２６ｂ  実行停止部
【図１】
2007148529.tif 000003
【図２】
2007148529.tif 000004
【図３】
2007148529.tif 000005
【図４】
2007148529.tif 000006