環境変数の位置がなぜそんなに変わるのですか?

環境変数の位置がなぜそんなに変わるのですか?

SHELLCODEJon Ericksonが書いたHacking:The Art of Exploitationという本を読んで、プログラムを活用するために環境変数のアドレスを推定してみました。

場所を見つけるために走るたびに、getenv("SHELLCODE");結果は完全に異なりました。

私の殻から抽出された:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

プログラムの名前を変更したり、新しい環境変数を追加すると、場所が少しずつ変わることがわかりますが、なぜ場所が違うのでしょうか。

答え1

あなたが説明するのは悪用防止機能です。アドレス空間レイアウトのランダム化(ASLR).デフォルトでは、カーネルがディスクからプログラムのELFファイルをロードするたびに、カーネルはプログラム関数呼び出しスタックの最上位アドレスをわずかに異なる(「ランダム」)アドレスに配置します。シェルコードのアドレスと環境変数argv(シェルコードの1つ)は、プログラムが呼び出されるたびに異なるアドレスを持ちます。

ASLRは、バッファオーバーフローやその他のスタック関連の脆弱性を悪用しにくくします。攻撃者は、関数呼び出しスタック内の変数と値の異なるアドレスを解釈するためにコードを書くか、何かを実行する必要があります。

次の手順でASLRを無効にできるようです。

echo 0 > /proc/sys/kernel/randomize_va_space

rootユーザーとして。 Ubuntuを明示的に参照したので、上記のコマンドは異なります。

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

関連情報