0

我正在使用一个父进程,它使用 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);
}
4

1 回答 1

1

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

于 2013-06-22T17:14:46.970 回答