Section outline

  • execve() 系统调用的第三个参数是一个指向环境变量数组的指针,它允许我们向程序传递环境变量。在我们的示例程序中,我们向 execve() 传递了一个空指针,因此没有环境变量被传递给程序。

    在本任务中,如果我们将 shellcode(mysh64.s)中的命令 "/bin/sh" 替换为 "/usr/bin/env",该命令用于打印出环境变量。您会发现,当我们运行我们的 shellcode 时,没有任何输出,因为我们的进程没有任何环境变量。

    在本任务中,我们将编写一个名为 myenv64.s 的 shellcode。当此程序被执行时,它会执行 "/usr/bin/env" 命令,并打印出以下环境变量:
    $ ./myenv64
    aaa=hello
    bbb=world
    ccc=hello world

    要编写这样的 shellcode,我们需要构造一个环境变量数组,并在调用 execve() 之前,将该数组的地址存储到 rdx 寄存器中。构造此数组的方法与构造 argv[] 数组的方法完全相同。请参见以下内容:
    env[0] = "aaa=hello"        字符串的地址
    env[1] = "bbb=world"        字符串的地址
    env[2] = "ccc=hello world"  字符串的地址
    env[3] = 0                  0 标志数组的结束