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 标志数组的结束