Windows 緩衝區溢位與資料執行防止DEP

來源:互聯網
上載者:User
 
緩衝區溢位與資料執行防止DEP介紹

先看一個緩衝區溢位的C++執行個體程式,代碼如下(VC6.0下編譯通過):

//by MoreWindows #include <windows.h>#include <conio.h>#include <stdio.h>#include <process.h>#include <string.h>void foo(const char *input){char buf[4]; //buf 佔4位元組,後4位元組為ebp,再後4個位元組為返回地址。strcpy(buf, input); //傳入的字串去覆蓋返回地址,從而使用程式執行bar()函數}void bar(void){printf("Augh! This program have been hacked by MoreWindows!\n");getch();exit(0);//由於這時的ebp已經破壞了, 所以在這直接退出程式. 不然會彈出錯誤對話方塊}int main(int argc, char *argv[]){  printf("Address of main = %p\n", main);printf("Address of foo = %p\n", foo);printf("Address of bar = %p\n", bar); //構造字串,前8個填充字元,再跟一個bar()函數的地址。char szbuf[50] = "12341234";DWORD *pbarAddress = (DWORD *)&szbuf[8];*pbarAddress = (DWORD)bar;foo(szbuf);return 0;} 

程式運行結果如下:

可以看出在程式中並沒有調用bar()函數,只調用了foo()函數,但由於foo()函數處理不當,造成了緩衝區溢位後修改了foo()函數的返回地址從而導致程式執行本不應該執行的bar()函數。當然實際的溢出攻擊遠比這個例子要複雜的多,但原理相同,都是通過篡改函數的返回地址從而讓程式執行不應該執行的代碼。

 

資料執行防止DEP原理

分析緩衝區溢位攻擊,其根源在於現代電腦對資料和代碼沒有明確區分這一先天缺陷,就目前來看重新去設計電腦體繫結構基本上是不可能的,我們只能靠向前相容的修補來減少溢出帶來的損害,資料執行防止DEP就是用來彌補電腦對資料和代碼混淆這一天然缺陷的。

DEP的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢出成功轉入shellcode時(注1),程式會嘗試在資料頁面上執行指令,此時CPU就會拋出異常,而不是去執行惡意指令。1所示。

  圖1 DEP工作原理

DEP的主要作用是阻止資料頁(如預設的堆頁、各種堆棧頁以及記憶體池頁)執行代碼。微軟從Windows XP SP2開始提供這種支援人員,根據實現的機制不同分為:軟體DEP(Software DEP)和硬體DEP(Hardware-enforced DEP)。

軟體DEP與CPU硬體無關,其本質是Windows利用軟體類比實現DEP,對作業系統提供一定的保護。

硬體DEP才是真正意義的DEP,硬體DEP需要CPU的支援,AMD和Intel都為此做了設計,AMD稱之為No-Execute Page-Protection(NX),Intel稱之為Execute Disable Bit(XD),兩者功能及工作原理在本質上是相同的。

作業系統通過設定記憶體頁的NX/XD屬性標記,來指明不能從該記憶體執行代碼。為了實現這個功能,需要在記憶體的頁面表(Page Table)中加入一個特殊的標識位(NX/XD)來標識是否允許在該頁上執行指令。當該標識位設定為0裡表示這個頁面允許執行指令,設定為1時表示該頁面不允許執行指令。

 

在系統中設定資料執行防止DEP

  可以通過如下方法檢查CPU是否支援硬體DEP,按右鍵案頭上的"我的電腦"à"屬性"à"進階"選項卡。在"進階"索引標籤頁面面中的"效能"下單擊"設定"開啟"效能選項"頁。單擊"資料執行防止"選項卡,在該頁面中我們可確認自己電腦的CPU是否支援DEP。如果CPU不支援硬體DEP該頁面底部會有如下類似提示:"您的電腦的處理器不支援基於硬體的DEP。但是,Windows可以使用DEP軟體協助保護免受某些類型的攻擊",2所示。

圖2 Windows XP下DEP選項頁樣本

根據啟動參數的不同,DEP工作狀態可以分為四種:

(1)optin:預設僅將DEP保護應用於Windows系統組件和服務,對於其他程式不予保護,但使用者可以通過應用程式相容性工具(ACT,Application Compatibility Toolkit)為選定的程式啟用DEP,在Vista下邊經過/NXcompat選項編譯過的程式將自動應用DEP.這種模式可以被應用程式動態關閉,它多用於普通使用者版的作業系統,如Windows XP、Windows Vista、Windows7.

(2)optout:為排除清單程式外的所有程式和服務啟用DEP,使用者可以手動在排除清單中指定不啟用DEP保護的程式和服務。這種模式可以被應用程式動態關閉,它多用於伺服器版的作業系統,如 Windows Server 2003、Windows Server 2008.

(3)alwaysOn:對所有進程啟用DEP 的保護,不存在排序列表,在這種模式下,DEP不可以被關閉,目前只有在64位的作業系統上才工作在AlwaysOn模式。

(4)alwaysOff:對所有進程都禁用DEP,這種模式下,DEP也不能被動態開啟,這種模式一般只有在某種特定場合才使用,如DEP幹擾到程式的正常運行。

可以通過切換圖2中的複選框切換Optin和Optout兩種模式。還可以通過修改c:boot.ini中的/noexecute啟動項的值來控制DEP的工作模式。3所示,DEP在XP作業系統上的工作模式為optin。

  圖3 Windows XP下DEP的預設啟動狀態

 

在編程中使用資料執行防止DEP

介紹完DEP的工作原理及狀態後,我們來看一個和DEP密切相關的程式連結選項:/NXCOMPAT。/NXCOMPAT是Visual Studio 2005及後續版本中引入一個連結選項,預設情況下是開啟的。使用的Visual Studio 2008(VS 9.0),可以在通過菜單中的“項目”->最下面的工程屬性->“連結器”->“進階”就可以看到資料執行防止(DEP)了。4所示:

圖4 VS 2008中設定/NXCOMPAT編譯選項

因此如果你用VS2008去編譯上面那個範例程式碼,程式運行遇到緩衝區溢位後不會執行bar()函數而是直接彈出個提示框,5所示:

圖5 VS2008產生程式會自動防範緩衝區攻擊

 

經過/NXCOMPAT編譯的程式有什麼好處呢?通過前面的介紹我們知道使用者版的作業系統中DEP一般工作在optin狀態,此時DEP只保護系統核心進程,而對於普通的程式是沒有保護的。雖然使用者可以通過工具自行添加,但這無形中增高了安全的門檻,所以微軟推出了/NXCOMPAT編譯選項。經過/NXCOMPAT編譯的程式在Windows Vista及後續版本的作業系統上會自動啟用DEP保護。由此可見在編程中利用資料執行防止來加強程式的安全性是一件非常容易的事情。

 

DEP的不足之處

DEP針對溢出攻擊的本源,完善了記憶體管理機制。通過將記憶體頁設定為不可執行狀態,來阻止堆棧中shellcode的執行,這種釜底抽薪的機制給緩衝溢出帶來了前所未有的挑戰。這也是迄今為止我們遇到的最有力的保護機制,它能夠徹底阻止緩衝區溢位攻擊嗎?答案是否定的。如同前面介紹的安全機制一樣,DEP也有著自身的局限性:

首先,硬體DEP需要CPU的支援,但並不是所有的CPU都提供了硬體DEP的支援,在一些比較老的CPU上面DEP是無法發揮作用的。

其次,由於相容性的原因Windows不能對所有進程開啟DEP保護,否則可能會出現異常。例如一些第三方的外掛程式DLL,由於無法確認其是否支援DEP,對涉及這些DLL的程式不敢貿然開啟DEP保護。再有就是使用ATL 7.1或者以前版本的程式需要在資料頁面上產生可以執行代碼,這種情況就不能開啟DEP保護,否則程式會出現異常。

再次,/NXCOMPAT編譯選項,或者是IMAGE_DLLCHARACTERISTICS_NX_COMPAT的設定,只對Windows Vista 以上的系統有效。在以前的系統上,如Windows XP SP3等,這個設定會被忽略。也就是說,即使採用了該連結選項的程式在一些作業系統上也不會自動啟用DEP保護。

最後,當DEP工作在最主要的兩種狀態optin和optout下時,DEP是可以被動態關閉和開啟的,這就說明作業系統提供了某些API函數來控制DEP的狀態。同樣很不幸的是早期的作業系統中對這些API函數的調用沒有任何限制,所有的進程都可以調用這些API函數,這就埋下了很大的安全隱患,也為突破DEP的攻擊者提供了一條道路。

 

 

 

注1.    Shellcode指的是一段用來發送到伺服器利用特定漏洞的代碼(也可以是填充資料),一般用於擷取許可權。另外,Shellcode通常是作為資料發送給受攻擊服務的。 Shellcode是溢出程式和蠕蟲的核心。

 

 

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/6887136


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.