質問をする前に、私が正しいことを確認したいいくつかの技術的な詳細について説明したいと思います。
Position Independent Executable (PIE) は、ロード先のメモリ アドレスに関係なく実行できるプログラムですよね?
ASLR (Address Space Layout Randomization) では、アドレスを静的に保つために、何らかの方法でアドレスをランダム化すると述べています。
特にLinuxおよびUnixベースのシステム内では、コードがPIEであるかどうかに関係なく、ASLRの実装が可能であり、PIEである場合、すべてのジャンプ、呼び出し、およびオフセットは相対的であるため、問題はありません。そうでない場合、コードが実行可能ファイルであるか共有オブジェクトであるかに関係なく、何らかの形でコードが変更され、アドレスが編集されます。
さて、これは私にいくつかの質問をするように導きます
PIE ではなく、実行可能ファイルであり、共有/再配置可能オブジェクトではないコード内に ASLR を実装できる場合 (再配置可能オブジェクト内で再配置がどのように機能するか知っています!!!! )、どのように行われますか? ELF 形式には、カーネル ローダーがそれを変更できるように、コード セクション内の関数がどこにあるかを示すセクションを保持するべきではありませんよね? ASLR はカーネル機能である必要があるため、たとえば、これらの命令を含む実行可能ファイルをどのように作成できるでしょうか。
擬似コード:
inc_eax: add eax, 5 ret main: mov eax, 5 mov ebx, 6 call ABSOLUTE_ADDRES{inc_eax}
アドレスが ELF ファイル内の再配置可能なテーブルに格納されておらず、実行可能ファイルをランダムなアドレスにロードするために相対的でない場合、カーネル実行可能ローダーはアドレスを変更する方法をどのように知るのでしょうか?
私が間違っているとしましょう。ASLR を実装するには、PIE 実行可能ファイルが必要です。すべてのセグメントは相対的です。たとえば、構造体内の仮想テーブルへのポインターを使用するクラスのインスタンスがあり、その仮想テーブルが絶対アドレスを保持する必要がある場合、C++ OOP コードをコンパイルして機能させるにはどうすればよいでしょうか。ランタイム仮想テーブルを使用するC++プログラム用の純粋なPIEをコンパイルできますが、ASLRは不可能です....仮想テーブルに相対アドレスが含まれ、呼び出しごとに異なる仮想テーブルがあるとは思えませんいくつかの仮想関数...
私の最後の最も重要でない質問は、ELF と PIE に関するものです — ELF 実行可能ファイルが PIE であることを検出する特別な方法はありますか? 私は ELF 形式に精通しているので、方法があるとは思えませんが、間違っているかもしれません。とにかく、方法がない場合、カーネルローダーは実行可能ファイルが PIE であるかどうかをどのように認識し、ASLR を使用できるのでしょうか。
私は頭の中でこれをすべて台無しにしています。誰かがここで私を助けてくれれば幸いです。