問題タブ [aslr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - Windows シェル コマンドの実行 NASM X86 アセンブリ言語
Windowsコマンドを実行するだけの簡単なアセンブリプログラムを書いています。以下に現在の作業コードを添付します。Kernel32.dll の関数である WinExec のベース アドレスをハード コードすると、コードが機能します。Arwin という別のプログラムを使用して、このアドレスを見つけました。ただし、Windows のメモリ保護アドレス空間レイアウトのランダム化 (ASLR) のため、再起動するとこれが中断されます。
私が探しているのは、次回の再起動時に変更されるメモリ アドレスをコードにハード コードすることなく、Windows シェル コマンドを実行する方法を見つけることです。私は似たようなコードを見つけましたが、私が理解している、または目的に合っているものは何もありません。これは C で記述できることはわかっていますが、特にアセンブラを使用してサイズをできるだけ小さくしています。
アドバイス/助けてくれてありがとう。
linux - Linux ASLR がスタックの場所を正確にランダム化する方法
32 ビット x86 Ubuntu デスクトップを使用しています。/proc/[pid]/mmaps を調べたところ、スタック ベース アドレスが常に変更されていることがわかりました (たとえば、次の場合は 0xbfe76000)。したがって、カーネル (または ELF ローダー) は、プロセスが開始されるたびにスタックの場所をランダム化する必要があると思います。
スタックベースアドレスのランダム化のための正確なコード (カーネルまたは ELF ローダー内) はどこにあるのか疑問に思っています。0xC0000000 のすぐ下にいくつかのページを (たとえば mmap 経由で) 割り当てたいのですが、スタックがたとえば 0xbffff000 にある可能性があるかどうかはわかりません。ありがとうございました!
c++ - 別のプロセスのベースアドレスを取得するにはどうすればよいですか? (ASLR)
起動するたびにランダムなベース アドレスを持つ .exe のベース アドレスを取得する必要があります。私はこれを試しましたが、うまくいかないようです:
なにが問題ですか?
windows - スタックの「論理的ボトム」と「物理的ボトム」のオフセットがランダムなのはなぜですか?
Windbg を使用して Windows 10 マシンでプログラムを実行し、最初のブレークポイントで中断させます。スタックの物理的な最下部 (TEB の stackBase) のアドレスを取得し、 のrsp
値を減算しますntdll!LdrInitializeThunk
。同じプログラムでこれを 5 回実行したところ、5 つの異なる値が得られました。
などで同じことを行うと、同様の結果が得られますntdll!RtlUserThreadStart
。これは、スタックの「論理的な底」が多少ランダム化されていることを示唆しています。何故ですか?これは、スタック内のある種の「ミニ ASLR」ですか? これはどこかに文書化されていますか?
compilation - ELF、PIE ASLR、およびその間のすべて (特に Linux 内)
質問をする前に、私が正しいことを確認したいいくつかの技術的な詳細について説明したいと思います。
Position Independent Executable (PIE) は、ロード先のメモリ アドレスに関係なく実行できるプログラムですよね?
ASLR (Address Space Layout Randomization) では、アドレスを静的に保つために、何らかの方法でアドレスをランダム化すると述べています。
特にLinuxおよびUnixベースのシステム内では、コードがPIEであるかどうかに関係なく、ASLRの実装が可能であり、PIEである場合、すべてのジャンプ、呼び出し、およびオフセットは相対的であるため、問題はありません。そうでない場合、コードが実行可能ファイルであるか共有オブジェクトであるかに関係なく、何らかの形でコードが変更され、アドレスが編集されます。
さて、これは私にいくつかの質問をするように導きます
PIE ではなく、実行可能ファイルであり、共有/再配置可能オブジェクトではないコード内に ASLR を実装できる場合 (再配置可能オブジェクト内で再配置がどのように機能するか知っています!!!! )、どのように行われますか? ELF 形式には、カーネル ローダーがそれを変更できるように、コード セクション内の関数がどこにあるかを示すセクションを保持するべきではありませんよね? ASLR はカーネル機能である必要があるため、たとえば、これらの命令を含む実行可能ファイルをどのように作成できるでしょうか。
擬似コード:
アドレスが ELF ファイル内の再配置可能なテーブルに格納されておらず、実行可能ファイルをランダムなアドレスにロードするために相対的でない場合、カーネル実行可能ローダーはアドレスを変更する方法をどのように知るのでしょうか?
私が間違っているとしましょう。ASLR を実装するには、PIE 実行可能ファイルが必要です。すべてのセグメントは相対的です。たとえば、構造体内の仮想テーブルへのポインターを使用するクラスのインスタンスがあり、その仮想テーブルが絶対アドレスを保持する必要がある場合、C++ OOP コードをコンパイルして機能させるにはどうすればよいでしょうか。ランタイム仮想テーブルを使用するC++プログラム用の純粋なPIEをコンパイルできますが、ASLRは不可能です....仮想テーブルに相対アドレスが含まれ、呼び出しごとに異なる仮想テーブルがあるとは思えませんいくつかの仮想関数...
私の最後の最も重要でない質問は、ELF と PIE に関するものです — ELF 実行可能ファイルが PIE であることを検出する特別な方法はありますか? 私は ELF 形式に精通しているので、方法があるとは思えませんが、間違っているかもしれません。とにかく、方法がない場合、カーネルローダーは実行可能ファイルが PIE であるかどうかをどのように認識し、ASLR を使用できるのでしょうか。
私は頭の中でこれをすべて台無しにしています。誰かがここで私を助けてくれれば幸いです。
c - ASLR が機能していないように見える理由
次のようにASLRが有効になっているかどうかを確認しましたが、有効だと思います:
次のプログラムでテストしてみました。
test.c :
ASLR がアクティブな場合、実行ごとに異なるアドレスになると予想していましたよね? しかし、私は毎回同じことをしました。64 ビットと 32 ビットの実行可能ファイルの両方をテストしました。これをテストするために 64 ビットの Arch Linux システムを使用しています。
ご覧のとおり、アドレスはすべての実行で同じです。これは、ASLR がオフになっているということではありませんか?
c - 次のコードは ASLR を無効にしますか?
演習でこのコードに遭遇しました。私の推測に基づいて、これは子プロセスの ASLR を無効にするはずです。ただし、LD_PRELOAD を使用してバイナリを printf でスリープし、その時点で gdb にアタッチしました。この時点で、スタック アドレスの変化に基づいて、ASLR が有効になっているように見えることに気付きました。Aslr は、親プロセスで確実に有効になっています。
子プロセスで ASLR を無効にする必要がありますか? フォークされた子で ASLR が無効になるのを妨げているコードの何が問題になっていますか?