代码之家  ›  专栏  ›  技术社区  ›  user1798340

GCC中是否有一个编译器开关来防止最终可执行文件中的随机数据泄漏?

gcc
  •  0
  • user1798340  · 技术社区  · 5 年前

    编辑:我在这里做了错误的假设,GCC工作正常,阅读下面的答案。

    我在编译后的对象文件中找到开发计算机中的源代码、目录结构和其他随机数据片段,这些文件在链接后最终形成一个可执行文件。

    当然,这只是来自编译器进程内存的随机数据,可能是重新使用的缓冲区,其中保存了源代码或其他文件,在重新使用之前没有正确清理。

    在许多情况下,这不是问题,但有时泄漏会暴露得太多。我发现最有问题的是它的不可预测性:今天它揭示了一些不重要的库的来源,而明天它可能揭示一些私钥或类似的东西。

    是否有一些常规的方法来防止这种情况发生,一些开关会强制GCC在使用之间清理缓冲区,或者其他一些解决方案?

    编辑:

    好的,下面是一个示例,通过编译qrcodegen.c,可以从:

    https://github.com/nayuki/QR-Code-generator/tree/master/c

    使用此命令行:

    GCC-C-墙qrcodegen.C-O9-O qrcodegen.O

    结果如下,查看偏移量0x668c:

    https://drive.google.com/file/d/1WZRlCsjr4CALfi5pmsbd3fLeVsnnxGsa

    如果链接到可执行文件,则显示该内容 在.rdata节中,您可以在对象文件中看到它。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Stephen Newell    5 年前

    你所观察到的问题是基于 assert . 自从 断言 会在失败时打印通常(总是)的消息吗?包括实际断言测试( 21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize ,文件名和行号。

    如果用 -DNDEBUG ,您将禁用 断言 我还没有挖掘出结果对象文件,但是你之前指出的代码片段不在那里。