【问题标题】:Environment variables using execve() to run child process使用 execve() 运行子进程的环境变量
【发布时间】:2013-06-21 11:55:10
【问题描述】:

我正在使用一个父进程,它使用 execve() 来运行具有我在父进程中定义的特定环境变量的子进程。 在父进程中,如果我查看内存位置 $esp + 0x240 我会找到所有环境变量。但是,一旦启动子进程,我就无法找到存储预定义环境变量的内存地址。

我原以为由于 execve() 将父进程替换为子进程,因此传递给子进程的环境变量将位于 0xbffffffa 减去环境变量字符串的长度(在 Linux 中)。 但是,当启动子进程时,我不再可以访问内存中的那个位置。父进程调用execve()之前的esp为0xbffff120,子进程启动后esp跳转到0xbf9835a0。 (我猜这是因为子进程具有父进程没有的root权限) 现在,当我从堆栈顶部查看内存直到我不再有权访问内存时,没有任何从父进程传递的环境变量的符号。他们将位于哪里?同样在更一般的说明中,当您运行一个进程时,环境变量是否全部复制到堆栈最底部的内存中的高端?

#include <stdio.h>
#include <stdlio.h>
#include <string.h>
#include <unistd.h>

char envvari[]=
"\x31\xc0\  ...."   // Can be any environment variable

int main(int argc, char *argv[]) {
    char *env[2] = {envvari, 0};
    unsigned int i, ret;
    char *buffer = (char *) malloc(160);
    char *args[] = {"notesearch", buffer, 0};

    ret = 0xbffffffa - (sizeof(envvari)-1) - strlen("./notesearch");
    for(i=0; i < 160; i+=4)
        *((unsigned int *)(buffer+i)) = ret;

    execve("./notesearch", args, env);
    free(buffer);
}

【问题讨论】:

  • 拜托,与其描述代码,不如实际显示代码。
  • 如果没有一些代码,您将不会得到有用的答案。 +1 @Joachim Pileborg
  • 你们中的一些人可能已经在 J​​on Erickson 的《剥削的艺术》一书中看到了这段代码的示例。
  • @Benjamin:抱歉,上一个答案没有得到很好的考虑......我已经删除了它。我认为这个页面可能会有所帮助...stackoverflow.com/questions/3693335/…
  • 另外,这是一本好书 - www-h.eng.cam.ac.uk/help/tpl/unix/fork.html - 我认为您无权访问 envvari,因为 execve 将结束您当前的进程,包括所有资源(某些 fd 除外)。

标签: c linux gdb execve


【解决方案1】:

execve() 不会创建子进程。它只是替换了现有的流程。此外, execve() 永远不会返回。 fork() 是创建子进程的系统调用。如果 execve() 成功,execve() 之后的 free(buffer) 调用将永远不会被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2016-07-14
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2014-01-24
    相关资源
    最近更新 更多