0

在 C 编程语言中,对于 execve:

int execve(const char *filename, char *const argv[],
                  char *const envp[]);

我们如何使用 envp 进行漏洞利用?

其次,当通过 envp 传递值时,我们需要用 NULL 终止它吗?

最后,envp 放在堆栈的什么位置?

提前致谢!

4

2 回答 2

0

这个例子可以帮助你理解 execve() argv 和 envp 的用法

$ 猫 a.sh

#!/bin/sh
echo "value of PWDIR is $PWDIR"
echo "first arg = $1"
echo "second arg = $2"
printenv

/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = {"PWDIR=/home/root" };

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    newargv[0] = argv[1];

    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() only returns on error */
    exit(EXIT_FAILURE);
}

编译代码

$ cc execve.c -o execve

执行代码并输出如下

$ ./execve a.sh
value of PWDIR is /home/root
first arg = hello
second arg = world
PWDIR=/home/root
PWD=/home/arul/work/images/samples

在 execve 中传递的环境变量在 shell 脚本中使用。另请注意,执行脚本时,将在此处生成单独的 shell。

于 2017-03-24T14:08:51.007 回答
0

Linux 上的 Shellcode 倾向于使用系统调用来执行。您可能在考虑 ret2libc 吗?您的问题是混合 c 代码和 shellcode,不清楚您在问什么。

于 2016-02-25T12:53:39.393 回答