gcc选项-fstack-check是如何工作的?

时间:2010-03-03 09:05:49

标签: gcc stack

当我添加选项-fstack-check和-fstack-protector时,我的程序崩溃了。在后跟踪中调用__stack_chk_fail。

那我怎么知道问题在哪里呢?什么-fstack-check真的检查? 关于gcc的信息似乎太大了,无法找到答案。

3 个答案:

答案 0 :(得分:6)

检查装配程序后。 我认为-fstack-check,会将代码写入0写入堆栈指针的偏移量,因此为了测试程序是否访问了违规地址,程序如果发生了则崩溃了。 例如mov $ 0x0,-0x928(%esp)

答案 1 :(得分:3)

“`-fstack-protector'发出额外的代码来检查缓冲区溢出,例如堆栈 粉碎攻击。这是通过添加一个保护变量来完成的 弱势对象的功能。这包括功能 调用alloca,以及大于8字节的缓冲区的函数。该 输入功能然后检查后,将初始化防护装置 当函数退出时。如果防护检查失败,则会显示错误消息 打印出来,程序退出“

GCC Options That Control Optimization

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

我希望这会给出一些线索..

答案 2 :(得分:3)

-fstack-check:如果两个功能宏STACK_CHECK_BUILTINSTACK_CHECK_STATIC_BUILTIN保留为默认值0,则只需在堆栈增长时每4kb(页面)插入一个NULL字节。 默认情况下只有一个,但是当堆栈可以增长多个页面时,这是最危险的情况,每4KB。 linux> 2.6在堆栈和堆之间只有一个小的页面间隙,这可能导致自2005年以来已知的堆栈间隙攻击。 请参阅What exception is raised in C by GCC -fstack-check option进行装配。 它至少从2.95.3开始在gcc中启用,自3.6以来就是clang。

__stack_chk_fail是插入的-fstack-protector代码,用于验证插入的堆栈金丝雀值,该值可能被简单的堆栈溢出覆盖,例如:通过递归。