環境変数の場所がなぜそれほど異なるのですか?


9

Jack Ericksonによる本「ハッキング:悪用の芸術」を読んで、私はSHELLCODEプログラムを悪用するために環境変数のアドレスを概算しようとしています。

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

プログラム名が変更されたり、新しい環境変数が追加されたりすると、位置が少し異なることを理解していますが、なぜ場所がそれほど異なるのですか?


getenvマニュアルでは、それは変数の値を含む文字列へのポインタを返すと言います。それ以外はすべて指定されていないため、ポインタと約束が真である限り、カーネルやコンパイラは値をどこにでも固定できます。私はこれに対する正確な答えは重い魔法であり、さまざまなメモリマッピングの実装の詳細と月の位相に依存していると思います。(私はあなたに正確な答えを与えるのに十分な魔法使いではありません。)
Anko

「プログラム名が変更されたり、新しい環境変数が追加されたりすると、位置が少し異なることは理解していますが、なぜ場所がそれほど異なるのですか?」これは、考えられるすべての実装の中で最も単純ですが、必須ではありません。
dmckee ---元モデレーターの子猫2014

回答:


13

あなたが説明するのは、アドレススペースレイアウトランダム化(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

はい、それでうまくいきました。本の著者がUbuntu 10.04を使用していることに気づきましたが、これにはまだASLRがありませんでした。
Janman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.