首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候怎样利用GCC的堆栈保护功能?

什么时候怎样利用GCC的堆栈保护功能?
EN

Stack Overflow用户
提问于 2009-10-27 09:40:06
回答 2查看 83.1K关注 0票数 69

我在编译我正在做的项目时启用了-Wstack-protector警告(一个商业的多平台C++游戏引擎,在MacOSX10.6上编译,GCC 4.2)。此标志警告那些即使启用了-fstack-protector也不会受到堆栈破坏保护的函数。GCC在建设这个项目时发出了一些警告:

不保护函数:没有至少8字节长的缓冲区

不保护局部变量:可变长度缓冲区

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

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

  1. 什么时候使用-fstack-protector?(例如,在开发过程中,或者仅仅在跟踪bug的过程中)
  2. 什么时候应该使用-fstack-protector-all
  3. -Wstack-protector告诉我什么?这是否意味着我要降低缓冲区最小大小?如果是,
  4. ,那么将大小设置为1有什么坏处吗?
  5. ,如果您想要一个没有警告的构建,那么-Wstack-protector似乎不是您一直想要启用的那种标志。是这样吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-25 19:46:23

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

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

对于面向调试的解决方案,请看一些类似的内容。

关于你的具体问题:

如果从不受控制的源获取数据,则

  1. 使用堆栈保护器。答案可能是肯定的。那就用它吧。即使您没有来自不受控制来源的数据,您也可能最终或已经这样做了,并且没有意识到这一点。如果您想要额外的保护来换取性能的提高,可以使用对所有缓冲区的
  2. 堆栈保护。来自gcc4.4.2 manual

-fstack保护器

发出额外的代码来检查缓冲区溢出,例如堆栈崩溃攻击。这是通过向带有易受攻击对象的函数添加一个保护变量来完成的。这包括调用alloca的函数和缓冲区大于8个字节的函数。在输入函数时初始化保护程序,然后在函数退出时进行检查。如果安全检查失败,则打印错误消息,程序退出.。

-fstack-保护器-全部

除了所有功能都受到保护外,类似于-fstack保护程序。

  1. 警告告诉您堆栈保护不能保护哪些缓冲区。
  2. 并不一定建议您减小最小缓冲区大小,并且在0/1的大小下,它与堆栈保护器-all相同。如果您决定重新设计代码,使缓冲区为protected.
  3. No,--这些警告不代表问题,它们只会向您指出信息。不要经常使用它们。--
票数 76
EN

Stack Overflow用户

发布于 2009-10-27 10:15:29

您确实不应该关心对正常构建的警告。更多的是一种信息信息。我希望这是很明显的,您确实有一个固有的安全考虑,与可变大小的缓冲区在堆栈上;如果大小计算错误,您将打开一个大洞。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1629685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档