簡體   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