C語言中奇技淫巧07-使用GCC棧保護選項檢測程序棧溢出

-fstack-protector 是 GCC 和 Clang 編譯器提供的一種棧保護(Stack Smashing Protection, SSP) 機制,用于檢測和防御常見的緩沖區溢出攻擊(特別是棧溢出)。它通過在函數的棧幀中插入特殊的“金絲雀值”(canary value)來實現保護。

這個機制的靈感來源于煤礦中的“金絲雀”——礦工會帶一只金絲雀下井,如果礦井中有毒氣,金絲雀會先死亡,從而警告礦工。
在棧保護中:

  • “金絲雀”:是一個隨機的、不可預測的數值。
  • “毒氣”:是惡意的緩沖區溢出攻擊。
  • “金絲雀死亡”:是金絲雀值被修改,表示棧已被破壞。

1. 保護機制的工作流程

當使用 -fstack-protector 編譯時,編譯器會在特定函數的棧幀中插入以下內容:

(1) 棧幀布局變化

在未啟用保護時,一個典型的棧幀可能如下:

高地址
+------------------+
| 參數             |
+------------------+
| 返回地址         |  <-- 函數返回時跳轉的目標
+------------------+
| 舊的棧幀指針     |
+------------------+
| 局部變量         |  <-- 緩沖區溢出可能從此處開始
+------------------+
低地址

啟用 -fstack-protector 后,棧幀變為:

高地址
+------------------+
| 參數             |
+------------------+
| 返回地址         |  <-- 攻擊者最想覆蓋的目標
+------------------+
| 舊的棧幀指針     |
+------------------+
| **金絲雀值**     |  <-- 保護“返回地址”的哨兵
+------------------+
| 局部變量         |  <-- 緩沖區溢出從此處開始
+------------------+
低地址

關鍵變化:金絲雀值被放置在返回地址和局部變量(尤其是緩沖區)之間

(2) 函數執行過程

  1. 函數入口

    • 編譯器生成的代碼會在函數開始時,從一個全局安全位置(如線程控制塊)讀取一個隨機的金絲雀值
    • 將這個值寫入棧幀中的金絲雀槽
  2. 函數執行

    • 程序正常運行。如果存在緩沖區溢出漏洞(如 strcpy 寫入過長的字符串到局部數組),溢出的數據會先覆蓋局部變量,然后覆蓋金絲雀值,最后才可能覆蓋返回地址。
  3. 函數出口

    • 在函數 return 之前,編譯器插入的代碼會重新讀取棧中的金絲雀值
    • 將其與原始的金絲雀值(通常存儲在寄存器或安全位置)進行比較。
    • 如果相等:說明棧未被破壞,函數正常返回。
    • 如果不相等:說明金絲雀值被修改(即發生了棧溢出),程序會立即調用一個錯誤處理函數(如 __stack_chk_fail),通常會導致程序終止(abort),并可能輸出錯誤信息(如 “stack smashing detected”)。

2. -fstack-protector 的不同級別

GCC/Clang 提供了多個級別的棧保護,嚴格程度遞增:

選項保護范圍說明
-fstack-protector中等僅保護包含長度大于 8 字節的字符數組的函數,或使用了 alloca() 的函數。這是最常用的級別,平衡了安全性和性能開銷。
-fstack-protector-strong較強保護范圍更廣,包括:
? 包含任意大小的數組的函數
? 包含地址被取走的局部變量的函數
? 使用 alloca() 的函數
? 包含 printf 風格可變參數的函數
在現代編譯器中推薦使用此選項。
-fstack-protector-all最強保護所有函數,無論其是否包含易受攻擊的變量。性能開銷最大,通常用于高安全要求的場景。
-fno-stack-protector顯式禁用棧保護(默認不啟用,除非系統配置開啟)。

3. 金絲雀值的來源與安全性

  • 隨機性:金絲雀值通常在程序啟動時從系統的隨機源(如 /dev/urandom)生成,并存儲在每個線程的線程控制塊(Thread Control Block, TCB)中。
  • 不可預測性:由于金絲雀值是隨機的且對攻擊者不可見,攻擊者無法輕易構造一個能同時覆蓋金絲雀值并將其設置為原始值的 payload,從而繞過檢測。
  • 終止符:金絲雀值通常設計為包含字符串終止符 \0 和其他特殊字節,使其難以通過標準的字符串操作函數(如 strcpy)完整寫入。

4. 局限性與繞過

盡管 -fstack-protector 非常有效,但它并非萬能:

  1. 不保護所有溢出

    • 它主要保護返回地址不被覆蓋。
    • 如果溢出只覆蓋了其他局部變量(而未到達金絲雀),這種攻擊可能不會被檢測到(例如“變量篡改”攻擊)。
  2. 信息泄露前提下的繞過

    • 如果攻擊者能通過其他漏洞(如格式化字符串漏洞)泄露金絲雀值,那么他們就可以在溢出時將金絲雀值恢復,從而繞過保護。
  3. 不防止堆溢出

    • 該機制只保護棧,對堆(heap)上的緩沖區溢出無效。
  4. 性能開銷

    • 每個受保護的函數都需要額外的內存(金絲雀槽)和運行時檢查(讀取、比較),會帶來輕微的性能和內存開銷。

5. 實際效果

當你在程序中觸發一個棧溢出時,如果啟用了棧保護,你通常會看到類似這樣的錯誤信息:

*** stack smashing detected ***: <program_name> terminated
Aborted (core dumped)

這表明保護機制成功檢測到了棧破壞并終止了程序,防止了更嚴重的后果(如代碼執行)。


6. 總結

-fstack-protector 通過在棧幀中插入一個“金絲雀值”來保護關鍵數據(如返回地址)。它在函數入口放置金絲雀,在函數出口檢查其完整性。如果金絲雀被修改,說明發生了棧溢出,程序會立即終止。這是一種簡單、高效且廣泛部署的安全防御機制,能有效阻止大量基于棧溢出的攻擊,是現代軟件安全編譯的基本配置之一。推薦在編譯時使用 -fstack-protector-strong 以獲得更好的保護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96112.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 8.0 Web API JWT 身份驗證和基于角色的授權

在當今的數字環境中&#xff0c;保護 Web 應用程序的安全至關重要。隨著 .NET 8.0 的不斷發展&#xff0c;它提供了強大的工具來確保您的 API 既安全又高效。 示例代碼&#xff1a;https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜歡此文章&#xff0c…

ZYNQ SDK軟件在線調試

1、然后右鍵項目->debug as->launch on hardware2、從左到右分別是&#xff1a;運行程序到設置的斷點暫停運行終止斷開連接步進&#xff08;進入函數內部&#xff09;跳過&#xff08;不進入函數內部&#xff09;跳出函數3、雙擊添加斷點&#xff0c;然后點擊運行可以讓程…

四大金剛之計算機操作系統

1. 進程和線程的區別&#xff1f;創建線程的代價比創建進程小嗎&#xff1f;進程是資源分配和調度的基本單位&#xff1b;線程是 CPU 調度的基本單位。進程有獨立的地址空間&#xff0c;線程共享進程地址空間。創建/銷毀進程開銷大&#xff0c;線程開銷小。是的&#xff0c;因為…

redis--redis.conf的相關配置問題

關于redis.conf內的相關重要的配置介紹 1. bind 配置 僅僅設置bind&#xff0c;還需要搭配下面的rotected-mode 配置才能外部ip進行連接 功能&#xff1a;設置 Redis 監聽的 IP 地址&#xff0c;決定哪些設備可以連接到 Redis 服務器。 bind 127.0.0.1&#xff1a;只允許本機&a…

unsloth 筆記:從最近的檢查點繼續微調

檢查點&#xff08;checkpointing&#xff09;可以把微調進度保存下來&#xff0c;這樣可以中途暫停&#xff0c;隨后繼續訓練。首先需要在 Trainer 的參數里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平臺選型指南:破解研發效率瓶頸,適配金融/政務/國產化場景的5大關鍵指標

在數字化轉型的浪潮中&#xff0c;軟件研發效能已成為企業的核心競爭力。然而&#xff0c;許多團隊在追求敏捷與高速交付的過程中&#xff0c;常常會遇到工具鏈割裂、流程冗長、環境混亂等效率瓶頸。選擇一個合適的、一體化的DevOps平臺&#xff0c;是破解這些瓶頸、實現研發運…

【面試向】元宇宙介紹

屬于基礎知識介紹&#xff0c;主要目的是對這一概念有技術層面的理解&#xff0c;有前瞻性的觀點&#xff0c;幫助大家在面試中給出得體的表述。 1. 什么是元宇宙&#xff1f; 元宇宙本質上是一個融合了數字與現實、由技術構建的 “沉浸式虛擬空間”&#xff0c;是一個 “超越…

FreeMarker快速入門指南

FreeMarker快速入門指南 FreeMarker是一個基于模板和數據模型生成文本輸出的Java庫。它廣泛應用于Web開發、代碼生成、郵件模板等場景。本文將帶你快速上手FreeMarker的核心概念和基本用法。 什么是FreeMarker FreeMarker是一個模板引擎&#xff0c;它將模板文件&#xff08;.f…

Nginx主配置文件

一&#xff0c;Nginx基本介紹1&#xff0c;nginx概念Nginx 是一款輕量級、高性能的服務器軟件&#xff0c;核心能力是 “處理網絡請求”&#xff0c;被廣泛用于網站、App 的后端架構中。Nginx 就像一個 “高效的網絡交通指揮官”&#xff0c;核心價值是用最少的資源&#xff0c…

基于ResNet50的智能垃圾分類系統

基于ResNet50的智能垃圾分類系統&#xff1a;從理論到實踐的完整指南 源碼獲取https://mbd.pub/o/bread/YZWXlZ1yZg 引言&#xff1a;智能垃圾分類的時代背景與意義 隨著城市化進程的加速和人口數量的增長&#xff0c;垃圾處理問題日益成為全球性的環境挑戰。傳統的垃圾分類…

災難性遺忘:神經網絡持續學習的核心挑戰與解決方案

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1. 災難性遺忘的定義與核心問題 災難性遺忘&#xff08;Catastrophic…

OPENPPP2 —— IP標準校驗和算法深度剖析:從原理到SSE2優化實現

&#x1f50d; OPENPPP2 —— IP標準校驗和算法深度剖析&#xff1a;從原理到SSE2優化實現 引用&#xff1a; IP校驗和算法&#xff1a;從網絡協議到SIMD深度優化IP校驗和算法&#xff1a;從標量到SIMD的高級優化&#xff08;SSE4.1&#xff09; GDB online Debugger C17 Co…

4.4 機器學習 - 集成學習

集成學習通過 “組合多個基礎模型” 提升泛化能力&#xff0c;核心分為并行集成&#xff08;Bagging&#xff09;、串行集成&#xff08;Boosting&#xff09; 和多層集成&#xff08;Stacking&#xff09; 三大范式&#xff0c;分別對應 “降方差”“降偏差”“兼顧偏差與方差…

機器學習 - 使用 ID3 算法從原理到實際舉例理解決策樹

一、什么是決策樹1.基本概念決策樹是一種樹形結構&#xff0c;由結點&#xff08;node&#xff09; 和有向邊&#xff08;directed edge&#xff09; 組成。其中結點分為兩類&#xff1a;內部結點&#xff08;internal node&#xff09;&#xff1a;表示一個屬性&#xff08;特…

【期末復習】嵌入式——S5PV210開發板

本文為嵌入式課程期末復習&#xff0c;僅供參考&#xff0c;所用課本&#xff1a;嵌入式Linux操作系統&#xff08;李建祥著&#xff09;。第一章1.1 簡述嵌入式微處理器數據存儲格式的大&#xff0c;小端模式。大端模式是指數據的高字節保存在內存的低地址中&#xff0c;而數據…

word文檔結尾批量插入圖片 docx批量插入圖片 指定幾張

如果你有一些word文檔。比如工作總結。你想每一個文檔里面都插入幾張圖片。插入到每個文檔的結尾&#xff0c;那么你可以使用這個工具。首先準備好你的文檔。然后把它們拖進右邊的方框中。拖動的時候&#xff0c;拖動第一個&#xff0c;然后準備好你的圖片。把你的圖片全部拖動…

CodeBuddy國際版又更新了體驗感1

CodeBuddy國際版又更新了 更好的使用體驗更少的資源消耗合理的消耗剩余資源使用起來也是很不錯的&#xff0c;這次更新自動模式想不到的少&#xff0c;可以用于其他的例如翻譯與寫測試用例或者其他的說明文檔等或者是閱讀一下項目更好了解項目總的上來說 使用體驗響應速度還是不…

基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的公益課引流策略研究

摘要&#xff1a;本文聚焦公益課引流場景&#xff0c;探討開源AI智能名片、鏈動21模式與S2B2C商城小程序的融合應用。通過構建低成本用戶裂變體系&#xff0c;分析該技術組合在精準篩選、社群運營、激勵機制設計中的協同效應。研究提出"智能名片畫像-鏈動裂變激勵-S2B2C生…

季度最強策略:年化247%,回撤10%,夏普比率3.79。附大小盤輪動策略python源代碼。

原創內容第993篇&#xff0c;專注AGI&#xff0c;AI量化投資、個人成長與財富自由。 季度最強策略&#xff1a; 年化247%&#xff0c;回撤10%&#xff0c;夏普比率3.79。3積分可查看參數。 大小盤輪動的策略源代碼&#xff1a; 年化收益18.8%。 from engine import Task, Eng…

testng.xml

一、TestNG.xml 是 TestNG 測試框架的核心配置文件&#xff0c;用于組織和控制測試執行。通過它&#xff0c;可以靈活地管理測試套件、測試類、方法&#xff0c;并設置各種執行參數一個基本的 testng.xml文件通常以 ??DOCTYPE 聲明??開頭&#xff0c;并遵循特定的文檔類型定…