【问题标题】:Is there a way to figure out what environment variables are needed/used by an executable?有没有办法弄清楚可执行文件需要/使用哪些环境变量?
【发布时间】:2013-11-08 20:31:18
【问题描述】:

我有一个 C++ 程序,它将以 root 身份运行某些非常特定的命令。之所以需要这样做是因为在 Node.js 下运行的另一个程序需要执行诸如设置系统时间、设置时区等需要 root 权限才能完成的事情。在使用 setuid 命令后,我正在使用 C++ 中的函数 execve 以 root 权限进行系统调用。我特地选择了execve命令,因为我想隔离环境,所以我不会创建环境变量漏洞。

 setuid(0);
 execve(acExeName, pArgsForExec2, pcEnv);

我想要做的是准确地找出 pcEnv,它是我的程序需要的程序执行的环境变量列表。例如,如果我想像从控制台运行工具 time-admin 一样运行它,我如何才能确定它需要哪些环境变量。我知道我可以使用命令 printenv 打印出环境变量,但这给了我所有这些。我很确定我不需要所有这些,并且想要尽可能小的子集。

我知道我可以全部使用它们,然后慢慢评论每一个,看看它是否能继续工作,但我真的不想走那么远。

任何人有一个聪明的方法来弄清楚程序使用了哪些环境变量?我应该补充一下,我是在 Ubuntu 12.04 LTS 安装上执行此操作的。

感谢您的帮助。

【问题讨论】:

  • 除非程序在做一些有趣的事情,否则 ltrace 应该很有用
  • @PlasmaHH 有趣的是你的意思是像使用非标准但通常实现的第三个参数到main()char *envp[]?因为在那种情况下,如果没有询问作者、阅读文档或查看实际来源,我认为 OP 是一条没有桨的小溪。
  • @WhozCraig:没错,但是我发现 envptr 在现代 C 和 C++ 代码中的使用频率比在更旧的 C 代码中要少得多。但是所有的猜测都比阅读精美的手册更好。
  • 从二进制文件中提取strings,除非二进制文件有一些有趣的事情,应该包括它查找的所有环境变量。对 Node.js 做同样的事情可能会更棘手。

标签: c++ linux node.js environment-variables root


【解决方案1】:

没有确定某些程序使用的环境变量的通用方法。例如,可以想象一个程序有一些配置文件,其中给出了环境变量的名称。

实际上许多类似 shell 的程序(或脚本解释器)都在这样做。

更一般地,可以计算getenv(3) 的参数。所以理论上你无法猜测它的可能值。 (我可能错了,但是libcbash 的一些非常旧的版本曾经玩过这样的把戏;不幸的是,我忘记了细节,但有时使用了名称中带有一些 pid 号的环境变量。

而且,正如其他人评论的那样,您可能想要使用ltrace(或玩LD_PRELOAD 技巧),或使用gdb,以了解getenv 的调用方式...

应用程序还可能使用environ 变量(请参阅environ(7) ...)或main ...的第三个参数。

然而,在实践中,一个合理编写的程序应该清楚地记录它正在使用的所有环境变量......

如果您可以访问该程序的源代码,如果它是由 GCC 编译的,您可以使用(刚刚发布的 1.0 版)MELT plugin。 MELT 是一种扩展 GCC 的领域特定语言,可用于在编译程序时探索 GCC 处理的内部 Gimple 表示。特别是使用它的新 findgimple mode,您可以在一个命令中找到所有对 getenv 的调用以及一个常量字符串。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2015-05-03
    • 2012-03-19
    • 2010-10-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多