1. 程式人生 > >DEP和ASLR的原理與破解

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