c - 获取环境变量的地址

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

最佳答案

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

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

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

关于c - 获取环境变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885716/

相关文章:

c - C中的结构,检查点是否在圆圈内

bash - 从 shell 脚本 (bash) 的参数列表中删除最后一个参数

bash - ubuntu服务器用点重命名文件

c - 机器之间堆栈粉碎行为不同的原因

c++ - 程序意外退出,代码为 0xC0000417(无效的 C 运行时参数)

c - 如何删除无符号整数中的 2 位数字?

linux - 从 Windows 资源管理器中的共享文件夹执行 bash 脚本

python-3.x - 如何在 ubuntu 18.04 中将 python 3.8.0 升级到 3.8.3

C++计算CPU/内存使用情况

css - 如何将 `diff`文件创建一个 "common"文件?