何时以及如何使用GCC';什么是堆栈保护功能? < >我在编译我正在进行的项目时(Wstack,GMC 4.2的商业多平台C++游戏引擎,编译Mac OS X 10.6),启用了 -“保护器< /代码>警告”。 此标志警告即使启用了-fstack protector也无法防止堆栈崩溃的函数。 GCC在构建项目时发出一些警告:
不保护功能:没有至少8字节长的缓冲区何时以及如何使用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
不保护局部变量:可变长度缓冲区 对于第一个警告,我发现可以调整缓冲区在函数中使用时必须具有的最小大小,以防止此函数发生堆栈崩溃:
--可以使用param ssp buffer size=X
,其中X默认为8,可以低至1
对于第二个警告,除非停止使用-Wstack protector
,否则无法抑制其出现
-fstack保护器
?(例如,在开发过程中的所有时间,或者在跟踪bug时?)-fstack保护器
李>
-Wstack protector
告诉我什么?这是否表明我降低了缓冲区的最小大小李>
-Wstack protector
不是您希望始终启用的标志类型。是这样吗您确实不应该关心正常构建的警告。这实际上更多的是一个信息性的信息。我希望很明显,对于堆栈上大小可变的缓冲区,您确实存在固有的安全问题;如果大小计算错误,就会打开一个大漏洞。堆栈保护是一种强化策略,而不是调试策略。如果您的游戏具有网络感知功能或数据来源不受控制,请将其打开。如果它没有来自不受控制的地方的数据,不要打开它 结果如下:如果您有一个bug,并根据攻击者可以控制的内容更改缓冲区,则攻击者可以覆盖返回地址或堆栈的类似部分,使其执行其代码而不是您的代码。如果堆栈保护检测到这种情况,它将中止程序。你的用户不会高兴,但他们也不会被黑客攻击。这不是关于游戏中作弊的黑客行为,而是关于有人利用你代码中的漏洞制造可能感染你用户的漏洞的黑客行为 对于面向调试的解决方案,请查看mudflap之类的内容 关于你的具体问题:
-fstack保护器所有 与-fstack protector类似,只是所有功能都受到保护
From:使用:-Wno stack protector禁用所有堆栈破坏警告目前还没有pragma仅禁用此警告。(这在GCC中经常发生。没有警告或警告太少之间经常存在紧张关系。一种解决方案是为有问题的文件创建特殊的make target,并为其设置特殊的编译标志。)您能否详细说明为什么可变大小的缓冲区在风险方面与固定大小的缓冲区明显不同?我可以理解为什么很难像堆栈保护器对固定大小缓冲区所做的那样将它们放在函数中。双重攻击向量:攻击者可以提供比您为缓冲区分配的输入字节更多的输入字节,或者他可以尝试在缓冲区大小分配中查找错误有什么原因-fstack protector只检查缓冲区大于“8个字节”?为什么不是4个字节还是1个字节?@wenchiching,原因是性能和溢出的可能性。发现8个字节是溢出可能性值保护性能成本的阈值。⁺对于«挡泥板»而言♥堆栈保护的调试策略是可能的,有时也是有用的:(1)执行使用堆栈保护编译的二进制文件,并在调试器中禁用ASLR(地址空间布局随机化)。(2)等待内核。(3)内核将指示被关闭的堆栈金丝雀的地址。(4)在调试器中重新运行二进制文件,并在被破坏的堆栈金丝雀的地址上设置一个硬件监视点当位于罪犯地址的内存被修改时,调试器将停止。这些选项试图防止基于缓冲区溢出/堆栈损坏的攻击。这些文章应该会有所帮助:-您需要使用C99的可变长度数组(VLA)功能吗?如果不使用它,您将不会收到警告-并且您将