3

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

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

4

2 回答 2

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 返回 a ,它是指向printf 语句部分char *定义的存储的指针,而本质上是取消引用 getenv 返回的 char 指针。此外,通过语句找到 getenv()。%08X%s#include <stdlib.h>

于 2013-07-30T23:21:18.037 回答
1

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

将尝试编写我自己的 c 代码来做你想做的事情,并会发布第二个注释。

于 2013-07-29T23:31:56.603 回答