情報背景
DRIDEX是自2014年起活動至今的著名惡意銀行木馬家族,通常以OFFICE檔案的方式進行檔案釣魚攻擊,0xCERT的研究人員將其描述為精于防御規避的資訊與憑據竊取惡意軟體,利用眾多C&C服務器令針對其的網路·封鎖無能為力,DRIDEX在其歷史行動中曾多次運用高級防御規避技術隱匿其惡意行為,其v4版本是第一個使用AtomBombing行程注入技術的惡意軟體,
【學習資料】
而本文中將對其近期樣本中利用向量化例外處理(VEH)機制混淆其API函式呼叫的手法進行分析研判,該手法對于動態靜態分析均有較好的對抗效果,

攻擊技術分析
亮點:利用VEH進行API呼叫混淆
關于向量化例外處理(VEH)
向量化例外處理(VEH)是結構化例外處理(SEH)的擴展,VEH的優先級先于SEH,且不依賴堆疊結構,而是以雙鏈表的形式保存在堆中,應用程式可通過AddVectoredContinueHandler函式注冊例外處理函式來監視和處理程式所有的例外,當程式執行程序中發生例外,該例外處理函式將被首先呼叫以處理例外,
PVOID AddVectoredContinueHandler(
ULONG First,
PVECTORED_EXCEPTION_HANDLER Handler
);
當例外處理函式捕獲到例外時,將會拿到型別為EXCEPTION_POINTERS的引數,其中的ContextRecord成員保存了觸發例外時的暫存器背景關系,并在例外處理完成后恢復,通過修改EIP/ESP等暫存器便可劫持程式執行流程,
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
插入代碼破壞動靜態分析
開始的流程比較中規中矩,利用哈希匹配動態決議API地址放入暫存器之后,將函式引數依次推入堆疊中,之后呼叫函式,

而DRIDEX獨居匠心之處則是未使用call指令直接呼叫函式,而是使用“int3+retn”的組合完成函式呼叫,這是一種一箭雙雕的反分析手段:通過插入int3斷點實作反除錯、利用retn指令破壞程式靜態函式分析,
正常執行流程下int3指令會觸發例外,進入到VEH處理函式中完成最終的跳轉,而當程式被動態除錯分析時,int3斷點例外會被除錯器捕獲并中斷,給程式分析帶來阻礙,分析者必須理解DRIDEX的反除錯意圖,對插入的指令進行恰當的處理,增加了動態分析的成本,
而插入的retn指令則會使ida等反編譯工具將retn地址視為函式的結尾,忽略剩余的函式執行流程(如下圖,對回傳值的檢查及后續跳轉被反編譯器忽略了),

精巧設計的VEH跳轉流程
DRIDEX通過動態決議獲取AddVectoredContinueHandler的地址之后,將sub_687D40注冊新的VEH例外處理函式,這意味著代碼段中被插入的int3指令被執行時,例外將被捕獲并交由該函式處理,

該例外處理函式會通過傳入的ExceptionRecord的傳入引數獲取例外型別,若是斷點導致的例外則將例外交由下一個例外處理函式,在接下來的例外處理程序中,DRIDEX讀取存盤于ContextRecord中的eax暫存器值(保存之前被決議的API地址),將其置于堆疊頂,并將EIP指向int3之后的retn指令,

當暫存器的篡改操作完成后,函式回傳EXCEPTION_CONTINUE_EXCUTION,使得程式以被修改的背景關系繼續執行,當retn執行被執行時,被決議的API函式地址從堆疊頂彈出并跳轉,完成一次隱蔽的API呼叫程序,

總結
DRIDEX在本次活動中利用向量化例外處理(VEH)對其呼叫API的行為進行了隱藏,在對抗動靜態分析方面起到了較好的效果,但其例外觸發與例外處理函式中的流程還較為簡單,導致研究者可通過撰寫patch腳本等方式對函式呼叫流程進行修改,復原其原始邏輯,
向量化例外處理的利用潛力遠不只如此,更加靈活地對其進行利用,可以在不修改程式代碼段的前提下對整個程式的執行流程進行篡改,實作更加復雜的反除錯反分析技巧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353277.html
標籤:其他
