2013年12月26日 星期四

windows溢出保護原理與繞過方法概覽

標題:windows溢出保護原理與繞過方法概覽
作者:riusksk(泉哥)
主頁:http://riusksk.blogbus.com
出處:http://bbs.pediy.com/showthread.php?p=879124#post879124
本文已發表於《黑客防線》

前言
從20世紀80年代開始,在國外就有人開始討論關於溢出的攻擊方式。但是在當時並沒有引起人們的注意,直至後來經一些研究人員的披露後,特別是著名黑客雜 志Phrack上面關於溢出的經典文章,引領許多人步入溢出研究的行列,從此關於緩衝區溢出的問題才為人們所重視。隨著溢出研究的深入,網上開始出現很多 關於溢出攻擊教程,揭露了許多溢出利用技術,特別是經典的call/jmp esp,借此溢出攻擊案例層出不窮。這也引起了微軟的重視,他們在 windows系統及VC++編譯器上加入了各種溢出保護機制,以試圖阻止這類攻擊,可惜每次公佈溢出保護機制之後,不久就有人公佈繞過方法。MS每次都 稱某保護機制將成為溢出利用的末日,可惜每次都被終結掉。既而,黑客與微軟之間的溢出鬥爭一直持續著。更多關於windows溢出的歷史,可參見由 Abysssec安全組織編寫的文章 《Past,Present,Future of Windows Exploitation》(http://www.abysssec.com /blog/2010/05/past-present-future-of -windows-exploitation/)。在本篇文章中主要揭露了 windows平台上的各種溢出保護機制原理以及繞過方法,具體內容參見下文。

一、GS編譯選項

原理:通過VC++編譯器在函數前後新增額外的處理代碼,前部分用於由偽隨機數生成的cookie並放入.data節段,當本地變數初始化,就會向棧中插入cookie,它位於局部變數和返回地址之間:

    ┌════════┐記憶體低地址
    │   局部變數     │▲
    ├════════┤│
    │security_cookie ││
    ├════════┤│棧
    │  入棧暫存器    ││生
    ├════════┤│長                      
    │     SEH節點    ││方
    ├════════┤│向
    │    返回地址    ││
    ├════════┤│
    │    函數參數    ││
    └════════┘記憶體高地址

經GS編譯後棧中局部變數空間分配情況:

sub   esp,24h
mov   eax,dword ptr [___security_cookie (408040h)]
xor   eax,dword ptr [esp+24h]
mov   dword ptr [esp+20h],eax

在函數尾部的額外代碼用於在函數返回時,調用security_check_cookie()函數,以判斷cookie是否被更改過,當函數返回時的情況如下:

mov   ecx,dword ptr [esp+20h]
xor   ecx,dword ptr [esp+24h]
add   esp,24h
jmp   __security_check_cookie (4010B2h)

在緩衝區溢出利用時,如果將惡意代碼從局部變數覆蓋到返回地址,那麼自然就會覆寫cookie,當檢測到與原始cookie不同時(也就是比較上面408040h與4010B2h兩處cookie值的比較),就會觸發異常,最後終止行程。

繞過方法:

1.猜測/計算cookie
Reducing the Effective Entropy of GS Cookies:http://www.uninformed.org/?v=7&a=2&t=html
至從覆蓋SEH的方法出現後,這種方法目前已基本不用了,它沒有後面的方法來得簡便。

2.覆蓋SEH
由於當security_check_cookie()函數檢測到cookie被更改後,會檢查是否安裝了安全處理例程,也就是SEH節點中保存的指標, 如果沒有,那麼由系統的異常處理器接管,因此我們可以通過(pop pop ret)覆蓋SEH來達到溢出的目的。但對於受SafeSEH保護的模組,就 可能會導致exploit失效,關於它的繞過在後續部分再述。
輔助工具:OD插件safeSEH、pattern_create、pattern_offset、msfpescan、memdump

3.覆蓋虛表指標
堆疊佈局:[局部變數][cookie][入棧暫存器][返回地址][參數][虛表指標]
當把虛表指標覆蓋後,由於要執行虛函數得通過虛表指標來搜索,即可借此劫持eip。

二、SafeSEH

原理:為了防止SEH節點被攻擊者惡意利用,微軟在.net編譯器中加入/sdeseh編譯選項引入SafeSEH技術。編譯器在編譯時將PE文件所有合 法的異常處理例程的地址解析出來製成一張表,放在PE文件的數據塊(LQAJ)一C0N—FIG)中,並使用shareuser記憶體中的一個隨機數加密, 用於匹配檢查。如果該PE文件不支持safesEH,則表的地址為0。當PE文件被系統加載後,表中的內容被加密保存到ntdl1.dll模組的某個數據 區。在PE文件運行期間,如果發生異常需要調用異常處理例程,系統會逐個檢查該例程在表中是否有記錄:如果沒有則說明該例程非法,進而不執行該異常例程。

繞過方法

利用SafeSEH保護模組之外的地址
對於目前的大部分windows操作系統,其系統模組都受SafeSEH保護,可以選用未開啟SafeSEH保護的模組來利用,比如漏洞軟體本身自帶的 dll文件,這個可以借助OD插件SafeSEH來查看行程中各模組是否開啟SafeSEH保護。除此之外,也可通過直接覆蓋返回地址 (jmp/call esp)來利用。另一種方法,如果esp +8 指向EXCEPTION_REGISTRATION 結構,那麼你仍然可以尋找一個 pop/pop/ret指令組合(在加載模組的地址範圍之外的空間),也可以正常工作。但如果你在程序的加載模組中找不到pop/pop/ret 指令, 你可以觀察下esp/ebp,查看下這些暫存器距離nseh 的偏移,接下來就是查找這樣的指令:

call dword ptr[esp+nn] / jmp dword ptr[esp+nn]
call dword ptr[ebp+nn] / jmp dword ptr[ebp+nn]
call dword ptr[ebp-nn] / jmp dword ptr[ebp-nn]
(其中的nn 就是暫存器的值到nseh 的偏移,偏移nn可能是: esp+8, esp+14, esp+1c, esp+2c, esp+44, esp+50, ebp+0c, ebp+24, ebp+30, ebp-04, ebp-0c, ebp-18)。

如果遇到以上指令是以NULL字節結尾的,可將shellcode放置在SEH之前:
‧ 在nseh 上放置向後的跳轉指令(跳轉7 字節:jmp 0xfffffff9);
‧ 向後跳轉足夠長的地址以存放shellcode,並借此執行至shellcode;
‧ 把shellcode 放在用於覆蓋異常處理結構的指令地址之前。

三、DEP

原理:數據執行保護 (DEP) 是一套軟硬體技術,能夠在記憶體上執行額外檢查以防止在不可運行的記憶體區域上執行代碼。 在 Microsoft Windows XP Service Pack 2、 Microsoft Windows Server 2003 Service Pack 1 、 Microsoft Windows XP Tablet PC Edition 2005 、 Microsoft Windows Vista 和 windows 7 中,由硬體和軟體一起強制實施 DEP。DEP 有兩種模式,如果CPU 支 持記憶體頁NX 屬性, 就是硬體支持的DEP。只有當處理器/系統支持NX/XD位(禁止執行)時,windows才能擁有硬體DEP,否則只能支持軟體 DEP,相當於只有SafeSEH保護。

繞過方法:

1.ret2lib
其思路為:將返回地址指向lib庫中的代碼,而不直接跳轉到shellcode 去執行,進而實現惡意代碼的運行。可以在庫中找到一段執行系統命令的代 碼,比如system()函數,用它的地址覆蓋返回地址,此時即使NX/XD 禁止在堆疊上執行代碼,但庫中的代碼依然是可以執行的。函數 system()可通過運行環境來執行其它程序,例如啟動Shell等等。另外,還可以通過VirtualProtect函數來修改惡意代碼所在記憶體頁面 的執行權限,然後再將控制轉移到惡意代碼,其堆疊佈局如下所示:
┌════════════┬═════════════════┐      
│                        │            惡意代碼              │記憶體高地址
│                        ├═════════════════┤│
│                        │        lpflOldProtect            ││
│                        ├═════════════════┤│
│                        │          flNewProtect            ││棧
│       調用參數         ├═════════════════┤│
│                        │             dwSize               ││生
│                        ├═════════════════┤│
│                        │            lpAddress             ││長
│                        ├═════════════════┤│
│                        │      惡意代碼的入口地址          ││方
├════════════┼═════════════════┤│
│      返回地址          │    VirtualProtect函數地址        ││向
├════════════┼═════════════════┤│
│ EBP上層函數堆疊基址    │                                  ││
├════════════┤                                  ││
│ 異常例程入口地址(若有 │     填充數據的覆蓋區域          ││
│設置的話,比如try…catch)│       (AAAAAAAA……)           ││
├════════════┤                                  │▼
│      局部變數          │                                  │記憶體低地址
└════════════┴═════════════════┘
更多訊息可參考資料:http://www.infosecwriters.com/text_resources/pdf/return-to-libc.pdf

2.利用TEB突破DEP
在之前的《黑客防線》中有篇文章《SP2下利用TEB執行ShellCode》,有興趣的讀者可以翻看黑防出版的《緩衝區溢出攻擊與防範專輯》,上面有這 篇文章。該作者在文中提到一種利用TEB(執行緒環境塊)來突破DEP的方法,不過它受系統版本限制,只能在XP sp2及其以下版本的windows系統 上使用,因為更高版本的系統,其TEB地址是不固定的,每次都是動態生成的。該方法的具體實現方法如下:
(1)將返回地址覆蓋成字符串複製函數的地址,比如lstrcpy,memcpy等等;
(2)在返回地址之後用目標記憶體地址和shellcode地址覆蓋,當執行複製操作時,就會將shellcode複製到目標記憶體地址,該目標記憶體地址位於TEB偏移0xC00的地方,它有520字節緩衝用於ANSI-to-Unicode函數的轉換;
(3)複製操作結束後返回到shellcode地址並執行它。
此時其堆疊佈局如下:
【shellcode】【save ebp】【lstrcpy】【TEB緩衝地址,用於複製結束後返回到shellcode】【TEB緩衝地址】【ShellCode地址】

3.關閉DEP
關於此方法最原始的資料應該是黑客雜誌《uninformed》上的文章《Bypassing Windows Hardware- enforced Data Execution Prevention》(http://www.uninformed.org/?v=2& a=4),另外也可以看下本人之前翻譯的《突破win2003 sp2中基於硬體的DEP》(http://bbs.pediy.com /showthread.php?t=99045),此方法的主要原理就是利用NtSetInformationProcess()函數來設置 KPROCESS 結構中的相關標誌位,進而關閉DEP,KPROCESS結構中相關標誌位情況如下:

0:000> dt nt!_KPROCESS -r
ntdll!_KPROCESS
. . .
+0x06b Flags       : _KEXECUTE_OPTIONS
  +0x000 ExecuteDisable     : Pos 0, 1 Bit
  +0x000 ExecuteEnable     : Pos 1, 1 Bit
  +0x000 DisableThunkEmulation   : Pos 2, 1 Bit
  +0x000 Permanent     : Pos 3, 1 Bit
  +0x000 ExecuteDispatchEnable   : Pos 4, 1 Bit
  +0x000 ImageDispatchEnable   : Pos 5, 1 Bit
  +0x000 Spare       : Pos 6, 2 Bits
 
當DEP 被啟用時,ExecuteDisable 被置位,當DEP 被禁用,ExecuteEnable 被置位,當Permanent 標誌置位時表示這些設置是最終設置,不可更改。代碼實現:

ULONG ExecuteFlags = MEM_EXECUTE_OPTION_ENABLE;
NtSetInformationProcess(
  NtCurrentProcess(),   // ProcessHandle = -1
  ProcessExecuteFlags,   // ProcessInformationClass = 0x22(ProcessExecuteFlags)
  &ExecuteFlags,     // ProcessInformation = 0x2(MEM_EXECUTE_OPTION_ENABLE)
  sizeof(ExecuteFlags));   // ProcessInformationLength = 0x4
   
具體實現思路(以我電腦上VirtualBox虛擬機下的xp sp3為例):
1.將al設置為1,比如指令mov al,1 / ret,然後用該指令地址覆蓋返回地址:

0:000> lmm ntdll
start    end        module name
7c920000 7c9b3000   ntdll      (pdb symbols)          c:\symbollocal\ntdll.pdb\1751003260CA42598C0FB326585000ED2\ntdll.pdb
0:000> s 7c920000 l 93000 b0 01 c2 04
7c9718ea  b0 01 c2 04 00 90 90 90-90 90 8b ff 55 8b ec 56  ............U..V
0:000> u 7c9718ea
ntdll!NtdllOkayToLockRoutine:
7c9718ea b001            mov     al,1
7c9718ec c20400          ret     4

由於上面的ret 4,因此要再向棧中填充4字節(比如0xffffffff)以抵消多彈出的4字節,如果選擇的指令剛好是ret則無須再多填充4字節。

2.跳轉到ntdll!LdrpCheckNXCompatibility中的部分代碼(從cmp al,1 開始,可通過windbg下的命令 uf ntdll!LdrpCheckNXCompatibility來查看其反彙編代碼),比如以下地址就需要用0x7c93cd24來覆寫堆疊上的第 二個地址:

ntdll!LdrpCheckNXCompatibility+0x13:
7c93cd24 3c01            cmp     al,1
7c93cd26 6a02            push    2
7c93cd28 5e              pop     esi
7c93cd29 0f84df290200    je      ntdll!LdrpCheckNXCompatibility+0x1a (7c95f70e)  ; 之前已將al置1,故此處實現跳轉

3.上面跳轉後來到這裡:

0:000> u 7c95f70e
ntdll!LdrpCheckNXCompatibility+0x1a:
7c95f70e 8975fc          mov     dword ptr [ebp-4],esi  ; [ebp-0x4]= esi = 2
7c95f711 e919d6fdff      jmp     ntdll!LdrpCheckNXCompatibility+0x1d (7c93cd2f)

4.上面跳轉後來到:

0:000> u 7c93cd2f
ntdll!LdrpCheckNXCompatibility+0x1d:
7c93cd2f 837dfc00        cmp     dword ptr [ebp-4],0
7c93cd33 0f85f89a0100    jne     ntdll!LdrpCheckNXCompatibility+0x4d (7c956831) ; 不相等再次實現跳轉

5.上面跳轉後來到:

0:000> u 7c956831
ntdll!LdrpCheckNXCompatibility+0x4d:
7c956831 6a04            push    4     ;ProcessInformationLength = 4
7c956833 8d45fc          lea     eax,[ebp-4]
7c956836 50              push    eax      ;ProcessInformation = 2(MEM_EXECUTE_OPTION_ENABLE)
7c956837 6a22            push    22h       ;ProcessInformationClass = 0x22(ProcessExecuteFlags)
7c956839 6aff            push    0FFFFFFFFh
7c95683b e84074fdff      call    ntdll!ZwSetInformationProcess (7c92dc80)
7c956840 e92865feff      jmp     ntdll!LdrpCheckNXCompatibility+0x5c (7c93cd6d)
7c956845 90              nop

在這裡調用函數ZwSetInformationProcess(),而其參數也剛好達到我們關閉DEP的各項要求.

6.最後跳轉到函數結尾:

0:000> u 7c93cd6d
ntdll!LdrpCheckNXCompatibility+0x5c:
7c93cd6d 5e              pop     esi
7c93cd6e c9              leave
7c93cd6f c20400          ret     4

最後的堆疊佈局應為:
【AAA……】【al=1地址】【0xffffffff】【LdrpCheckNXCompatibility指令地址】【0xffffffff】【"A" x 54】【call/jmp esp】【shellcode】
  ▲       ▲            ▲                       ▲                      ▲            ▲
填充數據  返回地址   抵消ret 4的4字節     指令cmp al,0x1 的起始地址      平衡堆疊   調整NX禁用後的堆疊

如果在禁用NX後,又需要讀取esi或ebp,但此時它們又被我們填充的數據覆蓋掉了,那麼我們可以使用諸如push esp/pop esi/ret或者push esp/pop ebp/ret這樣的指令來調整esi和ebp,以使關閉DEP後還能夠正常執行。
輔助工具:ImmDbg pycommand插件(!pvefindaddr depxpsp3  + !findantidep)

3.利用WPN與ROP技術
ROP(Return Oriented Programming):連續調用程序代碼本身的記憶體地址,以逐步地建立一連串欲執行的指令序列。
WPM(Write Process Memory):利用微軟在kernel32.dll中定義的函數比如:WriteProcess Memory函數可將數據寫入到指定行程的記憶體中。但整個記憶體區域必須是可訪問的,否則將操作失敗。
具體實現方法參見我之前翻譯的文章《利用WPN與ROP技術繞過DEP》:http://bbs.pediy.com/showthread.php?t=119300

4.利用SEH 繞過DEP
啟用DEP後,就不能使用pop pop ret地址了,而應採用pop reg/pop reg/pop esp/ret 指令的地址,指令 pop esp 可以改變堆疊指標,ret將執行流轉移到nseh 中的地址上(用關閉NX 例程的地址覆蓋nseh,用指向pop/pop /pop esp/ret 指令的指標覆蓋異常處理器)。
輔助工具:ImmDbg插件!pvefindaddr

四、ASLR

原理:ASLR(地址空間佈局隨機化)技術的主要功能是通過對系統關鍵地址的隨機化,防止攻擊者在堆疊溢出後利用固定的地址定位到惡意代碼並加以運行。它主要對以下四類地址進行隨機化:
(1)堆地址的隨機化;
(2)棧基址的隨機化;
(3)PE文件映像基址的隨機化;
(4)PEB(Process Environment Block,行程環境塊)地址的隨機化。
它在vista,windows 2008 server,windows7下是默認啟用的(IE7除外),非系統鏡像也可以通過鏈接選項 /DYNAMICBASE(Visual Studio 2005 SP1 以上的版本,VS2008 都支持)啟用這種保護,也可手動更改已編譯庫的 dynamicbase 位,使其支持ASLR 技術(把PE 頭中的DllCharacteristics 設置成0x40 -可以
使用工具PE EXPLORER 打開庫,查看DllCharacteristics 是否包含0x40 就可以知道是否支持ASLR 技術)。另外,也 可以使用Process Explorer來查看是否開啟ASLR。啟用ASLR後,即使你原先已經成功構造出exploit,但在系統重啟後,你在 exploit中使用的一些固定地址就會被改變,進而導致exploit失效。

繞過方法:

1.覆蓋部分返回地址
對比下windows7系統啟動前後OD中loaddll.exe的各模組基址,啟動前:

可執行模組
基址       大小       入口       名稱       文件版本          路徑
00400000   00060000   00410070   loaddll                      D:\riusksk\TOOL\Ollydbg\loaddll.exe
6DDE0000   0008C000   6DDE1FFF   AcLayers   6.1.7600.16385 (  C:\Windows\AppPatch\AcLayers.dll
710E0000   00012000   710E1200   mpr        6.1.7600.16385 (  C:\Windows\System32\mpr.dll
71C50000   00051000   71C79834   winspool   6.1.7600.16385 (  C:\Windows\System32\winspool.drv
747F0000   00017000   747F1C89   userenv    6.1.7600.16385 (  C:\Windows\System32\userenv.dll
750A0000   0001A000   750A2CCD   sspicli    6.1.7600.16385 (  C:\Windows\System32\sspicli.dll
750C0000   0004B000   750C2B6C   apphelp    6.1.7600.16385 (  C:\Windows\System32\apphelp.dll
75190000   0000B000   75191992   profapi    6.1.7600.16385 (  C:\Windows\System32\profapi.dll
75420000   0004A000   75427A9D   KERNELBA   6.1.7600.16385 (  C:\Windows\system32\KERNELBASE.dll
75B50000   0000A000   75B5136C   LPK        6.1.7600.16385 (  C:\Windows\system32\LPK.dll
75B60000   0004E000   75B6EC49   GDI32      6.1.7600.16385 (  C:\Windows\system32\GDI32.dll
……

啟動後:

可執行模組
基址       大小       入口       名稱       文件版本          路徑
00400000   00060000   00410070   loaddll                      D:\riusksk\TOOL\Ollydbg\loaddll.exe
6F510000   0008C000   6F511FFF   AcLayers   6.1.7600.16385 (  C:\Windows\AppPatch\AcLayers.dll
715B0000   00012000   715B1200   mpr        6.1.7600.16385 (  C:\Windows\System32\mpr.dll
72170000   00051000   72199834   winspool   6.1.7600.16385 (  C:\Windows\System32\winspool.drv
74C70000   00017000   74C71C89   userenv    6.1.7600.16385 (  C:\Windows\System32\userenv.dll
75520000   0001A000   75522CCD   sspicli    6.1.7600.16385 (  C:\Windows\System32\sspicli.dll
75540000   0004B000   75542B6C   apphelp    6.1.7600.16385 (  C:\Windows\System32\apphelp.dll
75610000   0000B000   75611992   profapi    6.1.7600.16385 (  C:\Windows\System32\profapi.dll
75690000   0004A000   75697A9D   KERNELBA   6.1.7600.16385 (  C:\Windows\system32\KERNELBASE.dll
759B0000   000CC000   759B168B   msctf      6.1.7600.16385 (  C:\Windows\System32\msctf.dll
75E60000   000AC000   75E6A472   msvcrt     7.0.7600.16385 (  C:\Windows\system32\msvcrt.dll
75F10000   0004E000   75F1EC49   GDI32      6.1.7600.16385 (  C:\Windows\system32\GDI32.dll
……

由此可見,各模組基址的高位是隨機變化的,而低位是固定不變的,這裡loaddll.exe不受ADSL保護,所以其基址沒有隨機化,如果是 Notepad.exe就有啟用ASLR,還有其它經鏈接選項/DYNAMICBASE編譯的程序也會啟用ASLR。因此我們可以讓填充字符只覆蓋到返回 地址的一半,由於小端法機器的緣故,其低位地址在前,因此覆蓋到的一半地址剛好處於低位,而返回地址的高位我們讓它保持不變,所以我們必須在返回地址之前 的地址範圍內(相當於漏洞函數所在的255字節空間地址)查找出一個可跳轉到shellcode的指令,比如jmp edx(關鍵看哪一暫存器指向 shellcode)。除此之外,我們還必須將shellcode放在返回地址之前,不然連返回地址的高位也覆蓋掉了,這是不允許的。縱觀此法,相當的有 局限性,如果漏洞函數過短,可能就沒有我們需要的指令了,這時就得另尋他法了。

2.利用未啟用ASLR的模組地址
這與之前繞過SafeSEH的方法類似,直接在未受ASLR保護的模組中查找跳轉指令的地址來覆蓋返回地址或者SEH結構,可以通過 Process Explorer或者ImmDbg命令插件!ASLRdynamicbase或者(!pvefindaddr noaslr):來查看哪 些行程模組啟用ASLR保護。

五、SEHOP

原理:微軟在Microsoft Windows 2008 SP0、Microsoft Windows Vista SP1和 Microsoft Windows 7中加入了另一種新的保護機制 SEHOP(Structured Exception Handling Overwrite Protection),它可作為SEH的擴展,用於檢 測SEH是否被覆寫。SEHOP的核心特性是用於檢測程序棧中的所有SEH結構鏈表的完整性,特別是對最後一個SHE結構的檢測。在最後一個SEH結構中 擁有一個特殊的異常處理函數指標,指向一個位於ntdll中的函數ntdll!FinalExceptHandler()。當我們用 jmp 06 pop pop ret 來覆蓋SEH結構後,由於SEH結構鏈表的完整性遭到破壞,SEHOP就能檢測到異常從而阻止shellcode 的運行

繞過方法:

偽造SEH鏈表
由於SEHOP會檢測SEH鏈表的完整性,那麼我們可以通過偽造SEH鏈表來替換原先的SEH鏈表,進而達到繞過的目的。具體實現方法:

(1)查看SEH鏈表結構,可借助OD實現,然後記住最後一個SEH結構地址,以方便後面的利用;
(2)用JE(0x74) + 最後一個SEH結構的地址(由於地址開頭是00,故可省略掉,可由0x74替代,共同實現4字節對齊)去覆蓋nexSEH;
(3)用xor pop pop ret指令地址去覆蓋SEH handle,其中的xor指令是用於將ZF置位,使前面的JE = JMP指令,進而實現跳轉;
(4)在這兩個SEH結構之前寫入一跳轉指令(JMP+8),以避免數據段被執行;
(5)在這兩個SEH結構之間全部用NOP填充,如果兩者之間還有其它SEH結構的話;
(6)將shellcode放置在最後一個SEH結構之後,即ntdll!FinalExceptHandler()函數之後。

此時的堆疊佈局如下:
【NOP…】【JMP 08】【JE XXXXXX】【xor pop pop ret】【NOP…】【JMP 08】【0xFFFFFFFF】【ntdll!FinalExceptHandler】【shellcode】
                        ▲              ▲                                  ▲                   ▲
           next SEH(指向0xffffffff)  SEH Handle                          next SEH           SEH Handle

更多訊息可參見我之前翻譯的《繞過SEHOP安全機制》:http://bbs.pediy.com/showthread.php?t=104707

結論
本文簡單地敘述了windows平台上的各類溢出保護機制及其繞過方法,但若結合實例分析的話,沒有幾萬字是不可能完成的,因此這裡概覽一番,讀者若想獲 得相關的實例運用的資料,可參考文中提及一些paper,特別是由看雪論壇上dge兄弟翻譯的《Exploit編寫系列教程6》以及黑客雜誌 《Phrack》、《Uninformed》上的相關論文。微軟與黑客之間的鬥爭是永無休止的,我們期待著下一項安全機制的出現……

沒有留言:

張貼留言