gpt4 book ai didi

c++ - 有没有办法弄清楚可执行文件需要/使用哪些环境变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:13 26 4
gpt4 key购买 nike

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

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

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

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

有谁知道程序使用了哪些环境变量?我应该补充一点,我是在 Ubuntu 12.04 LTS 安装上执行此操作的。

感谢您的帮助。

最佳答案

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

实际上很多类似 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 的所有调用,其中包含一个常量字符串。

关于c++ - 有没有办法弄清楚可执行文件需要/使用哪些环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com