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

标签 c ubuntu stack-overflow shellcode

现代编译器GCC的功能非常强大,甚至可以在编译阶段防止缓冲区溢出,使操作系统无法在栈空间运行代码。

例如:

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'

现在你可以试试缓冲区溢出了,我推荐阅读Smashing the Stack for Fun and Profit

编辑:

就像我在评论中所说的那样,可以安全地假设在您的任务中禁用堆栈保护是可以接受的,但是,如果您想绕过堆栈保护,您应该检查 SOF 以了解相关问题金丝雀喜欢这样的问题:

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

关于c - 缓冲区溢出的编译器艺术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13024977/

相关文章:

c - 实现你自己的 sizeof

c - 双自由或腐败(fasttop)

bash - 如何使用 find 和 awk 提取文件名的一部分

java - Stackoverflow 和 Hibernate 使用 sql IN (id, id, id, id..id)

使用 system() 使用 gcc 进行编译

c - 为什么我的 while 循环不在 C 中重复?

docker - 如何在 docker 容器中压缩文件?

php - Zend Framework 2.5 安装过程 + Nginx + Ubuntu 14.04

c - 我可以提供什么输入来导致缓冲区溢出,从而导致另一个变量发生精确变化?

security - 设置缓冲区溢出学习环境