linux程式的常用保護機制

2021-09-02 23:10:56 字數 2356 閱讀 4328

linux         nx    pie

windows  dep  aslr

dep是資料執行保護的英文縮寫,全稱為data execution prevention。資料執行保護(dep) 是一套軟硬體技術,能夠在記憶體上執行額外檢查以幫助防止在系統上執行惡意**。

nx即no-execute(不可執行)的意思,nx(dep)的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢位成功轉入shellcode時,程式會嘗試在資料頁面上執行指令,此時cpu就會丟擲異常,而不是去執行惡意指令。dep 的主要作用是阻止資料頁(如預設的堆頁、各種堆疊頁以及記憶體池頁)執行**。

linux下開啟了nx的以及windows下開啟了dep的程式堆疊是不可執行的

如果需要關閉nx選項,可以給gcc編譯器新增-z execstack引數。

aslr記憶體位址隨機化機制(address space layout randomization)

aslr只是隨機化基位址,頁內偏移不會發生變化

liunx下關閉pie的命令如下:

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space

棧溢位保護(加canary)是一種緩衝區溢位攻擊緩解手段,當函式存在緩衝區溢位攻擊漏洞時,攻擊者可以覆蓋棧上的返回位址來讓shellcode能夠得到執行。當啟用棧保護後,函式開始執行的時候會先往棧裡插入cookie資訊,當函式真正返回的時候會驗證cookie資訊是否合法,如果不合法就停止程式執行。攻擊者在覆蓋返回位址的時候往往也會將cookie資訊給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。在linux中我們將cookie資訊稱為canary

關閉該保護輸入:-fno-stack-protector

gcc在4.2版本中新增了-fstack-protector和-fstack-protector-all編譯引數以支援棧保護功能,4.9新增了-fstack-protector-strong編譯引數讓保護的範圍更廣。以下是-fstack-protector和-fstack-protector-strong的區別:

引數gcc支援版本

說明-fstack-protector

4.2只為區域性變數中包含長度超過8-byte(含)的char陣列的函式插入保護**

-fstack-protector-strong

4.9滿足以下三個條件都會插入保護**:1.區域性變數的位址作為賦值語句的右值或函式引數;2.區域性變數包含陣列型別的區域性變數,不管陣列的長度;3.帶register宣告的區域性變數

linux系統中存在著三種型別的棧:

應用程式棧:工作在ring3,由應用程式來維護;

核心程序上下文棧:工作在ring0,由核心在建立執行緒的時候建立;

核心中斷上下文棧:工作在ring0,在核心初始化的時候給每個cpu核心建立乙個。

參考:在linux系統安全領域資料可以寫的儲存區就會是攻擊的目標,尤其是儲存函式指標的區域。 所以在安全防護的角度來說儘量減少可寫的儲存區域對安全會有極大的好處.

gcc, gnu linker以及glibc-dynamic linker一起配合實現了一種叫做relro的技術: read only relocation。大概實現就是由linker指定binary的一塊經過dynamic linker處理過 relocation之後的區域為唯讀.

設定符號重定向**為唯讀或在程式啟動時就解析並繫結所有動態符號,從而減少對got(global offset table)攻擊。relro為」 partial relro」,說明我們對got表具有寫許可權。

gcc編譯:

gcc -o test test.c // 預設情況下,是partial relro

gcc -z norelro -o test test.c // 關閉,即no relro

gcc -z lazy -o test test.c // 部分開啟,即partial relro

gcc -z now -o test test.c // 全部開啟,即

參考:set-uid 是unix系統中的乙個重要的安全機制。當乙個set-uid程式執行的時候,它被假設為具有擁有者的許可權。例如,如果程式的擁有者是root,那麼任何人執行這個程式時都會獲得程式擁有者的許可權。

stack smashing是堆疊緩衝區溢位(stack buffer overflow)的乙個時髦稱謂。它表示利用**中存在的緩衝區溢位bug而發起的攻擊。在早期,這完全是程式設計師的責任,他們要確保**中不存在緩衝區溢位的問題。但是隨著時間推移,技術的不斷發展,現在像gcc這樣的編譯器已經有編譯選項用來確保緩衝區溢位問題不被攻擊者利用來破壞系統或者程式。

程式保護機制

3.堆保護 nx 傳統的堆漏洞攻擊會覆蓋對塊首部,並檢視建立乙個偽造的塊,當記憶體釋放例程執行時可以使用該塊在任意記憶體位址處寫入任意4個位元組。具體為 4.dep nx dep data execution prevention 即資料執行保護,阻止存放在堆 棧或資料記憶體中的 執行,這一直以來都...

Linux下程式的保護機制 checksec

相信很多人,檢視程式資訊時會用到,checksec這個命令。它會給你返回如下圖的結果,但是很多最開始看到的人,很多都看不懂,如果身為小白的我,跟在大佬後面比葫蘆畫瓢,這樣用。這篇博文就是用來解釋下面資訊的,希望對你有所幫助,同時也是為了以後自己忘記可以回顧。stack canray是專門針對棧溢位攻...

程式編譯保護機制

本篇文章主要內容摘選自 linux程式的常用保護機制 gcc 安全編譯選項 gcc安全保護機制,在本篇文章中,主要梳理彙總,便於以後查閱。gcc編譯器中的引數pie和pic都可生成位置無關的 pie主要用在可執行檔案上,pic用在共享庫上。cannary機制還會調整區域性變數的順序。如果陣列位址在其...