缓冲区溢出的编译器艺术

时间:2012-10-23 06:52:07

标签: c ubuntu stack-overflow shellcode

现代编译器GCC非常强大,它甚至可以防止编译阶段的缓冲区溢出,因此OS无法在堆栈空间上运行代码。

例如:

void function(char *str) 
{
   char buffer[16];

   strncpy(buffer, str, 256);
}

void main() 
{
  char large_string[256];
  int i;

  for( i = 0; i < 256; i++)
    large_string[i] = 'A';

  function(large_string);
}

我能获得神奇的0x41414141的唯一方法是设置GCC编译参数,如:

gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

(我在ubuntu 10.04 x86清晰32位盒子上测试过它)

有什么方法可以绕过GCC堆栈粉碎保护吗?

2 个答案:

答案 0 :(得分:7)

编译时应禁用堆栈保护:

gcc  -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

您可能还想禁用地址空间随机化(ASLR):

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

现在您可以尝试缓冲区溢出,我建议您阅读Smashing the Stack for Fun and Profit

修改

就像我在评论中所说的那样,可以安全地假设在你的任务中可以接受禁用堆栈保护,但是,如果你想绕过堆栈保护,你应该检查SOF是否有问题 canaries 就像这样的问题:

Is there any way to bypass SSP (StackSmashing Protection)/Propolice?

答案 1 :(得分:1)

有一些方法可以规避堆栈粉碎保护(称为堆栈canaries ),尽管在你的例子中并不容易。有关堆栈金丝雀的一些弱点,请参阅我的回答here