自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對CFG漏洞緩解機制的分析研究

安全
控制流保護(CFG)是Windows的一種安全機制,其目的是通過檢查間接調(diào)用的目標地址是否是有效的函數(shù)來減輕執(zhí)行流的 重定向,我們可以用這個例子作分析。

 控制流保護(CFG)是Windows的一種安全機制,其目的是通過檢查間接調(diào)用的目標地址是否是有效的函數(shù)來減輕執(zhí)行流的重定向,我們可以用這個例子作分析。

0x01 CFG是怎樣工作的

通過這個例子,我們用MSVC編譯器編譯一個exe文件,看看在調(diào)用main()之前生成和執(zhí)行了什么代碼:

  1. call __scrt_get_dyn_tls_init_callback 
  2. mov esi, eax 
  3. ... 
  4. mov esi, [esi] 
  5. mov ecx, esi 
  6. call ds:__guard_check_icall_fptr 
  7. call esi 

函數(shù) scrt_get_dyn_tls_init_callback得到一個指向TLS回調(diào)表的指針,以調(diào)用第一個條目,回調(diào)的函數(shù)受到CFG的保護,因此編譯器在執(zhí)行ESI中的目標地址之前添加代碼以檢查函數(shù)地址是否有效。

隨后執(zhí)行:

  1. __guard_check_icall_fptr dd offset _guard_check_icall_nop 
  2. _guard_check_icall_nop proc near 
  3.  retn 
  4. _guard_check_icall_nop endp 

retn可以繞過,為什么? 這樣程序就可以在不支持CFG的舊操作系統(tǒng)版本中運行 。 在支持它的系統(tǒng)中 ,

_guard_check_icall_nop地址會被NT DLL中的Ldrp驗證用戶調(diào)用目標替換:

  1. ntdll!LdrpValidateUserCallTarget: 
  2. mov edx,[ntdll!LdrSystemDllInitBlock+0xb0 (76fb82e8)] 
  3. mov eax,ecx 
  4. shr eax,8 
  5. ntdll!LdrpValidateUserCallTargetBitMapCheck: 
  6. mov edx,[edx+eax*4] 
  7. mov eax,ecx 
  8. shr eax,3 

0x02 Bitmap簡介

對于CFG,他們在Load Config目錄中的PE中添加了一堆新字段 : Guard CF Check 函 數(shù) 指 針 , 該 指 針 指 向guard_check_icall_ptr,是要替換的函數(shù)地址和Guard CF函數(shù)表, 該表包含所有要設(shè)置為有效目標的函數(shù)的RVA,在加載PE時創(chuàng)建的Bitmap中。

驗證用戶調(diào)用目標的Ldrp從該第一指令中的LdrSystemDllInit塊+0xb0獲取Bitmap的地址。 Bitmap包含整個過程中每16個字節(jié)的“狀態(tài)”, 當加載PE時,表中的RVAs被轉(zhuǎn)換為偏移量, 然后相應(yīng)地設(shè)置該偏移量處的狀態(tài)。

0x03 傳送 Bitmap

我的想法是使用Guard CFFunction表填充具有選定狀態(tài)的Bitmap,并在其中重新生成我們的代碼,然后在入口點將其復(fù)制到Bitmap中并執(zhí)行它。 由于 Alex Ionescu 在WindowsInternals中的研究,我能夠找出一些以前的文檔:

假設(shè)我們代碼中的第一個字節(jié)是0x10(010000b),我們從Bitmap傳輸代碼的區(qū)域從0x402000(RVA:0x2000)開始,為了清晰起見,我們將使用相同的區(qū)域來處理假RVA。 要生成 0x10,我們只需要表中的1個條目:0x2020,跳過前32個字節(jié),使狀態(tài)設(shè)置為0000b,0x2020將下一個狀態(tài)設(shè)置為 01b,Bitmap變?yōu)?10000b?,F(xiàn)在要得到狀態(tài)11b,假設(shè)我們想要字節(jié)0x1D(011101b), 我們使用未對齊的RVA,表將變成:0x2000(設(shè)置為01b), 0x2012(設(shè)置為11b),0x2020(設(shè)置為01b)。

要獲得10b,我們需要使用帶有元數(shù)據(jù)的特殊類型的 RVA,但很簡單,我們將一個字節(jié)附加到用于生成10b的 RVA 中 。

元數(shù)據(jù)是一個標 志: IMAGE_GUARD_FLAG_FID_SUPPRESSED (1) 或

IMAGE_GUARD_FLAG_EXPORT_SUPPRESSED(2)。 所以我們說要生成0x86(10000110b),使用:0x2000與0x2(設(shè)置為10b),0x2010(設(shè)置為01b),0x2030與0x2(設(shè)置為10b)。

0x04 Bitmap 轉(zhuǎn)換

  1. mov esi, 0DEADh ;GuardCFCheckFunctionPointer points here 
  2.  mov esi, [esi + 2] ;get LdrSystemDllInitBlock+0xb0 address 
  3.  mov esi, [esi] ;get the Bitmap address 
  4.  mov eax, [ebx + 8] ;ebx=fs:[30h] at start time 
  5.  lea edi, [eax + xxxxxxxx] ;imagebase + buffer rva 
  6.  add ah, 20h ;imagebase + 0x2000 
  7.  shr eax, 8 ;shift-right 8 bits to make the offset 
  8.  lea esi, [esi + eax*4] ;esi=our code in the Bitmap 
  9.  mov ecx, xxxxxxxx ;size of code 
  10.  rep movsb 

我們讓加載程序?qū)?DEADH替換為LDRP驗證用戶調(diào)用目標的地址,從中可以得到Bitmap的地址, 我們計算Bitmap(0x402000)中區(qū)域的偏移量,并從它復(fù)制再生代碼。

0x05 分析總結(jié)

那么,當檢測到無效地址時會發(fā)生什么呢? 程序被終止了。 因為大多數(shù)改變PE文件的工具或代碼不支持CFG:更改以在其他地方執(zhí)行代碼的任何地址,都必須在表中。 這會殺死許多病毒改變?nèi)肟邳c地址,或使用入口點Fuzzing(EPO)技術(shù)的效果。 但是,如果在PE中禁用CFG,可以用自己的地址替換Guard CF Check函數(shù)指針,以獲得EPO。

本文翻譯自:https://github.com/86hh/PagedOut2/blob/master/CFGTeleport.pdf如若轉(zhuǎn)載,請注明原文地址:

 

 

責(zé)任編輯:姜華 來源: 嘶吼網(wǎng)
相關(guān)推薦

2020-12-02 13:28:56

勒索軟件漏洞網(wǎng)絡(luò)攻擊

2010-03-16 14:35:53

思科交換機模塊

2010-01-28 15:09:36

C++資源管理

2009-12-24 15:51:34

ADO屬性

2010-03-03 16:51:13

Android版本

2011-07-06 15:56:57

BI

2020-12-18 09:49:48

iOS ChromiWKWebViewJavaScript

2009-12-31 11:02:48

ADO類

2009-12-30 16:58:43

ADO.NET

2013-04-09 16:42:55

2015-07-08 10:37:12

MySQL高可用架構(gòu)業(yè)務(wù)架構(gòu)

2017-01-20 14:49:46

2017-02-20 09:46:59

2009-06-18 14:51:12

Hibernate緩存Hibernate

2021-02-07 00:09:35

數(shù)據(jù)泄漏漏洞網(wǎng)絡(luò)攻擊

2018-03-21 15:21:52

互聯(lián)網(wǎng)研究平臺

2020-10-14 09:44:52

漏洞

2024-01-12 10:29:26

2015-01-15 09:38:30

2020-10-16 09:42:22

漏洞
點贊
收藏

51CTO技術(shù)棧公眾號