Black Hat USA 2000 - Advanced Buffer Overflow Techniques
三句話摘要
高級緩衝區溢位攻擊技術的完整架構,涵蓋注入向量、有效載荷設計與各種繞過作業系統限制的編程技巧。 緩衝區溢位的威力源於注入向量與有效載荷的解耦設計,加上精心優化的空間節省與繞過技巧,使單次技術努力能規模化地攻擊異構系統;防禦之道在於消除根本原因(代碼審查、安全編寫習慣)而非依賴表面防護。 模組化攻擊架構:注入向量與有效載荷分離設計,就像導彈與彈頭。軍事級攻擊者可部署多個開發團隊分別構建注入向量(應對不同軟體版本)與有效載荷(實現不同目標),最後靈活組合。同一個有效載荷可透過多個注入向量交付至異構目標,大幅提升攻擊效率。
重點整理
重點- 1
模組化攻擊架構:注入向量與有效載荷分離設計,就像導彈與彈頭。軍事級攻擊者可部署多個開發團隊分別構建注入向量(應對不同軟體版本)與有效載荷(實現不同目標),最後靈活組合。同一個有效載荷可透過多個注入向量交付至異構目標,大幅提升攻擊效率。
- 2
棧溢位的根本機制:在 Intel x86 上,棧向下生長而緩衝區向上填充。無邊界檢查的字串函數(strcpy、sprintf)被超大輸入溢位時,會覆寫返回地址、異常處理器等棧上關鍵資料。攻擊者將這些值改寫為指向有效載荷的地址,使處理器執行任意代碼。異常處理本身無法防禦此攻擊,因為異常處理器的地址也在棧上。
- 3
空間優化戰術:有效載荷往往侷限於數百位元組。解決方案包括呼叫預載函數而非重新實現功能、使用雜湊載入(用 4 位元組 CRC 代替冗長的 ASCII 函數名)、XOR 編碼資料段避免 null 位元組。Position-aware 技巧(Call-Pop)和寄存器技巧(Call-Through-Register)僅需 2 位元組即可達成位址計算或跳轉,極度節省空間。
- 4
容錯與繞過機制:NOOP sled 提供位址猜測容差;Call -1 等編碼技巧避免 null 位元組;利用 DLL 高位址記憶體區間克服棧 lowland 限制;向後橋接與推/減/彈技巧在極度受限字元集(MIME、URL 編碼)下仍能構建功能性有效載荷。
實用技巧與重點
乾貨- 工具與資源:
- Asmodeus Scanner - NT 快速連接埠掃描工具
- rootkit.com - Rootkit 安裝、檢測與記憶體隱藏資源
- Hackproofing Your Network(Ryan Russell 編著,包括 Greg Hoglund、Rainforest Puppy、Mudge、Oliver、Caesar 等)
- Frack 55 雜誌 - Barnaby Jack 的 NT 遠端 shell payload 文章
- Caesar's Challenge - DEF CON 每年繞過限制的破解挑戰
- 攻擊成本與規模:
- NCSA 報告:單次事件平均恢復成本 8,000 美元
- Morris Worm(1991):關閉大部分網際網路主機
- WANK 蠕蟲(1989):攻擊 NASA,耗時兩週清理,擴散至 HEPnet(高能物理網路)
- 企業調查:至少 50% 報告遭遇病毒或攻擊事件
- 軍事組織證實使用此類技術(美國國防部、俄羅斯 KGB 均有記錄,早至 1991 年)
- 記憶體位址範圍(Windows NT x86):
- 棧起始:0x00402000 附近(包含 0x00 null 位元組 → lowland address)
- DLL 映射:0x77700000 附近(無 null 位元組 → highland address)
- Linux 棧:highland(無 null 位元組限制)
- 關鍵指令與編碼:
- NOOP:0x90(1 位元組無操作)
- Call through registers:FFD0(call EAX)、FFD4(call EDX)- 2 位元組
- Push-Return:50(push)+ C3(return)- 2 位元組
- Call -1:E8FFFFFFFF - 避免 null 位元組
- Interrupt 0x2E:NT 系統呼叫 - 2 位元組
- Interrupt 0x80:Linux 系統呼叫 - 2 位元組
- 預載函數(無需注入):
- LoadLibrary - 任意 DLL 載入
- GetProcAddress - 函數位址查詢
- CreateProcess(NT)、Spawn(Linux)
- 可載入 DLL:
- WinInet:InternetOpenURL、InternetReadFile(檔案下載)
- WinSock:網路通訊與 Socket 操作
- Kernel32:Windows API 包裝
- 有效載荷類型與案例:
- 遠端 shell:Barnaby Jack - 直接載入 Winsock、繫結連接埠、執行 cmd.exe(無需 netcat)
- 蠕蟲:自我複製傳播
- Rootkit:系統級持久化控制(參見 rootkit.com)
- 密碼嗅探:內置 SMB 嗅探與 L0phtcrack 等雜湊破解
- 拒絕服務與基礎設施破壞:關閉子網、修改路由表、停用交換機
- 限制繞過技巧:
- XOR 編碼 - 儲存時編碼、執行時解碼資料段
- 位置尋覺(Call-Pop)- 透過 call 返回地址推算當前位置
- 雜湊載入 - 4 位元組 CRC 代替 ASCII 函數名
- 向後橋接(Backwards Bridge)- 從下往上構建有效載荷
- Push-Pop-Subtract 技巧 - 在僅允許有限指令的環境中重建指令
- 光景缺陷(Light Scene Deficiency)- 設定條件防止測試蠕蟲逸出
結論
結論“緩衝區溢位的威力源於注入向量與有效載荷的解耦設計,加上精心優化的空間節省與繞過技巧,使單次技術努力能規模化地攻擊異構系統;防禦之道在於消除根本原因(代碼審查、安全編寫習慣)而非依賴表面防護。”
完整解析
詳細緩衝區溢位是 IT 安全最持久的威脅。早在 1991 年,俄羅斯 KGB 就有文件記錄其使用此技術;美國國防部也承認軍事機構採用類似攻擊。企業調查顯示至少 50% 公司遭遇過病毒或同類攻擊,平均恢復成本達 8,000 美元。Morris Worm 和 WANK 蠕蟲都曾利用緩衝區溢位大規模傳播,癱瘓了當時大部分網際網路。
緩衝區溢位攻擊的核心洞察是將其分為兩個獨立技術部分。首先是注入向量,即如何將代碼注入目標系統。這取決於具體軟體版本、作業系統、是否部署內容過濾等環境因素。不同的軟體版本需要不同的注入手段。其次是有效載荷,即注入後執行什麼操作,例如啟動遠端 shell、安裝 rootkit 或自我複製。關鍵在於有效載荷可被複用——同一個精心設計的有效載荷可透過不同注入向量交付到各異構目標。這種分離使攻擊具有高度模組性:軍事級組織可部署多個開發團隊分別構建數十個注入向量和多個有效載荷,然後靈活組合使用。
棧溢位是最常見的攻擊向量。在 Intel x86 上,棧向下生長,動態緩衝區向上填充。當使用 strcpy 或 sprintf 等無邊界檢查函數處理超大輸入時,會覆寫棧上的返回地址、異常處理器等關鍵資料結構。攻擊者將這些值改寫為指向有效載荷的地址,使處理器執行任意代碼。許多開發者誤認為異常處理能防禦此攻擊,實際上異常處理器的地址本身也存放在棧上,同樣會被溢位覆寫。攻擊者甚至不需要精確猜測返回地址,只需覆寫異常處理器,在有意引發異常時就能轉跳到惡意代碼。
實現棧溢位面臨多個技術障礙。首個挑戰是 null 位元組。在 Windows NT 中,棧位址通常以 0x00 開頭(稱為 lowland address)。但字串函數在遇到 null 終止符時停止複製,所以若有效載荷包含 null 位元組就會被截斷。解決方案包括利用棧外儲存(堆或其他記憶體區域)或使用高位址記憶體(如 DLL 映射區,稱為 highland address,不含 null)。第二個挑戰是極度的空間限制。有效載荷往往只有數百位元組可用。此時需要極度優化組合語言,利用預載函數而非重新實現功能。
空間優化策略包括多項高級技巧。NOOP sled 提供容錯機制:將緩衝區填充大量 NOOP 指令(0x90,單位元組),即使位址猜測不夠精確,只要跳進 NOOP 區域,處理器就會「滑行」通過 NOOP 直到遇到真實代碼。位置尋覺利用 call 指令的特性:call 推入當前返回地址到棧,隨後 pop 取出,藉此確定代碼在記憶體中的確切位置。寄存器技巧則利用 CPU 暫存器(如 EDI、EDX)可能已指向棧的事實,透過 call-through-register 指令(僅 2 位元組)跳轉。
有效載荷的資料段也需處理 null 位元組。若函數名稱和參數存為 ASCII 字串會包含 null,導致字串提前終止。解決方案是 XOR 編碼:將資料段每個位元組與同一數值進行 XOR,生成編碼後的二進位資料不含任何 null;執行時有效載荷首先解碼資料段,再使用解碼後字串。動態函數載入也是關鍵優化。系統總是預載 LoadLibrary 和 GetProcAddress。攻擊者可透過 LoadLibrary 載入任意 DLL(WinInet 提供檔案下載、WinSock 提供網路通訊),再用 GetProcAddress 查詢所需函數的位址。雜湊載入進一步節省空間:用 4 位元組 CRC 代替冗長 ASCII 函數名,有效載荷運行時對 PE 標頭匯入表進行雜湊匹配,找到目標函數位址,如此資料段大幅縮小。
堆溢位針對 C++ 物件。每個 C++ 物件維護虛函數表(V-table),儲存虛函數指標。若兩個物件相鄰,攻擊者可透過溢位相鄰物件的緩衝區,覆寫其 V-table 指標指向偽造 V-table。當程式呼叫虛函數(尤其析構函數,幾乎總是虛函數)時,執行攻擊者預設代碼。
有效載荷多樣性取決於攻擊目標。最常見是遠端 shell,如 Barnaby Jack 的成果:不依賴外部工具,直接載入 Winsock、繫結連接埠、執行 cmd.exe 並重定向標準輸入/輸出。其他包括蠕蟲(自我複製傳播)、rootkit(系統級持久化)、密碼嗅探與破解、基礎設施破壞(改路由表、停用交換機)。
在極度受限環境中(MIME 或 URL 編碼限制字元集),攻擊者發展奇巧技巧。Caesar's Challenge 展示:受限於 push-pop-subtract 指令集,透過重複加減構建所需指令;為克服無條件跳轉限制,引入「向後橋接」——有效載荷從下往上構建,當上半部分完成解碼時,棧指標正好增長到真實代碼起點,自然銜接執行。
實際攻擊流程:掃描目標網路識別脆弱系統,為每個脆弱版本匹配預先開發的有效載荷,按下按鈕批量觸發攻擊。蠕蟲部分需防止失控傳播,常用「光景缺陷」技巧:設定條件檢查(軟碟必須在驅動器中),若條件不滿足禁止傳播,確保測試環境中蠕蟲不會逸出。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

