-fstack-protector、-fstack-protector-all 和 -fmudflap

Posted

技术标签:

【中文标题】-fstack-protector、-fstack-protector-all 和 -fmudflap【英文标题】:-fstack-protector, -fstack-protector-all and -fmudflap 【发布时间】:2011-12-10 05:39:51 【问题描述】:

-fstack-protector 和 -fstack-protector-all 是否也保护基于堆的内存分配或仅保护基于堆栈的内存分配?

前2和-fmudflap有什么区别?

关于哪个更适合调试的任何建议?

(我不确定gcc man page是否足够清楚,或者我根本不明白......)

char foobar[10]; // stack-based

char *foobar = malloc(10); // heap-based

【问题讨论】:

你的目标是什么?你想确保你的代码受到保护,并翻转保护它的好方法吗?如果是这种情况,gcc 默认编译为大多数,如果没有启用所有保护(例如,金丝雀值 -fatack-protector 似乎启用)。如果您的目标是在调试状态下选择性地禁用,以便更容易遵循代码逻辑而不必怀疑代码的哪些部分仅仅是黑客保护,您可以禁用许多保护(我认为除了 nx 的设置有点多)。在这种情况下,您想要的选项(以及其他选项)是 -fno-stack-protector。 还有一些我认为即使不是不可能也很难禁用的方法,比如某些重定向表是否可写。 @gnometorule 我的目标是启用尽可能多的保护。但为此,我需要了解每个人做什么和不做什么。 【参考方案1】:

-fstack-protector 和 -fstack-protector-all 与堆分配无关。 -fstack-protector 仅保护字符串(缓冲区溢出攻击的主要问题目标),-fstack-protector-all 保护所有类型。这里的一些描述: http://en.wikipedia.org/wiki/Buffer_overflow_protection

【讨论】:

更多关于 Gcc 的堆栈保护器的信息:***.com/questions/1629685/…【参考方案2】:

挡泥板用于指针检查。见this pdf。 您需要安装相关的库才能使用这些 gcc 功能。 我更喜欢 valgrind 来检测此类错误,因为无需重新编译/重新链接并且更易于使用,但这些也很有价值。

【讨论】:

pdf 链接已损坏

以上是关于-fstack-protector、-fstack-protector-all 和 -fmudflap的主要内容,如果未能解决你的问题,请参考以下文章

Gcc编译选项

DIY堆栈保护

Canary5种绕过方式 栈溢出保护及整数保护

(dpdk f-stack)-多进程模型

(dpdk f-stack)-通过kni与kernel上服务通信

(dpdk f-stack)-通过kni与kernel上服务通信