
摘 要
本文詳細描述和分析了緩沖區溢出攻擊的原理,然后就如何對緩沖區溢出攻擊漏洞構造攻擊程序進行了詳細的分析。
【關鍵詞】緩沖區溢出 棧溢出攻擊 Shellcode
在Internet高度普及的今天,緩沖區溢出漏洞作為最常見的軟件安全漏洞,是黑客攻擊中經常利用的一個漏洞。通過利用溢出漏洞,攻擊者可以使被攻擊的主機改變原代碼的執行流程,轉而執行攻擊者構造的惡意代碼。前些年,緩沖區溢出攻擊一度占到了網絡攻擊總量的百分之五十以上,只是近年來軟件廠商逐漸加強了操作系統和應用軟件的安全建設,采用了一些DEP、ASLR等對抗措施,才使得緩沖區溢出漏洞呈現逐年減少的趨勢,但在企業內網中,緩沖區溢出漏洞仍然普遍存在。因此,依然有必要對緩沖區溢出漏洞進行一些研究,從而開展有效的防范措施。
1 緩沖區溢出漏洞定義及原理
1996年,Aleph One在Phrack雜志發表的“Smashing the Stack for Fun and Profit”是緩沖區溢出的經典之作,第一次詳細地介紹了緩沖區溢出產生的原理和利用方法。緩沖區溢出漏洞攻擊是指攻擊者通過在緩沖區寫入超過預定長度的數據造成所謂的溢出,破壞了堆棧的原有數據結構,使程序的返回地址發生變化,使它指向溢出程序中惡意代碼,這樣就達到了攻擊者的目的。
常見的緩沖區溢出漏洞包括棧溢出和堆溢出漏洞,本文主要結合實驗簡要分析棧溢出的攻擊原理。要充分理解緩沖區溢出漏洞的基本原理,就要從理解系統的內存結構開始。系統的內存結構主要包含有text、data、bss、heap和stack等區段。其中,代碼text區,是由程序的代碼段,為只讀數據,任何對其寫入的操作都會導致段錯誤(segmentation violation); 而bss 和data 都是可寫的,它們保存全局變量,data 段包含已初始化的靜態變量,而bss 包含未初始化的數據;heap是堆區,stack是棧區。
棧結構及溢出原理:
堆棧是操作系統中非常重要的一種結構,系統或用戶進程通過堆棧用來完成各種函數調用。對于系統中的每個進程來說,都有其各自獨立的堆??臻g,堆??臻g隨著進程的創建而被創建,隨著進程的結束而被銷毀。與系統中其他內存空間的增長有所不同,堆棧的增長方向是由內存高地址向低地址進行的,正是由于堆棧的這個特點導致了一系列的安全問題。
當一個函數調用另一個函數的時候,其棧幀結構如圖2所示。在正常情況下,被調函數執行完畢,將被調函數的返回地址傳給EIP寄存器,CPU從EIP寄存器取指令地址,返回主函數繼續執行。如果黑客特意構造數據,使被調函數的局部變量越界,這樣就有可能破壞棧中的相鄰變量的值,甚至破壞棧幀中所保存的EIP、EBP值等重要數據。成功的緩沖區溢出攻擊會用精心設計的數據覆蓋返回地址,使被調函數執行完后將修改后的返回地址傳入EIP,從而使CPU執行攻擊代碼(shellcode)。
2 緩沖區溢出漏洞攻擊的構造
通過前面的分析,我們大致了解了構造緩沖區溢出漏洞需要考慮以下3個方面的問題。一是找出緩沖區溢出要覆蓋或修改的返回地址EIP。如棧溢出中的返回地址在棧中的存儲位置。二是將返回地址的值修改為何值?為了完成程序執行流程控制權的轉移,攻擊者將影響程序執行流程的EIP值進行修改,使其能夠跳轉至攻擊者預期的代碼進行執行。如何定位注入指令在目標程序中的位置,以及在存在限制條件如何完成程序控制權的移交,是一項重要的挑戰。三是要構造合適的指令代碼,即Shellcode。在程序控制權交至攻擊者注入的指令代碼后,那么這段代碼具體完成什么功能是由攻擊者開發的。這段代碼有時被稱為攻擊者的payload,由于這個payload通常為攻擊者提供了一個遠程shell訪問,因此也被稱為Shellcode。由于受目標主機的緩沖區大小限制,Shellcode長度一般越小越好。Shellcode構造步驟一般如下:
(1)先用C語言程序編寫實現Shellcode的功能的代碼。
(2)將上面編寫的代碼通過編譯器進行編譯,然后修改為帶有Shellcode特點的匯編代碼(精通匯編語言的人可直接使用匯編語言編寫程序)。
(3)根據匯編程序得到機器碼形式的Shellcode。
3 緩沖區溢出漏洞實驗
在了解了緩沖區溢出攻擊的原理之后,下面給出一個遠程棧溢出的例子。圖1所示的程序是一個存在緩沖去溢出漏洞的服務器端程序。該程序主要功能是實現字符串接收與回顯,通過windows socket機制創建一個服務器端socket,并在3764端口上進行監聽;在接受客戶端連接之后,把客戶端輸入的字符串統計接收的字節數,并進行回顯。該程序的被調函數overflow在將接收字符串復制至本地局部變量s1緩沖區時,因沒有進行邊界保護,存在著棧溢出漏洞風險。
下面我們構造一個針對圖1所示漏洞服務程序的遠程滲透攻擊程序。該攻擊程序關鍵點在于構造一個用于溢出目標程序緩沖區的攻擊數據,這是整個攻擊過程中最為關鍵的步驟。攻擊數據緩沖區Buff類似一個“三明治”,“頂層”填充一段無效的nop指令,“夾心層”是將EIP值修改為“jmp ESP”指令的地址,而這個指令地址在不同的目標程序所運行的操作系統平臺上是不一樣的,由攻擊者在不同的系統環境中調試獲得。在本示例代碼中,實驗的環境是windows xp環境,并從ws2_32.dll中查找到的“jmp esp”指令地址?!暗讓印眲t填充攻擊者構造的遠程Shellcode。
圖2所示的代碼省略了580字節的shellcode二進制代碼程序。下面給出Shellcode實現步驟,具體的代碼請讀者根據實際需要自行編寫。其大致過程如下:
(1)創建一個服務器端socket,并在指定的端口上監聽;
(2)通過accept()接受客戶端的網絡連接;
(3)創建子進程,運行“cmd.exe”,啟動命令行;
(4)創建兩個管道,命令管道將服務器端socket接收(recv)到的客戶端通過網絡輸入的執行命令,連接至cmd.exe的標準輸入;然后輸出管道將cmd.exe的標準輸出連接到服務器端socket的發送(send),通過網絡將運行結果反饋給客戶端。然后再將高級語言實現的shellcode代碼編譯,生成匯編代碼,提取匯編代碼所對應的Opcode二進制指令,就可以創建圖2所示的滲透攻擊程序中所省略的shellcode指令數組。
4 小結
本文詳細描述和分析了緩沖區溢出攻擊的原理,然后就如何對緩沖區溢出攻擊漏洞構造攻擊程序進行了詳細的分析。目前,緩沖區溢出漏洞仍然是互聯網和計算機系統中最普遍安全漏洞,特別是能夠實現本地提取和遠程滲透攻擊的緩沖區溢出漏洞威脅最大。雖然隨著軟件廠商不斷加強了軟件安全方面的建設,但在短期之內很難徹底解決緩沖區溢出漏洞攻擊的問題,因而目前對該問題的研究工作仍具有實際意義。
參考文獻
[1]韓萬軍.緩沖區溢出攻擊代碼檢測與防御技術研究[D].鄭州:解放軍信息工程大學,2012.
[2]付春雷.基于多階段網絡攻擊模型的緩沖區溢出攻擊技術研究與實踐[D].重慶:重慶大學,2006.
[3]王玉潔.基于攻擊代碼檢測的緩沖區溢出防御技術研究[D].成都:西南交通大學,2010.
作者簡介
宋春(1977-),男,江蘇省徐州市人。碩士研究生學歷?,F供職于南寧市公安局網絡安全保衛支隊。主要研究方向為計算機網絡與分布式計算。
作者單位
南寧市公安局網絡安全保衛支隊 廣西壯族自治區南寧市 530000