幾天前開始,我寫了一個關於惡意軟體脫殼的工具和方法的系列文章,第一篇的連結在此。每個惡意軟體/加殼軟體都是不同的,有時不能用通用方法脫殼。但有時可以找到他們共有的特徵。比如,加殼軟體經常使用弱加密演算法,破解這些演算法是可能的。
本文中我會介紹一些基於非常簡單的加密學原理的方法,這些方法可以破解加殼軟體使用的弱加密演算法。雖然這些破解方法很簡單,但是對大量的惡意軟體家族和加殼軟體仍然很有效,可以自動的脫殼一些惡意軟體。
首先,我必須宣告這些方法不是新的,已經用了很久。這是一些有關的文章和工具:
《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 轉載請註明來自看雪社群