execle()函数还指定了环境变量。这是什么意思?

5

我正在阅读一本名为《黑客攻防艺术》的书,我看到了这段话:

使用execl()函数时,将使用现有环境,但如果您使用execle()函数,则可以指定整个环境。如果环境数组仅是shellcode的第一个字符串(带有终止列表的空指针),则唯一的环境变量将是shellcode。这使得它的地址容易计算。在Linux中,地址将为0xbffffffa,减去环境中shellcode的长度,减去执行程序名称的长度。由于此地址将是确切的,因此不需要NOP滑板。

  1. 什么是指定环境?

  2. 答:指定环境是指在使用execle()函数时可以自己定义环境变量。

  3. 什么分类不同的环境?

  4. 答:不同的环境可以通过环境变量来区分,在Linux系统下使用export命令添加环境变量。

  5. 为什么要按那种方式计算环境变量的地址(或者更具体地说,为什么基地址是0xbffffffa)?

  6. 答:Linux系统的内存布局决定了环境变量的基地址是0xbffffffa,具体原因与内存布局有关。

  7. 如果我使用execl()函数而不是execle()函数,我就不能使用shellcode环境变量吗?

  8. 答:是的,如果您使用execl()函数,则无法使用shellcode环境变量。

2个回答

3

什么是指定环境?

execle() 的最后一个参数是一个 char 指针数组,其中包含描述执行程序所看到的环境变量的 C 字符串。这里是示例

什么分类不同的环境?

我不太明白这个问题。每个程序都有自己的环境变量集。

为什么以那种方式计算环境变量的地址(或者更具体地说,为什么基地址为 0xbffffffa)?

因为 Linux 内核是这样实现的。

如果我使用 execl() 函数而不是 execle(),我不能使用 shellcode 环境变量吗?

execl() 不允许您指定环境变量,如果您感兴趣的话。


我以为环境变量是系统变量,可以通过在终端中输入“env”来查看。那么我为什么需要创建那个数组呢? 我知道存在函数“getenv()”,它将返回环境变量的地址。那么这是用来做什么的? - matanc1
@Shookie:“我以为环境变量是系统变量,可以通过在终端中键入“env”来查看。” - 是的。“那么我为什么需要创建那个数组?” - 你不需要。这与getenv()无关。该函数设置环境变量。 - user529758

0
 int execle(const char *path, const char *arg0, ...
         /* const char *argn, (char *)0,char *const envp[]*/);

envp[]数组是指向要创建的进程的所有UNIX环境变量的指针。这定义了新进程的“环境”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接