【问题标题】:execle() also specifies the environment. What does that mean?execle() 还指定环境。这意味着什么?
【发布时间】:2013-05-31 19:48:27
【问题描述】:

我正在阅读一本名为“黑客:剥削的艺术”的书,我偶然发现了这一段:

使用execl(),使用现有环境,但如果使用execle(), 可以指定整个环境。如果环境数组只是 shellcode 作为第一个字符串(使用 NULL 指针终止列表), 只有环境变量是 shellcode。这使得它的地址很容易 计算。在 Linux 中,地址将为 0xbffffffa,减去 环境中的shellcode,减去执行的名字的长度 程序。由于这个地址是准确的,所以不需要 NOP 雪橇。

  1. 指定环境是什么意思?

  2. 什么对不同的环境进行分类?

  3. 为什么环境变量的地址是这样计算的(或者更具体地说,为什么基地址是 0xbffffffa)?

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

【问题讨论】:

    标签: c linux exec exploit shellcode


    【解决方案1】:

    指定环境是什么意思?

    传递给execle() 的最后一个参数是一个字符指针数组,其中包含描述执行程序将看到的环境变量的C 字符串。 Here 就是一个例子。

    什么对不同的环境进行分类?

    我不太明白这个。每个程序都有自己的一组环境变量,就是这样。

    为什么环境变量的地址是这样计算的(或者更具体地说,为什么基地址是 0xbffffffa)?

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

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

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

    【讨论】:

    • 我认为环境变量是系统变量,您可以通过在终端中键入“env”来查看。那么为什么我需要创建那个数组呢?我知道函数“getenv()”存在,它将返回环境变量的地址。那么这是干什么用的呢?
    • @Shookie “我认为环境变量是系统变量,您可以通过在终端中输入“env”来查看。” - 他们是。 “那我为什么需要创建那个数组呢?” - 你不需要。这与getenv() 无关。此函数设置环境变量。
    【解决方案2】:
     int execle(const char *path, const char *arg0, ...
             /* const char *argn, (char *)0,char *const envp[]*/);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      相关资源
      最近更新 更多