【问题标题】:How to find address of the environment variables in Linux如何在Linux中找到环境变量的地址
【发布时间】:2019-07-01 14:57:45
【问题描述】:
我目前正在学习使用“The Art of Exploitation”中的环境变量来利用基于堆栈的缓冲区溢出。本章的重点是在 shellcode 中使用环境变量而不需要创建 NOP sled。这需要我要使用的变量的确切地址。这是片段:
使用execl(),使用现有环境,但如果使用
execle() ,可以指定整个环境。如果环境
数组只是作为第一个字符串的 shellcode(带有 NULL 指针
终止列表),唯一的环境变量将是
外壳代码。这使得它的地址易于计算。在 Linux 中,
地址将是 **0xbffffffa** 减去 shellcode 中的长度
环境,减去执行程序名称的长度。
关键是我使用的是完全不同的系统版本(Kali Linux 64 位和 4.19 内核),在我的例子中,作者 (0xbffffffa) 使用的基地址非常不同,我不知道去哪里看为了它。有什么方法可以找到,还是我应该在文档中的某个地方查找?
我假设这个地址在栈底的某个地方。还是栈基的确切地址?
【问题讨论】:
标签:
linux
environment-variables
buffer-overflow
exploit
shellcode
【解决方案1】:
这看起来像是 32 位内核下 32 位进程的 32 位地址,没有堆栈 ASLR。 main 获得 3 个参数:argc、argv 和 envp,最后一个是指向 env[] 数组 above RSP 的指针。当然它不会接近 RSP,但低于它,它会被函数调用的堆栈增长踩到。
在进程入口点 (_start),x86-64 System V ABI 指定初始 RSP 指向 argc,在此之上为 argv[0]、argv[1]、...。然后envp 数组(再次以 NULL 结尾)。
这在 x86-64 System V ABI 中有记录。
除非禁用堆栈 ASLR,否则 RSP 的初始值不固定。
【解决方案2】:
我猜,如果您只找到该环境变量的特定地址,您可以使用 getenv() 函数。
% export PAYLOAD=$<whatever_payload>
例子:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
printf("env address at %p\n", argv[1], getenv(argv[1]));
return (0);
}
用法:
% ./getenv PAYLOAD
【解决方案3】:
在 gdb 中:
x/10s *((char **)environ)
这会显示前 10 个环境变量。
【解决方案4】:
好的,所以我去了 gdb 并开始查看 $rsp 下面的地址(具有更高的值),直到我得到这个:
0x7fffffffeffc: ""
0x7fffffffeffd: ""
0x7fffffffeffe: ""
0x7fffffffefff: ""
0x7ffffffff000: <error: Cannot access memory at address 0x7ffffffff000>
这就是我想知道的。不过,感谢您的宝贵时间。