【发布时间】:2017-06-04 17:36:27
【问题描述】:
首先,由于这是我在 StackOverflow 上提出的第一个问题,因此我没有足够的声誉来包含超过 2 个链接。但是,我需要包含超过 2 个链接才能使我的问题完整且易于理解。这就是为什么我在下面的Gist 中写下所有有问题的参考资料。后来每次看到[XXX],都是指前面提到的Gist中对应的链接。
让我们自己解决这个问题:我面临一个涉及 glibc 的编译问题。
总之,作为我课程的一部分,我有机会学习计算机安全。值得注意的是,我必须深入研究一些 CVE。我选择研究 [GHOST - CVE-2015-0235]:GetHOSTbyxxx 函数中允许远程代码执行的缓冲区溢出。
为此,我想尝试重现 [Qualys 漏洞利用]。 这就是为什么我基于最新的 LTS Ubuntu 发行版 (16.04) 建立一个 Docker 环境,我想在其中编译 [glibc] (2.17) 的易受攻击版本和 [Exim 邮件服务器] 的易受攻击版本(4.77) - 这是 Qualys 漏洞利用中利用的软件。
第一步是下载、编译和安装(在 /usr/local/lib 中)glibc。到目前为止,一切顺利。
为了验证我可以用 gcc 编译一些链接到这个版本的 glibc 的代码,我编译了 Qualys 提供的 [GHOST 漏洞检查],这要归功于以下命令(灵感来自 StackOverflow 的这两个答案:[ 1]和[2]):
gcc vulnerability_check.c -o vulnerability_check \
-Wl,--rpath=/usr/local/lib \
-Wl,--dynamic-linker=/usr/local/lib/ld-linux-x86-64.so.2
完全没有问题。因此,我尝试编译链接到易受攻击的 glibc 版本的 Exim 邮件服务器。根据与 Exim 邮件服务器相关的文档,可以通过将以下行附加到 Local/Makefile(必须由用户从 src/EDITME 创建)来添加编译标志:
CFLAGS="-Wl,--rpath=/usr/local/lib -Wl,--dynamic-linker=/usr/local/lib/ld-linux-x86-64.so.2"
但是,我面临一些“未定义的引用”错误:
/usr/local/lib/libpthread.so.0: undefined reference to `h_errno@GLIBC_PRIVATE'
/usr/local/lib/libpthread.so.0: undefined reference to `__vdso_clock_gettime@GLIBC_PRIVATE'
collect2: error: ld returned 1 exit status
Makefile:517: recipe for target 'eximon.bin' failed
据我了解,这意味着“eximon”源代码中使用的一些符号(h_errno 和clock_gettime),通常定义在共享静态库中,在我编译的glibc 版本中找不到。为了确保它们确实没有被定义,我在 [GHOST 漏洞检查] 代码中添加了对这两个符号的虚拟调用,并对其进行了编译。完全没问题。
我不确定下一步该做什么来跟踪问题的根源。我一直在寻找方法来分析沿 glibc 编译的静态库的内容(nm 似乎可以解决问题)。我尝试深入研究编译工具链的文档,从 gcc 到 ld。我也找到了关于 PatchELF,但我认为这不是我需要的(没有第三方库可以修改)。但是,我既找不到解决方案,也找不到解决方法。
因此,我将不胜感激有关如何将 Exim 与已编译的 glibc 链接、使用编译工具链的正确方法、解决此类编译问题的正确方法的任何建议;或者任何你认为会让我成为更好的程序员的建议。
非常感谢您。
【问题讨论】:
-
欢迎来到 S.O.这个问题显示了很好的努力。继续努力。
-
@DavidC.Rankin 谢谢!