4

「ハッキング: 搾取の技術」という本を読んでいて、次の段落に出くわしました。

execl() では既存の環境を使用しますが、execle() を使用すると環境全体を指定できます。環境配列が最初の文字列 (リストを終了するための NULL ポインターを含む) としての単なるシェルコードである場合、唯一の環境変数はシェルコードになります。これにより、アドレスの計算が容易になります。Linux では、アドレスは 0xbffffffa から環境内のシェルコードの長さを引いて、実行されたプログラムの名前の長さを引いたものになります。このアドレスは正確であるため、NOP スレッドは必要ありません。

  1. 環境を指定するとはどういう意味ですか?

  2. さまざまな環境を分類するものは何ですか?

  3. 環境変数のアドレスがそのように計算されるのはなぜですか (または、より具体的には、ベース アドレスが 0xbffffffa である理由)?

  4. execle() の代わりに execl() 関数を使用した場合、シェルコード環境変数を使用できなかったのでしょうか?

4

2 に答える 2

3

環境を指定するとはどういう意味ですか?

に渡される最後の引数execle()は、実行されたプログラムが参照する環境変数を記述する C 文字列を含む char ポインターの配列です。ここに例があります。

さまざまな環境を分類するものは何ですか?

これはよくわかりません。各プログラムには、独自の環境変数のセットがあります。それだけです。

環境変数のアドレスがそのように計算されるのはなぜですか (または、より具体的には、ベース アドレスが 0xbffffffa である理由)?

Linuxカーネルはそのように実装されているためです。

execl()代わりに関数を使用した場合execle()、シェルコード環境変数を使用できなかったでしょうか?

execl()興味がある場合は、環境変数を指定できません。

于 2013-05-31T19:56:17.050 に答える
0
 int execle(const char *path, const char *arg0, ...
         /* const char *argn, (char *)0,char *const envp[]*/);

envp[] 配列は、作成するプロセスのすべての UNIX 環境変数へのポインターです。これにより、新しいプロセスの「環境」が定義されます。

于 2013-05-31T19:56:48.723 に答える