問題タブ [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.
windows - ASLR は、dll のリベースが不要であることを意味しますか?
ASLRを使用する場合、ビルド中に dll をリベースしても意味がないと考えるのは正しいでしょうか。カーネルがロードするときに dll が再びリベースされるからです。
私たちのアプリケーションがターミナル サービス マシンで頻繁に使用されていることを懸念しています。そのため、ロード時にリベースが発生すると、DLL がロードされるプロセスごとにリベースされる可能性があります (セッションごとに 1 つのプロセスがあります)。そして、これにより、支払いを希望する以上のメモリ使用量とページングが発生します。心配する必要がありますか?
次のブログ投稿を見つけました。リベースは 1 回だけ行われ、システム全体で行われると書かれています: Matt Evans - メモリ節約のために ASLR を有効にしますか? . これに関する他の参考文献は見たことがありません。ASLR を使用し、ビルド中にリベースしない場合、ターミナル サービス ボックスでメモリの問題が発生しないことを確認したかっただけですか?
linux - ELF ファイルからアドレスのランダム化 (ASLR) を無効にする方法は?
解決済み: 解決 策は、パーソナリティ (0x40000) を呼び出すことでした。以下のコメントの詳細を参照してください。
ASLR フラグは ELF ファイル内のどこにありますか? 特定のライブラリ (.so) の ASLR を無効にする必要があります。objdump を使用してみましたが、その方法がわかりませんでした。
Android 4.4.4 では動作しないように見えるため、/proc を使用できないため、バイナリを変更しようとしています。
編集: 私は以下をコンパイルしました:
ASLR なし (PIE):
ASLR (PIE) を使用:
ただし、noPIE バイナリは実際にはランダム化されていません。
android - Phone Gap アプリで Address Space Layout Randomization (ASLR) を実装する方法
電話ギャップアプリを構築しています。私たちのアプリケーションは現在、インターネット、ギャラリー、カメラ、バックグラウンド サービスを利用しています。現時点では、クライアント側に機密レコードはありません (ただし、将来的にはそうなる可能性があります)。このため、アプリケーションの要件を作成している一部のクライアントは、Address Space Layout Randomization (ASLR) を利用しています。現在、これがすでに有効になっているかどうかはわかりません。これを電話ギャップ アプリに実装する方法、または ASLR をサポートする電話ギャップ プラグインはありますか?
https://en.wikipedia.org/wiki/Address_space_layout_randomization
hex - gproftools プロファイリングでの 16 進関数名
gproftools (Google プロファイラー) を使用した CPU プロファイリングの後、一部の関数名が 16 進値として表示されます。
https://groups.google.com/forum/#!topic/google-perftools/7sdO7wrPUpEの最後のコメントによると、問題はASLRによって引き起こされたように見えます が、一部の関数名が 16 進数値であり、他の関数名が正常である理由がわかりませんでした。
プロファイリングのサンプル出力。
16 0.40% 86.80% 16 0.40% 00007f05e018bc5d
16 0.40% 87.20% 36 0.90% _IO_file_xsgetn
16 0.40% 87.60% 16 0.40% __memcpy_sse2
16 0.40% 88.00% 16 0.40% __tls_get_addr
15 0.40% 88.40% 15 0.40% __GI___libc_free
15 0.40% 88.70% 15 0.40% __GI_strlen
c++ - ローカル変数のアドレスが毎回異なるのはなぜですか?
Google に問い合わせて、StackOverflow について調査しました。私の質問はmain()
、C++ プログラムで関数を入力して最初の変数を宣言すると、この変数のアドレスが実行ごとに異なるのはなぜですか? 以下のサンプルプログラムをご覧ください。
実行結果 1:
実行結果 2:
実行結果 3:
ご覧のとおり、実行ごとに異なる結果が得られます。割り当てられたメモリのアドレスに対応する出力の最初の行は、ヒープで発生するはずです。毎回異なるアドレスが割り当てられている場合、私には意味があります。ただし、2 行目に対応するローカル変数のアドレスを出力しても、結果は異なります。
一見すると、プログラムが物理メモリ アドレスを出力しているためだと思っていましたが、この投稿Virtual Memory or Physical Memoryは私の最初の考えを反証しています。プログラムの実行が「同じ」で、スレッドやユーザー入力などがない場合、異なるアドレスのメモリ割り当てがまだあるという理由はありますか?
テスト環境:
- Linux 14.04
- マック OS X 10.10
linux - Linux 上のスタックの ASLR エントロピー ビット
MITのプレゼンテーションで、さまざまな種類の ASLR 実装について説明しています。
たとえば、静的 ASLR の場合、スタックには 19 ビットのエントロピーがあると指摘しています。私の理解では、これは、スタック ベース アドレスをランダム化して 2^19 の異なる値を取ることしかできないことを意味します。
スタックに 19 ビットのエントロピーがあることを計算する方法を知りたいですか?
編集:
オンラインで確認したところ、Linux のスタック ASLR に関する説明が見つかりました。別の質問から学ぶと、関連すると思われるコードは次のとおりです。
ここが私の質問の理由を説明する適切な場所であるかどうかを尋ねたいですか?
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」ですか? これはどこかに文書化されていますか?