C 获取环境变量的地址

C 获取环境变量的地址,c,linux,shell,gdb,C,Linux,Shell,Gdb,我有一个环境变量,我正在尝试获取它的内存地址。我有 memset(&buffer, 0x90, 517); memcpy(&buffer[517-strlen(shellcode)],shellcode,strlen(shellcode)); setenv("EGG",buffer,1); putenv(buffer); printf("EGG address: 0x%1x\n", getenv("EGG")); system("bash"); 它打印出来的内存地址是0x804

我有一个环境变量,我正在尝试获取它的内存地址。我有

memset(&buffer, 0x90, 517);
memcpy(&buffer[517-strlen(shellcode)],shellcode,strlen(shellcode));
setenv("EGG",buffer,1);
putenv(buffer);
printf("EGG address: 0x%1x\n", getenv("EGG"));
system("bash");
它打印出来的内存地址是
0x804b00c
。这看起来不正确。我用gdbx/x
0x804b00c
检查了它。它说无法在
0x804b00c
上访问内存。所以
getenv
基本上给了我垃圾内存。我已经调用了
env
,以确保
EGG
变量已设置,并且已成功


为什么我无法获取
EGG
的内存地址

初步的答案是,您的Endian硬件很少。因此,字(4个字节,在字边界对齐)与半字一起存储,半字内的字节交换。0x0804b00c更可能位于0x0cb04b80


我将尝试编写我自己的c代码来做你想做的事情,并将发布第二条说明。

谢谢你提出这个问题,这是另一个学习机会

已将代码提炼为以下内容:

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

    void main()
    {
      const char shellcode[] = "EGG=whatever";

      putenv(shellcode);

      printf("EGG address @%08X\n", getenv("EGG"));

      printf("EGG value is <%s>.", getenv("EGG"));

    }
#包括
#包括
void main()
{
const char外壳代码[]=“EGG=whatever”;
putenv(外壳代码);
printf(“蛋地址@%08X\n”,getenv(“蛋”);
printf(“蛋值为”),getenv(“蛋”);
}
此代码在Eclipse/MicrosoftC编译器环境中工作。注意,我不必调用setenv或bash或发出系统命令。在本例中,为流程设置了环境变量EGG


另外,请注意EGG的地址与其实际值之间的差异。在第一种情况下,getenv返回一个
char*
,它是一个指向存储的指针,由printf语句的
%08X
部分定义,而
%s
基本上取消引用getenv返回的char指针。另外,getenv()是通过
#include
语句找到的。

除了您自己之外,任何人都几乎不可能调试它。变量太多。告诉您的环境变量所在的地址是没有意义的,它可以位于任何地址。为什么需要环境变量的地址?您打算如何处理它?请尝试使用正确的格式打印地址,
printf(“%p\n”),(void*)getenv(“EGG”)。这看起来非常可疑:
memset(&buffer,0x90517)。典型的程序员不太懂C。。。也许你的意思是
memset(buffer,0x90517)
或其他东西。@modifiablelvalue:大多数“sploitcoders”都非常了解C。Jake不是一个很好的sploitcoder,因为他假设环境变量存储在非随机地址,并且正在非可执行内存上编写nop sled。