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

靜態(tài)逆向工程Shellcode技術(上)

安全
本文介紹的是分析惡意軟件的逆向技術,而不是介紹惡意軟件的“工作原理”類型的帖子,因此在本文中,我決定專注于研究與惡意軟件緊密相關的概念,例如shellcode、加密算法等。 而不是惡意軟件本身,例如Dridex。本文我使用的是Metasploit,使用它來生成了一些shellcode。

Metasploit是一款開源的安全漏洞檢測工具,可以幫助安全和IT專業(yè)人士識別安全性問題,驗證漏洞的緩解措施,并管理專家驅(qū)動的安全性進行評估,提供真正的安全風險情報。這些功能包括智能開發(fā),代碼審計,Web應用程序掃描,社會工程。團隊合作,在Metasploit和綜合報告提出了他們的發(fā)現(xiàn)。

本文研究的惡意樣本的MD5哈希:9d7e34250477acf632c6c32fc2c50d3b。

Shllcode分析第1階段:靜態(tài)分析

首先,你要在你選擇的反匯編程序中打開shellcode ,我個人更喜歡IDA Pro,但是我不會使用偽代碼功能,而是將重點放在反匯編視圖上,因此這應該適用于你選擇的任何工具。通過IDA Pro,你可以選擇如何加載二進制數(shù)據(jù)(16位、32位或64位),因此,我將首先選擇32位,如果反匯編有任何錯誤,我們可以對其進行簡單地更改。加載二進制文件后,選擇第一個字節(jié)并按“ C”,這將嘗試將第一個字節(jié)轉(zhuǎn)換為代碼。因此,重新分析該文件,然后嘗試將其余字節(jié)反匯編為部件。如下所示,入口點從位置0x00開始,shellcode一直向上到達位置0x2A,此時IDA無法將剩余的字節(jié)轉(zhuǎn)換為程序集。

靜態(tài)逆向工程Shellcode技術(上)

僅基于這個事實,我們就可以假定這部分數(shù)據(jù)是以某種方式加密的,并且上面的shellcode解密并執(zhí)行它。因此,讓我們來看看第一個要運行的函數(shù)sub_0()。此函數(shù)僅負責跳轉(zhuǎn)到偏移量0x25,它將執(zhí)行sub_2(),我將其命名為main_func(),因為它包含了大部分代碼,因此,讓我們繼續(xù)研究該函數(shù)。

靜態(tài)逆向工程Shellcode技術(上)

因此,這個函數(shù)內(nèi)部的解密相當簡單,只是一個基本的XOR循環(huán),它將[edi]指向的XOR數(shù)據(jù)與[esi]指向的數(shù)據(jù)結(jié)合起來。在每一次XOR操作之后,edi(存儲器地址)都會增加,并且程序會將[esi:esi + 1]與0x550D進行比較。在本例中,IDA以Little-Endian顯示該值,,因此它被顯示為0x0D55。如果值匹配,它將跳到ecx指向的地址,否則它將增加esi,將它現(xiàn)在指向的數(shù)據(jù)與0x73進行比較,如果匹配,它將恢復原始地址(存儲在ebx中)。如果不匹配,它將循環(huán)回到XOR代碼并繼續(xù)。

靜態(tài)逆向工程Shellcode技術(上)

基于以上分析,我們知道esi用作密鑰,而edi被用作加密的shellcode。我們還知道密鑰長度可以是任何長度,并且ebx將包含指向密鑰首字節(jié)的地址。

利用所有這些信息,讓我們首先嘗試找出加密數(shù)據(jù)的開始和停止位置。從XOR循環(huán)(loc_F)開始并向上移動。我們可以首先看到存儲在edi中的地址被移動到ecx中,這是有意義的,因為一旦解密完成,程序就會跳轉(zhuǎn)到ecx中的地址。

現(xiàn)在,我們找到edi從ebx處獲取加密代碼地址,在函數(shù)的最頂部,彈出堆棧頂部的值,并將其存儲在ebx中,然后將該值移到edi中,然后將0x73移動到eax的較低位,調(diào)用cld,然后輸入a scasb循環(huán)。問題是,當它彈出ebx時,堆棧的頂部是什么?

好了,簡單地看一下調(diào)試器中的堆棧,可以發(fā)現(xiàn),當調(diào)用一個函數(shù)時,堆棧頂部的值是要返回的地址,這是調(diào)用指令之后的指令地址。在下圖中,返回地址為0x013B1CAB,調(diào)用該函數(shù)的地址為0x013B1CA6(此處的調(diào)用指令占用5個字節(jié))。那么,這如何適用于我們的shellcode?

靜態(tài)逆向工程Shellcode技術(上)

上面我們說過,main_func是從位置0x25調(diào)用的。無法識別的數(shù)據(jù)從0x2A開始。位置0x25之后的5個字節(jié)可為調(diào)用指令騰出空間。因此,main_func()中位于堆棧頂部的數(shù)據(jù)為值0x2A?,F(xiàn)在,我們終于知道了加密數(shù)據(jù)的起始位置!

靜態(tài)逆向工程Shellcode技術(上)

不過不要高興得太早,還記得0x73移入al后如何調(diào)用cld嗎? cld指令負責刪除(設置為0)EFLAGS寄存器中的DF(direction)標志。當此標志為0時,任何字符串操作都會根據(jù)操作中使用的寄存器來遞增索引寄存器,尤其是esi或edi。調(diào)用cld后,將進入一個循環(huán),該循環(huán)不斷執(zhí)行scasb,直到ZF(0)標志被設置(設置為1)。 scasb會做什么?它所做的只是將al中的字節(jié)與[edi]進行比較,并根據(jù)結(jié)果設置狀態(tài)標志。如果不匹配,則ZF將保持刪除狀態(tài),否則將被設置,并且程序會跳出循環(huán)。此外,由于scasb是字符串操作,因此它將在每個循環(huán)后增加edi中的地址,這意味著直到[edi]等于0x73為止,程序?qū)⒂肋h不會執(zhí)行解密功能?,F(xiàn)在我們知道,加密的數(shù)據(jù)從0x73開始,密鑰是從地址0x2A一直到[address] = 0x73的數(shù)據(jù)。如上圖所示,0x73是ebx指向的數(shù)據(jù)中的第二個字節(jié)。因此,XOR密鑰為0x06,加密的數(shù)據(jù)從0x2B開始!向下滾動到函數(shù)的最后,我們可以找到字節(jié)0x550D,這意味著加密的數(shù)據(jù)長401個字節(jié)!

了解了所有內(nèi)容之后,讓我們進入解密階段!

Shllcode分析第2階段:解密

靜態(tài)逆向工程Shellcode技術(上)

因此,我們現(xiàn)在有了XOR密鑰:0x06,以及加密數(shù)據(jù)開始的位置:0x2B。有了這些知識,我們就可以輕松地用Python編寫一個基本的XOR解密函數(shù),該函數(shù)帶有2個參數(shù):密鑰和加密的數(shù)據(jù)。向函數(shù)添加一個簡單的檢查,以查看數(shù)據(jù)是否與0x550D匹配并且腳本是否已完成!

靜態(tài)逆向工程Shellcode技術(上)

但是,為了實際使用它,我們需要手動或使用YARA或Regex從IDA提取數(shù)據(jù)來定位它。然后我們必須在新的IDA會話中將其打開,并且在某些情況下第二個“階段”從第一階段開始調(diào)用函數(shù),可能是對另一部分數(shù)據(jù)進行XOR。幸運的是,我們可以將此基本腳本轉(zhuǎn)換為IDAPython格式,并用解密的Shellcode覆蓋加密的Shellcode!

不用擔心,遷移到IDAPython的過程非常簡單。首先,我們需要導入所需的庫idaapi,然后將for循環(huán)更改為while循環(huán),然后才能對傳入的數(shù)據(jù)調(diào)用len(),但是在這種情況下,我們不知道數(shù)據(jù)的長度如何,因為我們現(xiàn)在正在傳遞加密數(shù)據(jù)的地址。

除此之外,只要在address + i中仍有數(shù)據(jù),就可以使while循環(huán)連續(xù)循環(huán)。這可以通過使用Byte()函數(shù)來實現(xiàn),該函數(shù)從給定地址獲取一個字節(jié)的數(shù)據(jù)。在本文的示例中,該地址就是我們的加密blob?,F(xiàn)在,我們就可以將該數(shù)據(jù)字節(jié)分配給一個變量字節(jié),然后將其與0x55進行比較。我們還將address+(i+1)與0x0D進行比較,以確保這兩個標記都存在。

如果這些標記不存在,則使用給定的輸入執(zhí)行XOR字節(jié)操作,然后調(diào)用PatchByte(),它將用我們的變量byte在address+i處覆蓋字節(jié)。最后,將i增加1,循環(huán)繼續(xù)!

靜態(tài)逆向工程Shellcode技術(上)

將它導入IDA,并在命令行中輸入ida_xor_crypt(0x06, 0x2B),將執(zhí)行我們的函數(shù),覆蓋數(shù)據(jù),如下圖所示!它不再以0x73開頭,因為現(xiàn)在是0x75。

靜態(tài)逆向工程Shellcode技術(上)

將它導入IDA,并在命令行中輸入ida_xor_crypt(0x06, 0x2B),將執(zhí)行我們的函數(shù),覆蓋數(shù)據(jù),如下圖所示我們可以在選擇0x75的情況下再次按“ C”,然后將其完全分解。

本文翻譯自:https://0ffset.net/reverse-engineering/malware-analysis/common-shellcode-techniques/如若轉(zhuǎn)載,請注明原文地址

 

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

2016-01-05 15:20:02

Reverse逆向工具逆向工程

2011-03-24 09:57:28

PowerDesign逆向工程

2022-09-26 00:00:01

java代碼開發(fā)

2023-08-07 18:55:19

2016-01-14 11:50:16

Shellcode分析PyAnaShellcode分析

2015-09-09 09:38:40

脫殼手工脫殼軟件逆向

2021-04-02 06:18:27

Docker鏡像

2023-07-17 07:25:48

2015-06-30 13:06:00

ShellterShellcode注入

2024-03-04 07:30:00

Sora論文研究

2010-03-31 22:20:51

2010-09-30 09:40:45

2022-12-08 09:17:30

ChatGPT漏洞AI

2012-11-27 17:41:16

2015-03-03 14:10:53

shellcode哈夫曼編碼Huffy

2021-08-18 15:59:47

蘋果工具系統(tǒng)

2012-05-18 09:54:05

2021-08-16 11:47:36

Asahi Linux開發(fā)者Apple M1

2022-05-06 18:55:29

Java技巧Shellcode

2013-12-10 10:53:47

shellcode
點贊
收藏

51CTO技術棧公眾號