小编inc*_*ete的帖子

使用GCC进行堆栈保护和粉碎

我正在阅读Smashing the Stack for Fun and Profit(特别是,这篇文章指的是"Buffer Overflows"部分).这篇文章是为32位机器编写的,但我正在研究64位,我在我的例子中考虑了这一点.一个特殊的例子是导致一些我无法解释的问题.example3.c具有覆盖返回地址以跳过main函数中的指令的功能.这是我的代码:

#include <stdio.h>

void function(int a, int b, int c)
{
  char buf1[5];
  char buf2[10];
  int *retptr;

  retptr = (void*)(buf2 + 40);
  (*retptr) += 8;
}

int main(void)
{
  int x;

  x = 0;
  function(1,2,3);
  x = 1;
  printf("%d\n", x);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用gcc v4.8.2使用以下命令编译此程序:

gcc example3.c -o example3
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,gcc编译器似乎实现了一些堆栈保护,例如地址空间布局随机化和堆栈金丝雀.我在计算ret指针值时考虑了这些安全措施.这是由gcc example3.c -S -fverbose-asm -o stack-protection.s以下产生的相应组件 :

    .file   "example3.c"
# GNU C (Ubuntu 4.8.2-19ubuntu1) version 4.8.2 (x86_64-linux-gnu)
#   compiled by …
Run Code Online (Sandbox Code Playgroud)

c stack-smash

6
推荐指数
1
解决办法
1152
查看次数

标签 统计

c ×1

stack-smash ×1