DEP和ASLR的原理與破解
DEP(Data execution protect)資料執行保護,這個功能需要作業系統和硬體的共同支援才可以生效。DEP的原理就是在系統的記憶體頁中設定了一個標誌位,標示這個記憶體頁的屬性(可執行)。
在硬體上這個工作就交給了CPU來完成,intel CPU在記憶體頁中設定了XD標誌位,amd CPU在記憶體頁中設定了NX標誌位,都標誌了記憶體頁的執行許可權。
在作業系統方面,windows xp sp2從開始支援DEP的功能,但是必須將作業系統執行在PAE(Physical address extension)模式下,即使用硬體的這個標誌位。
WINXP SP2 預設 /NOEXECUTE = OPTIN;DEP只是對一些必須的windows程式和服務起效。
WIN2K3 SP1預設 /NOEXECUTE = OPTOUT;DEP對所有的windows程式和服務起效,除非是使用者自己排除的程式。
ASLR(Address space layout randomization)windows系統中執行的同一個程式其模組載入的地址空間是隨機的,也是防止惡意程式碼攻擊的一種手段。(純系統級別的實現)我們自己編寫的程式或者連結庫,可以通過設定一個連結選項,Project Property -> Configuration Properties -> Linker -> Advanced -> Randomized Base Address,來設定是否支援ASLR。
繞過DEP的方法:
直接利用程式中沒有ASLR特性的模組,尋找能夠利用的彙編指令,xchg eax, esp retn, pop ebx retn等等,找到這些特殊的指令,接下來就是構造一個適合這些指令使用的棧資料了,這個執行過程就利用原來模組的執行記憶體,我們的棧資料也仍然是作為資料使用,不會被DEP檢測到。比如WinExec、system已經在程式中被呼叫,我們只需要將呼叫處的地址拿過來,放到ret語句中,並配置好適當的引數。這種方式非常巧妙,都不需要寫入一堆程式碼到記憶體中,但是前提是你需要使用的API原來程式中都有。
呼叫引數 |
覆蓋方向—> |
/bin/sh |
虛假的返回地址 |
||
返回地址 |
system函式的入口地址 |
|
EBP上層函式堆疊基址 |
溢位的變數覆蓋區域, 在這裡填充適當的資料, 作為system函式的引數。 (呼叫其他的API也是類似) |
|
異常處理程式碼入口地址 (如果函式設定異常處理) |
||
區域性變數 |
有了上面執行API的條件,我們就可以利用以下方法,改變程序或者記憶體頁的DEP屬性。
1、通過呼叫API賦予記憶體可執行的許可權,包括VirtualAlloc HeapCreate等函式,可以改變記憶體頁的執行屬性。
2、通過呼叫API取消系統對本程序的DEP檢測,SetProcessDEPPolicy,但是使用這個函式需要滿足條件:
# 作業系統是vista sp1、winxp sp3、win2k8
# 作業系統DEP的模式設定為OPTIN OPTOUT,如果是AlwaysON就沒有辦法了。
3、通過NT!NTSetInformationProcess函式關閉本程序的DEP檢測,nt5.1都可以實現,vista版本也可以,但是vista sp1之後就不行了。
4、通過WriteProcessMemory把執行程式碼寫入到可執行的記憶體頁中。
--------------------- 本文來自 wangjiabin2007 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wangjiabin2007/article/details/6595515?utm_source=copy