0

我需要为二进制程序分配一组精确的共享库依赖项。我正在使用 linux,该项目是用我的 C++ 编写的。因此,我需要 C++ 中的类似 ldd 的递归功能。我该怎么做?

4

2 回答 2

4

引用 Han Solo 的话,“我对此有一种不好的预感”。从 C++ 程序中为子进程设置 chroot 听起来像是一些架构上的误解/进一步搞砸了。抱歉,我没有想到现成的 C++ 解决方案。当然,您可以运行 ltrace / strace / recursive-ldd 并解析它们的输出......

...但一般来说,这个想法是静态设置 chroot 环境(即在任何进程启动之前),而不是动态设置。使用动态方法,攻击者可以欺骗主进程,使其相信它应该给子进程一些它不应该在 chroot 中拥有的东西。这违背了整个目的。

为给定的可执行文件静态设置 chroot 环境的工具很多,动态设置的工具我找不到。这本身就是一个提示。

于 2012-06-22T09:49:12.000 回答
1

与此同时,我发现了以下内容: linux/gcc:来自 C/C++ 程序内部的 ldd 功能, 其中接受的答案建议使用:
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1); FILE *ldd = popen("/lib/libz.so");
我尝试了它并从 bash 和 C++ 工作(在这种情况下我认为是 ofc等效版本)。但是,如果我为 SUID 二进制文件(我实际拥有的)运行任一版本,那么我会得到退出代码 5(我猜是权限问题)。

然后我追踪了 ldd 究竟做了什么,以下似乎很好(至少在命令行中):(
LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 binary_name
虚拟)问题是:C++ 中这个的等效实现是什么?

于 2012-07-04T09:23:08.157 回答