1、安全編譯選項
作業系統提供了許多安全機制來嘗試降低或阻止緩衝區溢位攻擊帶來的安全風險,包括dep、aslr等。在使用gcc進行編譯時,可以使用gcc的編譯選項來避免堆疊溢位、整數溢位等問題。
2、checksec.sh
3、aslr(位址隨機化)
aslr(address space layout randomization,位址空間布局隨機化)是一種針對緩衝區溢位的安全保護技術。借助aslr,pe檔案每次載入到記憶體的起始位址都會隨機變化。目前大部分主流作業系統都已經實現了aslr,aslr需要作業系統和程式自身的雙重支援。aslr的是作業系統的功能選項,作用於executable(elf)裝入記憶體執行時,因而只能隨機化stack、heap、libraries的基址
aslr(位址隨機化)
是一種針對緩衝區溢位的安全保護技術,通過對堆、棧、共享庫對映
等線性區布局的隨機化,通過增加攻擊者**目的位址的難度,防止攻擊者直接定位
攻擊**位置,達到阻止溢位攻擊
的目的。
linux開啟該功能:
echo 0 >/proc/sys/kernel/randomize_va_space
0 - 表示關閉程序位址空間隨機化。
1 - 表示將mmap的基址,stack和vdso頁面隨機化。
2 - 表示在1的基礎上增加棧(heap)的隨機化。
4、pie
aslr的是作業系統的功能選項,作用於executable(elf)裝入記憶體執行時,因而只能隨機化stack、heap、libraries的基址;而pie(position independent executables)是編譯器(gcc,..)功能選項(-fpie),作用於excutable編譯過程,可將其理解為特殊的pic(so專用,position independent code),加了pie選項編譯出來的elf用file命令檢視會顯示其為so,其隨機化了elf裝載記憶體的基址(**段、plt、got、data等共同的基址)。
5、pic
共享物件可能會被不同的程序載入到不同的位置上,如果共享物件中的指令使用了絕對位址、外部模組位址,那麼在共享物件被載入時就必須根據相關模組的載入位置對這個位址做調整,也就是修改這些位址,讓它在對應程序中能正確訪問,而被修改到的段就不能實現多程序共享乙份物理記憶體,它們在每個程序中都必須有乙份物理記憶體的拷貝。fpic指令就是為了讓使用到同乙個共享物件的多個程序能盡可能多的共享物理記憶體,它背後把那些涉及到絕對位址、外部模組位址訪問的地方都抽離出來,保證**段的內容可以多程序相同,實現共享。
6、nx
nx即no-execute(不可執行)的意思,nx(dep)的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢位成功轉入shellcode時,程式會嘗試在資料頁面上執行指令,此時cpu就會丟擲異常,而不是去執行惡意指令。
linux gcc鏈結選項詳解
i 大寫i l 大寫l l 小寫l 1 l i 大寫i 顯示指定標頭檔案的搜尋路徑。i home myinclude 表示 home myinclude目錄作為第乙個尋找標頭檔案的目錄,尋找的順序是 home myinclude usr include usr local include 2 l 大...
linux gcc編譯引數
gcc 編譯 hello.c hello.i 預處理階段,生成中間檔案 hello.s 彙編階段,生成彙編檔案 hello.o 編譯階段,生成二進位制 檔案 hello 鏈結階段,生成可執行程式 預處理階段,主要是將巨集定義替換,條件編譯 標頭檔案包含,可以cat hello.i檔案檢視 gcc e...
Linux GCC 編譯原始檔
一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 gcc test.c 2.選項 o 用法 gcc test.c o test 3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s ...