(57)【要約】【課題】ソフトウェアの脆弱性を利用した攻撃によるリターンアドレスの改ざんを検知して不正なプログラムの実行を防止すること。【解決手段】本発明は、変換対象プログラムに含まれる関数呼び出し命令と次の命令の間に、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを挿入する。実行時に識別ラベルの絶対アドレスを算出して、保持するように変換対象プログラムを変換する。さらに、実行時にリターン命令がリターン先として指し示すアドレスが、リターンすべきアドレス（算出して保持している変換対象プログラム実行時の識別ラベルの絶対アドレス）と一致しているかを判定して一致する場合には識別ラベルにジャンプし、一致しない場合にはプログラムを終了させるように変換対象プログラムを変換することで、リターンアドレスの改ざんを検知して不正なプログラムの実行を未然に防止する。【選択図】図１
2020027512.tif 000002
【特許請求の範囲】
【請求項１】
リターンアドレスの改ざんを検知して停止するようにプログラムを変換する変換装置であって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成部と、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入部と、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入部と、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え部と、
前記変換対象プログラムに、前記リターンアドレスチェック命令を生成し、挿入する、リターンアドレスチェック命令生成挿入部と、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得部と、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得部に前記識別ラベルアドレスの再取得を命令し、前記リターンアドレスチェック命令生成挿入部に前記リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新部と、
を備えることを特徴とする変換装置
【請求項２】
前記リターンアドレスチェック命令生成挿入部が生成する前記リターンアドレスチェック命令は、変換対象プログラム実行時に、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルが記述されたファイルが位置独立コード化されている場合には前記識別ラベルが記述されたファイルの開始アドレスに前記識別ラベルのオフセット値を取得して加算することで、位置独立コード化されていない場合には識別ラベルのアドレスを取得することで、リターンすべきアドレスを算出する、
ことを特徴とする請求項１に記載の変換装置
【請求項３】
前記識別ラベル生成挿入部は、検出した関数呼び出し命令が呼び出す関数が標準関数である場合には、前記標準関数を呼び出す命令を、前記標準関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルの実行時のアドレスを取得してレジスタに格納する命令及び前記標準関数に分岐する命令に書き換え、前記標準関数に分岐する命令と次の命令との間に前記識別ラベルを挿入する処理を、
前記リターンアドレスチェック命令生成挿入部は、前記標準関数の処理が終了した後に前記識別ラベル生成挿入部がレジスタに格納したアドレスへリターンする命令を生成し、変換対象プログラムに挿入する処理を、
更に備えることを特徴とする請求項１又は請求項２に記載の変換装置
【請求項４】
コンピュータに、
リターンアドレスの改ざんを検知して停止するようにプログラムの変換を実行させる変換プログラムであって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成処理ステップと、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入処理ステップと、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入処理ステップと、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え処理ステップと、
前記変換対象プログラムに、前記リターンアドレスチェック命令を生成し、挿入する、リターンアドレスチェック命令生成挿入処理ステップと、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得処理ステップと、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得部に前記識別ラベルアドレスの再取得を命令し、前記リターンアドレスチェック命令生成挿入部に前記リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新処理ステップと、
を実行させる変換プログラム
【請求項５】
リターンアドレスの改ざんを検知して停止するようにプログラムを変換するプログラム変換方法であって、
リターンアドレスの改ざんを検知して停止するようにプログラムの変換を実行させる変換プログラムであって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成処理ステップと、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入処理ステップと、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入処理ステップと、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え処理ステップと、
前記変換対象プログラムに、前記リターンアドレスチェック命令を生成し、挿入する、リターンアドレスチェック命令生成挿入処理ステップと、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得処理ステップと、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得部に前記識別ラベルアドレスの再取得を命令し、前記リターンアドレスチェック命令生成挿入部に前記リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新処理ステップと、
をコンピュータが実行するプログラム変換方法
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの脆弱性を利用した攻撃によるリターンアドレスの改ざんを検知して不正なプログラムの実行を防止する技術に関するものである。
【背景技術】
【０００２】
不正なプログラムをコンピュータにおいて実行することによる情報流出が問題となっている。これらの不正なプログラムは、ソフトウェアの脆弱性を利用するものが多い。
【０００３】
代表的な例としてバッファオーバーフロー攻撃がある。コンピュータでのプログラムの動作において関数が呼び出される際には、当該関数の呼び出し元へ戻ることを可能とするために、リターンアドレスがレジスタ又はメモリ上のスタック領域に格納されるが、関数の脆弱性を利用してスタック領域上のリターンアドレスを不正なアドレスに上書きする攻撃がよく知られている。
【０００４】
特許文献１には、バッファオーバーフローの発生を防ぐようにプログラムを変換する変換装置が記載されている。
【０００５】
特許文献２には、バッファオーバーフローによる不正なプログラムの実行を防止する手段を備えるプロセッサが記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許第５８２０７５４号公報
【特許文献２】特許第５７７７８４３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、バッファオーバーフロー攻撃以外にもソフトウェアの脆弱性を利用して、リターンアドレスを不正なアドレスに書き換える攻撃が存在する。例えば、共有ライブラリが位置独立コード化されていると、実行可能ファイルの実行時に動的リンクによってその絶対アドレスが解決されるために、特許文献１及び特許文献２に記載された発明では、いずれも主処理で呼び出されるプログラムを指し示す絶対アドレスが主処理の実行前にすべて判明していることを前提としているためにリターンアドレスを不正なアドレスに書き換えられたとしても対応ができない。
【０００８】
リターンアドレスをレジスタに退避するとの手段も考えられるが、ハードウェア資源には限界があるため、ソフトウェアによる解決手段が求められる。
【０００９】
本発明は、このような事情を鑑みてなされたものであり、前述の課題を解決しつつ、ソフトウェアの脆弱性を利用した攻撃によるリターンアドレスの改ざんを検知して不正なプログラムの実行を防止する変換装置、変換プログラム、プログラム変換方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明である変換装置、変換プログラム及びコンピュータを用いたプログラム変換方法は、次の仕組みを実現するように変換対象プログラムを変換することで、前述の課題を解決する。
【００１１】
（仕組み）
本発明は、変換対象プログラムに含まれる関数呼び出し命令と次の命令との間に、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを挿入する。実行時に識別ラベルの絶対アドレスを算出して、保持するように変換対象プログラムを変換する。さらに、実行時にリターン命令がリターン先として指し示すアドレスが、リターンすべきアドレス（算出して保持している変換対象プログラム実行時の識別ラベルの絶対アドレス）と一致しているかを判定して一致する場合にはそのままリターン（識別ラベルにジャンプ）し、一致しない場合にはプログラムを終了させるように変換対象プログラムを変換する。
【００１２】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成することを特徴とする。
【００１３】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムの開始アドレス及び変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、変換対象プログラムの実行開始直後に、変換対象プログラムから、この命令を呼び出すことができるように変換対象プログラムに挿入することを特徴とする。なお、本願書面においては、「変換対象プログラムの開始アドレス及び変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令」を「ロードアドレス算出命令」と記述する。以下において同様である。
【００１４】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムに含まれる関数呼び出し命令を検出し、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した関数呼び出し命令と次の命令との間に識別ラベルを挿入することを特徴とする。
【００１５】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムに含まれるリターン命令を検出し、検出したリターン命令を、変換対象プログラム実行時にリターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には変換対象プログラムを終了させるリターンアドレスチェック命令へ分岐する命令、に書き換えることを特徴とする。なお、本願書面においては、「変換対象プログラム実行時にリターン命令がリターン先として指し示すアドレスが識別ラベルアドレスから算出したリターンすべきアドレスと一致しているかを判定して一致しない場合には変換対象プログラムを終了させる命令」を「リターンアドレスチェック命令」と記述する。以下において同様である。
【００１６】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムに、リターンアドレスチェック命令を生成し、挿入することを特徴とする。
【００１７】
前述の仕組みを実現して課題を解決するために、本発明は、識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて識別ラベルアドレスとして保持することを特徴とする。
【００１８】
前述の仕組みを実現して課題を解決するために、本発明は、変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、識別ラベルアドレスの再取得を命令し、リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なうことを特徴とする。
【発明の効果】
【００１９】
以上のように本発明によれば、前述の課題を解決して、ソフトウェアの脆弱性を利用した攻撃によるリターンアドレスの改ざんを検知して不正なプログラムの実行を防止することができる。
【図面の簡単な説明】
【００２０】
【図１】変換装置の構成例を示すブロック図である。
【図２】変換装置のハードウェア構成である。
【図３】変換装置の動作を示すフローチャートである。
【図４】関係情報の例を模式的に示した図である。
【図５】メモリマップの例である。
【図６】シンボル名調査のフローチャートである。
【図７】ロードアドレス算出命令挿入処理を示すフローチャートである。
【図８】ロードアドレス算出命令によって実行される処理フローである。
【図９】変換された後の変換対象プログラムの動作の概要を説明する図である。
【図１０】識別ラベル生成挿入処理とリターン命令書き換え処理を示すフローチャートである。
【図１１】識別ラベル出力処理を示すフローチャートである。
【図１２】リターンアドレスチェック命令生成挿入処理を示すフローチャートである。
【図１３】リターンアドレスチェック命令の生成について説明するフローチャートである。
【図１４】識別ラベルアドレス取得処理を示すフローチャートである。
【図１５】リターンアドレスチェック命令更新処理を示すフローチャートである。
【図１６】リターンアドレス更新についての詳細を示すフローチャートである。
【図１７】第２実施形態での識別ラベル生成挿入処理を示すフローチャートである。
【図１８】標準ライブラリ関数識別ラベル出力について示すフローチャートである。
【図１９】第２実施形態でのリターンアドレスチェック命令生成挿入処理を示すフローチャートである。
【図２０】標準関数コール部生成出力処理を示すフローチャートである。
【発明を実施するための形態】
【００２１】
本発明の実施の形態について図面を参照して説明する。なお、各図において同一又は相当部分には同一の符号を付し、重複する説明を省略する。
【００２２】
（第１実施形態）
本実施形態に係る変換装置は、ソフトウェアの脆弱性を利用した攻撃によるリターンアドレスの改ざんを検知して停止するようにプログラムを変換する変換装置である。
【００２３】
図１は、本実施形態による変換装置１０の構成を示すブロック図である。図１に示すように、変換装置１０は、関係情報生成部１００、ロードアドレス算出命令挿入部１１０、コンパイラ１２０、識別ラベル生成挿入部１３０、リターン命令書き換え部１４０、識別ラベルアドレス取得部１５０、リターンアドレスチェック命令生成挿入部１６０、リターンアドレスチェック命令更新部１７０を備えている。
【００２４】
関係情報生成部１００は、変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する機能を有している。
【００２５】
ロードアドレス算出命令挿入部１１０は、ロードアドレス算出命令を、変換対象プログラムの実行開始直後に、変換対象プログラムから、この命令を呼び出すことができるように変換対象プログラムに挿入する機能を有している。
【００２６】
コンパイラ１２０は、変換対象プログラムのソースプログラムを実行可能ファイル及び共有ライブラリなどのオブジェクトファイルまたはアセンブリプログラムに変換する。
【００２７】
識別ラベル生成挿入部１３０は、変換対象プログラムに含まれる関数呼び出し命令を検出し、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した関数呼び出し命令と次の命令との間に識別ラベルを挿入する機能を有している。
【００２８】
リターン命令書き換え部１４０は、変換対象プログラムに含まれるリターン命令を検出し、検出したリターン命令を、リターンアドレスチェック命令へ分岐する命令、に書き換える機能を有している。
【００２９】
リターンアドレスチェック命令生成挿入部１６０は、変換対象プログラムに、リターンアドレスチェック命令を生成し、挿入する機能を有している。
【００３０】
識別ラベルアドレス取得部１５０は、オブジェクトファイルから識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて識別ラベルアドレスとして保持する機能を有している。
【００３１】
リターンアドレスチェック命令更新部１７０は、変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、識別ラベルアドレスの再取得を命令し、リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう機能を有している。
【００３２】
図１に示す変換装置１０は、図２に示すハードウェア構成２０を有する。図２に示すように、変換装置１０は、物理的には、中央演算装置（ＣＰＵ）２１０、入力装置２２０、出力装置２３０、主記憶装置（ＲＡＭ／ＲＯＭ）２４０、補助記憶装置２５０等を含むコンピュータシステムとして構成される。また、一時的な記憶回路としてＣＰＵ内に複数のレジスタ２６０を有する。
【００３３】
変換装置１０の各機能は、図２に示す中央演算装置（ＣＰＵ）２１０、主記憶装置（ＲＡＭ／ＲＯＭ）２４０等に所定のコンピュータソフトウェアを読み込ませることにより、中央演算装置（ＣＰＵ）２１０の制御により入力装置２２０、出力装置２３０を動作させるとともに、主記憶装置（ＲＡＭ／ＲＯＭ）２４０、補助記憶装置２５０とデータの読み書きを行うことで実現される。
【００３４】
次に、本実施形態に係る変換装置１０の動作について説明する。図３は、本実施形態に係る変換装置１０の動作を示すフローチャートである。図３に示すように変換装置１０が行う処理は、情報取得処理ブロックＢ１０、命令生成挿入処理ブロックＢ２０、チェック処理ブロックＢ３０の３つのブロックに大別される。なお、説明理解の容易性を考慮して、以下では、オペレーションシステムとしてＬｉｎｕｘ（登録商標）、プログラミング言語としてＣ言語、コンパイラとしてＧＮＵコンパイラコレクション（以下、ＧＣＣ）、及び、コンパイラが生成するファイル形式としてＥＬＦを使用するものとして説明するが、コンピュータが同様の挙動をとる環境であれば同じである。
【００３５】
変換装置１０は、例えば、変換対象プログラム及び変換対象プログラムにリンクされるプログラムをプロセス空間にロードした後に明示的に動作の開始を指示するなどによって、図３に示す動作を開始する。
【００３６】
図３に示すフローチャートに従って、本実施形態に係る変換装置１０の動作について説明する。
【００３７】
変換装置１０の動作の開始にあたっては、変換装置１０に対して変換対象プログラムを指定する。変換装置１０で起動する変換プログラムに引数として、変換対象プログラムであるすべての実行可能ファイルのディレクトリフルパス、変換対象プログラムであるすべての実行可能ファイルのソースファイルのディレクトリフルパスを与えることで指定する。また、実行可能ファイルにリンクされ、かつ変換対象プログラムであるすべての共有ライブラリについても、同様に、オブジェクトファイルのディレクトリフルパス、ソースファイルのディレクトリフルパスを引数として与える。このように引数を与える理由は、同一の共有ライブラリが複数の実行可能ファイルとリンクされる可能性があるため、共有ライブラリ内の関数に対するリターンアドレスチェック命令に不足が生じないようにするためである。
【００３８】
変換装置１０は、図３のＳ３０１に示すように、前述の通り指定された変換対象プログラムであるすべての実行可能ファイルについて、順順次変換処理を行う。変換装置１０の動作開始時に与えられる変換対象プログラムの実行可能なファイルが存在するディレクトリフルパス情報を引き継いで以下の処理を行う。まず、情報取得処理ブロックＢ１０の処理から説明する。
【００３９】
関係情報生成部１００が、関係情報生成処理（Ｓ３０３）を行う。関係情報生成処理（Ｓ３０３）は、変換対象プログラムを構成する実行可能ファイルまたは共有ライブラリなどのオブジェクトファイルについて、ソースファイルの存在するディレクトリと、個々のソースファイルに対応するオブジェクトファイル（以下、構成オブジェクトファイルという）と、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する処理である。
【００４０】
図４は、以降の説明理解を容易とするために、関係情報生成部１００が関係情報生成処理（Ｓ３０３）を行うことで生成する関係情報の例を模式的に示した図である。図４に示す関係情報を例にして関係情報生成処理（Ｓ３０３）について説明する。
【００４１】
関係情報生成部１００は、メモリマップを取得する。メモリマップとは、オペレーティングシステムのカーネルにおいてプロセスの状態を示すデータ構造の情報をマッピングしたファイルである。メモリマップによってプロセス空間の各領域の正確な開始アドレスを得ることができる。例えば、Ｌｉｎｕｘ（登録商標）では、／ｐｒｏｃディレクトリ配下にプロセスＩＤごとに存在する。プロセスＩＤは、Ｃ言語ではｇｅｔｐｉｄ関数によって取得できる。
【００４２】
図５に、メモリマップの例を示す。符号ａに開始アドレスが、符号ｂに終了アドレスが、符号ｃにアクセス権限が、符号ｄにフルパスが示される。実行可能ファイル（符号ｅ）と共有ライブラリ（符号ｆ）は、いずれもアクセス権限（符号ｃ）がｒ−ｘｐ（読み込み可、書き込み不可、実行可）であることから識別ができる。
【００４３】
関係情報生成部１００は、取得したメモリマップからアクセス権限（符号ｃ）がｒ−ｘｐであるオブジェクトファイルについて、フルパス（符号ｄ）を抽出して、図４に示すオブジェクトファイル配列を生成する。なお、アクセス権限（符号ｃ）がｒ−ｘｐであってもローダなどチェックの必要がないオブジェクトファイルについて、処理の効率化を図るために抽出対象から除外してもよい。
【００４４】
関係情報生成部１００は、生成したオブジェクトファイル配列４０について、引数として与えられた変換対象プログラムである実行可能ファイルのディレクトリフルパス、ソースファイルのディレクトリフルパス、及び、実行可能ファイルにリンクされ、かつ、変換対象プログラムである共有ライブラリについてのオブジェクトファイルのディレクトリフルパス、ソースファイルのディレクトリフルパスを利用してソースファイルディレクトリと関係づける処理を行う。これにより、図４に示すオブジェクトファイル配列４０とソースファイルディレクトリ４１の関係づけが行われる。
【００４５】
次に、関係情報生成部１００は、図４に示す関係情報を生成するためにシンボル名調査を行う。関係情報生成部１００は、図４に示すソースファイルディレクトリ４１について、順次、図６にフローチャートで示されるシンボル名調査を実行する。ソースファイルディレクトリ４１について、ディレクトリ内の要素がなくなるまで（Ｓ６０１）処理を実行する。
【００４６】
Ｓ６０３の処理では、要素がディレクトリかどうかを判定する。要素がディレクトリであった場合には当該ディレクトリ内についてもシンボル名調査を行う必要があることから、当該ディレクトリについてのシンボル名調査処理（Ｓ６０５）を実行する。要素がディレクトリでない場合にはＳ６０７の判定処理に移行する。
【００４７】
Ｓ６０７の処理では、要素がオブジェクトファイルかどうかを判定する。ファイル名の拡張子が．ｏである場合、オブジェクトファイルと判定する。要素がオブジェクトファイルであると判定した場合には、構成オブジェクトファイル４２として図４に示すようにソースファイルディレクトリ４１と関係づける。その後、Ｓ６０９の処理に移行する。要素がオブジェクトファイルでないと判定した場合にはディレクトリ内の次の要素に移行する。
【００４８】
Ｓ６０９の処理では、シンボルを取得する。Ｌｉｎｕｘ（登録商標）ではｎｍコマンドによってシンボルを取得できる。取得したシンボル名４３を図４に示すように構成オブジェクトファイル４２と関係づける処理（Ｓ６１１）を行う。
【００４９】
ディレクトリ内の要素がなくなったら処理を終了する。
【００５０】
関係情報生成部１００による関係情報生成処理（Ｓ３０３）が完了すると、図４に示す関係情報が生成される。
【００５１】
次に、ロードアドレス算出命令挿入部１１０が、ロードアドレス算出命令挿入処理（Ｓ３０５）を行う。ロードアドレス算出命令挿入処理（Ｓ３０５）は、変換対象プログラムの実行開始直後に、変換対象プログラムからロードアドレス算出命令を呼び出すことができるように変換対象プログラムにコードを挿入する処理である。
【００５２】
位置独立コード化された共有ライブラリなどはロードされないとアドレスが確定しない。このため、ロードアドレス算出命令挿入部１１０は、変換対象プログラムの実行開始直後に、変換対象プログラムから、ロードアドレス算出命令を呼び出すことができるように変換対象プログラムにコードを挿入することでロード時の開始アドレスを取得できるようにする。
【００５３】
図７は、ロードアドレス算出命令挿入処理を示すフローチャートである。図７に示すフローチャートに従って、ロードアドレス算出命令挿入処理について説明する。
【００５４】
Ｓ７０１の処理では、図４に示すオブジェクトファイル配列の第一要素に対応するソースファイルディレクトリを取得する。メモリマップでは、実行可能ファイルが必ず第一要素となっているため、オブジェクトファイル配列の第一要素が必ず実行可能ファイルに対応する。Ｓ７０１の処理が終了するとＳ７０３の処理に移行する。
【００５５】
Ｓ７０３の処理では、取得したオブジェクトファイル配列の第一要素に対応するソースファイルディレクトリについてディレクトリ内の要素がなくなるまで順次処理を行う。
【００５６】
Ｓ７０５の処理では、要素がディレクトリかどうかを判定する。要素がディレクトリであった場合には当該ディレクトリ内についてもロードアドレス算出命令挿入処理を行う必要があることから、当該ディレクトリについてのロードアドレス算出命令挿入処理（Ｓ７０７）を実行する。要素がディレクトリでない場合にはＳ７０９の判定処理に移行する。
【００５７】
Ｓ７０９の処理では、要素がソースファイルかどうかを判定する。例えば、Ｃ言語で書かれたソースファイルは拡張子が、「．Ｃ」のファイルである。要素がソースファイルでなければ次の要素に移行する。要素がソースファイルならばファイルをオープンしてＳ７１１の処理に移行する。
【００５８】
Ｓ７１１の処理では、ソースファイルについて終端まで順次読み込んでｍａｉｎ関数を見つける（Ｓ７１３）。ｍａｉｎ関数が見つかった場合には、ロードアドレス算出命令を呼び出すコードをｍａｉｎ関数内の冒頭（ソースファイルのｍａｉｎ関数が記述された直後の行）に記述（Ｓ７１５）する。これにより、変換後のプログラム実行時にｍａｉｎ関数が呼び出されると、まず初めにロードアドレス算出命令が呼び出される。
【００５９】
Ｓ７１５の処理では、ｍａｉｎ関数にロードアドレス算出命令を呼び出すコードを新たに記述した。Ｓ７１７の処理では、この新たに呼び出されるロードアドレス算出命令の実体を含むソースファイルと共にコンパイルとリンクを行う必要があるため、Ｍａｋｅｆｉｌｅの書き換えを行う。以上が、情報取得処理ブロックＢ１０の処理である。
【００６０】
ロードアドレス算出命令挿入部１１０によるロードアドレス算出命令挿入処理（Ｓ３０５）が完了すると、変換装置１０は、コンパイラ１２０に書き換えたＭａｋｅｆｉｌｅを使ってコンパイル（Ｓ３０７）させ、実行可能ファイルを作成する。この時、変換装置１０は、後続の命令生成挿入処理ブロックＢ２０で使用するアセンブリファイルとして、図４のすべてのソースファイルディレクトリ４１内のソースファイルに対してアセンブリファイルの出力を行なう。
【００６１】
ここで、図３の処理フローから離れて、変換後のプログラム実行時におけるロードアドレス算出命令の動作ついて説明する。ロードアドレス算出命令は、変換対象プログラムの開始アドレス及び変換対象プログラムにリンクされるプログラムの開始アドレスを算出し、アドレスの低い順に１つの文字列に連結してファイルに出力し、このファイルに記載された文字列を読み込み可能、書き込み不可としてプロセス空間に新たなメモリ領域として保存し、このメモリ領域の開始アドレスを静的変数に格納する。
【００６２】
図８は、ロードアドレス算出命令によって実行される処理フローである。ロードアドレス算出命令を呼び出すコードはｍａｉｎ関数の直後に記述されるため、変換後のプログラム実行直後にロードアドレス算出命令によって図８に示す処理フローが実行される。
【００６３】
Ｓ８０１の処理では、起動したプロセスのプロセスＩＤを取得する。プロセスＩＤは、Ｃ言語ではｇｅｔｐｉｄ関数によって取得できる。Ｓ８０１の処理が終了するとＳ８０３の処理に移行する。
【００６４】
Ｓ８０３の処理では、取得したプロセスＩＤのメモリマップを取得する。メモリマップは／ｐｒｏｃディレクトリ配下にプロセスＩＤごとに存在する。Ｓ８０３の処理が終了するとＳ８０５の処理に移行する。
【００６５】
Ｓ８０５の処理では、取得したメモリマップについて１行目から順に取得して、アクセス権限がｒ−ｘｐ（読み込み可、書き込み不可、実行可）であるかどうか判定（Ｓ８０７）することで、実行可能ファイルと共有ライブラリを抽出する。
【００６６】
Ｓ８０９の処理では、ｒ−ｘｐ行の開始アドレス（図５符号ａを参照）を取得し、取得した開始アドレスを連結した文字列を生成する。後の処理で生成した文字列から開始アドレスが復元できるように各開始アドレスのバイト数を統一する。例えば、バイト数については、０を埋めることで１６バイトにアドレスを修正する。また、バイト順（エンディアン）がプロセッサやプラットフォームによって異なるため、環境にあわせた文字列を生成する。エンディアンの種別についてはＥＬＦヘッダに情報が記述されている。Ｓ８０９の処理がメモリマップのすべてのｒ−ｘｐ行について終了するとＳ８１１の処理に移行する。
【００６７】
Ｓ８１１の処理では、開始アドレスを結合した文字列を、改ざんされないようにｍｍａｐ関数を使用して読み取り専用でメモリ領域に書き込む。開始アドレス格納変数として静的変数をひとつ定義して、その静的変数に読み取り専用で文字列を書き込んだメモリ領域の先頭のアドレスを格納する。
【００６８】
開始アドレス格納変数で指示されるメモリ領域に読み込み専用で書き込まれた文字列の先頭から１６バイトごとに各々のオブジェクトの開始アドレスが記述されているので、目的の位置から文字列を読み込むことで目的とするオブジェクトの開始アドレスを取得することができる。
【００６９】
このようにロードアドレス算出命令によって、変換対象プログラムの開始アドレス及び変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する。
【００７０】
次に、図３に示す命令生成挿入処理ブロックＢ２０の処理についての説明に移る前に、以降の説明理解の容易性を考慮して、変換装置１０によって変換された後の変換対象プログラムの動作と命令生成挿入処理ブロックＢ２０のＳ３０９からＳ３１３の処理との関係について概要を説明する。
【００７１】
図９は、変換された後の変換対象プログラムの動作の概要を説明する図である。図９では、関数ｍｙｆｕｎｃが呼び出された場合を例示している。
【００７２】
図９に沿って変換された後の変換対象プログラムの動作について概要を説明する。呼び出し元のアセンブリ言語で記述されたソースコード（以下、アセンブリコードという）でｃａｌｌ  ｍｙｆｕｎｃで関数ｍｙｆｕｎｃが呼び出されると、呼び出し先アセンブリファイルの関数ｍｙｆｕｎｃに処理が移る。呼び出し先アセンブリファイルでは、関数ｍｙｆｕｎｃの処理終了後に呼び出し元に戻るためのｒｅｔ命令がリターンアドレスチェック命令へのｊｕｍｐ命令（９０３）に書き換わっている。このため、関数ｍｙｆｕｎｃの処理が終了すると、同じ呼び出し先アセンブリファイルに記述されたリターンアドレスチェック命令（９０５）に処理が移る。リターンアドレスチェック命令では、チェックロジックに基づいてリターン先が正しいかどうかを判定し、正しくないと判定した場合にはプロセスを終了し、正しいと判定した場合には呼び出し元アセンブリファイルのｃａｌｌ命令の次の行に記述された識別ラベルにジャンプする。
【００７３】
変換された後の変換対象プログラムの動作と命令生成挿入処理ブロックＢ２０のＳ３０９からＳ３１３の処理との関係について図９を用いて概要を説明する。命令生成挿入処理ブロックＢ２０の処理では、前述の図９に示す動作を行うように変換対象プログラムのアセンブリコードを書き換えることでプログラムを変換する。識別ラベル生成挿入処理（Ｓ３０９）は、呼び出し元アセンブリファイルから関数呼び出し命令を検出し、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベル（９０１）を生成し、検出した関数呼び出し命令と次の命令との間に識別ラベル（９０１）を挿入する。リターン命令書き換え処理（Ｓ３１１）は、呼び出し先アセンブリファイルからリターン命令を検出し、検出したリターン命令を、リターンアドレスチェック命令へ分岐する命令（９０３）に書き換える。リターンアドレスチェック命令生成挿入処理（Ｓ３１３）は、リターンアドレスチェック命令（９０５）を生成し、呼び出し先アセンブリファイルに挿入する。
【００７４】
前述のように、本実施例では、呼び出し先アセンブリファイルにリターンアドレスチェック命令を記述することで、リターン先が正しいかどうかの判定を実現している。しかし、呼び出される関数が標準関数の場合、標準関数はバイナリで提供されるので、直接アセンブリファイルにリターンアドレスチェック命令を記述することができない。そこで、第１実施形態では、変換対象プログラムが使用する標準関数については、公開されているソースコードを参考にして同じ動作をする自作した標準関数を新たな共有ライブラリとして配置することで、直接アセンブリファイルにリターンアドレスチェック命令を記述できるようにする。この方法によれば、リターンアドレスの改ざんを完全に防ぐことができる。なお、バイナリで提供される標準関数をそのまま使用する実施形態を第２実施形態として後述する。
【００７５】
図３に戻って、命令生成挿入処理ブロックＢ２０の処理について説明する。識別ラベル生成挿入部１３０が、識別ラベル生成挿入処理（Ｓ３０９）を行う。識別ラベル生成挿入処理（Ｓ３０９）は、変換対象プログラムに含まれる関数呼び出し命令を検出し、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した関数呼び出し命令と次の命令との間に識別ラベルを挿入する処理である。
【００７６】
図１０は、識別ラベル生成挿入処理（Ｓ３０９）とリターン命令書き換え処理（Ｓ３１１）を示すフローチャートである。アセンブリコードを読み込んで、図１０のフローチャートに示す処理に従ってアセンブリコードの書き換えを行う。まず、図１０に沿って識別ラベル生成挿入処理（Ｓ３０９）について説明する。
【００７７】
識別ラベル生成挿入部１３０は、識別ラベル生成挿入処理（Ｓ３０９）を行う。識別ラベル生成挿入処理（Ｓ３０９）は、アセンブリファイルごとに実行される。Ｓ１００１の処理では、アセンブリファイルの１行目から末尾まで順次以下の処理を行う。
【００７８】
Ｓ１００３の処理は、変換対象プログラムに含まれる関数呼び出し命令を検出するためにｃａｌｌ命令を発見する処理である。ｃａｌｌ命令を発見した場合にはＳ１００５の処理に移行する。
【００７９】
Ｓ１００５の処理は、Ｓ１００３の処理で発見したｃａｌｌ命令とｃａｌｌ命令の次の行に呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成してアセンブリコードとして出力する。
【００８０】
図１１は、識別ラベル出力処理（Ｓ１００５）を示すフローチャートである。アセンブリコードを生成することで書き換え処理を行う。図１１では、図４に示す関数ｐｒｉｎｔ＿ｍｓｇがｃａｌｌ命令によって呼び出される場合を例として説明する。図４で、関数ｐｒｉｎｔ＿ｍｓｇは、シンボル名ｐｒｉｎｔ＿ｍｓｇ、構成オブジェクトファイルｓａｍｐｌｅ＿１．ｏに属し、ソースディレクトリ／ｕｓｒ／ｌｏｃａｌ／ｓｒｃ／ｓａｍｐｌｅ＿１／に存在する。
【００８１】
Ｓ１１０１の処理は、リターン元の識別ラベルを生成する。識別ラベルの名づけは、識別ができればルールは問わない。ここでは、例示として、リターン元識別ラベルであることを示す共通の文字列「．ＡＴＴＣ＿ＲＥＴ＿ＬＢ」、存在するソースディレクトリ／ｕｓｒ／ｌｏｃａｌ／ｓｒｃ／ｓａｍｐｌｅ＿１／をハッシュ化した文字列「３５ｘｑｈ７５４」、ソースファイル名「ｓａｍｐｌｅ＿１」及び連番「＄２」を結合して識別ラベルを生成している。同じアセンブリコードで同じ関数が複数回呼び出されることがあるが、同じ関数であってもリターン元は異なるため、識別ラベル名が重複しないように処理する。図１１の例示では識別ラベルに連番を付与して識別ラベル名が重複しないようしている。Ｓ１１０１の処理が終了するとＳ１１０３の処理に移行する。
【００８２】
Ｓ１１０３とＳ１１０５の処理では、識別ラベルの挿入処理を行う。Ｓ１１０１の処理で生成した識別ラベルを、関数を呼び出すｃａｌｌ命令と次の命令との間に挿入する。Ｓ１１０５の処理が終了するとＳ１１０７の処理に移行する。
【００８３】
Ｓ１１０７の処理は、リターン元識別ラベルファイルを生成して、関数名（１１０９）、識別ラベル名（１１１１）、アドレス値（１１１３）を書き込んで保存する。リターン元識別ラベルファイルの各行は、関数名でソート（Ｓ１１０７）しておく。Ｓ１１０７の処理の段階では、アドレス値（１１１３）には初期値として、一律で００００００００００００００００を書き込む。なお、この値は後述の識別ラベルアドレス取得処理（Ｓ３１５）において、識別ラベルのアドレスが取得されると更新される。これによって、リターン元識別ラベルファイルにアドレス値（１１１３）として保持される。
【００８４】
次に、図１０に沿ってリターン命令書き換え処理（Ｓ３１１）について説明する。リターン命令書き換え部１４０は、リターン命令書き換え処理（Ｓ３１１）を行う。リターン命令書き換え処理（Ｓ３１１）は、アセンブリファイルごとに実行される。Ｓ１００１の処理では、アセンブリファイルの１行目から末尾まで順次処理を行う。
【００８５】
Ｓ１００７の処理は、変換対象プログラムに含まれるリターン命令を検出するためにｒｅｔ命令を発見する処理である。ｒｅｔ命令を発見した場合にはＳ１００９の処理に移行する。
【００８６】
Ｓ１００９の処理は、検出したリターン命令をリターンアドレスチェック命令へ分岐する命令に書き換える。具体的には、図９で示したように、ｒｅｔ命令を同じソースファイルに記述されたリターンアドレスチェック命令のラベルにジャンプするｊｍｐ命令に書き換える。
【００８７】
リターンアドレスチェック命令は、呼び出される関数ごとに独立して個別に存在し、チェックするリターン元識別ラベルごとのチェックロジックが記述されている。このため、リターンアドレスチェック命令のラベル名は呼び出される関数ごとに重複しないように付与する必要がある。本実施例では、図１１に示すリターン元識別ラベルファイルの連番を除いた識別ラベル名（１１１１）と関数名（１１０９）を結合した文字列をリターンアドレスチェック命令のラベル名として付与している。具体的には、図１１で関数ｐｒｉｎｔ＿ｍｓｇに対応するリターンアドレスチェック命令のラベル名は、ＡＴＴＣ＿ＲＥＴ＿ＬＢ＿３５ｘｑｈ７５４＿ｓａｍｐｌｅ＿１＄ｐｒｉｎｔ＿ｍｓｇとなる。
【００８８】
Ｓ１０１１の処理は、アセンブリコードで、ｃａｌｌ命令、ｒｅｔ命令のいずれでもない行についてはそのまま出力する。アセンブリファイルの末尾まで処理を行って、識別ラベル生成挿入処理（Ｓ３０９）とリターン命令書き換え処理（Ｓ３１１）が終了する。
【００８９】
リターンアドレスチェック命令生成挿入部１５０は、リターンアドレスチェック命令生成挿入処理（Ｓ３１３）を行う。リターンアドレスチェック命令生成挿入処理（Ｓ３１３）は、変換対象プログラムにリターンアドレスチェック命令を生成し、挿入する処理を行う。
【００９０】
図１２は、リターンアドレスチェック命令生成挿入処理（Ｓ３１３）を示すフローチャートである。関係情報生成部１００が生成した関係情報（図４参照）に基づいて、すべてのソースファイルディレクトリ４１について（Ｓ１２０１）、関係づけられた構成オブジェクトファイル４２に対応（Ｓ１２０３）するアセンブリファイルに含まれるシンボル名４３を引数として（Ｓ１２０５）、引数としたシンボル名に対応する関数についてのリターンアドレスチェック命令を生成して、当該関数が含まれるアセンブリファイルに出力（図９を参照）する。
【００９１】
図１３は、Ｓ１２０７の処理であるリターンアドレスチェック命令の生成について詳細に説明するフローチャートである。リターンアドレスチェック命令は、当該アセンブリファイル内のシンボル名に対応する関数ごとに生成されるが、リターン元は複数存在するため、リターン元識別ラベルファイル（図１１参照）の識別ラベルごとに判定を行うチェックロジックで構成される。具体的には、リターンアドレスチェック命令は、変換後のプログラム実行時において、レジスタＡにリターン命令がリターン先として指し示すアドレスを、レジスタＢにリターンすべきアドレス（算出して保持している変換対象プログラム実行時の識別ラベルの絶対アドレス）を、それぞれ退避してレジスタＡとレジスタＢと一致しているか判定を行うことで、リターンアドレスの改ざんを検知する。
【００９２】
図１３に沿ってリターンアドレスチェック命令の生成について説明する。前述の通り、リターンアドレスチェック命令生成挿入処理（Ｓ３１３）は、関係情報生成部１００が生成した関係情報に基づいたアセンブリファイルに含まれるシンボル名を引数としてもつ。ここでは、引数のシンボル名をｐｒｉｎｔ＿ｍｓｇとして説明を進める。Ｓ１３０１の処理は、識別ラベル生成挿入部１３０が生成したリターン元識別ラベルファイル（図１１参照）の要素について終端まで順次以下の処理をおこなう。
【００９３】
Ｓ１３０３の処理では、リターン元識別ファイルに記述された関数名１１０９と引数としてシンボル名で与えられた関数名が一致するか判断する。一致しない場合は、リターン元識別ファイルの次の行に移って処理を繰り返す。一致する場合は、Ｓ１３０５の処理に移行する。
【００９４】
Ｓ１３０５の処理では、引数としてシンボル名で与えられた関数名が、リターン元識別ファイルに記述された関数名として最初に出現した行であるかどうかを判定する。リターン元識別ラベルファイルは関数名でソートされているので、順次、ファイルを読み込むことで、関数名が最初に出現したかどうか判定できる。図１１に示すリターン元識別ファイルでは、関数名ｐｒｉｎｔ＿ｍｓｇは４行に渡って記述されているが、関数名でソート済みなので、リターン元識別ファイルの要素の２行目が関数名ｐｒｉｎｔ＿ｍｓｇの最初に出現した行となる。Ｓ１３０５の処理で、引数としてシンボル名で与えられた関数名が、リターン元識別ファイルに記述された関数名として最初に出現した行であると判定されると、Ｓ１３０７の処理に移行する。
【００９５】
Ｓ１３０７の処理は、リターン元識別ファイルに記述された関数のリターンアドレスチェック命令であること示すラベルを出力する。前述の通り、図１１の関数ｐｒｉｎｔ＿ｍｓｇに対応するリターンアドレスチェック命令のラベル名は、ＡＴＴＣ＿ＲＥＴ＿ＬＢ＿３５ｘｑｈ７５４＿ｓａｍｐｌｅ＿１＄ｐｒｉｎｔ＿ｍｓｇとなる。Ｓ１３０９からの処理で、このラベルのあとに当該関数についてリターン元識別ラベルごとのチェックロジックが記述される。Ｓ１３０７の処理が終了するとＳ１３０９の処理に移行する。
【００９６】
Ｓ１３０９の処理は、スタックをレジスタＡに退避する命令を出力する。変換後のプログラムが起動した場合、リターンアドレスチェック命令が呼び出されたタイミングでスタックポインタが指しているのはリターンアドレスになるので、リターンアドレスがレジスタＡに格納される。Ｓ１３０９の処理が終了するとＳ１３１１の処理に移行する。
【００９７】
Ｓ１３１１からＳ１３２５の処理は、変換後のプログラム実行時において、レジスタＡに格納したリターンアドレスと対比するためのリターンすべきアドレス（算出して保持している変換対象プログラム実行時の識別ラベルの絶対アドレス）をレジスタＢに格納する命令を出力する。事前準備処理として、変換装置１０は、リターン元識別ファイル中の識別ラベルのアドレスを、ｎｍコマンドにより問い合わせて取得する。この際、取得できるアドレスは、識別ラベルが記述されたファイルのＥＬＦヘッダのエントリポイントに記述された値が相対アドレスの場合は位置独立コード化されたファイルであってアドレスは相対アドレス（オフセット値）となる。従って、変換後のプログラム実行時でのチェックタイミングにおいて、変換後のプログラムが絶対アドレスを演算で求めるようにチェックロジックを生成する。
【００９８】
Ｓ１３１１の処理は、識別ラベルが記述されたオブジェクトファイルが位置独立コード化されているかどうかを判定する。具体的には識別ラベルが記述された実行可能ファイル又は共用ライブラリのＥＬＦヘッダを参照し、エントリポイントが相対アドレスであるかどうかを判定する。相対アドレスかどうかは、エントリポイントが１６進数で，４０００００より小さいかどうかで判定できる。Ｓ１３１１の処理で、識別ラベルが記述されたオブジェクトファイルが位置独立コード化されていると判定された場合、Ｓ１３１３の処理に移行する。
【００９９】
Ｓ１３１３からＳ１３１９の処理は、識別ラベルが位置独立コード化されたオブジェクトファイル内に存在する場合の処理である。この場合、識別ラベルのアドレスはオフセット値である。よって、識別ラベルの絶対アドレスは、識別ラベルが記述されたロードされたオブジェクトファイルの開始アドレスに、リターン元識別ファイル中の識別ラベルのオフセット値を加算することで求められる。
【０１００】
Ｓ１３１３からＳ１３１９の処理について詳細に説明する。Ｓ１３１３からＳ１３１７の処理は、識別ラベルが記述されたオブジェクトファイルの開始アドレスの絶対アドレスを算出してレジスタＢに格納する命令を出力する。
【０１０１】
変換後のプログラム実行時には、実行直後に、ロードアドレス算出命令（図８）によって、変換対象プログラムの開始アドレス及び変換対象プログラムにリンクされる共有ライブラリの開始アドレスがメモリマップに基づいて取得され、これら開始アドレスを連結した文字列が読み取り専用でメモリ領域に書き込まれる。そして、このメモリ領域の先頭アドレスが開始アドレス格納変数に保持される。識別ラベルのアドレスがオフセット値である場合、リターンアドレスチェック命令生成挿入部１５０は、ロードアドレス算出命令（図８）によって取得され、保持されているアドレスを使ってリターンアドレスのチェックを行う命令を生成して挿入する。
【０１０２】
Ｓ１３１３の処理は、開始アドレス格納変数の参照先アドレス（ロードされたオブジェクトファイルの開始アドレスを連結した文字列が書き込まれているメモリ領域の先頭アドレス）をレジスタＢに転送する命令を出力する。
【０１０３】
Ｓ１３１５の処理は、Ｓ１３１３の処理で取得したロードされたオブジェクトファイルの開始アドレスを連結した文字列が書き込まれているメモリ領域の先頭アドレスに、オフジェクト配列の要素番号（０から始まるロード順の番号）から算出されるメモリ領域に書き込まれた文字列の先頭から当該オブジェクトファイルの開始アドレスが記述されている目的の位置までの距離をレジスタＢにおいて加算することで、当該オブジェクトファイルの開始アドレスが記述されている目的の位置のアドレスを算出する命令を転送する。
【０１０４】
Ｓ１３１７の処理は、当該オブジェクトファイルの開始アドレスが記述されている目的の位置のアドレスの参照先（当該オブジェクトファイルの開始アドレス）をレジスタＢに転送する命令を出力する。
【０１０５】
Ｓ１３１９の処理は、レジスタＢにリターン元識別ラベルファイルに記述される当該識別ラベル１１１１に対応するアドレス値１１１３を加算する命令を出力する。変換後のプログラム実行時において、後述する識別ラベルアドレス取得部１６０が行う識別ラベルアドレス取得処理（Ｓ３１５）によって、アドレス値１１１３にはｎｍコマンドで取得した識別ラベルのアドレスが記述されるが、Ｓ１３１１の処理での判定通り、識別ラベルのアドレス値１１１３はオフセット値をとる。Ｓ１３１９の処理は、ロードされたオブジェクトファイルの開始アドレスと識別ラベルのアドレス値（オフセット）を加算することで識別ラベルの絶対アドレスを算出する命令を生成している。
【０１０６】
Ｓ１３１１の処理で、識別ラベルが記述されたオブジェクトファイルが位置独立コード化されていないと判定された場合、Ｓ１３２１の処理に移行する。この場合、識別ラベルのアドレスは絶対アドレスとなる。Ｓ１３２１の処理では、アセンブリファイルが自作ｓｏソースかどうかを判定する。
【０１０７】
当該アセンブリファイルが自作ｓｏソースの場合は、実行可能ファイルの中で、自作の共用ライブラリの関数を呼び出す場合に該当する。リターン元識別ラベルファイルに記述される当該識別ラベル１１１１に対応するアドレス値１１１３は、実行可能ファイル内に存在するので絶対アドレスとなり、そのままレジスタＢに転送する命令を出力（Ｓ１３２３）する。
【０１０８】
当該アセンブリファイルが自作ｓｏソースではない場合は、実行可能ファイルの中で、実行可能ファイル内の関数を呼び出す場合に該当する。実行時に識別ラベルのアドレスを取得してレジスタＢに転送する命令を出力（Ｓ１３２５）する。例として、ｌｅａｑ  ．ＡＴＴＣ＿ＲＥＴ＿ＬＢ＿３５ｘｑｈ７５４＿ｓａｍｐｌｅ＿１＄１（％ｒｉｐ），％ｒ１１となる。本実施例では、例示した関数を利用する。
【０１０９】
Ｓ１３２７の処理は、レジスタＡとＢを比較する命令を出力する。Ｓ１３２９の処理は、比較の結果一致していればＯＫラベルへジャンプする命令を出力する。ジャンプ先のＯＫラベル先には、レジスタＡに格納していたリターンアドレスにジャンプする命令が記述される。以上の処理を当該関数について繰り返す（Ｓ１３３１）。図１１に示す関数ｐｒｉｎｔ＿ｍｓｇでは、関数ｐｒｉｎｔ＿ｍｓｇの出現回数（４回）各々処理が行われてチェックロジックが出力され呼び出し先アセンブリファイルに記述される。
【０１１０】
当該関数に関しての処理が最後まで終わる（Ｓ１３３１）と、ＮＧラベルへジャンプする命令を出力（Ｓ１３３５）する。ジャンプ先のＮＧラベル先には、プロセスを終了する命令が記述される。以上が、命令生成挿入処理ブロックＢ２０の処理である。
【０１１１】
図３に戻って、チェック処理ブロックＢ３０の処理について説明する。チェック処理ブロックＢ３０は、識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて識別ラベルアドレスとして保持する識別ラベルアドレス取得処理（Ｓ３１５）と、変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、識別ラベルアドレスの再取得を命令し、リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なうリターンアドレスチェック命令更新処理（Ｓ３１７）からなる。
【０１１２】
チェック処理ブロックＢ３０に処理が移行すると、まず１回、実行可能ファイルと共用ライブラリを作成する。チェック処理ブロックＢ３０は、命令生成挿入処理ブロックＢ２０の処理で書き換えられたプログラムが正常に起動することを確認するためである。
【０１１３】
図１４は、識別ラベルアドレス取得処理（Ｓ３１５）を示すフローチャートである。識別ラベルアドレス取得部１６０が識別ラベルアドレス取得処理（Ｓ３１５）を実行する。関係情報生成部１００が生成した関係情報（図４参照）に基づいて、すべてのソースファイルディレクトリ４１について（Ｓ１４０１）、対応するオブジェクトファイル４０を取得（Ｓ１４０３）する。各々のオブジェクトファイルからｎｍコマンドによってシンボル名とシンボルに対する実行可能ファイル作成後のアドレスを取得（Ｓ１４０５）する。シンボル名が合致するものについてリターン元識別ファイルのアドレス値１１１３を書き換える（Ｓ１４０９）。この一連の処理により、リターン元識別ファイルのアドレス値１１１３が実行時のアドレス値になり、識別ラベルと紐づけられる。
【０１１４】
図１５は、リターンアドレスチェック命令更新処理（Ｓ３１７）を示すフローチャートである。リターンアドレスチェック命令更新処理部１７０がリターンアドレスチェック命令更新処理（Ｓ３１７）を実行する。識別ラベルアドレス取得処理（Ｓ３１５）によって取得したアドレス値に書き換えたリターン元識別ファイルのアドレス値１１１３を反映するために、リターンアドレスチェック命令生成（図１３）を再度実行することで、リターン元識別ファイルのアドレス値１１１３として実行時のアドレス値を埋め込まれたリターンアドレスチェック命令を生成する。また、リターンアドレスチェック命令生成挿入処理（Ｓ３１３）によって、アセンブリファイルにリターンアドレスチェック命令を挿入するとファイルサイズが当初より大きくなるため、挿入した識別ラベルのアドレス値が変化する。こうなると、リターンアドレスが当初の想定と異なる値を取り、リターンアドレスが改ざんされたと判断され、プロセスが異常終了してしまう。そこで、このような状況に対応するため、実行可能ファイル及び共用ライブラリを作成して正常動作するかを確認し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、識別ラベルアドレスの再取得を命令し、リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう。
【０１１５】
図１５に沿って、リターンアドレスチェック命令更新処理（Ｓ３１７）を説明する。関係情報生成部１００が生成した関係情報（図４参照）に基づいて、すべてのソースファイルディレクトリ４１について（Ｓ１５０１）、関係づけられた構成オブジェクトファイル４２に対応（Ｓ１５０３）するアセンブリファイル名を引数として、引数としたアセンブリファイルに記述されたリターンアドレスチェックロジックを更新（Ｓ１５０５）する。その後、実行可能ファイル及び共用ライブラリを作成（Ｓ１５０７）して、実行可能ファイルを起動（Ｓ１５０９）する。正常起動したか判定（Ｓ１５１１）を行い、正常起動すればリターンする。正常起動しない場合は、再度、識別ラベルアドレス取得処理（Ｓ３１５）に戻って実行を続ける。
【０１１６】
図１６は、リターンアドレスチェックロジック更新（Ｓ１５０５）についての詳細を示すフローチャートである。図１６に沿って、リターンアドレスチェックロジック更新（Ｓ１５０５）について説明する。Ｓ１６０１の処理では、引数で指定されたアセンブリファイルを開き、先頭行から終端まで順次書き換えを行う。Ｓ１６０３の処理では、チェックロジックが記述されている部分かどうかの判定を行う。チェックロジックの記述部分でない場合には、そのまま行を出力（Ｓ１６０５）して次の行に移行（Ｓ１６１３）する。チェックロジックの記述部分である場合には、関数ごとに記述してあるリターンアドレスチェックラベルかどうかを判定（Ｓ１６０７）する。リターンアドレスチェックラベルでない場合には、次の行に移行（Ｓ１６１３）する。リターンアドレスチェックラベルである場合には、ラベルから関数名を取得（Ｓ１６０９）して取得した関数名を引数としてリターンアドレスチェック命令生成（図１３）を実行（Ｓ１６１１）する。
【０１１７】
以上が、チェック処理ブロックＢ３０の処理である。チェック処理ブロックＢ３０の処理が終了すると、図３に戻って引数で指定された次の変換対象プログラムの変換処理に移行（Ｓ３０１）する。すべての変換対象プログラムについて変換処理が完了すると、変換装置１０による変換対象プログラムの変換が完了する。
【０１１８】
（第２実施形態）
本実施形態に係る変換装置は、第１実施形態の変換装置の機能に加えて、標準関数については識別ラベルのアドレスを実行時に取得してレジスタに格納するようにプログラムを変換する変換装置である。
【０１１９】
呼び出される関数が標準関数の場合、標準関数はバイナリで提供されるので、直接ソースファイルにリターンアドレスチェック命令を記述することができない。一方、標準関数は位置独立コード化されていないため、アドレスを取得した場合、絶対アドレスとなる。第２実施形態の変換装置は、標準関数については、識別ラベルのアドレスを実行時に取得してレジスタに格納するように変換対象プログラムを変換する。第１実施形態と比較すると、公開されているソースコードに基づいて同じ動作をする自作した標準関数を新たな共有ライブラリとして配置する必要がないので汎用的である一方、以降に説明するように、レジスタは関数呼び出しなどによってスタックに退避、復元を繰り返すため、第１実施形態に比べ改ざんリスクは高くなる。
【０１２０】
第２実施形態では、識別ラベル生成挿入処理（Ｓ３０９）とリターンアドレスチェック命令生成挿入処理（Ｓ３１３）が第１実施形態と異なる。いずれも、呼び出される関数が標準関数の場合の処理が追加される。第２実施形態で追加される処理を中心に説明する。
【０１２１】
図１７は、第２実施形態での識別ラベル生成挿入処理を示すフローチャートである。第１実施形態での識別ラベル生成挿入処理（図１０）と異なり、ｃａｌｌ命令を検出（Ｓ１００３）した後、呼び出される関数が標準関数かどうかの判定（Ｓ１７１３）を行う。標準関数でない場合には第１実施形態と同様の処理となる。標準関数の場合、標準ライブラリ関数識別ラベル出力（Ｓ１７１５）に移行する。Ｓ１７１７の処理は、アセンブリファイル別に使用される標準関数のリストを生成する。同じ標準関数（例えば、ｐｒｉｎｔｆ）であっても記述されているアセンブリファイルが異なると標準関数の処理終了後のリターン元のアドレスが異なるからである。
【０１２２】
図１８は、標準ライブラリ関数識別ラベル出力（Ｓ１７１５）について示すフローチャートである。標準関数を呼び出すｃａｌｌ命令を書き換える。ｃａｌｌ命令が呼び出した標準関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルのアドレスを実行時に取得してレジスタに格納する命令（Ｓ１８０５）と、標準関数の呼び出し用ラベルを生成して、そのラベルにジャンプする命令（Ｓ１８０７）を出力する。ジャンプ命令の次にｃａｌｌ命令が呼び出した標準関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを出力（Ｓ１８０９）する。
【０１２３】
図１９は、第２実施形態でのリターンアドレスチェック命令生成挿入処理を（Ｓ３１３）示すフローチャートである。第１実施形態での処理フロー（図１２）に、標準関数コール部生成出力処理（Ｓ１９０９）が追加される。
【０１２４】
図２０は、標準関数コール処理生成出力処理（Ｓ１９０９）を示すフローチャートである。標準関数コール処理は、Ｓ１８０７の処理で生成された標準関数の呼び出し用ラベルにジャンプした際の標準関数実行と標準関数の処理が終了した後に予めレジスタに格納していた適正なアドレスへリターンする処理である。
【０１２５】
Ｓ２００３の処理では、Ｓ１７１７の処理で生成されたアセンブリファイル別標準関数のリストの要素である標準関数について順次標準関数コール処理を生成する。Ｓ２００５の処理では、Ｓ１８０７の処理で生成された標準関数の呼び出し用ラベルを出力する。Ｓ２００７の処理では、当該関数をコールする命令を出力する。Ｓ２００９の処理では、標準関数コール共通処理にジャンプする命令を出力する。図２０に示すように、ジャンプ先の標準関数コール共通処理では、Ｓ１８０５の処理で実行時に取得してレジスタに格納したリターンすべき場所を特定するための識別ラベルのアドレスにジャンプする。
【０１２６】
（第３実施形態）
本実施形態は、コンピュータシステムを変換装置１０として機能させるための変換プログラムである。コンピュータシステムの構成は、図２に示す通りである。
【０１２７】
変換プログラムは、メインモジュール、入力モジュール、出力モジュール及び演算処理モジュールを備える。メインモジュールは変換処理を統括的に制御する部分である。入力モジュールは変換対象のプログラムの入力を、出力モジュールは変換後のプログラムの出力をするようにコンピュータシステムを動作させる。演算処理モジュールは、関係情報生成モジュール、ロードアドレス算出命令挿入モジュール、コンパイラ、識別ラベル生成挿入モジュール、リターン命令書き換えモジュール、識別ラベルアドレス取得モジュール、リターンアドレスチェック命令生成挿入モジュール及びリターンアドレスチェック命令更新モジュールを備える。メインモジュール、入力モジュール、出力モジュール及び演算処理モジュールを実行させることにより実現される機能は、変換装置１０の関係情報生成部１００、ロードアドレス算出命令挿入部１１０、コンパイラ１２０、識別ラベル生成挿入部１３０、リターン命令書き換え部１４０、リターンアドレスチェック命令生成挿入部１５０、識別ラベルアドレス取得部１６０及びリターンアドレスチェック命令更新部１７０の機能とそれぞれ同様である。
【符号の説明】
【０１２８】
１０      変換装置
１００    関係情報生成部
１１０    ロードアドレス算出命令挿入部
１２０    コンパイラ
１３０    識別ラベル生成挿入部
１４０    リターン命令書き換え部
１５０    リターンアドレスチェック命令生成挿入部
１６０    識別ラベルアドレス取得部
１７０    リターンアドレスチェック命令更新部
２０      ハードウェア構成
２１０    中央演算装置（ＣＰＵ）
２２０    入力装置
２３０    出力装置
２４０    主記憶装置（ＲＡＭ／ＲＯＭ）
２５０    補助記憶装置
２６０    複数のレジスタ
Ｂ１０    情報取得処理ブロック
Ｂ２０    命令生成挿入処理ブロック
Ｂ３０    チェック処理ブロック
【図１】
2020027512.tif 000003
【図２】
2020027512.tif 000004
【図３】
2020027512.tif 000005
【図４】
2020027512.tif 000006
【図５】
2020027512.tif 000007
【図６】
2020027512.tif 000008
【図７】
2020027512.tif 000009
【図８】
2020027512.tif 000010
【図９】
2020027512.tif 000011
【図１０】
2020027512.tif 000012
【図１１】
2020027512.tif 000013
【図１２】
2020027512.tif 000014
【図１３】
2020027512.tif 000015
【図１４】
2020027512.tif 000016
【図１５】
2020027512.tif 000017
【図１６】
2020027512.tif 000018
【図１７】
2020027512.tif 000019
【図１８】
2020027512.tif 000020
【図１９】
2020027512.tif 000021
【図２０】
2020027512.tif 000022
【手続補正書】
【提出日】平成30年11月21日(2018.11.21)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
リターンアドレスの改ざんを検知して停止するようにプログラムを変換する変換装置であって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成部と、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入部と、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入部と、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令であって、前記リターン命令が記述されている前記変換対象プログラムに含まれる関数呼び出し命令によって呼び出される関数についてのリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え部と、
前記変換対象プログラムを構成する実行可能なオブジェクトファイルと、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルに、前記関係情報で関係づけられたシンボル名に対応する関数ごとに前記リターンアドレスチェック命令を生成し、前記シンボル名に対応する関数と前記関係情報で関係づけられたソースファイルに生成した前記リターンアドレスチェック命令を記述することで、前記変換対象プログラムに前記リターンアドレスチェック命令を挿入する、リターンアドレスチェック命令生成挿入部と、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得部と、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得部に前記識別ラベルアドレスの再取得を命令し、前記リターンアドレスチェック命令生成挿入部に前記リターンアドレスチェック命令の更新を命令し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新部と、
を備えることを特徴とする変換装置
【請求項２】
前記リターンアドレスチェック命令生成挿入部が生成する前記リターンアドレスチェック命令は、変換対象プログラム実行時に、関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルが記述されたファイルが位置独立コード化されている場合には前記識別ラベルが記述されたファイルの開始アドレスに前記識別ラベルのオフセット値を取得して加算することで、位置独立コード化されていない場合には識別ラベルのアドレスを取得することで、リターンすべきアドレスを算出する、
ことを特徴とする請求項１に記載の変換装置
【請求項３】
前記識別ラベル生成挿入部は、検出した関数呼び出し命令が呼び出す関数が標準関数である場合には、前記標準関数を呼び出す命令を、前記標準関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルの実行時のアドレスを取得してレジスタに格納する命令及び前記標準関数に分岐する命令に書き換え、前記標準関数に分岐する命令と次の命令との間に前記識別ラベルを挿入する処理を、
前記リターンアドレスチェック命令生成挿入部は、前記標準関数の処理が終了した後に前記識別ラベル生成挿入部がレジスタに格納したアドレスへリターンする命令を生成し、変換対象プログラムに挿入する処理を、
更に備えることを特徴とする請求項１又は請求項２に記載の変換装置
【請求項４】
コンピュータに、
リターンアドレスの改ざんを検知して停止するようにプログラムの変換を実行させる変換プログラムであって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成処理ステップと、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入処理ステップと、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入処理ステップと、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令であって、前記リターン命令が記述されている前記変換対象プログラムに含まれる関数呼び出し命令によって呼び出される関数についてのリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え処理ステップと、
前記変換対象プログラムを構成する実行可能なオブジェクトファイルと、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルに、前記関係情報で関係づけられたシンボル名に対応する関数ごとに前記リターンアドレスチェック命令を生成し、前記シンボル名に対応する関数と前記関係情報で関係づけられたソースファイルに生成した前記リターンアドレスチェック命令を記述することで、前記変換対象プログラムに前記リターンアドレスチェック命令を挿入する、リターンアドレスチェック命令生成挿入処理ステップと、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得処理ステップと、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得処理ステップを実行して前記識別ラベルアドレスを再取得し、前記リターンアドレスチェック命令生成挿入処理ステップを実行して前記リターンアドレスチェック命令を更新し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新処理ステップと、
を実行させる変換プログラム
【請求項５】
リターンアドレスの改ざんを検知して停止するようにプログラムを変換するプログラム変換方法であって、
リターンアドレスの改ざんを検知して停止するようにプログラムの変換を実行させる変換プログラムであって、
変換対象プログラムを構成する実行可能なオブジェクトファイルについて、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルと、シンボル名と、が互いに紐づく関係を示す関係情報をメモリマップに基づいて生成する、関係情報生成処理ステップと、
前記変換対象プログラムの開始アドレス及び前記変換対象プログラムにリンクされる共有ライブラリの開始アドレスをメモリマップに基づいて算出し、保持する命令を、前記変換対象プログラムの実行開始直後に、前記変換対象プログラムから、この命令を呼び出すことができるように前記変換対象プログラムに挿入する、開始アドレス算出命令挿入処理ステップと、
前記変換対象プログラムに含まれる関数呼び出し命令を検出し、前記関数呼び出し命令が呼び出した関数の処理が終了した後にリターンすべき場所を特定するための識別ラベルを生成し、検出した前記関数呼び出し命令と次の命令との間に前記識別ラベルを挿入する、識別ラベル生成挿入処理ステップと、
前記変換対象プログラムに含まれるリターン命令を検出し、検出した前記リターン命令を、前記変換対象プログラム実行時に前記リターン命令がリターン先として指し示すアドレスが識別ラベルのアドレスから算出したリターンすべき絶対アドレスと一致しているかを判定して一致しない場合には前記変換対象プログラムを終了させるリターンアドレスチェック命令であって、前記リターン命令が記述されている前記変換対象プログラムに含まれる関数呼び出し命令によって呼び出される関数についてのリターンアドレスチェック命令へ分岐する命令、に書き換える、リターン命令書き換え処理ステップと、
前記変換対象プログラムを構成する実行可能なオブジェクトファイルと、ソースファイルの存在するディレクトリと、ソースファイルを構成するオブジェクトファイルに、前記関係情報で関係づけられたシンボル名に対応する関数ごとに前記リターンアドレスチェック命令を生成し、前記シンボル名に対応する関数と前記関係情報で関係づけられたソースファイルに生成した前記リターンアドレスチェック命令を記述することで、前記変換対象プログラムに前記リターンアドレスチェック命令を挿入する、リターンアドレスチェック命令生成挿入処理ステップと、
前記識別ラベルのアドレスを取得し、取得したアドレスを識別ラベルと紐づけて前記識別ラベルアドレスとして保持する、識別ラベルアドレス取得処理ステップと、
前記変換対象プログラムが正常起動するかを判定し、正常に起動した場合にはプログラムの変換を終了し、正常に起動しない場合には、前記識別ラベルアドレス取得処理ステップを実行して前記識別ラベルアドレスを再取得し、前記リターンアドレスチェック命令生成挿入処理ステップを実行して前記リターンアドレスチェック命令を更新し、再度正常起動するかを判定する処理を行なう、リターンアドレスチェック命令更新処理ステップと、
をコンピュータが実行するプログラム変換方法