C 获取环境变量地址

C 获取环境变量地址,c,gdb,C,Gdb,我已禁用ASLR。我想获得环境变量“SHELL”的地址,所以我使用C函数getenv() 通过gdb获得的地址: gdb> x/4000s $esp ... (gdb) x/s 0xbffff710 0xbffff710: "SHELL=/bin/bash" (gdb) x/s 0xbffff716 0xbffff716: "/bin/bash" 为什么地址不同?如前所述,我必须说出使用GDB获得的正确地址。[对于Linux] 摘自(我用斜体): getenv()的实现不

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

通过gdb获得的地址:

gdb> x/4000s $esp
...
(gdb) x/s 0xbffff710
0xbffff710:     "SHELL=/bin/bash"
(gdb) x/s 0xbffff716
0xbffff716:     "/bin/bash"
为什么地址不同?如前所述,我必须说出使用GDB获得的正确地址。

[对于Linux]

摘自(我用斜体):

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


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

问题在于,在gdb下运行和不运行时,环境变量列表可能不同。这足以引起地址的变化

略为缩短的列表。。。(你的节目)

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

为什么地址不同

因为一个是在
gdb
下运行的,而另一个不是。在不同的环境下运行会导致不同的环境。真的

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

请注意,我必须说正确的地址在与gdb获得的文件


该声明基于什么信息?

您如何知道gdb的正确地址?当然,这两个都是正确的。他们都生活在不同的环境中。@EdHeal如果我用C函数获得的地址进行搜索:(gdb)x/s 0xbfffff752 0xbfff752:发布的代码甚至还没有开始编译。除其他事项外,系统功能需要“包括”;getenv()。强烈建议编译时启用所有警告。(对于gcc,至少在我的系统(UbuntuLinux 14.04)上使用:'-Wall-Wextra-pedantid')在添加缺少的#include、输出:0x7fff2280de16和gdb输出:0x7fffffffe46a等内容后,发布的代码是不同的进程,每个进程都有自己的地址空间,那么同一个环境变量的“有效”地址是不同的“可重入”与这个问题有什么关系?@alk尽管手册页上确实有这样的说法,而且一些真正古老的操作系统也这样做了,但目前使用的操作系统从来没有这样做过。这个答案不是观察行为的原因。正如您和@user3629249所说,地址不同,因为我的程序是在gdb下运行的。我理解调试器调试进程,但进程是独立的(这是一个“正常”进程),gdb只停止、修改它,等等。到底发生了什么?gdb不添加环境变量。@David发生的事情是,在执行gdb时。/program gdb是进程的父进程。如果您想要绝对独立,您需要在原始环境中进行调试,并通过gdb-p$PID.Ok,Ok连接到流程。我不能在使用gdb后运行程序并创建附加进程吗?作为gdb的正常调试,我想说。我想测试一下,对于一个完成得太快的程序,我能想到的唯一方法就是放getchar();我在main()的第一行添加了一个getchar。好的,$./getenv打印0xbfff752,如果我使用“gdb-pmypid”,(gdb)x/s 0xbfff750,0xbfff750:“/bin/bash”。getenv.c打印到0xbffff752,gdb打印到0xbffff750。反正地址不对。
$ ./getenv
0xbffff752
gdb> x/4000s $esp
...
(gdb) x/s 0xbffff710
0xbffff710:     "SHELL=/bin/bash"
(gdb) x/s 0xbffff716
0xbffff716:     "/bin/bash"
$ 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)