何时以及如何使用GCC';什么是堆栈保护功能? < >我在编译我正在进行的项目时(Wstack,GMC 4.2的商业多平台C++游戏引擎,编译Mac OS X 10.6),启用了 -“保护器< /代码>警告”。 此标志警告即使启用了-fstack protector也无法防止堆栈崩溃的函数。 GCC在构建项目时发出一些警告:

何时以及如何使用GCC';什么是堆栈保护功能? < >我在编译我正在进行的项目时(Wstack,GMC 4.2的商业多平台C++游戏引擎,编译Mac OS X 10.6),启用了 -“保护器< /代码>警告”。 此标志警告即使启用了-fstack protector也无法防止堆栈崩溃的函数。 GCC在构建项目时发出一些警告:,c++,gcc,stack,protection,C++,Gcc,Stack,Protection,不保护功能:没有至少8字节长的缓冲区 不保护局部变量:可变长度缓冲区 对于第一个警告,我发现可以调整缓冲区在函数中使用时必须具有的最小大小,以防止此函数发生堆栈崩溃:--可以使用param ssp buffer size=X,其中X默认为8,可以低至1 对于第二个警告,除非停止使用-Wstack protector,否则无法抑制其出现 什么时候应该使用-fstack保护器?(例如,在开发过程中的所有时间,或者在跟踪bug时?) 什么时候应该全部使用-fstack保护器 -Wstack prote

不保护功能:没有至少8字节长的缓冲区
不保护局部变量:可变长度缓冲区

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

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

  • 什么时候应该使用
    -fstack保护器
    ?(例如,在开发过程中的所有时间,或者在跟踪bug时?)
  • 什么时候应该全部使用
    -fstack保护器
  • -Wstack protector
    告诉我什么?这是否表明我降低了缓冲区的最小大小
  • 如果是这样,将大小设置为1是否有任何不利之处
  • 如果希望生成无警告版本,则似乎
    -Wstack protector
    不是您希望始终启用的标志类型。是这样吗

  • 您确实不应该关心正常构建的警告。这实际上更多的是一个信息性的信息。我希望很明显,对于堆栈上大小可变的缓冲区,您确实存在固有的安全问题;如果大小计算错误,就会打开一个大漏洞。

    堆栈保护是一种强化策略,而不是调试策略。如果您的游戏具有网络感知功能或数据来源不受控制,请将其打开。如果它没有来自不受控制的地方的数据,不要打开它

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

    对于面向调试的解决方案,请查看mudflap之类的内容

    关于你的具体问题:

  • 如果从非受控源获取数据,请使用堆栈保护器。答案可能是肯定的。所以使用它。即使您没有来自不受控制的来源的数据,您可能最终会或已经这样做,但没有意识到这一点
  • 如果您需要额外的保护以换取某些性能损失,则可以使用所有缓冲区的堆栈保护。发件人:

    -fstack保护器 发出额外代码以检查缓冲区溢出,例如堆栈破坏攻击。这是通过向具有易受攻击对象的函数添加保护变量来实现的。这包括调用alloca的函数,以及缓冲区大于8字节的函数。在输入函数时初始化防护,然后在函数退出时进行检查。如果保护检查失败,将打印错误消息,程序退出。

    -fstack保护器所有 与-fstack protector类似,只是所有功能都受到保护

  • 警告告诉您堆栈保护无法保护的缓冲区

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

  • From:使用:-Wno stack protector禁用所有堆栈破坏警告目前还没有pragma仅禁用此警告。(这在GCC中经常发生。没有警告或警告太少之间经常存在紧张关系。一种解决方案是为有问题的文件创建特殊的make target,并为其设置特殊的编译标志。)您能否详细说明为什么可变大小的缓冲区在风险方面与固定大小的缓冲区明显不同?我可以理解为什么很难像堆栈保护器对固定大小缓冲区所做的那样将它们放在函数中。双重攻击向量:攻击者可以提供比您为缓冲区分配的输入字节更多的输入字节,或者他可以尝试在缓冲区大小分配中查找错误有什么原因-fstack protector只检查缓冲区大于“8个字节”?为什么不是4个字节还是1个字节?@wenchiching,原因是性能和溢出的可能性。发现8个字节是溢出可能性值保护性能成本的阈值。⁺对于«挡泥板»而言♥堆栈保护的调试策略是可能的,有时也是有用的:(1)执行使用堆栈保护编译的二进制文件,并在调试器中禁用ASLR(地址空间布局随机化)。(2)等待内核。(3)内核将指示被关闭的堆栈金丝雀的地址。(4)在调试器中重新运行二进制文件,并在被破坏的堆栈金丝雀的地址上设置一个硬件监视点当位于罪犯地址的内存被修改时,调试器将停止。这些选项试图防止基于缓冲区溢出/堆栈损坏的攻击。这些文章应该会有所帮助:-您需要使用C99的可变长度数组(VLA)功能吗?如果不使用它,您将不会收到警告-并且您将