単純な構造体を想定します。
struct test {
char variable[4];
char variable2;
}
variable[4] = '\0'
variable2を変更するバッファオーバーフローがあります。
ASLRはこのバッファオーバーフローを防ぎますか?
ASLRがバッファオーバーフローを防ぐことはありません。バッファオーバーフローとは、アプリケーションがバッファに書き込むことができるよりも多くのバイトをバッファに書き込む場合です。バッファを任意のランダムアドレスに配置しても修正できません。
ASLRが変更するのは、オーバーフローの結果です。攻撃者は、バッファオーバーフローを悪用して、制御された方法で余分なバイトを他のいくつかの要素に流し込もうとします。 ASLRは、次の2つの点でそれをより困難にします。
struct
の場合、ASLRは2つの構造体フィールドを分離しません。これは、C仕様に反し、コードが破損するためです。 ASLRに関係なく、variable2
フィールドは常にRAMのvariable
バッファーの直後にあるため、バッファーオーバーフローによりvariable2
が予測どおりに上書きされます。ただし、ASLRは引き続きアプリケーションの2つの実行間でコードチャンクを移動するため、variable2
を上書きしても、たとえば任意のコードを挿入するには不十分な場合があります。