棧溢位的幾種保護機制

2021-10-03 07:37:46 字數 1477 閱讀 9382

說明:當啟用棧保護後,函式開始執行的時候會先往棧裡插入cookie資訊,當函式真正返回的時候會驗證cookie資訊是否合法,如果不合法就停止程式執行。攻擊者在覆蓋返回位址的時候往往也會將cookie資訊給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。在linux中我們將cookie資訊稱為canary

canary是一種用來防護棧溢位的保護機制。其原理是在乙個函式的入口處,先從fs/gs暫存器中取出乙個4位元組(eax)或者8位元組(rax)的值存到棧上,當函式結束時會檢查這個棧上的值是否和存進去的值一致。

-fstack-protector 啟用保護,不過只為區域性變數中含有陣列的函式插入保護

-fstack-protector-all 啟用保護,為所有函式插入保護

-fstack-protector-strong

-fstack-protector-explicit 只對有明確stack_protect attribute的函式開啟保護

-fno-stack-protector 禁用保護.

說明:nx(dep)的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢位成功轉入shellcode時,程式會嘗試在資料頁面上執行指令,此時cpu就會丟擲異常,而不是去執行惡意指令。

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

-z execstack / -z noexecstack (關閉 / 開啟)
說明:標準的可執行程式需要固定的位址,並且只有被裝載到這個位址才能正確執行,pie能使程式像共享庫一樣在主存任何位置裝載,這需要將程式編譯成位置無關,並鏈結為elf共享物件。

一般情況下nx和位址空間分布隨機化(aslr)會同時工作。

引入pie的原因就是讓程式能裝載在隨機的位址,從而緩解緩衝區溢位攻擊。

0 - 表示關閉程序位址空間隨機化。

1 - 表示將mmap的基址,stack和vdso頁面隨機化。

2 - 表示在1的基礎上增加棧(heap)的隨機化。

#!bash

sudo -s

echo 2 > /proc/sys/kernel/randomize_va_space

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

-z norelro / -z lazy / -z now (關閉 / 部分開啟 / 完全開啟)

棧溢位需關閉的安全保護機制

系統環境 linux 4.8.0 36 generic x86 64 distrib description ubuntu 16.04.2 lts gcc ubuntu 5.4.0 6ubuntu1 16.04.4 5.4.0 20160609 關閉棧溢位保護的指令 1.編譯需加上的指令 gcc g...

Canary保護機制(棧保護)的開啟與關閉

這個選項表示棧保護功能有沒有開啟。棧溢位保護是一種緩衝區溢位攻擊緩解手段,當函式存在緩衝區溢位攻擊漏洞時,攻擊者可以覆蓋棧上的返回位址來讓shellcode能夠得到執行。當啟用棧保護後,函式開始執行的時候會先往棧裡插入cookie資訊,當函式真正返回的時候會驗證cookie資訊是否合法,如果不合法就...

STM32程式設計 動畫深度演示棧機制 棧溢位

為什麼要深入理解棧?做c語言開發如果棧設定不合理或者使用不對,棧就會溢位,溢位就會遇到無法 亂飛現象。所以對棧的深入理解是非常重要的。棧是一種受限的資料結構模型,其資料總是只能在頂部追加,利用乙個指標進行索引,頂端叫棧頂,相對的一端底部稱為棧底。棧是一種lifo 先出的資料結構。棧就兩種操作 再進一...