繁体   English   中英

获取环境变量地址

[英]Get the environment variable address

我禁用了ASLR。 好吧,我想获取环境变量“SHELL”的地址,所以我使用C函数getenv()。

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

int main(int argc, char *argv[])
{
    char* ptr = getenv("SHELL");
    printf("%p\n", ptr);
}

用getenv()获得的地址

$ ./getenv
0xbffff752

使用gdb获取的地址:

gdb> x/4000s $esp
...
(gdb) x/s 0xbffff710
0xbffff710:     "SHELL=/bin/bash"
(gdb) x/s 0xbffff716
0xbffff716:     "/bin/bash"

为什么地址不同? 如上所述,我必须说明使用GDB获得的正确地址。

为什么地址不同?

因为一个是在gdb下运行而另一个不是。 在不同的环境下运行会导致不同的环境。 从字面上看。

gdb下运行时printf()语句的输出是什么?

请注意,我必须说明使用gdb获取的正确地址。

该声明基于什么信息?

麻烦的是,在gdb下运行时没有环境变量列表可能会有所不同。 这足以引起地址的转变。

有点缩短的列表......(你的程序)

$ gdb ./a.out
(gdb) r
Starting program: /home/mfranc/a.out 
0x7fffffffdd37
(gdb) r
Starting program: /home/mfranc/a.out 
0x7fffffffdd37
(gdb) set environment a="hello world"
(gdb) r
Starting program: /home/mfranc/a.out 
0x7fffffffdd27
(gdb) r
Starting program: /home/mfranc/a.out 
0x7fffffffdd27
(gdb) unset environment a
(gdb) r
Starting program: /home/mfranc/a.out 
0x7fffffffdd37
(gdb) 

通常,您应该在原始环境中进行调试,并通过gdb -p $ PID附加到进程。 如果以稍微不同的方式生成进程并且环境稍有不同,您可能会看到不同的地址。

[对于Linux]

来自man 3 getenv()斜体由我):

getenv()的实现不需要是可重入的。 getenv()返回值指向的字符串可以静态分配,并可以通过后续调用getenv()进行修改。

这意味着可以复制查询的值并返回对副本的引用,因此返回的地址可能与存储原始env-var-tuple的地址不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM