现代编译器 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 堆栈粉碎保护?