当我添加选项-fstack-check和-fstack-protector时,我的程序崩溃了。在后跟踪中调用__stack_chk_fail。
那我怎么知道问题在哪里呢?什么-fstack-check真的检查? 关于gcc的信息似乎太大了,无法找到答案。
答案 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_BUILTIN
和STACK_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
代码,用于验证插入的堆栈金丝雀值,该值可能被简单的堆栈溢出覆盖,例如:通过递归。