C-缓冲区溢出的编译器的艺术



现代编译器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 Lucid 32bits Box)

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

编译时应禁用堆栈保护:

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

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

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

现在您可以尝试缓冲区溢出,我建议阅读以娱乐和利润粉碎堆栈

编辑:

就像我在评论中所说的那样,可以肯定地假设您在任务中可以接受堆栈保护是可以接受的,但是,如果您想旁路堆栈保护,则应检查SOF是否与SOF有关像这样的问题 Canaries

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

相关内容

  • 没有找到相关文章

最新更新