获取环境变量的地址

时间:2013-02-14 23:06:40

标签: 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");

打印出的内存地址为0x804b00c。这看起来不正确。我用GDB x / x 0x804b00c检查了它。它说无法访问0x804b00c的内存。所以getenv基本上给了我垃圾记忆。我已调用env以确保EGG变量已设置,并且确实如此。

为什么我不能获得EGG的内存地址?

2 个答案:

答案 0 :(得分:2)

感谢这个问题,另一个学习机会!

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

    #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"));

    }

此代码适用于Eclipse / Microsoft C编译器环境。注意,我没有必要调用setenv或bash或发出系统命令。在此示例中,为流程设置了环境变量EGG。

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

答案 1 :(得分:1)

初步答案是你有很少的Endian硬件。因此,在半字内的半字和字节SWAPPED中存储字(4个字节,在字边界处对齐)。 0x0804b00c更可能真的在0x0cb04b80。

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