惡意軟體的脫殼方法(二):弱加密演算法

Editor發表於2017-11-02

惡意軟體的脫殼方法(二):弱加密演算法


幾天前開始,我寫了一個關於惡意軟體脫殼的工具和方法的系列文章,第一篇的連結在此。每個惡意軟體/加殼軟體都是不同的,有時不能用通用方法脫殼。但有時可以找到他們共有的特徵。比如,加殼軟體經常使用弱加密演算法,破解這些演算法是可能的。


本文中我會介紹一些基於非常簡單的加密學原理的方法,這些方法可以破解加殼軟體使用的弱加密演算法。雖然這些破解方法很簡單,但是對大量的惡意軟體家族和加殼軟體仍然很有效,可以自動的脫殼一些惡意軟體。


首先,我必須宣告這些方法不是新的,已經用了很久。這是一些有關的文章和工具:

《Principles and practice of x-raying》,最好的也是最早的相關文章,作者Peter Ferrie。

《XorSearch》,作者Didier Stevens。

《Decoding XOR shellcode without a Key》,作者Chris Jordan。

《UnXor》,作者Tomchop。

《Deobfuscating Embedded Malware using Probable-Plaintext Attacks》(KANDI工具),作者Christian Wressnegger, Frank Boldewin和 Konrad Rieck。


我用Python實現了一個工具(revealpe.py)進行破解。我將這些破解方法放在一個工具裡,並做了一些改進,特別是在惡意軟體的脫殼方面:

RevealPE


該工具可以破解基於XOR、ADD、ROL的演算法,8或32位金鑰(我認為這是在惡意軟體中最常見的),有或沒有金鑰增量。此外,它還可以破解維吉尼亞(vigenere)密碼,是否可以破解其他更復雜的加密演算法還有待發現。


使用

惡意軟體的脫殼方法(二):弱加密演算法


結果:

該指令碼在目標檔案上嘗試所有的破解方法,可以匹配不同的演算法和金鑰。它會為每種結果建立一個檔案,命名格式如下:

.___.

| decpe>

字尾名.dec表示用演算法和金鑰解密得到的檔案。字尾名.decpe表示找到的那些被解密並提取有效的PE檔案。

例如,一個惡意軟體f658526e1227c45415544063997b49c8,破解後可以得到下列結果:

f658526e1227c45415544063997b49c8.XOR1_1f60_88_ff.dec

f658526e1227c45415544063997b49c8.XOR1_1f60_88_ff.decpe

f658526e1227c45415544063997b49c8.XOR4_1f60_85868788_fbfbfbfc.dec

匹配位置為0x1f60。前兩條結果表示可以用xor_byte解密,金鑰初始值0x88,增量0xff。第三條結果表示用xor_dword解密,金鑰初始值0x85868788,增量0xfbfbfbfc,但是沒有生成.decpe檔案,所以該演算法和找到的金鑰只適用於給定的明文,而不適用於完整的PE檔案(或許這是對齊的問題,如果設定選項為不對齊,則會得到xor_dword演算法的正確金鑰)。


這裡是一個短視訊,展示了該工具的使用:

https://youtu.be/pRuyN64ZkAg


弱加密演算法的例項


這裡是一些可能被攻擊的弱加密演算法的例子。


XOR或ADD(不變金鑰)

P xor K = C  ->  K = C xor P

P add K = C  ->  K = C sub P

惡意軟體的脫殼方法(二):弱加密演算法

例如:

金鑰初始值:0x85,無增量。

惡意軟體的脫殼方法(二):弱加密演算法

XOR或ADD(自增金鑰,增量恆定)

Pi xor Ki = Ci  ->  Ki = Ci xor Pi  ->  K(i) - K(i-1) = Kinc

Pi add Ki = Ci  ->  Ki = Ci sub Pi  ->  K(i) - K(i-1) = Kinc

惡意軟體的脫殼方法(二):弱加密演算法

例如:

金鑰初始值:0x54,增量:0x92。

惡意軟體的脫殼方法(二):弱加密演算法

維吉尼亞之類的演算法


Ci = SUST_TABLE[ Pi ]

明文中有相同值的位置的索引,必須與密文中有相同值的位置的索引相一致,我們可以基於相同值之間的距離建立簽名,來確定給定的明文在密文中的位置。

例如:

惡意軟體的脫殼方法(二):弱加密演算法

一旦找到某個明文所對應的密文,就有可能重建一個區域性的替換表:(T -> 73),(i ->

A6),(s ->FC),(space ->

C5)等(除了PE頭部分,revealPE.py工具還會查詢其他有名的明文來完善替換表,比如通用的API名稱)。

除了構建一個區域性的替換表,revealPE.py工具會用暴力破解的方法,檢查常用的演算法是否與該重建的替換表相匹配(revealPE.py工具暴力破解這些演算法:xor-add-rol

, xor-rol-add, add-xor-rol, add-rol-xor, rol-xor-add,

rol-add-xor,用所有可能的金鑰)。


測試


我用一些exe檔案和pdf檔案做了一些測試:

Exe檔案:

93個exe檔案得到嵌入PE。

4453個exe檔案沒有得到嵌入PE。

Pdf檔案:

586個pdf檔案得到加密PE。

44536個pdf檔案沒有得到加密PE。

測試檔案是隨機選取的。可能其中的大多數不是加殼檔案,或者不包含任何加密PE。例如,revealPE.py沒有在4453個exe檔案中找到嵌入PE,但這不意味著對這些檔案破解失敗,因為可能這些檔案本身不包含嵌入PE。


為了更準確的測試,我需要一些確定包含加密PE的檔案,來精確測試revealPE到底可以解密多少PE。

測試檔案連結:exe檔案pdf檔案


本文由看雪翻譯小組 Green奇 編譯,來源@vallejocc  轉載請註明來自看雪社群

相關文章