[英]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.