linux程序保護(hù)機(jī)制&gcc編譯選項(xiàng)

總結(jié)

  • NX:-z execstack / -z noexecstack (關(guān)閉 / 開(kāi)啟)
  • Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (關(guān)閉 / 開(kāi)啟 / 全開(kāi)啟)
  • PIE:-no-pie / -pie (關(guān)閉 / 開(kāi)啟)
  • RELRO:-z norelro / -z lazy / -z now (關(guān)閉 / 部分開(kāi)啟 / 完全開(kāi)啟)

Canary

gcc在4.2版本中添加了-fstack-protector和-fstack-protector-all編譯參數(shù)以支持棧保護(hù)功能框仔,4.9新增了-fstack-protector-strong編譯參數(shù)讓保護(hù)的范圍更廣齿拂。
編譯控制選項(xiàng)

gcc -o test test.c // 默認(rèn)情況下,不開(kāi)啟Canary保護(hù)
gcc -fno-stack-protector -o test test.c //禁用棧保護(hù)
gcc -fstack-protector -o test test.c //啟用堆棧保護(hù)燃少,不過(guò)只為局部變量中含有 char 數(shù)組的函數(shù)插入保護(hù)代碼
gcc -fstack-protector-all -o test test.c //啟用堆棧保護(hù)仆潮,為所有函數(shù)插入保護(hù)代碼

Fortify

fority其實(shí)非常輕微的檢查检盼,用于檢查是否存在緩沖區(qū)溢出的錯(cuò)誤。適用情形是程序采用大量的字符串或者內(nèi)存操作函數(shù)颁独,如memcpy彩届,memset,stpcpy誓酒,strcpy樟蠕,strncpy,strcat靠柑,strncat寨辩,sprintf,snprintf病往,vsprintf捣染,vsnprintf,gets以及寬字符的變體停巷。

  • _FORTIFY_SOURCE設(shè)為1耍攘,并且將編譯器設(shè)置為優(yōu)化1(gcc -O1),以及出現(xiàn)上述情形畔勤,那么程序編譯時(shí)就會(huì)進(jìn)行檢查但又不會(huì)改變程序功能
  • _FORTIFY_SOURCE設(shè)為2蕾各,有些檢查功能會(huì)加入,但是這可能導(dǎo)致程序崩潰庆揪。

gcc -D_FORTIFY_SOURCE=1僅僅只會(huì)在編譯時(shí)進(jìn)行檢查 (特別像某些頭文件 #include <string.h>)
gcc -D_FORTIFY_SOURCE=2 程序執(zhí)行時(shí)也會(huì)有檢查 (如果檢查到緩沖區(qū)溢出式曲,就終止程序)

gcc -o test test.c // 默認(rèn)情況下,不會(huì)開(kāi)這個(gè)檢查
gcc -D_FORTIFY_SOURCE=1 -o test test.c // 較弱的檢查
gcc -D_FORTIFY_SOURCE=2 -o test test.c // 較強(qiáng)的檢查

NX(DEP)

NX即No-eXecute(不可執(zhí)行)的意思缸榛,NX(DEP)的基本原理是將數(shù)據(jù)所在內(nèi)存頁(yè)標(biāo)識(shí)為不可執(zhí)行吝羞,當(dāng)程序溢出成功轉(zhuǎn)入shellcode時(shí),程序會(huì)嘗試在數(shù)據(jù)頁(yè)面上執(zhí)行指令内颗,此時(shí)CPU就會(huì)拋出異常钧排,而不是去執(zhí)行惡意指令。
gcc編譯器默認(rèn)開(kāi)啟了NX選項(xiàng)均澳,如果需要關(guān)閉NX選項(xiàng)恨溜,可以給gcc編譯器添加-z execstack參數(shù)

gcc -o test test.c // 默認(rèn)情況下符衔,開(kāi)啟NX保護(hù)
gcc -z execstack -o test test.c // 禁用NX保護(hù)
gcc -z noexecstack -o test test.c // 開(kāi)啟NX保護(hù)

PIE(ASLR)

內(nèi)存地址隨機(jī)化機(jī)制(address space layout randomization),有以下三種情況

0 - 表示關(guān)閉進(jìn)程地址空間隨機(jī)化糟袁。
1 - 表示將mmap的基址判族,stack和vdso頁(yè)面隨機(jī)化。
2 - 表示在1的基礎(chǔ)上增加棧(heap)的隨機(jī)化项戴。
  • Linux關(guān)閉PIE的方法如下
sudo -s echo 0 > /proc/sys/kernel/randomize_va_space
  • gcc編譯選項(xiàng)
gcc -o test test.c // 默認(rèn)情況下形帮,不開(kāi)啟PIE
gcc -fpie -pie -o test test.c // 開(kāi)啟PIE,此時(shí)強(qiáng)度為1
gcc -fPIE -pie -o test test.c // 開(kāi)啟PIE肯尺,此時(shí)為最高強(qiáng)度2
gcc -fpic -o test test.c // 開(kāi)啟PIC沃缘,此時(shí)強(qiáng)度為1,不會(huì)開(kāi)啟PIE
gcc -fPIC -o test test.c // 開(kāi)啟PIC则吟,此時(shí)為最高強(qiáng)度2槐臀,不會(huì)開(kāi)啟PIE

說(shuō)明
PIE最早由RedHat的人實(shí)現(xiàn),他在連接起上增加了-pie選項(xiàng)氓仲,這樣使用-fPIE編譯的對(duì)象就能通過(guò)連接器得到位置無(wú)關(guān)可執(zhí)行程序水慨。fPIE和fPIC有些不同【纯福可以參考Gcc和Open64中的-fPIC選項(xiàng).

gcc中的-fpic選項(xiàng)晰洒,使用于在目標(biāo)機(jī)支持時(shí),編譯共享庫(kù)時(shí)使用啥箭。編譯出的代碼將通過(guò)全局偏移表(Global Offset Table)中的常數(shù)地址訪存谍珊,動(dòng)態(tài)裝載器將在程序開(kāi)始執(zhí)行時(shí)解析GOT表項(xiàng)(注意,動(dòng)態(tài)裝載器操作系統(tǒng)的一部分急侥,連接器是GCC的一部分)砌滞。而gcc中的-fPIC選項(xiàng)則是針對(duì)某些特殊機(jī)型做了特殊處理,比如適合動(dòng)態(tài)鏈接并能避免超出GOT大小限制之類的錯(cuò)誤坏怪。而Open64僅僅支持不會(huì)導(dǎo)致GOT表溢出的PIC編譯贝润。

gcc中的-fpie和-fPIE選項(xiàng)和fpic及fPIC很相似,但不同的是,除了生成為位置無(wú)關(guān)代碼外,還能假定代碼是屬于本程序垂睬。通常這些選項(xiàng)會(huì)和GCC鏈接時(shí)的-pie選項(xiàng)一起使用。fPIE選項(xiàng)僅能在編譯可執(zhí)行碼時(shí)用尊蚁,不能用于編譯庫(kù)。所以侣夷,如果想要PIE的程序横朋,需要你除了在gcc增加-fPIE選項(xiàng)外,還需要在ld時(shí)增加-pie選項(xiàng)才能產(chǎn)生這種代碼惜纸。即gcc -fpie -pie來(lái)編譯程序叶撒。單獨(dú)使用哪一個(gè)都無(wú)法達(dá)到效果。

RELRO

GCC, GNU linker以及Glibc-dynamic linker一起配合實(shí)現(xiàn)了一種叫做relro的技術(shù): read only relocation耐版。大概實(shí)現(xiàn)就是由linker指定binary的一塊經(jīng)過(guò)dynamic linker處理過(guò) relocation之后的區(qū)域?yàn)橹蛔x.
設(shè)置符號(hào)重定向表格為只讀或在程序啟動(dòng)時(shí)就解析并綁定所有動(dòng)態(tài)符號(hào)祠够,從而減少對(duì)GOT(Global Offset Table)攻擊。RELRO為” Partial RELRO”粪牲,說(shuō)明我們對(duì)GOT表具有寫(xiě)權(quán)限古瓤。

gcc編譯選項(xiàng)

gcc -o test test.c // 默認(rèn)情況下,是Partial RELRO
gcc -z norelro -o test test.c // 關(guān)閉腺阳,即No RELRO
gcc -z lazy -o test test.c // 部分開(kāi)啟落君,即Partial RELRO
gcc -z now -o test test.c // 全部開(kāi)啟,即Full RELRO
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亭引,一起剝皮案震驚了整個(gè)濱河市绎速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焙蚓,老刑警劉巖纹冤,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異购公,居然都是意外死亡萌京,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門宏浩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)知残,“玉大人,你說(shuō)我怎么就攤上這事比庄∏竺茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵印蔗,是天一觀的道長(zhǎng)扒最。 經(jīng)常有香客問(wèn)我,道長(zhǎng)华嘹,這世上最難降的妖魔是什么吧趣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮耙厚,結(jié)果婚禮上强挫,老公的妹妹穿的比我還像新娘。我一直安慰自己薛躬,他們只是感情好俯渤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著型宝,像睡著了一般八匠。 火紅的嫁衣襯著肌膚如雪絮爷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天梨树,我揣著相機(jī)與錄音坑夯,去河邊找鬼。 笑死抡四,一個(gè)胖子當(dāng)著我的面吹牛柜蜈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播指巡,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淑履,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了藻雪?” 一聲冷哼從身側(cè)響起秘噪,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阔涉,沒(méi)想到半個(gè)月后缆娃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑰排,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贯要,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭住。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崇渗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出京郑,到底是詐尸還是另有隱情宅广,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布些举,位于F島的核電站跟狱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏户魏。R本人自食惡果不足惜驶臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叼丑。 院中可真熱鬧关翎,春花似錦、人聲如沸鸠信。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)星立。三九已至爽茴,卻和暖如春葬凳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背室奏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工沮明, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍奋。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酱畅,于是被迫代替她去往敵國(guó)和親琳袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 最近看了一些PWN 的題目纺酸,在此總結(jié)一波窖逗,這篇文章有些資料來(lái)自各網(wǎng)友的總結(jié)。像我這樣記憶力比較差的人餐蔬,還是要多記錄...
    simle天晴閱讀 3,447評(píng)論 0 0
  • 本文轉(zhuǎn)載自:http://yunnigu.dropsec.xyz/2016/10/08/checksec及其包含的...
    readilen閱讀 2,072評(píng)論 0 1
  • 一碎紊、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問(wèn)題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評(píng)論 0 27
  • 殤癡閱讀 151評(píng)論 0 0
  • 京城向來(lái)是高手云集之地,既然千辛萬(wàn)苦來(lái)了樊诺,自然不能只是老老實(shí)實(shí)上下班仗考。于是前幾天去體驗(yàn)了一節(jié)合氣道的課。 合氣道以...
    zhenyu1990閱讀 460評(píng)論 0 0