這筆字型數(shù)據(jù)采用FlateDecode方式編碼。當(dāng)我們將它解?之后,我們看到一個(gè)SING表,并且立刻發(fā)現(xiàn)了可疑的內(nèi)容。其uniqueName(獨(dú)特名稱)字段應(yīng)該是一個(gè)采用7位ASCII編碼且用NULL字符結(jié)尾的27字符字符串。

但是,此處的數(shù)據(jù)卻超過(guò)28個(gè)字符。這就是典型的緩沖區(qū)溢出。

除錯(cuò)

我們從靜態(tài)分析得知此漏洞攻擊使用了.PDF檔案中的哪一部分?jǐn)?shù)據(jù)。接下來(lái),我們要運(yùn)用程序除錯(cuò)器(debugger)來(lái)驗(yàn)證我們的看法,并且看看它實(shí)際上如何運(yùn)作。當(dāng)這個(gè)惡意.PDF檔案在Adobe Reader中開啟時(shí),會(huì)呼叫strcat函式。讓我們來(lái)看看此函數(shù)調(diào)用的來(lái)源緩沖區(qū)內(nèi)容。

我們已看過(guò)「A8AAAAAA…」這段內(nèi)容。這就是先前uniqueName字段的實(shí)際內(nèi)容。而目的地緩沖區(qū)則是一個(gè)固定大小的堆棧。正是因此才會(huì)造成緩沖區(qū)溢出。

在緩沖區(qū)溢出之后,堆棧上的一個(gè)函式指標(biāo)就會(huì)被覆寫成0x4a80cb38。接著后面會(huì)呼叫這個(gè)函式指標(biāo),攻擊者就因此獲得程序執(zhí)行控制權(quán)。

返回指標(biāo)漏洞攻擊

其實(shí)緩沖區(qū)溢出本身并不是太嚴(yán)重或太不尋常的問(wèn)題。但是,這項(xiàng)攻擊利用了ROP技巧來(lái)避開Windows用來(lái)防止漏洞攻擊的DEP機(jī)制。DEP機(jī)制可以防止系統(tǒng)執(zhí)行非可執(zhí)行內(nèi)存分頁(yè)中的內(nèi)容。

但ROP技巧會(huì)覆蓋已加載的可執(zhí)行碼來(lái)讓自己的程序執(zhí)行,巧妙地避開了DEP機(jī)制。ROP背后的邏輯是,只要程序夠大,就能讓攻擊程序運(yùn)用現(xiàn)有的程序代碼來(lái)組成一個(gè)程序代碼“串行”。

此攻擊的作者選擇了Adobe Reader的icucnv36.dll組件為目標(biāo)。此組件并未設(shè)定使用地址空間配置隨機(jī)化(Address Space Layout Randomization,簡(jiǎn)稱ASLR)功能,因此才會(huì)輕易成為 ROP 攻擊的目標(biāo)。前述的地址(0x4a80cb38)就是icucnv36.dll內(nèi)以下這段攻擊程序代碼的起點(diǎn)。

只要修改一下堆棧指針,這段程序代碼就會(huì)變成 ROP 串行的起點(diǎn)。后面接著的程序代碼則指向用來(lái)做為ROP串行的堆棧數(shù)據(jù)。堆棧數(shù)據(jù)內(nèi)容則是使用惡意.PDF檔案內(nèi)的JavaScript來(lái)加載內(nèi)存內(nèi)。以下是一段這項(xiàng)攻擊所用到的程序代碼:

框出來(lái)的部分經(jīng)過(guò)一些置換和反跳位運(yùn)算之后,最后在內(nèi)存內(nèi)是一個(gè)雙字組(double word)大小的數(shù)值:0x4a801064。

真正具備惡意行為的第二階段攻擊程序代碼一開始也是先由JavaScript加載內(nèi)存內(nèi)。在經(jīng)過(guò)解?之后,真正的程序代碼應(yīng)該像下面這樣:

這是原生 x86 機(jī)器碼,用來(lái)執(zhí)行真正的惡意攻擊。

回到堆棧指針調(diào)整好后的第一階段ROP程序,其程序代碼會(huì)搜尋icucnv36.dll的某些部分,并且呼叫幾個(gè)API函式:

呼叫CreateFileA來(lái)建立一個(gè)名為“iso88591”的檔案(?名不重要)。

呼叫CreateFileMappingA,指定flProtect=0×40(讓檔案可執(zhí)行)。

呼叫MapViewOfFile來(lái)映像剛才建立的檔案。

呼叫memcpy來(lái)將第二階段的程序代碼復(fù)制到緩沖區(qū),也就是此映射共享檔案的開頭。

接著,程序跳到映像檔案所在的緩沖區(qū)開頭來(lái)執(zhí)行。由于此區(qū)為可執(zhí)行的內(nèi)存,因此就能避開DEP保護(hù)機(jī)制。

分享到

liukai

相關(guān)推薦