gpt4 book ai didi

c++ - 何时以及如何使用 GCC 的堆栈保护功能?

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:11 27 4
gpt4 key购买 nike

我在编译我正在处理的项目(商业多平台 C++ 游戏引擎,使用 GCC 4.2 在 Mac OS X 10.6 上编译)时启用了 -Wstack-protector 警告。此标志警告即使启用了 -fstack-protector 也不会防止堆栈粉碎的函数。GCC 在构建项目时发出一些警告:

not protecting function: no buffer at least 8 bytes long
not protecting local variables: variable length buffer

对于第一个警告,我发现可以调整缓冲区在函数中使用时必须具有的最小大小,以保护此函数免受堆栈粉碎:--param ssp-buffer-size =X 可以使用,其中 X 默认为 8,可以低至 1。

对于第二个警告,除非我停止使用 -Wstack-protector,否则我无法抑制它的出现。

  1. 什么时候应该使用-fstack-protector? (例如,在开发期间的所有时间,还是仅在跟踪错误时?)
  2. 什么时候应该使用-fstack-protector-all
  3. -Wstack-protector 告诉我什么?是否建议我减小缓冲区的最小大小?
  4. 如果是这样,将大小设置为 1 是否有任何缺点?
  5. 看起来 -Wstack-protector 不是您希望在任何时候都启用的标志,如果您想要一个无警告的构建。这是对的吗?

最佳答案

堆栈保护是一种加固策略,而不是调试策略。如果您的游戏支持网络或有来自不受控制来源的数据,请将其打开。如果它没有来自不受控制的地方的数据,请不要打开它。

结果是这样的:如果您有一个错误并根据攻击者可以控制的内容更改缓冲区,则该攻击者可以覆盖返回地址或堆栈的类似部分以使其执行他们的代码而不是您的代码代码。如果堆栈保护检测到这种情况,它将中止您的程序。您的用户不会高兴,但他们也不会被黑客攻击。这不是关于在游戏中作弊的黑客攻击,而是关于有人利用您代码中的漏洞创建可能感染您的用户的漏洞的黑客攻击。

对于面向调试的解决方案,请查看诸如挡泥板之类的东西。

关于您的具体问题:

  1. 如果您从不受控制的来源获取数据,请使用堆栈保护器。答案可能是肯定的。所以使用它。即使您没有来自不受控制来源的数据,您也可能最终或已经拥有但没有意识到这一点。
  2. 如果您想要额外的保护以换取一些性能损失,则可以对所有缓冲区使用堆栈保护。来自 gcc4.4.2 manual :

    -fstack-protector

    Emit extra code to check for buffer overflows, such as stack smashing attacks. This is done by adding a guard variable to functions with vulnerable objects. This includes functions that call alloca, and functions with buffers larger than 8 bytes. The guards are initialized when a function is entered and then checked when the function exits. If a guard check fails, an error message is printed and the program exits.

    -fstack-protector-all

    Like -fstack-protector except that all functions are protected.

  3. 警告会告诉您堆栈保护无法保护哪些缓冲区。

  4. 这不一定是建议您减小最小缓冲区大小,大小为 0/1 时,它与 stack-protector-all 相同。如果您决定重新设计代码以保护缓冲区,它只是向您指出,以便您可以。
  5. 不,这些警告并不代表问题,它们只是向您指出信息。不要经常使用它们。

关于c++ - 何时以及如何使用 GCC 的堆栈保护功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008056/

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