ASLRとその実装方法を理解しようとしています。バッファオーバーフローなどが実際に「防止」されるわけではないことを理解しています。しかし、私はそれがどのようにlibc攻撃への復帰を防ぐのか理解できません。たとえば、バッファオーバーフローのあるプログラムがあるとします。入力として、np-opスレッドとそれに続くシェルコードを入力します。シェルコードは、スタックフレームのリターンアドレスを上書きします。したがって、関数が戻ると、シェルコードが実行されます。 libc関数のアドレスを書き込むと、その関数が呼び出されます。 ASLRを使用すると、プログラムを実行するたびに、プログラムはランダムなアドレスで開始されますよね?しかし、libc関数はまだ同じアドレスにあり、私が正しければ、マシンを再起動するまで変更されません。だから、もし私が基本的にすべての可能なアドレスで脆弱なプログラムをブルートフォースにしようとしたとしても、私はまだlibcに戻ることができますか?また、aslrはROP攻撃を防ぎますか?そうでなければ防御は何ですか?
可能なすべてのアドレスで脆弱なプログラムを総当たりします
アドレススペースをブルートフォースにしようとする(現代の64ビットシステムには2 ^ 64の可能なアドレスがある)ことは、時間(およびリソース)の制約により、実際には不可能であると考えられています。また参照してください: これまでに実行された/可能なブルートフォース攻撃の最大数はどれですか?
より実際的な注意として、アドレスが間違っていると推測した場合、たとえばセグメンテーションフォールトが原因でプログラムがクラッシュする可能性が高くなります。 64ビットアドレスをブルートフォースにすると時間がかかるため、これらのクラッシュを検出できます。
したがって、スタック上のシェルコード、ライブラリ関数(return-to-libcの場合)、またはガジェット(ROPの場合)のアドレスを見つけることは、攻撃者にとって難しすぎます。
もちろん、ASLRをバイパスする方法は他にもあります。興味がある場合は、ポインタリークやヒープスプレーなどのメモリレイアウト攻撃を調べてください。