写在前边
二
恶意软件加密
恶意软件的作者经常会使用简单的编码技术,因为这已足以掩盖数据。但有时,攻击者也会使用加密技术。为了识别二进制文件中加密功能的使用,我们可以寻找加密指标(签名),如:
-
引用加密功能的字符串或导入表
-
加密的常量
-
加密程序使用的独特指令序列
01
使用Signsrch识别加密货币签名
搜索文件或进程中的加密签名的一个有用工具是Signsrch。
网址:http://aluigi.altervista.org/mytoolz.html
*左右滑动查看更多
该工具依靠密码学签名来检测加密算法。加密签名位于一个文本文件中,即signsrch.sig。在下面的输出中,当signsrch以-e选项运行时,它显示在二进制文件中检测到DES签名的相对虚拟地址。
C:signsrch>signsrch.exe -e kav.exe
Signsrch 0.2.4
by Luigi Auriemma
[email protected] :
web: aluigi.org
optimized search function by Andrew http://www.team5150.com/~andrew/
disassembler engine by Oleh Yuschuk
open file "kav.exe"
91712 bytes allocated
load signatures
open file C:signsrchsignsrch.sig
3075 signatures in the database
start 1 threads
start signatures scanning:
offset num description [bits.endian.size]
--------------------------------------------
00410438 1918 DES initial permutation IP [..64]
00410478 2330 DES_fp [..64]
004104b8 2331 DES_ei [..48]
004104e8 2332 DES_p32i [..32]
00410508 1920 DES permuted choice table (key) [..56] 00410540 1921 DES permuted choice key (table) [..48] 00410580 1922 DES S-boxes [..512]
[Removed]
*左右滑动查看更多
一旦知道了加密指标所在的地址,就可以用IDA导航到该地址。例如,如果想导航到地址00410438(DES的初始排列组合IP),在IDA中加载二进制文件并选择Jump|Jump to address(跳转|跳转到地址)(或G热键)并输入地址,如图所示。
一旦点击确定,你将到达包含指标的地址(在这种情况下,DES初始permutation IP,标记为DES_ip),如以下截图所示。
现在,要知道这个加密指标在代码中的使用位置和方式,你可以使用交叉引用(Xrefs-to)功能。使用交叉引用(Xrefs to)功能显示,DES_ip在地址为0x4032E0(loc_4032E0)的函数sub_4032B0中被引用。
现在,导航到地址0x4032E0可以直接进入DES加密函数,如下面的截图所示。一旦找到了加密函数,你可以使用交叉引用来进一步检查,以了解在什么情况下加密函数被调用以及用于加密数据的密钥。
与其使用-e选项来定位签名,然后手动浏览使用签名的代码,你可以使用-F选项,它将给你使用加密指标的第一条指令的地址。在下面的输出中,用-F选项运行signsrch直接显示了代码中使用加密指标DES初始排列IP(DES_ip)的地址0x4032E0。
C:signsrch>signsrch.exe -F kav.exe
[removed]
offset num description [bits.endian.size]
--------------------------------------------
[removed]
004032e0 1918 DES initial permutation IP [..64]
00403490 2330 DES_fp [..64]
*左右滑动查看更多
-e和-F选项显示相对于PE头中指定的首选基址的地址。例如,如果二进制文件的首选基址是0x00400000,那么由-e和-F选项返回的地址是通过将相对虚拟地址与首选基址0x00400000相加而确定的。
当你运行(或调试)二进制文件时,它可以在首选基地址以外的任何地址被加载(例如,0x01350000)。如果你希望在一个正在运行的进程中或在调试二进制文件时(在IDA或x64dbg中)找到加密指标的地址,那么你可以用-P <pid或进程名称>选项运行signsrch。-P选项会自动确定加载可执行文件的基本地址,然后计算出加密签名的虚拟地址,如下所示。
C:signsrch>signsrch.exe -P kav.exe [removed]
- 01350000 0001b000 C:UserstestDesktopkav.exe - pid 3068
- base address 0x01350000
- offset 01350000 size 0001b000
- 110592 bytes allocated
- load signatures
- open file C:signsrchsignsrch.sig
- 3075 signatures in the database
- start 1 threads
- start signatures scanning:
offset num description [bits.endian.size] -------------------------------------------- 01360438 1918 DES initial permutation IP [..64] 01360478 2330 DES_fp [..64]
013604b8 2331 DES_ei [..48]
*左右滑动查看更多
除了检测加密算法外,Signsrch还可以检测压缩算法、一些反调试代码和Windows加密函数,通常以Crypt开头,如CryptDecrypt()和CryptImportKey()。
02
使用FindCrypt2检测加密常量
Findcrypt2是一个IDA Pro插件,可以在内存中搜索许多不同算法所使用的加密常数。要使用该插件,请下载它,并将findcrypt.plw文件复制到IDA插件文件夹中。
http://www.hexblog.com/ida_pro/files/findcrypt2.zip
如该链接无法下载,推荐换一种yara的匹配方式
https://github.com/polymorf/findcrypt-yara
*左右滑动查看更多
现在,当加载二进制文件时,该插件会自动运行,或者我们可以通过选择Edit | Plugins | Find crypt v2(编辑|插件|查找密码v2)来手动调用它。该插件的结果会显示在输出窗口。
FindCrypt2插件也可以在调试模式下运行。如果使用IDA 6.x或更低的版本,FindCrypt2工作得很好;但可能是由于IDA 7.x API的变化,它似乎不能在IDA 7.x版本中工作。
03
利用YARA检测加密签名
另一种识别二进制文件中使用加密技术的方法是用包含加密签名的YARA规则扫描二进制文件。你可以自己编写YARA规则,或者下载其他安全研究人员编写的YARA规则,然后用YARA规则扫描二进制文件。
其他YARA规则示例:
https://github.com/x64dbg/yarasigs/blob/master/crypto_signatures.yara
*左右滑动查看更多
x64dbg集成了YARA;如果你想在调试时扫描二进制文件中的加密签名,这很有用。我们可以将二进制文件加载到x64dbg中(确保执行在二进制文件的某个地方暂停),然后右键点击CPU窗口,选择YARA(或Ctrl + Y);这将带来这里显示的Yara对话框。点击 “文件”,加载包含YARA规则的文件。也可以通过点击目录按钮从一个目录中加载含有YARA规则的多个文件。
下面的截图显示了用包含加密签名的YARA规则扫描恶意二进制文件后检测到的加密常量。现在你可以右击任何一个条目,选择在转储中关注,以查看转储窗口中的数据,或者,如果签名与加密程序有关,那么你可以双击任何一个条目来浏览代码。
像RC4这样的加密算法不使用加密常数,因为它不容易用加密签名来检测。通常,你会看到攻击者使用RC4来加密数据,因为它很容易实现。
RC4的使用步骤:
http://blog.talosintelligence.com/2014/06/an-introduction-to-recognizing-and.html
*左右滑动查看更多
04
使用Python解密
在确定了加密算法和用于加密数据的密钥后,可以使用PyCryto的Python模块来解密数据。要安装PyCrypto,你可以使用apt-get install python-crypto 或 pip install pycrypto 或从源代码中编译它。
PyCryto下载网址:
https://www.dlitz.net/software/pycrypto/
*左右滑动查看更多
Pycrypto支持散列算法,如MD2、MD4、MD5、RIPEMD、SHA1和SHA256。它还支持加密算法,如AES、ARC2、Blowfish、CAST、DES、DES3(Triple DES)、IDEA、RC5和ARC4。
下面的Python命令演示了如何使用Pycrypto模块生成MD5、SHA1和SHA256哈希值。
# 由于原脚本存在bug,这里给出的是调整过的脚本
> from Crypto.Hash import MD5,SHA256,SHA1
"explorer.exe" > text =
> MD5.new(str.encode(text)).hexdigest()
'cde09bcdf5fde1e2eac52c0f93362b79'
'7592a3326e8f8297547f8c170b96b8aa8f5234027fd76593841a6574f098759c' > SHA256.new(str.encode(text)).hexdigest()
'7a0fd90576e08807bde2cc57bcf9854bbce05fe3' > SHA1.new(str.encode(text)).hexdigest()
*左右滑动查看更多
为了解密内容,从Crypto.Cipher中导入适当的加密模块。下面的例子显示了如何在ECB模式下使用DES进行加密和解密。
# 由于原脚本存在bug,这里给出的是调整过的脚本
> from Crypto.Cipher import DES
"hostname=blank78" > text =
"14834567" > key =
> des = DES.new(str.encode(key), DES.MODE_ECB)
> cipher_text = des.encrypt(str.encode(text))
> cipher_text
'xdexaftxd5)sNj`xf5xaexfdxb8xd3fxf7'
> plain_text = des.decrypt(cipher_text)
> plain_text
'hostname=blank78'
*左右滑动查看更多
(未完待续)
— 往期回顾 —
原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 恶意软件的混淆技术(四)