配置实验环境(转vhttp://blog.sina.com.cn/s/blog_70dd16910100qpzh.html
第一步:sysctl -w kernel.randomize_va_space=0
在Ubuntu和其它基于Linux内核的系统中,目前都使用内存地址随机化的机制来初始化堆栈,这将会使得猜测具体的内存地址变得十分困难,所以在本试验中,用下列命令关闭内存随机化机制:
$ su root
Password: (enter root password)
sysctl -w kernel.randomize_va_space=0
第二步:sysctl -w kernel.exec-shield=0
对于Federal系统,默认会执行可执行程序的屏蔽保护,而对于Ubuntu系统默认没有执行这种保护机制,可执行程序的屏蔽保护机制不允许执行存储在栈中的代码,这会使得缓冲区溢出攻击变得无效。所以如果在Fedora系统中我们需要用下面的命令关闭这种机制:
$ su root
Password: (enter root password)
sysctl -w kernel.exec-shield=0
第三步:重新建立符合链接
目前的系统为了阻止缓冲区溢出攻击使用Shell程序,当这些shell程序被攻击时,他们会自动的放弃自己具有的root权限。这样的话,即使你可以在一个Set-UID程序中嵌入了一段shell脚本,你可能也不会获得root权限。这种保护机制都被应用在/bin/bash中,Ubuntu中的/bin/sh是一个指向/bin/bash的符合链接,为了能顺利进行本次的实验,我们让/bin/sh指向/bin/zsh,命令如下:
cd /bin
rm sh
ln -s /bin/zsh /bin/sh
第四步:–fno-stack-protector
另外GCC编译器也会执行一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。
例如:
gcc -fno-stack-protector example.c