我需要为二进制程序分配一组精确的共享库依赖项。我正在使用linux,该项目是用我的C ++编写的。因此,我需要在C ++中使用类似递归的ldd功能。我该怎么办?
答案 0 :(得分:3)
引用Han Solo,"我对此感到很不舒服"。在C ++程序中为子进程设置chroot听起来像是一些架构误解/搞砸了。对不起,没有现成的C ++解决方案。当然,可以运行ltrace / strace / recursive-ldd并解析它们的输出......
...但一般来说,我们的想法是静态设置chroot环境 (即在任何进程启动之前),而不是动态设置。通过动态方法,攻击者可以欺骗主进程,使其相信它应该为子进程提供它不应该在chroot中拥有的进程。这违背了整个目的。
静态为给定可执行文件设置chroot环境的工具很多,这样做的工具动态地我无法找到任何。这本身就是一个提示。
答案 1 :(得分:0)
与此同时,我发现了以下内容:
linux/gcc: ldd functionality from inside a C/C++ program
接受的答案建议使用:
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
我试了一下,从bash和C ++开始工作(在这种情况下,我认为是等效的版本)。但是,如果我为SUID二进制文件(我实际拥有的)运行任一版本,那么我得到退出代码5(我猜许可问题)。
然后我追踪了ldd究竟做了什么,以下看起来很好(至少在命令行中):
LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 binary_name
(虚拟)问题是:在C ++中它的等效实现是什么?