c - GCC 是否生成 Canary?

标签 c gcc assembly compiler-construction buffer-overflow

我的gcc版本是4.8.2,操作系统是ubuntu 14.04(64位)。 我发现有时gcc会自动生成金丝雀来做缓冲区溢出保护有时不会,为什么?

生成金丝雀的情况:SIZE是4的倍数

#include<stdio.h>
#define SIZE 4

int main()
{
    char s[SIZE];
    scanf("%s", s);
    return 0;
}

gcc -c -g -Wa,-a,-ad 之后的汇编

...
   4:a.c           **** int main()
   5:a.c           **** {
  13                    .loc 1 5 0
  14                    .cfi_startproc
  15 0000 55            pushq   %rbp
  16                    .cfi_def_cfa_offset 16
  17                    .cfi_offset 6, -16
  18 0001 4889E5        movq    %rsp, %rbp
  19                    .cfi_def_cfa_register 6
  20 0004 4883EC10      subq    $16, %rsp
  21                    .loc 1 5 0
  22 0008 64488B04      movq    %fs:40, %rax
  22      25280000 
  22      00
  23 0011 488945F8      movq    %rax, -8(%rbp)
  24 0015 31C0          xorl    %eax, %eax
   6:a.c           ****     char s[SIZE];
   7:a.c           ****     scanf("%s", s);
...

不生成金丝雀的情况:不是四的倍数

#include<stdio.h>
#define SIZE 2

int main()
{
    char s[SIZE];
    scanf("%s", s);
    return 0;
}

gcc -c -g -Wa,-a,-ad 之后的汇编

...
   4:a.c           **** int main()
   5:a.c           **** {
  13                    .loc 1 5 0
  14                    .cfi_startproc
  15 0000 55            pushq   %rbp
  16                    .cfi_def_cfa_offset 16
  17                    .cfi_offset 6, -16
  18 0001 4889E5        movq    %rsp, %rbp
  19                    .cfi_def_cfa_register 6
  20 0004 4883EC10      subq    $16, %rsp
   6:a.c           ****     char s[SIZE];
   7:a.c           ****     scanf("%s", s);
...

最佳答案

好的,我想我们从评论中知道了答案,所以我将其发布在这里以明确说明。

将金丝雀放入大量函数中会导致性能下降。这就是为什么有几种方法可以告诉 GCC 我们要使用它们,这些方法都有很好的描述 here .主要思想:

  1. 默认情况下不使用金丝雀,需要传递启用它们的标志之一。
  2. 为了节省执行时间,GCC 使用带有 -fstack-protector 标志的简单启发式:为使用 alloca 或大于 8< 的本地缓冲区的函数添加金丝雀 字节(默认情况下)。
  3. 可以使用 ssp-buffer-size 参数调整启发式:--param ssp-buffer-size=4

显然,Ubuntu 发布的 GCC 版本的缓冲区大小已更改为 4,因此小于该大小的缓冲区不会触发金丝雀生成。我确认(其他任何人都应该能够重复)通过使用 --param ssp-buffer-size=4 编译两个示例,它只为其中一个生成带有金丝雀的程序集。

关于c - GCC 是否生成 Canary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24465014/

相关文章:

c - K&R 练习 1-19 意外且不一致的输出

c - 这是什么意思,我该如何纠正它 *** 检测到堆栈粉碎 *** : ./array1output 终止

c - .c 中的变量更改值不正确

c - 嵌套范围如何影响堆栈深度?

c - 二进制文件-菜单写入和读取,c 语言问题

C:Roguelike map 很奇怪

c++ - GCC - 多个预编译头文件和特定路径

c - 为什么编译器不优化掉这些无法访问的指令呢?

assembly - AMD monitorx 指令的正确语法是什么?

c - Valgrind 显示调用 pr_set_ptracer 时出错,vgdb 可能会阻塞