緩衝區溢位 是資安史上最經典、破壞力最強的漏洞類型。從 1988 年 Morris 蠕蟲到 2003 年 SQL Slammer、MSBlaster,無不利用堆疊/堆積緩衝區溢位實現遠端程式碼執行。本文深入解析 Win32 架構下緩衝區溢位成因、堆疊運作機制、危險函數特徵,並以 WideChapter.exe 為例展示使用者應用程式溢位利用過程。
當程式允許寫入資料超過緩衝區預留空間時,多餘資料會覆蓋相鄰記憶體區域。在堆疊架構中,函數呼叫時會將返回位址壓入堆疊,若區域變數緩衝區發生溢位,攻擊者可精心構造輸入資料覆寫返回位址,導致程式執行流程跳轉到攻擊者植入的 Shellcode (通常在同一緩衝區中)。
高位址 +------------------+ | 函數參數 | +------------------+ | 返回位址 (EIP) | ← 攻擊目標:覆寫此處控制執行流 +------------------+ | 儲存的 EBP | ← 基底指標 +------------------+ | 區域變數/緩衝區 | ← 輸入資料寫入此處,向高位址增長 | (char buf[16]) | +------------------+ 低位址
PUSH EBP; MOV EBP, ESP; SUB ESP, 缓冲区大小strcpy, strcat, gets, sprintf 等) 不檢查邊界複製使用者輸入。LEAVE; RETN 彈出被覆寫的返回位址至 EIP,程式跳轉攻擊代碼。NULL (0x00) 結尾 (ASCIIZ),strcpy 複製至遇到 NULL 為止。char buf[16]; (16 位元組),char buf[]="HELLO"; (6 位元組含 NULL)。目標程式: WideChapter.exe (網址:https://www.widechapter.com)
漏洞點: 處理特定檔案格式/網路封包時,使用 strcpy 複製使用者可控資料到固定大小堆疊緩衝區。
利用步驟:
pattern_create.rb 產生唯一模式,分析崩潰時 EIP 值定位精確偏移量。JMP ESP 指令位址 (從系統 DLL 搜尋) 作為新返回位址。| 技術 | 原理 | Windows 版本支援 |
|---|---|---|
| GS 編譯器選項 (/GS) | 函數序言/結尾插入 Cookie 檢查,偵測堆疊破壞 | VC++ .NET 2002+ (XP SP2 系統 DLL 多已編譯) |
| DEP (資料執行防護) | 標記堆疊/堆積為不可執行 (NX 位元) | XP SP2+ (需 CPU 支援 NX/XD) |
| ASLR (位址空間配置隨機化) | 模組載入基址隨機化,難以預測 JMP ESP 等指令位址 | Vista+ (XP 不支援) |
| SafeSEH / SEHOP | 驗證結構化例外處理鏈完整性 | XP SP2+ (SafeSEH), Vista+ (SEHOP) |
| 編譯器內建函數 | strcpy_s, strcat_s, sprintf_s 等邊界檢查版本 | VC++ 2005+ (C11 Annex K) |