调用__stack_chk_fail后出现意外行为

时间:2016-07-08 12:47:18

标签: c gcc x86 arm control-flow-graph

在x86中,GCC在想要呼叫__stack_chk_fail时生成以下说明:

; start of the basic block
00000757         call       sub_590 ; __stack_chk_fail@plt
0000075c         add        byte [ds:eax], al
0000075e         add        byte [ds:eax], al
; start point of another function

ARM中发生了类似的行为:

; start of the basic block
00001000         bl         __stack_chk_fail@PLT
00001004         dd         0x0000309c ; data entry, NOT executable indeed!

在静态分析工具中,当想要构建CFG时,CFG算法不能确定调用__stack_chk_fails的基本块的最后一条指令。

在调用__stack_chk_fail之后使用某种 return 指令以防止CPU执行它不应该执行的指令(或可能的数据条目)是合理的。

在这些情况下,CFG生成器算法假定它是常规函数调用并继续遍历另一个函数的代码(在前一个示例中)或数据条目(在后一个中),这是完全不需要的

所以,我的问题是为什么GCC不会在基本块的结束点插入 return (或 branch )指令?

0 个答案:

没有答案