0%

gcc-stack-protector

  • -fstack-protector 只为局部变量中包含长度超过8-byte(含)的char数组的函数插入保护代码
  • -fstack-protector-strong 满足以下三个条件都会插入保护代码:
    1. 局部变量的地址作为赋值语句的右值或函数参数
    2. 局部变量包含数组类型的局部变量,不管数组的长度
    3. 带register声明的局部变量

Linux系统中存在着三种类型的栈:

  1. 应用程序栈:工作在Ring3,由应用程序来维护;
  2. 内核进程上下文栈:工作在Ring0,由内核在创建线程的时候创建;
  3. 内核中断上下文栈:工作在Ring0,在内核初始化的时候给每个CPU核心创建一个。

Ref

  1. 解读Linux安全机制之栈溢出保护
  2. GCC 中的编译器堆栈保护技术
  3. 如何利用GCC编译选项检测栈溢出