高地址
+------------------+
| 函數參數 (右到左壓棧) | <- 調用者壓入
+------------------+
| 返回地址 (EIP) | <- CALL 指令壓入,RET 彈出跳轉
+------------------+
| 老 EBP (基址指針) | <- 函數序言: PUSH EBP; MOV EBP, ESP
+------------------+
| 局部變量 | <- 分配棧空間: SUB ESP, size
| ... |
| 寄存器保存區 | <- 可選,編譯器決定
+------------------+
低地址 (棧增長方向)
ESP 指向棧頂
1. 溢出覆蓋返回地址
2. 跳轉到緩衝區 Shellcode (需可執行棧)
或
2. ROP (Return-Oriented Programming): 跳轉到現有代碼片段 (Gadgets) 組合邏輯
如: POP RET; MOV EAX, ...; INT 0x80 等
3. 調用 system("/bin/sh") 或 VirtualProtect 修改內存屬性
4. 反彈 Shell / 執行任意命令
5. 提權 (本地提權漏洞) -> 獲取 Root/SYSTEM
6. 橫向移動 / 持久化 / 數據竊取
| 技術 | 原理 | 繞過難度 | 備註 |
|---|---|---|---|
| Stack Canary (GS/SSP) | 函數序言在局部變量與老 EBP 間放隨機 Canary 值,結尾檢查是否被改。改了則終止程序。 | 高 | 需泄露 Canary 值或利用非棧溢出漏洞 |
| DEP / NX (Data Execution Prevention) | 標記棧/堆/數據段為「不可執行」 (CPU NX 位)。Shellcode 注入棧無法直接執行。 | 中 | 繞過: ROP 鏈調用 `VirtualProtect`/`mprotect` 修改內存屬性,或跳轉到已可執行模塊 (無 ASLR 時)。 |
| ASLR (Address Space Layout Randomization) | 程序加載基址、堆、棧、共享庫基址隨機化。攻擊者無法預知 `system`、`VirtualProtect`、Gadgets 地址。 | 高 | 繞過: 信息洩露漏洞泄露基址、部分覆蓋 (低字節)、JIT 噴射、側信道攻擊。 |
| CFI (Control Flow Integrity) | 編譯器插桩,間接跳轉/調用/返回前驗證目標地址合法性 (如 Microsoft CET, Clang CFI)。 | 極高 | 硬件輔助 (Intel CET: Shadow Stack, IBT) 大幅提升門檻。 |
| SafeSEH / SEHOP | 保護異常處理鏈不被劫持。 | 高 | Windows 特有。 |
棧溢出本質是內存安全邊界檢查缺失導致控制數據 (返回地址) 被數據覆蓋。現代防禦構建了多層纏繞防線:Canary 守門 → DEP 禁執行 → ASLR 盲打 → CFI 鎖定控制流。開發者應從源頭消除不安全 API,啟用編譯器強化,配合 SDLC 安全流程,將漏洞擠壓到極小面。