【问题标题】:Getting address of Environmental Variable获取环境变量的地址
【发布时间】:2013-02-14 23:06:39
【问题描述】:

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

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的内存地址?

【问题讨论】:

  • 这对于任何人来说几乎是不可能调试的,除了你自己。变数太多。告诉你的环境变量在哪个地址是没有实际意义的,它可以在任何地址。
  • 为什么需要环境变量的地址?你打算用它做什么?
  • 尝试以正确的格式打印地址,printf("%p\n", (void*)getenv("EGG"));。并不是说它可能会有所帮助。
  • 这看起来非常可疑:memset(&buffer, 0x90, 517);。典型的 sploitcoder 不太了解 C...也许您的意思是 memset(buffer, 0x90, 517); 或其他什么。
  • @modifiablelvalue:大多数“sploitcoders”确实非常了解 C。不过,Jake 不是一个很好的 sploitcoder,因为他假设环境变量存储在非随机地址,并且正在非可执行内存上编写 nop sled。

标签: c linux shell gdb


【解决方案1】:

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

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

    #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 &lt;stdlib.h&gt; 语句找到的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2016-10-10
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多