JPH08249206A - スタック領域破壊検出機能付き計算機 - Google Patents
スタック領域破壊検出機能付き計算機Info
- Publication number
- JPH08249206A JPH08249206A JP7052951A JP5295195A JPH08249206A JP H08249206 A JPH08249206 A JP H08249206A JP 7052951 A JP7052951 A JP 7052951A JP 5295195 A JP5295195 A JP 5295195A JP H08249206 A JPH08249206 A JP H08249206A
- Authority
- JP
- Japan
- Prior art keywords
- stack area
- function
- stack
- register
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Storage Device Security (AREA)
- Executing Machine-Instructions (AREA)
- Debugging And Monitoring (AREA)
Abstract
(57)【要約】
【目的】 呼出し元のスタック領域を破壊する異常な関
数を呼び出したとき、当該関数の異常を呼出し元への戻
り時に検出することを可能とする。 【構成】 プログラムでの一定の処理を行うためのスタ
ック領域をプログラムメモリ内で確保・解放しながら動
作し、また、スタック領域の底部を指し示すベースポイ
ンタをCPU内のレジスタ5及びプログラムメモリ内8
cに記憶し、プログラムメモリ内の記憶8cを用いてレ
ジスタ5内のベースポインタを変更しながらプログラム
を動作させる計算機にあって、ベースポインタを保存す
る上記記憶部分8cと異なる補助保存手段13,11
と、プログラムの動作が新たなスタック領域9からある
スタック領域8に戻ったときに、レジスタ内容8c,5
と補助保存手段の内容11とを比較して、これらが一致
しない場合、その旨を報知する比較報知手段10,12
とを備えたスタック領域破壊検出機能付き計算機。
数を呼び出したとき、当該関数の異常を呼出し元への戻
り時に検出することを可能とする。 【構成】 プログラムでの一定の処理を行うためのスタ
ック領域をプログラムメモリ内で確保・解放しながら動
作し、また、スタック領域の底部を指し示すベースポイ
ンタをCPU内のレジスタ5及びプログラムメモリ内8
cに記憶し、プログラムメモリ内の記憶8cを用いてレ
ジスタ5内のベースポインタを変更しながらプログラム
を動作させる計算機にあって、ベースポインタを保存す
る上記記憶部分8cと異なる補助保存手段13,11
と、プログラムの動作が新たなスタック領域9からある
スタック領域8に戻ったときに、レジスタ内容8c,5
と補助保存手段の内容11とを比較して、これらが一致
しない場合、その旨を報知する比較報知手段10,12
とを備えたスタック領域破壊検出機能付き計算機。
Description
【0001】
【産業上の利用分野】本発明は、スタック領域単位でプ
ログラムの動作が進行する計算機におけるスタック領域
破壊検出機能付き計算機に関する。
ログラムの動作が進行する計算機におけるスタック領域
破壊検出機能付き計算機に関する。
【0002】
【従来の技術】計算機の動作においては、プログラムメ
モリの低い方から(下から)順に動作領域すなわちスタ
ック領域を確保していき、各スタック領域に対してデー
タ入出力を行って関数等を実行することが一般に行われ
てる。
モリの低い方から(下から)順に動作領域すなわちスタ
ック領域を確保していき、各スタック領域に対してデー
タ入出力を行って関数等を実行することが一般に行われ
てる。
【0003】各スタック領域は、対応する関数等の動作
が終了すれば解放され、当該スタック領域からさらに関
数等が呼び出されれば、新たなスタック領域がその上に
確保される。
が終了すれば解放され、当該スタック領域からさらに関
数等が呼び出されれば、新たなスタック領域がその上に
確保される。
【0004】このようにスタック領域の確保・解放によ
り処理を進行させる計算機の中でも、特に、関数内のス
タック変数領域を「EBPレジスタ−オフセット」の形
で処理を行うようにプログラムをコンパイルするコンパ
イラを用いた計算機がある。
り処理を進行させる計算機の中でも、特に、関数内のス
タック変数領域を「EBPレジスタ−オフセット」の形
で処理を行うようにプログラムをコンパイルするコンパ
イラを用いた計算機がある。
【0005】この計算機においては、CPU(あるいは
MPU;マイクロプロセッサユニット)内にベースポイ
ンタ用レジスタとしてのEBPレジスタとスタックポイ
ンタ用レジスタとしてのESPレジスタとが用意され、
EBPレジスタとESPレジスタとにより、プログラム
の動作進行が保証される。そして、新たなスタック領域
が確保される際に、EBPレジスタ等の値が呼出し側の
スタック領域の上の部分に保存される。
MPU;マイクロプロセッサユニット)内にベースポイ
ンタ用レジスタとしてのEBPレジスタとスタックポイ
ンタ用レジスタとしてのESPレジスタとが用意され、
EBPレジスタとESPレジスタとにより、プログラム
の動作進行が保証される。そして、新たなスタック領域
が確保される際に、EBPレジスタ等の値が呼出し側の
スタック領域の上の部分に保存される。
【0006】図5はこのような計算機におけるスタック
領域の確保・解放を伴うプログラム処理の進行を説明す
る図である。図5(a)〜(d)は、プログラムメモリ
の状態を示しており、図中の下側が上記説明におけるメ
モリの低い方(下)であり、上側が上記説明におけるメ
モリの上である。まず、図5(a)において、プログラ
ムは関数Aのスタック31で関数Aの処理を行ってお
り、計算結果等の入出力もこのスタック31に対して行
われている。
領域の確保・解放を伴うプログラム処理の進行を説明す
る図である。図5(a)〜(d)は、プログラムメモリ
の状態を示しており、図中の下側が上記説明におけるメ
モリの低い方(下)であり、上側が上記説明におけるメ
モリの上である。まず、図5(a)において、プログラ
ムは関数Aのスタック31で関数Aの処理を行ってお
り、計算結果等の入出力もこのスタック31に対して行
われている。
【0007】したがって、このとき、CPU内のEBP
レジスタには、関数Aのスタック31の一番下を指し示
すアドレスA1が保存されており、一方、ESPレジス
タには、動作中のスタック領域の一番上を指し示すアド
レスA2が保存されている。
レジスタには、関数Aのスタック31の一番下を指し示
すアドレスA1が保存されており、一方、ESPレジス
タには、動作中のスタック領域の一番上を指し示すアド
レスA2が保存されている。
【0008】つまり、ベースポインタであるEBPレジ
スタの内容は、常に処理に対応するスタックの一番下の
アドレス(スタック領域の底部)を指し示すのであり、
スタックポインタであるESPレジスタの内容は、常に
対応するスタックの一番上のアドレス(当該スタックの
上に次のスタックのためのパラメータ等が積まれている
ときはその一番上)を指し示すものである。
スタの内容は、常に処理に対応するスタックの一番下の
アドレス(スタック領域の底部)を指し示すのであり、
スタックポインタであるESPレジスタの内容は、常に
対応するスタックの一番上のアドレス(当該スタックの
上に次のスタックのためのパラメータ等が積まれている
ときはその一番上)を指し示すものである。
【0009】計算機は、この両レジスタの内容から動作
時に必要なアドレス等を確保でき、これにより高速動作
が担保されている。ここで、図5(b)に示すように、
仮に関数A内から関数Bを呼び出すと、関数B用のスタ
ック領域を確保する前に、関数Aのスタック31の一番
上のアドレスA2の上に、関数Bを処理するためのパラ
メータ32、関数Aへの戻り番地33、関数AのEBP
領域34が順に保存されていく。このようにメモリ領域
の新たな確保が行われる度に、ESPレジスタ内容は、
アドレスA3、アドレスA4、アドレスA5と変更され
ていく。
時に必要なアドレス等を確保でき、これにより高速動作
が担保されている。ここで、図5(b)に示すように、
仮に関数A内から関数Bを呼び出すと、関数B用のスタ
ック領域を確保する前に、関数Aのスタック31の一番
上のアドレスA2の上に、関数Bを処理するためのパラ
メータ32、関数Aへの戻り番地33、関数AのEBP
領域34が順に保存されていく。このようにメモリ領域
の新たな確保が行われる度に、ESPレジスタ内容は、
アドレスA3、アドレスA4、アドレスA5と変更され
ていく。
【0010】そして、関数AのEBP領域34が確保さ
れて、EBPレジスタ内容すなわちアドレスA1がこの
領域34に保存されると、ESPレジスタの内容すなわ
ちアドレスA5がEBPレジスタに保存され、関数Bの
スタック領域の確保処理に移る。
れて、EBPレジスタ内容すなわちアドレスA1がこの
領域34に保存されると、ESPレジスタの内容すなわ
ちアドレスA5がEBPレジスタに保存され、関数Bの
スタック領域の確保処理に移る。
【0011】図5(c)は、関数Bのスタック35が確
保され、関数Bが処理されている状況を示す。ここで、
CPU内のEBPレジスタには、関数Bのスタック35
の一番下を指し示すアドレスA5が保存されており、一
方、ESPレジスタには、動作中のスタック領域の一番
上を指し示すアドレスA6が保存されている。
保され、関数Bが処理されている状況を示す。ここで、
CPU内のEBPレジスタには、関数Bのスタック35
の一番下を指し示すアドレスA5が保存されており、一
方、ESPレジスタには、動作中のスタック領域の一番
上を指し示すアドレスA6が保存されている。
【0012】このとき、さらに新たな関数等が呼び出さ
れれば、図5(a),(b)と同様な処理を経て、新た
なスタック領域が関数Bのスタック35の上に確保され
ることになる。
れれば、図5(a),(b)と同様な処理を経て、新た
なスタック領域が関数Bのスタック35の上に確保され
ることになる。
【0013】一方、関数Bについての処理が終了する
と、スタック35は、解放され、処理対象が関数Aに戻
ることになる。つまり、図5(d)に示すように、アド
レスA1を保存する関数AのEBP領域34の内容がE
BPレジスタに移され、ESPレジスタの内容は、関数
Aのスタック31の一番上を示すアドレスA2に変更さ
れる。さらに、CPUは、関数Aにおける戻り番地を、
関数Aへの戻り番地33から受け取ってこの番地から関
数Aについての処理を再開することになる。
と、スタック35は、解放され、処理対象が関数Aに戻
ることになる。つまり、図5(d)に示すように、アド
レスA1を保存する関数AのEBP領域34の内容がE
BPレジスタに移され、ESPレジスタの内容は、関数
Aのスタック31の一番上を示すアドレスA2に変更さ
れる。さらに、CPUは、関数Aにおける戻り番地を、
関数Aへの戻り番地33から受け取ってこの番地から関
数Aについての処理を再開することになる。
【0014】以上が、「EBPレジスタ−オフセット」
の形で処理を行うようにコンパイルされたプログラムに
おける、新たなスタック領域が確保される際に、EBP
レジスタ等の値が呼出し側のスタック領域の上の部分に
保存されるときの処理方法である。このような処理方法
は、EBPレジスタ及びESPレジスタに相当するレジ
スタを備えたCPUを用いた計算機において一般的に用
いられている手法である。特に、プログラム言語として
C言語を用いた場合は、上記処理方法が用いられる。
の形で処理を行うようにコンパイルされたプログラムに
おける、新たなスタック領域が確保される際に、EBP
レジスタ等の値が呼出し側のスタック領域の上の部分に
保存されるときの処理方法である。このような処理方法
は、EBPレジスタ及びESPレジスタに相当するレジ
スタを備えたCPUを用いた計算機において一般的に用
いられている手法である。特に、プログラム言語として
C言語を用いた場合は、上記処理方法が用いられる。
【0015】
【発明が解決しようとする課題】ところで、上記処理方
法によりプログラムの処理がなされているとき、あるス
タック領域で、そのスタック領域の容量を越えてデータ
の書込みが行われた場合、メモリの上から下に向ってデ
ータの書込みが行われていくので、呼出し元のスタック
領域の内容が破壊されてしまうことになる。この場合、
呼出し元のスタック領域とは、呼出し元が例えば関数A
であれば、関数AのEBP領域34、関数Aへの戻り番
地33、関数Bを処理するためのパラメータ32及び関
数Aのスタック31からなる領域を示している。
法によりプログラムの処理がなされているとき、あるス
タック領域で、そのスタック領域の容量を越えてデータ
の書込みが行われた場合、メモリの上から下に向ってデ
ータの書込みが行われていくので、呼出し元のスタック
領域の内容が破壊されてしまうことになる。この場合、
呼出し元のスタック領域とは、呼出し元が例えば関数A
であれば、関数AのEBP領域34、関数Aへの戻り番
地33、関数Bを処理するためのパラメータ32及び関
数Aのスタック31からなる領域を示している。
【0016】図6は、関数Bのスタック35への書込み
により関数AのEBP領域34、関数Aへの戻り番地3
3、関数Bを処理するためのパラメータ32の内容が破
壊された場合を示す説明図である。
により関数AのEBP領域34、関数Aへの戻り番地3
3、関数Bを処理するためのパラメータ32の内容が破
壊された場合を示す説明図である。
【0017】この場合、関数Aへの戻り番地33が失わ
れているので、CPUは戻り番地を受け取ることができ
ず、関数Bからの戻りとして異常な番地に移行しようと
する。したがって、異常発生をすぐに検出することがで
きる。つまり、この場合は、関数Bに不具合があるとす
ぐに判明する。
れているので、CPUは戻り番地を受け取ることができ
ず、関数Bからの戻りとして異常な番地に移行しようと
する。したがって、異常発生をすぐに検出することがで
きる。つまり、この場合は、関数Bに不具合があるとす
ぐに判明する。
【0018】一方、関数Bのスタック35を越えて書込
みが行われる場合であっても、関数Aへの戻り番地33
が破壊されない場合もある。図7は、関数Bのスタック
35への書込みにより関数AのEBP領域34のみが破
壊された場合を示す説明図である。
みが行われる場合であっても、関数Aへの戻り番地33
が破壊されない場合もある。図7は、関数Bのスタック
35への書込みにより関数AのEBP領域34のみが破
壊された場合を示す説明図である。
【0019】図7に示すように、例えば1バイトのみ関
数Bのスタック35を越えてメモリの下側まで書込みが
行われたとき、関数AのEBP領域34の内容は異常値
となるが、関数Aへの戻り番地33及び関数Bを処理す
るためのパラメータ32の内容は正常なままである。
数Bのスタック35を越えてメモリの下側まで書込みが
行われたとき、関数AのEBP領域34の内容は異常値
となるが、関数Aへの戻り番地33及び関数Bを処理す
るためのパラメータ32の内容は正常なままである。
【0020】したがって、関数Bから関数Aに戻ると
き、EBPレジスタには異常な内容が入力されるが、関
数Aへの戻りそのものは正常に行われる。そして、関数
A内での処理は正常に続けられ、次に、EBPレジスタ
を使用するとき、例えば関数Aからさらに呼び出し元の
スタック領域に戻るなどのときに、初めてメモリアクセ
ス異常が発生し、異常が検出される。
き、EBPレジスタには異常な内容が入力されるが、関
数Aへの戻りそのものは正常に行われる。そして、関数
A内での処理は正常に続けられ、次に、EBPレジスタ
を使用するとき、例えば関数Aからさらに呼び出し元の
スタック領域に戻るなどのときに、初めてメモリアクセ
ス異常が発生し、異常が検出される。
【0021】このときの異常発生は、関数Aの処理中に
起こるので、プログラマは、関数Bに原因があって当該
異常が発生したと特定することは困難である。したがっ
て、異常発生原因すなわち関数Bの不具合の検出までに
かなりの時間及び労力が必要であり、さらに、習熟した
プログラマでなければ異常原因がわからない等の問題点
があった。
起こるので、プログラマは、関数Bに原因があって当該
異常が発生したと特定することは困難である。したがっ
て、異常発生原因すなわち関数Bの不具合の検出までに
かなりの時間及び労力が必要であり、さらに、習熟した
プログラマでなければ異常原因がわからない等の問題点
があった。
【0022】本発明は、このような実情を考慮してなさ
れたもので、呼出し元のスタック領域を破壊する異常な
関数等を呼び出したとき、当該関数等の異常を呼出し元
への戻り時に検出することを可能としたスタック領域破
壊検出機能付き計算機を提供することを目的とする。
れたもので、呼出し元のスタック領域を破壊する異常な
関数等を呼び出したとき、当該関数等の異常を呼出し元
への戻り時に検出することを可能としたスタック領域破
壊検出機能付き計算機を提供することを目的とする。
【0023】
【課題を解決するための手段】上記課題を解決するため
に、本発明は、計算機プログラムにおける一定の処理を
行うためのスタック領域をプログラムメモリ内で確保・
解放しながら動作し、また、プログラムの動作を保証す
るためにスタック領域の底部を指し示すベースポインタ
をCPU内のレジスタに記憶し、そして、あるスタック
領域での処理動作中に新たなスタック領域を確保する場
合、プログラムメモリ内におけるあるスタック領域と新
たなスタック領域との境界附近にあるスタック領域のベ
ースポインタを保存した後に新たなスタック領域を確保
し、さらに、新たなスタック領域の底部を指し示す新た
なベースポインタをレジスタに記憶させて新たなスタッ
ク領域でのプログラムにおける他の一定の処理を行い、
一方、プログラムの動作が新たなスタック領域からある
スタック領域に戻るときに、境界付近に保存されたベー
スポインタをレジスタに戻してからプログラムの動作を
継続させる計算機にあって、プログラムメモリ内の境界
付近とは異なる、あるスタック領域のベースポインタを
保存する補助保存手段と、プログラムの動作が新たなス
タック領域からあるスタック領域に戻ったときに、この
ときのレジスタ内容と補助保存手段の内容とを比較し
て、これらが一致しない場合、その旨を報知する比較報
知手段とを備えたスタック領域破壊検出機能付き計算機
である。
に、本発明は、計算機プログラムにおける一定の処理を
行うためのスタック領域をプログラムメモリ内で確保・
解放しながら動作し、また、プログラムの動作を保証す
るためにスタック領域の底部を指し示すベースポインタ
をCPU内のレジスタに記憶し、そして、あるスタック
領域での処理動作中に新たなスタック領域を確保する場
合、プログラムメモリ内におけるあるスタック領域と新
たなスタック領域との境界附近にあるスタック領域のベ
ースポインタを保存した後に新たなスタック領域を確保
し、さらに、新たなスタック領域の底部を指し示す新た
なベースポインタをレジスタに記憶させて新たなスタッ
ク領域でのプログラムにおける他の一定の処理を行い、
一方、プログラムの動作が新たなスタック領域からある
スタック領域に戻るときに、境界付近に保存されたベー
スポインタをレジスタに戻してからプログラムの動作を
継続させる計算機にあって、プログラムメモリ内の境界
付近とは異なる、あるスタック領域のベースポインタを
保存する補助保存手段と、プログラムの動作が新たなス
タック領域からあるスタック領域に戻ったときに、この
ときのレジスタ内容と補助保存手段の内容とを比較し
て、これらが一致しない場合、その旨を報知する比較報
知手段とを備えたスタック領域破壊検出機能付き計算機
である。
【0024】
【作用】したがって、まず、本発明のスタック領域破壊
検出機能付き計算機においては、計算機プログラムにお
ける一定の処理を行うためのスタック領域が必要に応じ
てプログラムメモリ内で確保・解放されて動作してい
る。
検出機能付き計算機においては、計算機プログラムにお
ける一定の処理を行うためのスタック領域が必要に応じ
てプログラムメモリ内で確保・解放されて動作してい
る。
【0025】このとき、スタック領域は、例えば関数を
実行するためのデータ入出力領域として用いられ、関数
の呼出し、戻り等に応じて確保・解放されている。そし
て、このスタック領域の確保・解放の際に、プログラム
の動作を保証するためのスタック領域の底部を指し示す
ベースポインタがCPU内のレジスタに対して入力され
ている。
実行するためのデータ入出力領域として用いられ、関数
の呼出し、戻り等に応じて確保・解放されている。そし
て、このスタック領域の確保・解放の際に、プログラム
の動作を保証するためのスタック領域の底部を指し示す
ベースポインタがCPU内のレジスタに対して入力され
ている。
【0026】例えば、あるスタック領域での処理動作中
に新たなスタック領域を確保する場合、すなわち他の関
数等を呼び出すとき、まず、プログラムメモリ内におけ
るあるスタック領域と新たなスタック領域との境界附近
に、このときにレジスタ内に記憶されている上記あるス
タック領域のベースポインタが保存される。
に新たなスタック領域を確保する場合、すなわち他の関
数等を呼び出すとき、まず、プログラムメモリ内におけ
るあるスタック領域と新たなスタック領域との境界附近
に、このときにレジスタ内に記憶されている上記あるス
タック領域のベースポインタが保存される。
【0027】次に、新たなスタック領域が確保され、新
たなスタック領域の底部を指し示す新たなベースポイン
タがレジスタに記憶されて、新たなスタック領域でのプ
ログラムにおける他の一定の処理、すなわち目的の関数
の実行が行われる。
たなスタック領域の底部を指し示す新たなベースポイン
タがレジスタに記憶されて、新たなスタック領域でのプ
ログラムにおける他の一定の処理、すなわち目的の関数
の実行が行われる。
【0028】一方、当該関数の実行が終了し、プログラ
ムの動作が新たなスタック領域からあるスタック領域に
戻るときには、上記境界付近に保存されたベースポイン
タを上記レジスタに戻してから呼出し元でのプログラム
動作が継続させる。
ムの動作が新たなスタック領域からあるスタック領域に
戻るときには、上記境界付近に保存されたベースポイン
タを上記レジスタに戻してから呼出し元でのプログラム
動作が継続させる。
【0029】上記計算機においては、呼び出された側の
新たなスタック領域を用いる関数等に、例えば確保され
たスタック領域の大きさを越えて書込みを行うような異
常があると、上記境界附近に保存されたベースポインタ
が破壊されてしまう。
新たなスタック領域を用いる関数等に、例えば確保され
たスタック領域の大きさを越えて書込みを行うような異
常があると、上記境界附近に保存されたベースポインタ
が破壊されてしまう。
【0030】そこで、本発明では、プログラムメモリ内
の境界付近のものとは異なる補助保存手段によって、上
記あるスタック領域のベースポインタが保存される。そ
して、プログラムの動作が新たなスタック領域からある
スタック領域に戻ったとき、比較報知手段によって、こ
のときのレジスタ内容と補助保存手段の内容とが比較さ
れ、これらが一致しない場合、その旨が報知される。し
たがって、プログラムの実行に際して、呼び出された関
数等による呼出し元のスタック領域破壊を容易に検出す
ることができる。
の境界付近のものとは異なる補助保存手段によって、上
記あるスタック領域のベースポインタが保存される。そ
して、プログラムの動作が新たなスタック領域からある
スタック領域に戻ったとき、比較報知手段によって、こ
のときのレジスタ内容と補助保存手段の内容とが比較さ
れ、これらが一致しない場合、その旨が報知される。し
たがって、プログラムの実行に際して、呼び出された関
数等による呼出し元のスタック領域破壊を容易に検出す
ることができる。
【0031】
【実施例】以下、本発明の実施例について説明する。図
1は本発明に係るスタック領域破壊検出機能付き計算機
の一実施例を示す構成図である。
1は本発明に係るスタック領域破壊検出機能付き計算機
の一実施例を示す構成図である。
【0032】このスタック領域破壊検出機能付き計算機
は、システムバス1に接続され、各種処理を行うCPU
2と、プログラム動作のためのプログラムメモリ3を少
なくとも保存するシステムバス1に接続されたメモリ4
と、その他の図示しない周辺要素とからなっている。
は、システムバス1に接続され、各種処理を行うCPU
2と、プログラム動作のためのプログラムメモリ3を少
なくとも保存するシステムバス1に接続されたメモリ4
と、その他の図示しない周辺要素とからなっている。
【0033】また、特にこだわらないかぎり、本計算機
を動作させるプログラムはC言語で記述されているもの
とする。CPU2には、EBPレジスタ5とESPレジ
スタ6とが具備されており、これらの各レジスタ5,6
は、従来例で説明した通り、それぞれベースポインタの
レジスタ及びスタックポインタのレジスタとして機能す
る。
を動作させるプログラムはC言語で記述されているもの
とする。CPU2には、EBPレジスタ5とESPレジ
スタ6とが具備されており、これらの各レジスタ5,6
は、従来例で説明した通り、それぞれベースポインタの
レジスタ及びスタックポインタのレジスタとして機能す
る。
【0034】プログラムメモリ3には、スタックAまで
のスタック部7と、スタックA部8と、スタックB部9
とが確保されており、これらの領域はメモリの下側から
順に確保されている。
のスタック部7と、スタックA部8と、スタックB部9
とが確保されており、これらの領域はメモリの下側から
順に確保されている。
【0035】なお、従来例で説明した通り、これらの各
スタック部、又、図示しないスタック部は、プログラム
の処理にしたがって確保、解放されるものである。ま
た、スタックA部8は、関数Aのスタック8aと、戻り
番地・パラメータ部8bと、スタックAのEBP保存部
8cとによって構成されている。
スタック部、又、図示しないスタック部は、プログラム
の処理にしたがって確保、解放されるものである。ま
た、スタックA部8は、関数Aのスタック8aと、戻り
番地・パラメータ部8bと、スタックAのEBP保存部
8cとによって構成されている。
【0036】ここで、関数Aのスタック8aは、従来例
の関数Aのスタック31に対応するものである。また、
戻り番地・パラメータ部8bは、従来例の関数Bを処理
するためのパラメータ32及び関数Aへの戻り番地33
と同様な構成を有するものである。さらに、スタックA
のEBP保存部8cも、従来例の関数AのEBP領域3
4と同様な構成を有する。
の関数Aのスタック31に対応するものである。また、
戻り番地・パラメータ部8bは、従来例の関数Bを処理
するためのパラメータ32及び関数Aへの戻り番地33
と同様な構成を有するものである。さらに、スタックA
のEBP保存部8cも、従来例の関数AのEBP領域3
4と同様な構成を有する。
【0037】また、スタックB部9も、関数Bのスタッ
ク9aにスタックA部8と同様な保存・比較・通知部1
0,11,12等を備え、また、図示しないその他のス
タック部も必要に応じてスタックA部8と同様な保存・
比較・通知部10,11,12等を備えている。なお、
これらの各スタックの構成状態は、プログラムの動作状
況によって決まる。
ク9aにスタックA部8と同様な保存・比較・通知部1
0,11,12等を備え、また、図示しないその他のス
タック部も必要に応じてスタックA部8と同様な保存・
比較・通知部10,11,12等を備えている。なお、
これらの各スタックの構成状態は、プログラムの動作状
況によって決まる。
【0038】ここで、関数Aのスタック8aには、EB
P取込・比較部10とチェック用EBP保存部11と異
常通知部12とが設けられている。なお、関数Bのスタ
ック9a等の他の各スタック部が存在する場合には同様
な構成が設けられる。
P取込・比較部10とチェック用EBP保存部11と異
常通知部12とが設けられている。なお、関数Bのスタ
ック9a等の他の各スタック部が存在する場合には同様
な構成が設けられる。
【0039】一方、スタックA部までのスタック部7に
は、EBPレジスタ読込部13が設けられている。EB
P取込・比較部10は、例えば関数Bのように新たなス
タック部を作成することになる関数等を呼び出す直前
に、そのときのEBPレジスタ5の内容,具体的にはア
ドレスA1を取り込み、チェック用EBP保存部11に
保存するようになっている。そして、関数B処理の終了
後、チェック用EBP保存部11の内容とEBPレジス
タ5の内容とを比較し、これらが一致していなければ異
常通知部12に通知されるようになっている。
は、EBPレジスタ読込部13が設けられている。EB
P取込・比較部10は、例えば関数Bのように新たなス
タック部を作成することになる関数等を呼び出す直前
に、そのときのEBPレジスタ5の内容,具体的にはア
ドレスA1を取り込み、チェック用EBP保存部11に
保存するようになっている。そして、関数B処理の終了
後、チェック用EBP保存部11の内容とEBPレジス
タ5の内容とを比較し、これらが一致していなければ異
常通知部12に通知されるようになっている。
【0040】図2は関数A内におけるEBP取込・比較
部10等の具体的なプログラム例を示す図である。つま
り、図2に示すように、プログラム行P1においてEB
Pレジスタ読込部13の一例であるGetEBP()を
用いて、チェック用EBP保存部11の一例であるSa
veEBPにEBPレジスタ5の内容を保存する。
部10等の具体的なプログラム例を示す図である。つま
り、図2に示すように、プログラム行P1においてEB
Pレジスタ読込部13の一例であるGetEBP()を
用いて、チェック用EBP保存部11の一例であるSa
veEBPにEBPレジスタ5の内容を保存する。
【0041】次のプログラム行P2において関数Bを実
行させ、関数B終了後、すなわち、EBPレジスタ5が
スタックAのEBP保存部8cの値を受け取った後に、
プログラム行P3の前段P3aにおいて、当該EBPレ
ジスタ5の内容(GetEBP())とチェック用EB
P保存部11の内容(SaveEBP)とを比較するよ
うになっている。そして、SaveEBP!=GetE
BP()すなわち、一致していなければ、異常通知部1
2の一例であるプログラム行P3の後段P3bを実行し
て、異常通知を出力する。
行させ、関数B終了後、すなわち、EBPレジスタ5が
スタックAのEBP保存部8cの値を受け取った後に、
プログラム行P3の前段P3aにおいて、当該EBPレ
ジスタ5の内容(GetEBP())とチェック用EB
P保存部11の内容(SaveEBP)とを比較するよ
うになっている。そして、SaveEBP!=GetE
BP()すなわち、一致していなければ、異常通知部1
2の一例であるプログラム行P3の後段P3bを実行し
て、異常通知を出力する。
【0042】一方、EBPレジスタ読込部13の一例と
しての関数GetEBP()は、アセンブラ言語で作成
されており、EBPレジスタ5の内容を読込めるように
なっている。ここで、アセンブラ言語で記述するのは、
CPU内のハードウェアレジスタの値をそのまま読込む
ためである。また、C言語へのインターフェースとして
は、この関数の戻り値がEBPレジスタを示すように設
計することにより、C言語ライクな関数として使用する
ことが可能となっている。
しての関数GetEBP()は、アセンブラ言語で作成
されており、EBPレジスタ5の内容を読込めるように
なっている。ここで、アセンブラ言語で記述するのは、
CPU内のハードウェアレジスタの値をそのまま読込む
ためである。また、C言語へのインターフェースとして
は、この関数の戻り値がEBPレジスタを示すように設
計することにより、C言語ライクな関数として使用する
ことが可能となっている。
【0043】図3はEBPレジスタ読込部13の具体的
なプログラム例を示す図である。また、図1において
は、EBPレジスタ読込部13は、スタックAまでのス
タック部7に設けられているとしたが、例えば他領域に
あるスタック部として設けられてもよい。つまり、EB
Pレジスタ読込部13は、関数B等の書込みによって破
壊されない領域に設けられていればよい。
なプログラム例を示す図である。また、図1において
は、EBPレジスタ読込部13は、スタックAまでのス
タック部7に設けられているとしたが、例えば他領域に
あるスタック部として設けられてもよい。つまり、EB
Pレジスタ読込部13は、関数B等の書込みによって破
壊されない領域に設けられていればよい。
【0044】なお、EBPレジスタ読込部13とチェッ
ク用EBP保存部11とによって補助保存手段の一例が
構成されており、EBP取込・比較部10と異常通知部
12とによって比較報知手段の一例が構成されている。
ク用EBP保存部11とによって補助保存手段の一例が
構成されており、EBP取込・比較部10と異常通知部
12とによって比較報知手段の一例が構成されている。
【0045】次に、以上のように構成された本実施例の
スタック領域破壊検出機能付き計算機の動作について説
明する。図4は本実施例の動作を示す流れ図である。
スタック領域破壊検出機能付き計算機の動作について説
明する。図4は本実施例の動作を示す流れ図である。
【0046】図4において、まず、関数Aが実行されて
いる(ST1)。次に、関数Aの実行中で関数Bを呼び
出したいとき、呼び出し前にEBPレジスタ5の内容を
読込みチェック用EBP保存部11に保存する(ST
2)。
いる(ST1)。次に、関数Aの実行中で関数Bを呼び
出したいとき、呼び出し前にEBPレジスタ5の内容を
読込みチェック用EBP保存部11に保存する(ST
2)。
【0047】そして、関数Bを実行する(ST3)が、
関数Bのスタック9aを確保するときに、従来例で説明
したように、関数Aのスタック8aの上に関数Aへの戻
り番地等及び関数AのEBPがそれぞれ戻り番地・パラ
メータ部8b及びスタックAのEBP保存部8cに保存
される。
関数Bのスタック9aを確保するときに、従来例で説明
したように、関数Aのスタック8aの上に関数Aへの戻
り番地等及び関数AのEBPがそれぞれ戻り番地・パラ
メータ部8b及びスタックAのEBP保存部8cに保存
される。
【0048】関数Bの実行が終了するとき、スタックA
のEBP保存部8cの値がEBPレジスタ5に入力され
る。そこで、関数A内のEBP取込・比較部10は、関
数Aの処理を再開する前に、このときのEBPレジスタ
5の内容を読込み(ST4)、これを先に保存しておい
た関数Aのスタック8aのチェック用EBP保存部11
の内容と比較する(ST5)。
のEBP保存部8cの値がEBPレジスタ5に入力され
る。そこで、関数A内のEBP取込・比較部10は、関
数Aの処理を再開する前に、このときのEBPレジスタ
5の内容を読込み(ST4)、これを先に保存しておい
た関数Aのスタック8aのチェック用EBP保存部11
の内容と比較する(ST5)。
【0049】ここで、当該EBPレジスタ5の内容とチ
ェック用EBP保存部11の内容とが異なっていれば、
少なくともスタックAのEBP保存部8cの内容が破壊
されていると判定できるので、関数Bは、呼出し元のス
タック領域を破壊する異常な関数である旨の通知を行う
(ST6)。
ェック用EBP保存部11の内容とが異なっていれば、
少なくともスタックAのEBP保存部8cの内容が破壊
されていると判定できるので、関数Bは、呼出し元のス
タック領域を破壊する異常な関数である旨の通知を行う
(ST6)。
【0050】一方、上記各内容が同じであれば、呼出し
元のスタック領域は破壊されていないので、処理を継続
する(ST7)。上述したように、本実施例によるスタ
ック領域破壊検出機能付き計算機は、新たなスタック部
として関数Bのスタック9aを確保する際に、EBPレ
ジスタ読込部13によって、スタックAのEBP保存部
8cとは別のチェック用EBP保存部11にEBPレジ
スタ5の内容を保存し、関数Bから関数Aに戻った直後
に、EBP取込・比較部10によって、スタックAのE
BP保存部8cの内容を戻されたEBPレジスタ5内容
とチェック用EBP保存部11内容とを比較し、両者が
一致しないときには、異常通知部12とによってその旨
を報知するようにしたので、呼出し元のスタック領域を
破壊する異常な関数が呼び出したとき、この異常な関数
を検出し、呼出し元スタック領域が破壊されたことを通
知することができる。
元のスタック領域は破壊されていないので、処理を継続
する(ST7)。上述したように、本実施例によるスタ
ック領域破壊検出機能付き計算機は、新たなスタック部
として関数Bのスタック9aを確保する際に、EBPレ
ジスタ読込部13によって、スタックAのEBP保存部
8cとは別のチェック用EBP保存部11にEBPレジ
スタ5の内容を保存し、関数Bから関数Aに戻った直後
に、EBP取込・比較部10によって、スタックAのE
BP保存部8cの内容を戻されたEBPレジスタ5内容
とチェック用EBP保存部11内容とを比較し、両者が
一致しないときには、異常通知部12とによってその旨
を報知するようにしたので、呼出し元のスタック領域を
破壊する異常な関数が呼び出したとき、この異常な関数
を検出し、呼出し元スタック領域が破壊されたことを通
知することができる。
【0051】また、図2、図3のプログラム例に示すよ
うに、上記各手段は非常に短いプログラムで実現できる
ので、プログラム実行速度をあまり落とすことなく、上
記機能を実現することができる。特に、EBPレジスタ
読込部13は、アセンブラ言語で記述することにより、
機械語の2命令しか必要とせず、プログラム実行速度に
対する悪影響はほとんどない。
うに、上記各手段は非常に短いプログラムで実現できる
ので、プログラム実行速度をあまり落とすことなく、上
記機能を実現することができる。特に、EBPレジスタ
読込部13は、アセンブラ言語で記述することにより、
機械語の2命令しか必要とせず、プログラム実行速度に
対する悪影響はほとんどない。
【0052】したがって、上記異常を起こす関数等を少
ない労力でかつ短時間で検出することができる。さら
に、本実施例の装置を用いれば、習熟度の低いプログラ
マであってもの容易に当該異常を検出することができ
る。
ない労力でかつ短時間で検出することができる。さら
に、本実施例の装置を用いれば、習熟度の低いプログラ
マであってもの容易に当該異常を検出することができ
る。
【0053】また、本実施例においては、EBPレジス
タ読込部13をアセンブラ言語で作成したが、プログラ
マの便宜を図るためC言語で作成してもよい。この場
合、プログラム全体が、プログラマにとって扱い易いも
のとなる。
タ読込部13をアセンブラ言語で作成したが、プログラ
マの便宜を図るためC言語で作成してもよい。この場
合、プログラム全体が、プログラマにとって扱い易いも
のとなる。
【0054】さらに、本実施例においては、異常通知部
12をスタックA部8内に設けたが、これは、スタック
Aまでのスタック部7等の他の記憶領域に設けてもよ
く、関数を呼び出す形で処理してもよい。なお、本発明
は、上記各実施例に限定されるものでなく、その要旨を
逸脱しない範囲で種々に変形することが可能である。
12をスタックA部8内に設けたが、これは、スタック
Aまでのスタック部7等の他の記憶領域に設けてもよ
く、関数を呼び出す形で処理してもよい。なお、本発明
は、上記各実施例に限定されるものでなく、その要旨を
逸脱しない範囲で種々に変形することが可能である。
【0055】
【発明の効果】以上詳記したように本発明によれば、E
BPレジスタの内容をEBP保存部とは別の他の保存部
に記憶し、関数戻り時に両者を比較するようにしたの
で、呼出し元のスタック領域を破壊する異常な関数等を
呼び出したとき、当該関数等の異常を呼出し元への戻り
時に検出することを可能としたスタック領域破壊検出機
能付き計算機を提供する。
BPレジスタの内容をEBP保存部とは別の他の保存部
に記憶し、関数戻り時に両者を比較するようにしたの
で、呼出し元のスタック領域を破壊する異常な関数等を
呼び出したとき、当該関数等の異常を呼出し元への戻り
時に検出することを可能としたスタック領域破壊検出機
能付き計算機を提供する。
【図1】本発明に係るスタック領域破壊検出機能付き計
算機の一実施例を示す構成図。
算機の一実施例を示す構成図。
【図2】同実施例における関数A内におけるEBP取込
・比較部の具体的なプログラム例を示す図。
・比較部の具体的なプログラム例を示す図。
【図3】同実施例におけるEBPレジスタ読込部の具体
的なプログラム例を示す図。
的なプログラム例を示す図。
【図4】同実施例の動作を示す流れ図。
【図5】従来の計算機におけるスタック領域の確保・解
放を伴うプログラム処理の進行を説明する図。
放を伴うプログラム処理の進行を説明する図。
【図6】従来の計算機における関数Bのスタックへの書
込みによる関数Aについてのスタック領域の一部が破壊
された場合を示す説明図。
込みによる関数Aについてのスタック領域の一部が破壊
された場合を示す説明図。
【図7】従来の計算機における関数Bのスタックへの書
込みによる関数AのEBP領域のみが破壊された場合を
示す説明図。
込みによる関数AのEBP領域のみが破壊された場合を
示す説明図。
1…システムバス、2…CPU、3…プログラムメモ
リ、5…EBPレジスタ、6…ESPレジスタ、7…ス
タックAまでのスタック部、8…スタックA部、9…ス
タックB部、10…EBP取込・比較部、11…チェッ
ク用EBP保存部、12…異常通知部、13…EBPレ
ジスタ読込部。
リ、5…EBPレジスタ、6…ESPレジスタ、7…ス
タックAまでのスタック部、8…スタックA部、9…ス
タックB部、10…EBP取込・比較部、11…チェッ
ク用EBP保存部、12…異常通知部、13…EBPレ
ジスタ読込部。
Claims (1)
- 【請求項1】 計算機プログラムにおける一定の処理を
行うためのスタック領域をプログラムメモリ内で確保・
解放しながら動作し、また、前記プログラムの動作を保
証するために前記スタック領域の底部を指し示すベース
ポインタをCPU内のレジスタに記憶し、そして、ある
スタック領域での処理動作中に新たなスタック領域を確
保する場合、前記プログラムメモリ内における前記ある
スタック領域と前記新たなスタック領域との境界附近に
前記あるスタック領域のベースポインタを保存した後に
前記新たなスタック領域を確保し、さらに、前記新たな
スタック領域の底部を指し示す新たなベースポインタを
前記レジスタに記憶させて前記新たなスタック領域での
前記プログラムにおける他の一定の処理を行い、一方、
前記プログラムの動作が前記新たなスタック領域から前
記あるスタック領域に戻るときに、前記境界付近に保存
されたベースポインタを前記レジスタに戻してから前記
プログラムの動作を継続させる計算機にあって、 前記プログラムメモリ内の前記境界付近とは異なる、前
記あるスタック領域のベースポインタを保存する補助保
存手段と、 前記プログラムの動作が前記新たなスタック領域から前
記あるスタック領域に戻ったときに、このときの前記レ
ジスタ内容と前記補助保存手段の内容とを比較して、こ
れらが一致しない場合、その旨を報知する比較報知手段
とを備えたことを特徴とするスタック領域破壊検出機能
付き計算機。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP7052951A JPH08249206A (ja) | 1995-03-13 | 1995-03-13 | スタック領域破壊検出機能付き計算機 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP7052951A JPH08249206A (ja) | 1995-03-13 | 1995-03-13 | スタック領域破壊検出機能付き計算機 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH08249206A true JPH08249206A (ja) | 1996-09-27 |
Family
ID=12929197
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP7052951A Pending JPH08249206A (ja) | 1995-03-13 | 1995-03-13 | スタック領域破壊検出機能付き計算機 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH08249206A (ja) |
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2007148529A (ja) * | 2005-11-24 | 2007-06-14 | Nippon Telegr & Teleph Corp <Ntt> | バッファオーバーフロー検知装置、バッファオーバーフロー検知方法およびバッファオーバーフロー検知プログラム |
| JP2010198147A (ja) * | 2009-02-24 | 2010-09-09 | Mitsubishi Heavy Ind Ltd | コンピュータメモリにおけるスタック領域のデータの保護方法 |
| JP2012216111A (ja) * | 2011-04-01 | 2012-11-08 | Silex Technology Inc | ディレクトリ走査プログラム |
| JP2020533683A (ja) * | 2017-09-15 | 2020-11-19 | エイアールエム リミテッド | コール・パス依存認証 |
-
1995
- 1995-03-13 JP JP7052951A patent/JPH08249206A/ja active Pending
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2007148529A (ja) * | 2005-11-24 | 2007-06-14 | Nippon Telegr & Teleph Corp <Ntt> | バッファオーバーフロー検知装置、バッファオーバーフロー検知方法およびバッファオーバーフロー検知プログラム |
| JP2010198147A (ja) * | 2009-02-24 | 2010-09-09 | Mitsubishi Heavy Ind Ltd | コンピュータメモリにおけるスタック領域のデータの保護方法 |
| JP2012216111A (ja) * | 2011-04-01 | 2012-11-08 | Silex Technology Inc | ディレクトリ走査プログラム |
| JP2020533683A (ja) * | 2017-09-15 | 2020-11-19 | エイアールエム リミテッド | コール・パス依存認証 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| KR101782313B1 (ko) | 예외 이벤트 처리 장치 및 방법 | |
| CN101446918A (zh) | 一种实现用户态调试器调试单个函数的方法及系统 | |
| JPH0682320B2 (ja) | データ処理装置 | |
| JPS62226234A (ja) | スタツクポインタ制御回路 | |
| JPH08249206A (ja) | スタック領域破壊検出機能付き計算機 | |
| JPH10214203A (ja) | 情報処理装置 | |
| JP2001265620A (ja) | Romのプログラムデバッグ方式 | |
| JP3810805B2 (ja) | 情報修正システム | |
| JP2001306334A (ja) | エミュレーション装置 | |
| JP2671160B2 (ja) | 例外処理方式 | |
| JP2009230479A (ja) | マイクロプロセッサ | |
| JPS61141047A (ja) | 障害情報の退避方式 | |
| JP3263999B2 (ja) | プログラム内容解析装置 | |
| JP2663895B2 (ja) | Cpuシミュレータ | |
| JP3988740B2 (ja) | 並列処理装置、命令再試行方法、およびプログラム | |
| JP2004287618A (ja) | オペレーティングシステム起動制御方法、およびその方法をコンピュータに実行させるプログラム、ならびにオペレーティングシステム起動制御装置 | |
| JPH0782460B2 (ja) | 記録媒体のチェック方法 | |
| JPH1021067A (ja) | プログラムの動的修正方法 | |
| RU2393530C2 (ru) | Способ формирования дамп файла | |
| JPH0744398A (ja) | 情報処理装置 | |
| JPH05334118A (ja) | プログラム割込み原因となるプログラムステップの事前検出方式 | |
| US7131118B2 (en) | Write-through caching a JAVA® local variable within a register of a register bank | |
| JPH09160800A (ja) | エミュレータ | |
| JPH02178749A (ja) | 仮想記憶計算システムのページ不在割込制御方式 | |
| JPH1139159A (ja) | 計算機システム |