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
プログラム名が変更されたり、新しい環境変数が追加されたりすると、位置が少し異なることを理解していますが、なぜ場所がそれほど異なるのですか?
「プログラム名が変更されたり、新しい環境変数が追加されたりすると、位置が少し異なることは理解していますが、なぜ場所がそれほど異なるのですか?」これは、考えられるすべての実装の中で最も単純ですが、必須ではありません。
—
dmckee ---元モデレーターの子猫2014
getenv
マニュアルでは、それは変数の値を含む文字列へのポインタを返すと言います。それ以外はすべて指定されていないため、ポインタと約束が真である限り、カーネルやコンパイラは値をどこにでも固定できます。私はこれに対する正確な答えは重い魔法であり、さまざまなメモリマッピングの実装の詳細と月の位相に依存していると思います。(私はあなたに正確な答えを与えるのに十分な魔法使いではありません。)