配置實(shí)驗(yàn)環(huán)境(轉(zhuǎn)vhttp://blog.sina.com.cn/s/blog_70dd16910100qpzh.html
第一步:sysctl -w kernel.randomize_va_space=0
在Ubuntu和其它基于Linux內(nèi)核的系統(tǒng)中,目前都使用內(nèi)存地址隨機(jī)化的機(jī)制來初始化堆棧,這將會(huì)使得猜測具體的內(nèi)存地址變得十分困難,所以在本試驗(yàn)中,用下列命令關(guān)閉內(nèi)存隨機(jī)化機(jī)制:
$ su root
Password: (enter root password)
sysctl -w kernel.randomize_va_space=0
第二步:sysctl -w kernel.exec-shield=0
對于Federal系統(tǒng),默認(rèn)會(huì)執(zhí)行可執(zhí)行程序的屏蔽保護(hù),而對于Ubuntu系統(tǒng)默認(rèn)沒有執(zhí)行這種保護(hù)機(jī)制,可執(zhí)行程序的屏蔽保護(hù)機(jī)制不允許執(zhí)行存儲(chǔ)在棧中的代碼,這會(huì)使得緩沖區(qū)溢出攻擊變得無效。所以如果在Fedora系統(tǒng)中我們需要用下面的命令關(guān)閉這種機(jī)制:
$ su root
Password: (enter root password)
sysctl -w kernel.exec-shield=0
第三步:重新建立符合鏈接
目前的系統(tǒng)為了阻止緩沖區(qū)溢出攻擊使用Shell程序,當(dāng)這些shell程序被攻擊時(shí),他們會(huì)自動(dòng)的放棄自己具有的root權(quán)限。這樣的話,即使你可以在一個(gè)Set-UID程序中嵌入了一段shell腳本,你可能也不會(huì)獲得root權(quán)限。這種保護(hù)機(jī)制都被應(yīng)用在/bin/bash中,Ubuntu中的/bin/sh是一個(gè)指向/bin/bash的符合鏈接,為了能順利進(jìn)行本次的實(shí)驗(yàn),我們讓/bin/sh指向/bin/zsh,命令如下:
cd /bin
rm sh
ln -s /bin/zsh /bin/sh
第四步:–fno-stack-protector
另外GCC編譯器也會(huì)執(zhí)行一種棧保護(hù)機(jī)制來阻止緩沖區(qū)溢出,所以我們在編譯代碼時(shí)需要用 –fno-stack-protector 關(guān)閉這種機(jī)制。
例如:
gcc -fno-stack-protector example.c