瞭解checksec顯示的各種引數和保護

_ljnljn發表於2024-12-04

image

Arch:核心(32位/64位)

RELRO

在Linux系統安全領域資料可以寫的儲存區就會是攻擊的目標,尤其是儲存函式指標的區域。所以在安全防護的角度來說盡量減少可寫的儲存區域對安全會有極大的好處.
GCC, GNU linker以及Glibc-dynamic linker一起配合實現了一種叫做relro的技術: read only relocation。大概實現就是由linker指定binary的一塊經過dynamic linker處理過 relocation之後的區域為只讀.
RELRO重定位段只讀保護分為以下三個等級:

  • NO RELRO:保護未開的情況,所有重定位段均可寫,包括.dynamic、.got、.got.plt;
  • Partial RELRO:部分開啟保護,其為GCC編譯的預設配置。.dynamic、.got被標記為只讀,並且會強制地將ELF的內部資料段 .got ,.got.plt等放到外部資料段 .data、.bss之前,即防止程式資料段溢位改變內部資料段的值,從而劫持程式控制流。雖然.got標記為只讀,但是.got.plt仍然可寫,即仍然可以改寫GOT表劫持程式控制流;
  • Full RELRO:繼承Partial RELRO的所有保護,並且.got.plt也被標為只讀。此時延遲繫結技術被禁止,所有的外部函式地址將在程式裝載時解析、裝入,並標記為只讀,不可更改。此時不需要link_map以及dl_runtime_resolve函式,則GOT表中這兩項資料均置為0,此時ret2dlresolve技術最關鍵的兩項資料丟失,並且GOT表不可寫。

介紹RELRO與Pwn:https://bbs.kanxue.com/thread-282512.htm

Stack(棧檢查)

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

NX

NX即No-eXecute(不可執行)的意思,NX(DEP)的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢位成功轉入shellcode時,程式會嘗試在資料頁面上執行指令,此時CPU就會丟擲異常,而不是去執行惡意指令。

PIE

一般情況下NX(Windows平臺上稱其為DEP)和地址空間分佈隨機化(ASLR)會同時工作。記憶體地址隨機化機制(address space layout randomization),有以下三種情況
0 - 表示關閉程序地址空間隨機化。
1 - 表示將mmap的基址,stack和vdso頁面隨機化。
2 - 表示在1的基礎上增加堆(heap)的隨機化。
可以防範基於Ret2libc方式的針對DEP的攻擊。ASLR和DEP配合使用,能有效阻止攻擊者在堆疊上執行惡意程式碼。
Built as PIE:位置獨立的可執行區域(position-independent executables)。這樣使得在利用緩衝溢位和移動作業系統中存在的其他記憶體崩潰缺陷時採用面向返回的程式設計(return-oriented programming)方法變得難得多。

Stripped

stripped:將程式中的符號表的資訊剔除掉了,這樣子編譯出來的可執行檔案體積比較小;
not stripped:則反之,但是就是因為其保留了這些資訊,所以便於除錯。

參考資料:
https://blog.csdn.net/panfengsoftware/article/details/7775108
https://blog.csdn.net/qq_44108455/article/details/104985351
https://www.testzero-wz.com/2022/03/05/Ret2dlresolve——從No-RELRO到FULL-RELRO/

相關文章