Windows漏洞利用技術概述


Windows漏洞利用技術總結

1. 前言

  本文是我對漏洞利用技術的學習總結,也是自己踐行QAD (Questions、Answer、Discussions)的一次實踐。本文通過閱讀幾位大牛的文章、演講報告、exploit編寫教程等技術文檔不斷總結修改而成,列舉了當前Windows下常見攻擊緩解技術的基本原理及繞過方法,具體技術細節則不詳細描述,大家可以通過參考文獻或其他文章進一步學習。由於本人能力有限,文中可能還存在不少錯誤,我會不斷回顧並完善,也歡迎讀者指出錯誤,共同學習進步。

 

2. Windows攻擊緩解技術簡介

  自從Windows 成為主流操作系統以后,針對Windows平台的漏洞利用技術不斷發展,而微軟也不斷運用新的攻擊緩解技術來封堵漏洞利用技術。根據被引入Windows的時間順序,先后引入的攻擊緩解技術有:GS(Control Stack Checking Calls)、SafeSEH(Safe Structured Exception Handler)、Heap Protection、DEP(Data Execution Prevention)、ASLR(Address Space Layout Randomization)等。

  下面用一個例子對這幾種保護機制及其繞過方法做進一步說明

int main(int argc, char **argv)
{
    Char buf[64];
    __try
    {
        memcpy(buf, argv[1], atol(argv[2]));
    }
    __except(EXCEPTION_CONTINUE_SEARCH)
    {
    }
    return 0;
}

  這個例子的漏洞顯而易見,下面讓我們在開啟不同保護機制的情況下解釋如何利用這個例子的堆棧溢出漏洞。

 

  •  無攻擊緩解措施

  如果在編譯鏈接時不開啟任何保護機制,我們只需要溢出buf,改寫返回地址,使其指向可預測的shellcode地址。這里我使用jmp esp指令(內存中任何一條jmp esp指令,在當前進程自己的dll中尋找最佳)的地址覆蓋main函數的返回地址,並用shellcode進一步覆蓋隨后的堆棧空間。

  當main函數返回時,會從棧中彈出返回地址(此時已經是jmp esp的地址)並跳轉至其處繼續執行。當jmp esp指令被執行后,eip指向了當前堆棧,此時程序執行流程被轉到了已經溢出的堆棧中,shellcode便得到了執行。

 

  •  GS

  GS(Buffer Security Check)是一種針對堆棧溢出的攻擊緩解技術,它主要通過Stack Cookies和Variable Reordering兩種技術對堆棧進行保護。

  Stack Cookies是由編譯器提供的一種運行時堆棧溢出檢測技術,開啟/GS選項的編譯器通過在函數頭部與尾部增加代碼塊的方式來檢測堆棧溢出。當函數執行時,這段代碼會在堆棧本地變量與函數返回地址之間保存一個隨機值(即stack cookies)。函數返回時會檢查堆棧中存放的隨機值是否被修改,如果被修改則意味着發生了堆棧溢出,從而終止程序運行,阻止惡意代碼執行。

  Variable reordering是一種在編譯階段通過重新排列變量順序來最大限度降低堆棧溢出破壞的技術。它重新排列本地變量,將string buffer類型的變量放置在比其他類型變量更高的堆棧地址空間上,防止攻擊者通過溢出string buffer改寫其他本地變量,在stack cookies被檢測前獲取控制權。同時,Variable reordering還將函數參數中的指針、string buffer復制到本地變量上方額外分配的堆棧地址空間上,函數內部不再使用原先位於返回地址后方的參數。

  下面的示意圖是被GS保護的函數堆棧布局

 

 Figure 2‑1

 

  針對開啟GS保護的程序,可以通過溢出buf,改寫堆棧上的SHE record,因為GS並沒有對堆棧上的SHE record進行保護。同時攻擊者在stack cookie被檢查前觸發一個異常,即可通過改寫的SHE record獲取控制權。

  這里,我們確保修改后的SHE record --> Handler為指向pop pop ret指令串的地址(注意,需要確保此指令串位於沒有SafeSEH保護的模塊中,否則異常分發函數將對其進行驗證),而將SHE record --> nextSEH改寫成jumpcode(short jmp X)。

  當函數發生異常(可以通過buf溢出大量的數據,使得strcpy訪問到堆棧的底端)從而索引SEH異常處理函數時,將執行pop pop ret,這串指令從堆棧中彈出nextSEH的地址(此時nextSEH處為跳轉指令jumpcode)給EIP,執行jumpcode后將跳轉到shellcode,使其獲取執行權限。

 

Figure 2‑2

 

  •  GS & SafeSEH

  SafeSEH(Safe Structured Exception Handler)是一種針對SHE異常處理的攻擊緩解技術,用於阻止攻擊者通過改寫堆棧上的Exception Handler Record來獲取控制權。它包括針對SEH異常處理函數的驗證(SHE Handler validation)和針對SEH鏈完整性的驗證(SEH chain validation)兩部分。

  SHE Handler validation:使用(/SAFESEH)鏈接選項生成的可執行文件,會在頭部包含一個記錄所有有效異常處理函數的SafeSEH table,當異常發生時ntdll.dll中的異常分發處理函數會驗證堆棧上的Exception Handler Record指向SafeSEH table中一個有效的異常處理函數。如果異常分發處理函數檢測出Exception Handler Record被攻擊者改寫並指向了其它地方,則會終止程序的運行。

  SEH chain validation是針對SEH鏈完整性的驗證保護技術,通常這種技術被稱為SEHOP(Structured Exception Handler Overwrite Protection),它是在Windows Server 2008被引入的一項保護機制。如果系統開啟了SEHOP保護機制,會將ntdll.dll中的FinalExceptionHandler作為最后一個異常處理函數設置到每個SHE鏈的尾部。當異常發生時,異常分發處理函數會遍歷整個異常處理鏈,確保最后一個Exception Handler Record的nextSEH指針為0xFFFFFFFF,Handler始終指向FinalExceptionHandler,否則將終止程序的運行。

  針對開啟SafeSEH保護的程序,可以在改寫Exception Handler Record時,進一步偽造整個SEH鏈,從而繞過檢測。具體細節不在這里闡述,請參考其他技術文檔。

 

  •   GS & DEP

  DEP(Data Execution Prevention)試圖從根本上阻止shellcode的執行。在開啟DEP的系統中,代碼只能在被標記為execution的頁面上執行,因此可以阻止攻擊者執行位於堆棧、堆或者數據段中的shellcode。當EIP指向non-execution屬性的頁面時,系統將直接終止程序執行。可以通過鏈接選項(/NXCOMPAT)使生成的可執行文件開啟DEP保護。

  目前,常見的繞過DEP的技術主要分兩類,第一類是借用第三方應用程序及組件,利用這些程序可以申請同時支持readable、writeable、executable屬性內存頁的特點,結合Heap Spray技術實現shellcode的布局與執行。JIT Spray就屬於這類技術;第二類是采用代碼重用的方法實現對DEP的繞過,包括利用系統API改寫內存頁屬性、調用執行系統命令或加載可執行文件(EXE、DLL等)引入外部代碼、改寫安全配置(IE瀏覽器的SafeMode標志位等)。其中利用系統API改寫內存頁屬性是最為常見的利用方法。

  針對這個例子,我們利用漏洞改寫Exception Handler Record,此時修改SHE record --> Handler指向pop/pop/pop esp ret指令串的地址。並用可以改寫頁面屬性的系統API地址(VirtualProtect、ZwProtectVirtualMemory等)來改寫nextSEH。當發生異常時,pop/pop/pop esp ret將被執行,其中pop esp將改變堆棧指針,使esp其指向nextSEH。因此ret指令執行后,將跳轉到用於改寫頁面屬性的系統API處。通過系統API將頁面改寫為execution屬性,最后跳轉到shellcode處繼續執行。

 

  •  GS & DEP & SafeSEH

  針對同時開啟GS、DEP、SafeSEH的應用程序,實現漏洞利用的原理與上面類似,不同的是還需要偽造SEH鏈,這里不再詳細敘述。

 

  • GS & DEP & SafeSEH & ASLR

  ASLR(Address Space Layout Randomization)是從Vista和Windows Server 2008起引入的一項重要的攻擊緩解技術。系統在加載支持ASLR技術的可執行程序、動態鏈接庫等映像文件時,會對其加載位置進行隨機化處理,使得重啟后每次加載進內存的基址不同。因此利用程序編寫者就無法找到穩定可靠的jmp esp、pop pop ret、xchg eax,esp等指令地址,更無法定位系統API的位置,特別是在DEP、ASLR同時開啟的情況下,會大大增加漏洞利用的難度。

  ASLR會對加載的PE文件、堆、堆棧、PEB、TEB等的位置進行隨機化處理。可以通過鏈接選項(/DYNAMICBASE)使生成的可執行文件開啟ASLR保護。

  面對ASLR和DEP,許多攻擊者需要解決兩個關鍵問題,首先是如何通過漏洞獲取到模塊(目標進程、系統或其他DLL)基址,由此才有可能利用系統API進行代碼重用;其次是定位攻擊者布局在堆棧、堆上的shellcode地址(通常由stack pivot、ROP chain、payload等組成)。

  目前,常見的獲取模塊基址的方法有兩種,第一種是查看系統或應用程序運行時是否加載了non-ASLR的模塊,是否有其他外部的non-ASLR模塊可以被引入當前進程空間,比如Java 6運行環境JRE1.6的msvcr71.dll、Office 2010/2007的hxds.dll(當在URL中使用ms-help://時引入)等。這些non-ASLR模塊每次加載到進程內存空間時的基址都是固定不變的,因此可以在他們導入表中索引系統DLL的基址,在其代碼空間中搜索可執行指令小配件(gadget)等;第二種是通過內存信息泄露漏洞獲取有關內存布局、目標進程相關的狀態信息等。例如可以通過靜態變量的指針、虛函數表指針等暴露出目標進程、系統或其他DLL的基址,從而進一步獲取相關API地址及有用的gadget等。(后文會對bypass ASLR的相關技術進一步討論)

  為了定位攻擊者布局在堆棧、堆上的shellcode地址,最常見的方法是Heap spray技術,通過連續大量的內存申請,將shellcode布局在指定的內存地址上。這種方法存在穩定性不高、消耗時間和資源多、容易被檢測的缺點;因此,最好的方法還是使用漏洞讀取出shellcode地址,其限制條件為漏洞類型,需要一個具有任意地址讀寫的漏洞來配合利用。

  針對這個例子的漏洞場景,攻擊者的可控程度較低,無法在GS & DEP & SafeSEH & ASLR攻擊緩解技術都開啟的情況下實現利用。但是,當類似這樣的一個漏洞場景發生在瀏覽器、Adobe Flash、Adobe Reader、Office等應用軟件中時,結合信息泄露類漏洞,攻擊者則會實現完美利用。因為攻擊者可以使用JavaScript、ActionScript、VBScript等腳本語言進行內存操作(內存申請與釋放、創建特殊對象等)從而使得利用變得可行。

 

  由上面的簡介我們知道,即便Windows已經逐步引入了新的攻擊緩解技術來阻止惡意代碼運行,但這些攻擊緩解技術只是提高了編寫漏洞利用程序的難度,並不能完全阻止惡意代碼的運行。通過研究,仍然可以通過已知或未知的方法對其進行利用。

  當前,IE瀏覽器、Adobe Flash、Adobe Reader、Microsoft Office等是人們日常辦公、娛樂生活中經常使用的應用軟件。因此,惡意代碼編寫者常常針對它們,利用挖掘到的漏洞進行攻擊,使得惡意代碼傳播面廣、影響范圍大。業內安全廠商、研究人員也都集中精力針對這些軟件的漏洞挖掘、利用技術進行分析與研究,下面主要針對IE瀏覽器,具體講解ASLR & DEP繞過技術的原理。

 

3. 繞過ASLR

  FireEye在其博客上曾發表一篇文章——《ASLR Bypass Apocalypse in Recent Zero-Day Exploits》,通過舉例說明了最近0day漏洞利用中所使用的三類繞過ASLR的技術:Using non-ASLR modules、Modifying the BSTR length/null terminator、Modifying the Array object。從本質上來講第二類和第三類技術一樣,都是通過一系列的內存破壞(Memory Corruption),最終泄露出關鍵模塊的內存基址,並獲取控制權。下面參考FireEye的文章分別對三類技術的原理進行介紹。

 

3.1. 利用non-ASLR模塊

  這是一種最簡單也最常見的對抗ASLR保護的技術,因為現在仍然有許多應用程序及其模塊在編譯時沒有開啟ASLR保護(/DYNAMICBASE鏈接選項)。系統每次都會在固定的內存基址上加載它們,惡意代碼編寫者便可以從這些non-ASLR模塊中挑選指令(gadget)、索引系統函數,實現關閉DEP、獲取控制權等。

  常見的未開啟ASLR保護的模塊有Java 6運行環境JRE1.6的msvcr71.dll, office 2007/2010的HXDS.DLL。HXDS.DLL會在瀏覽器加載一個帶有“ms-help://”的URL時被加載進內存,但是微軟已經通過補丁修補了這個問題,現在的HSDS.DLL已經開啟了ASLR保護。而Java 7運行環境JRE 1.7也已經全部開啟了ASLR保護。

  隨着越來越多的應用程序及其模塊使用ASLR保護,今后使用這種利用方法通用性將越來越低。

 

3.2. 修改BSTR的長度或終止符

3.2.1. BSTR

  BSTR是一種字符串數據類型,一種Pascal-Style字符串(明確標示字符串長度)和C-Style字符串(以\0結尾)的混合物,主要應用於COM、交互功能等。它是一種復合的數據類型,由一個長度前綴,數據字符串和一個終止符組成,如下圖所示:

 

Figure 3‑1

  其中數據字符串string為UNICODE編碼,但是也可以存儲其他非\x00\x00的字符串。

3.2.2. 利用方法

  這種利用方法首次出現是在Pwn2own 2010上,它只適用於那些可以重寫內存的特殊類型的漏洞,例如緩沖區溢出、任意地址寫、增加或減少內存指針處的內容。

  1. 修改BSTR的長度

  當某個內存破壞漏洞可以滿足修改任意4字節內存的最終效果時,便可以利用它來修改指定位置處的BSTR的長度前綴,從而使得此BSTR可以訪問它原始界限以外的內存。由此最終可以獲取適合構造ROP鏈的鏈接庫的精確位置,從而實現了繞過ASLR。當通過此方法繞過ASLR后,便可通過同樣的內存破壞漏洞改變執行流程獲取控制權。

  例如下面的一個情形,首先在內存中連續創建一定數量且大小相同的BSTR,它們在內存中的布局如Figure 3‑2所示。

 

Figure 3‑2

 

   釋放其中的一個BSTR,然后立刻申請相同大小的一個object,相同大小是指object最終在內存中所占用的大小與BSTR在內存中占用的大小一致。由於前端堆Low Fragmentation Heap的作用,申請的object很可能會被分配到剛剛釋放的BSTR內存空間上。因此此時的內存布局如圖所示。

 

Figure 3‑3

 

  此時修改Object前面BSTR的長度,就可以通過越界讀,讀取到object對象的虛函數表指針,最終計算出相關模塊的內存基址。

  2. 修改BSTR的終止符

  很多時候內存破壞類漏洞可控程度並不高,不足以修改4字節(不能用來修改BSTR的長度),只能對內存指針處的1、2字節進行修改。在這種情況下我們可以通過修改BSTR的終止符,從而將string與后面的object連接起來。隨后訪問修改后的BSTR,object也會作為BSTR的一部分被訪問到,攻擊者便可以計算出相關模塊的基址。

 

3.3. 修改Array對象長度

3.3.1. 利用方法

  這種修改Array對象長度的利用方法與修改BSTR長度的利用方法類似,同樣需要那些可以重寫內存的內存破壞類型的漏洞。但是從攻擊者的角度來看,可以通過這種利用方法實現繞過ASLR的漏洞更具用戶友好性,因為一旦Array對象的長度被修改,攻擊者就可以通過數組獲取任意內存讀寫的能力,同時更容易控制程序的執行流程,實現代碼執行。下面通過VUPEN在Pwn2Own2013上利用的CVE-2013-2551漏洞為例,描述此方法的利用原理。

  這個漏洞是由於負責VML解析的模塊VGX.DLL,在處理<v:stroke>標簽的dashstyle.array.length屬性時,沒有對傳入的參數進行完備驗證而導致的整數溢出漏洞。攻擊者利用這個漏洞能夠對任意地址進行讀寫操作——通過讀取敏感內存信息、改寫對象虛表,就能夠完美繞過重重內存防護機制實現任意代碼執行。

  首先說明一下,VML中使用JS語句對dashstyle屬性賦值時,例如:stroke.dashstyle = "1 2 3 4",函數vgx!ParseDashStyle會被調用,將控制流轉向_MsoFCreateArray函數來創建一個ORG數組。在_MsoFCreateArray中調用_MsoFInitPx函數根據數組成員個數來、進行內存分配,每個數組成員占四字節內存,所以ORG數組的緩沖區大小為數組成員個數×4(byte)。在對dashstyle.array.length屬性賦值時,數組成員的個數會改變,在其內部調用的vgx!COALineDashStyleArray::put_length函數中會根據新設置的值來重新為ORG數組成會根據新設置的值來重新為ORG數組成分配內存。然而在put_length中存在一個整數溢出漏洞,使得可以不通過新的內存分配而將dashstyle的Array對象長度設置為0xffff。此漏洞的利用原理如下。

  在堆上分配連續的 COARuntimeStyle對象,每個對象占用0xB0字節,並在中間通過設置dashstyle穿插進一個ORG數組。控制數組的大小,使其也為0xB0字節。此時內存布局如圖所示。

 

Figure 3‑4

 

  利用漏洞修改dashstyle的長度,使得可以通過ORG數組越界訪問隨后的數據。 ORG數組的長度被修改后,循環給每個 COARuntimeStyle的marginLeft屬性賦值,在循環中同時利用已經溢出的ORG 數組去讀取指定偏移處的值(即讀取ORG 數組隨后 COARuntimeStyle對象保存marginLeft屬性的地址),如果其值大於0,說明此時索引到ORG 數組之后的那個 COARuntimeStyle對象。此時利用ORG 數組越界寫 COARuntimeStyle對象中保存marginLeft屬性的地址的值,修改其為0x7ffe0300。越界寫完成后,通過 COARuntimeStyle對象的get_marginLeft來讀取marginLeft屬性。於是 COARuntimeStyle就會將0x7ffe0300處的值讀取出來,而0x7ffe0300處正好保存着系統調用入口函數ntdll!KiFastSystemCall的地址,通過計算便可得到ntdll的內存基址,由此便繞過了ASLR。

  此處也可以通過ORG數組越界讀隨后COARuntimeStyle對象的前4字節(虛函數表指針),最終減去相應偏移即可得到當前vgx.dll的內存基址。

  (注:Win7+IE8/IE10下的CVE-2013-2551漏洞利用原理及代碼請關注ISCC2014結束后我發表的博文。)

 

4. 繞過DEP

  DEP技術在XP SP3被引入,但僅依靠GS & DEP & SafeSEH技術仍不足以阻止所有的惡意代碼。第2節中已經簡要介紹了常見的兩類Bypass DEP技術。目前0day漏洞利用中常采用代碼重用的方法實現對DEP的繞過,包括利用系統API改寫內存頁屬性、調用執行系統命令或加載可執行文件(EXE、DLL等)從進程空間外引入代碼、改寫安全配置(例如IE瀏覽器的SafeMode標志位[5]等)。

  其中,利用系統API改寫內存頁屬性和加載可執行文件(EXE、DLL等)從進程空間外引入代碼是最為常見的利用方法,其核心是ROP技術。它將堆棧切換到攻擊者偽造的堆棧上,利用精巧構造的堆棧實現DEP的繞過。下面將主要說明ROP的技術原理。(注:TK提出的LdrHotPatchRoutine技術等方法不需要使用ROP)

 

4.1. ROP技術

  ROP的全稱為Return Oriented Programming,它是目前最常用的繞過DEP的技術。它利用了攻擊者可以控制程序執行時的數據這樣一個事實,攻擊者向進程內存空間中注入一個偽造的調用堆棧,然后執行一個stack pivot(堆棧反轉)指令,使得堆棧指針轉換到偽造的調用堆棧上,偽造的堆棧可以被認為是記錄着因果鏈(ROP chain,由一個個ROP Gadget組成,下文具體解釋)。

  在正常情況下,當一個函數返回時,正常的堆棧中保存着函數的返回地址,即父函數調用子函數時的下一條指令的地址。然而當堆棧指針轉換到偽造的調用堆棧后,當函數返回時將從偽造堆棧中獲取返回地址,此時的返回地址是指向進程空間中的一個ROP Gadget。

  ROP Gadget代表進程空間中任何有用的可執行指令串(位於可執行頁面上),並且這些可執行指令串都以 ret指令結尾,從而使得指令串執行完畢后仍然從偽造的堆棧中獲取返回地址(下一個ROP Gadget的地址)。 要保證目標程序每次運行時,偽造堆棧中ROP Gadgets的地址都是可預期且可靠的,攻擊者必須先繞過ASLR,獲取相關模塊的內存基址,然后根據指令偏移(硬編碼,每個模塊中的指令偏移固定不變)得到確定的ROP Gadget地址,或者通過動態搜索的方法在內存空間中搜索ROP Gadget構建ROP chain。

  在偽造堆棧上構造一系列ROP Gadget的目的就是針對要利用的漏洞布置“有用”的環境(例如調整堆棧指針、設置寄存器值等),因為最后一個ROP Gadget將指向VirtualAlloc、VirtualProtect、WriteProcessMemory、ShellExecueEx、LoadLibrary等函數的地址,它們將用於修改指定內存頁為可執行或者從進程空間外引入代碼並執行。最終使得堆棧、堆上的數據變成可執行或直接加載運行可執行文件,從而繞過DEP的保護。

  ROP利用方法之所以能夠工作是因為攻擊者欺騙系統使用攻擊者可控的數據,而這些數據也並不需要得到執行權限,攻擊者只需要控制EIP接下來執行的地址從而執行需要的指令和函數。當偽造的堆棧被注入進程空間后(通過Heap spray[4]在指定地址處布局shellcode、通過漏洞獲取shellcode的地址),ROP方法的執行流程[6]簡單總結如下:

  1)  執行“stack pivot”指令(例如xchg eax, esp; ret等),將堆棧指針轉換到偽造堆棧上。

  2)  從偽造堆棧的頂部開始執行ROP Gadget

    a) 執行一些“有用”的指令串(push/pop/add/sub…)

    b) 執行ret指令(如果偽造堆棧上的返回地址處仍然是一個ROP Gadget,則繼續跳轉至執行;如果返回地址是一個函數地址如VirtualProtect等,則利用偽造堆棧上布置            好的參數執行函數。執行完畢后即可跳轉至偽造堆棧上設置好的返回地址,運行payload)

 

5. 通用繞過方法

  已經有研究者公布出了更具通用性的繞過ASLR、DEP的方法,例如Dion Blazakis提出的JIT spray(Just In Time Compilation),於暘(tombkeeper)發現的LdrHotPatchRoutine等。但是研究者也發現,在自然環境下,從來沒有0day攻擊使用這些方法對抗ASLR,原因是這些方法公開以后,就很快會被修補掉。下面簡單介紹一下其實現原理,技術細節請參考其他技術文檔。

5.1. JIT spray技術

  JIT Spray 是一種利用“及時編譯”的特性來繞過ASLR、DEP的利用方法。一個“及時編譯器”根據定義生成代碼作為它的數據。因此它的目的就是生成可執行數據。JIT編譯器是一種不能運行在“no-executable-data”環境下的程序,因此,JIT編譯器會免除DEP。而JIT Spray攻擊就是用JIT編譯器“生成的代碼(利用代碼)”來進行堆噴射的一種攻擊方式。

5.2. LdrHotPatchRoutine 技術

  從Windows NT 4到Windows 8,SharedUserData的位置一直固定在地址0x7ffe0000,並且在x86下0x7ffe0300處也一直保存這KiFastSystemCall的地址。

而x64下7ffe0350則保存着LdrHotPatchRoutine的地址,在它內部會索引LdrLoadDll來加載外部的DLL,從而可以實現任意代碼的執行。

5.3. DVE技術

  DVE技術最早由yuange提出,其基本思想是利用腳本語言的先天優勢,即腳本語言是解釋執行的,代碼、shellcode都是數據。通過漏洞修改關鍵數據結構,最終實現作為腳本的shellcode的執行。關於DVE的技術細節請參見參考文獻[7]。

5.4. Undocuments

  相信還有其他未公開的通用方法,能夠像LdrHotPatchRoutine技術、JIT spray技術、DEV技術一樣不需要通過精心的內存布局,從而實現繞過ASLR、DEP。這些未公開的技術具有更高的價值。

 

6. 參考文獻

[1] Bypassing Browser Memory Protections-Setting back browser security by 10 years. Alexander Sotirov, Mark Dowd. 2008.

[2] The info leak era on software exploitation. Fermin J. Serna. 2012.

[3] ASLR Bypass Apocalypse in Recent Zero-Day Exploits. Xiaobo Chen. 2013.

[4] Heap Feng Shui in JavaScript. Alexander Sotirov. 2007

[5] ROP (Return Oriented Programming) . Neil Sikka. 2014.

[6] Subverting without EIP. MALLOCAT. 2014

[7] APT 高級漏洞利用技術. yuange. 2014

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM