Linux下的程序保護機制具體包括如下:
1、NX
????NX保護(數(shù)據(jù)執(zhí)行保護)在windows中也被稱為DEP,是指禁止程序在非可執(zhí)行的內(nèi)存區(qū)中執(zhí)行指令。通過現(xiàn)代的內(nèi)存保護單元(MPU)機制對程序內(nèi)存按頁的粒度進行全線設(shè)置,其基本規(guī)則為可寫權(quán)限與可執(zhí)行權(quán)限互斥。
????因此,在開啟NX保護的程序中不能直接使用shellcode執(zhí)行任意代碼。所有可以被修改寫入shellcode的內(nèi)存都不可執(zhí)行,所有可以被執(zhí)行的代碼數(shù)據(jù)都是不可被修改的。
????gcc默認(rèn)開啟NX保護,關(guān)閉方法是在編譯時加入“-z execstack”參數(shù)。
2、Stack Canary
????Stack Canary保護是專門針對棧溢出攻擊設(shè)計的一種保護機制。由于棧溢出攻擊的主要目標(biāo)是通過溢出覆蓋函數(shù)棧高位的返回地址,因此其思路是在函數(shù)開始執(zhí)行前,即在返回地址前寫入一個字長的隨機數(shù)據(jù),在函數(shù)返回前校驗該值是否被改變,如果被改變,則認(rèn)為是發(fā)生了棧溢出。程序會直接終止。
????gcc默認(rèn)使用Stack Canary保護,關(guān)閉方法是在編譯時加入“-fno-stack-protector”參數(shù)。
3、ASLR
????Address Space Layout Randomization,地址空間隨機化。ASLR的目的是將程序的堆棧地址和動態(tài)鏈接庫的加載地址進行一定的隨機化,這些地址之間是不可讀寫執(zhí)行的未映射內(nèi)存,降低攻擊者對程序內(nèi)存結(jié)構(gòu)的了解程序。這樣,即使攻擊者布置了shellcode并可以控制跳轉(zhuǎn),由于內(nèi)存地址結(jié)構(gòu)未知,依然無法執(zhí)行shellcode。
????ASLR是系統(tǒng)等級的保護機制,使用root權(quán)限可以進行修改。關(guān)閉方法是修改/proc/sys/kernel/randomize_va_space文件的內(nèi)容為0。
4、PIE
????代碼段隨機化,與ASLR保護十分相似,PIE保護的目的是讓可執(zhí)行程序ELF的地址進行隨機化加載,從而使得程序的內(nèi)存結(jié)構(gòu)對攻擊者完全未知,進一步提高程序的安全性。
????gcc編譯時開啟PIE的方法為添加參數(shù)“-fpic -pie”。較新版本的gcc默認(rèn)開啟PIE,可以設(shè)置“-no-pie”來關(guān)閉。
5、Relro
????重定位,一般分為partial relro和full relro,前者重定位信息(如got表)可寫,后者不可寫。
????full relro保護與linux下的Lazy Binding機制有關(guān),其主要作用是禁止.GOT.PLT表和其他一些相關(guān)內(nèi)存的讀寫,從而阻止攻擊者通過寫.GOT.PLT表來進行攻擊利用的手段。
????gcc開啟full relro的方法是添加參數(shù)“-z retro”。
參考:
《從0到1:CTFer成長之路》
《CTF特訓(xùn)營》