九维团队-青队(处置)| 恶意软件的混淆技术(五)

admin 2023年1月2日16:53:19评论15 views字数 4521阅读15分4秒阅读模式

九维团队-青队(处置)| 恶意软件的混淆技术(五)


写在前边

1.本文原文为K A, Monnappa. 2018年发表的《Learning Malware Analysis》,本文均为译者对相关内容的翻译及实践记录,仅供各位学术交流使用。另出于易读性考虑,对部分字句有所删改。 
2.如各位需要引用,请做原文引用,格式如下所示: 
[序号]K A, Monnappa. LearningMalware Analysis[M]. 2018.06. Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. 
3.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第四篇。
往期内容请参见合集《Learning Malware Analysis》




自定义编码/加密


有时,攻击者会使用自定义的编码/加密方案,这使得难以识别加密(和密钥),也使得逆向工程更加困难。自定义编码方法之一是使用编码和加密的组合来混淆数据;Etumbot是这种恶意软件的一个较好例子

参考链接:https://www.arbornetworks.com/blog/asert/illuminating-theetumbot-apt-backdoor/

*左右滑动查看更多


Etumbot恶意软件样本在执行时,会从C2服务器获得RC4密钥;然后使用获得的RC4密钥对系统信息(如主机名、用户名和IP地址)进行加密,加密后的内容使用自定义Base64进一步编码,并外流到C2。包含混淆内容的C2通信在下面的截图中显示。

关于该样本的逆向工程细节,请参考作者的演讲和视频演示:https://cysinfo.com/12th-meetup-reversing-decrypting-malware-communications/

*左右滑动查看更多


九维团队-青队(处置)| 恶意软件的混淆技术(五)


为了对内容进行解密,需要先用自定义的Base64进行解码,然后用RC4进行解密;这些步骤可以用以下python命令进行,输出显示解密后的系统信息。

>>> import base64>>> from Crypto.Cipher import ARC4>>> rc4_key = "e65wb24n5">>> cipher_text = "kRp6OKW9r90_2_KvkKcQ_j5oA1D2aIxt6xPeFiJYlEHvM8QMql38CtWfWuYlgiXMDFlsoFoH">>> content = cipher_text.replace('_','/').replace('-','=')>>> b64_decode = base64.b64decode(content)>>> rc4 = ARC4.new(rc4_key)>>> plain_text = rc4.decrypt(b64_decode)>>> print plain_textMYHOSTNAME|Administrator|192.168.1.100|No Proxy|04182|

*左右滑动查看更多


一些恶意软件作者没有使用标准编码/加密算法的组合,而是实施了一个全新的编码/加密方案。这种恶意软件的一个例子是APT1集团使用的恶意软件。该恶意软件将一个字符串解密为一个URL;为此,恶意软件调用一个用户定义的函数(在下面的截图中更名为Decrypt_Func),该函数实现了自定义加密算法。


Decrypt_Func接受三个参数;第一个参数是包含加密内容的缓冲区,第二个参数是将存储解密内容的缓冲区,第三个参数是缓冲区的长度。在下图中,在执行Decrypt_Func之前暂停了执行,它显示了第1个参数(包含加密内容的缓冲区)。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


根据我们的目标,可以分析Decrypt_Func以了解算法的工作原理,然后按照作者的介绍编写一个解密器(见以下链接),或者可以让恶意软件为你解密内容。

参考链接:https://cysinfo.com/8th-meetup-understanding-apt1-malware-techniques-using-malware-analysis-reverse-engineering/

*左右滑动查看更多


要让恶意软件解密内容,只需跨过Decrypt_Func(它将完成执行解密函数),然后检查第2个参数(存储解密内容的缓冲区)。下面的截图显示了包含恶意URL的解密缓冲区(第2参数)。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


前面提到的让恶意软件解码数据的技术,如果解密函数被调用的次数不多,是很有用的。如果解密函数在程序中被多次调用,那么使用调试器脚本自动解码过程会比手动操作更有效率。为了证明这一点,请考虑一个64位恶意软件样本的代码片段(参考下图)。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


请注意恶意软件如何多次调用一个函数(重命名为dec_function);如果看一下代码,我们就会注意到一个加密的字符串被传递给这个函数作为第1个参数(在rcx寄存器中),执行该函数后,eax中的返回值包含存储解密内容的缓冲区的地址。


下面的截图显示了对dec_function的交叉引用;可以看到,这个函数在程序中被多次调用。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


每次调用dec_function时,它都会解密一个字符串。为了解密传递给这个函数的所有字符串,我们可以写一个IDAPython脚本(参考以下内容)。

import idautilsimport idaapiimport idcfor name in idautils.Names():   if name[1] == "dec_function":       ea= idc.get_name_ea_simple("dec_function")       for ref in idautils.CodeRefsTo(ea, 1):           idc.add_bpt(ref)idc.start_process('', '', '')while True:   event_code = idc.wait_for_next_event(idc.WFNE_SUSP, -1)   if event_code < 1 or event_code == idc.PROCESS_EXITED:       break   rcx_value = idc.get_reg_value("RCX")   encoded_string = idc.get_strlit_contents(rcx_value)   idc.step_over()   evt_code = idc.wait_for_next_event(idc.WFNE_SUSP, -1)   if evt_code == idc.BREAKPOINT:       rax_value = idc.get_reg_value("RAX")   decoded_string = idc.get_strlit_contents(rax_value)   print "{0} {1:>25}".format(encoded_string, decoded_string)   idc.resume_process()

*左右滑动查看更多


由于我们已经将解密函数重命名为dec_function,所以它可以从IDA的名称窗口中访问。前面的脚本在名称窗口中进行迭代,以确定dec_function,并执行以下步骤。

1、如果dec_function存在,确定dec_function的地址。
2、使用dec_function的地址来确定对dec_function的交叉引用(Xrefs to)(它给出了所有dec_function被调用的地址)。
3、在所有调用dec_function的地址上设置断点。
4、自动启动调试器,当断点在dec_function处被击中时,从rcx寄存器所指向的地址读取加密的字符串。需要记住的一点是,要使IDA调试器自动启动,
一定要选择调试器(如本地Windows调试器),可以从工具栏区域或者选择调试器|选择调试器
5、然后步入函数,执行解密函数(dec_function),并读取返回值(rax),其中包含解密字符串的地址。随后打印出解密的字符串。
6、重复前面的步骤,对传递给dec_function的每个字符串进行解密。


运行前面的脚本后,加密的字符串和它们相应的解密字符串会显示在输出窗口中,如下图所示。从输出中可以看出,恶意软件在运行期间解密了文件名、注册表名和API函数名,以避免被怀疑。换句话说,这些是攻击者想要隐藏的字符串,以避免静态分析。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


恶意软件解包


攻击者不遗余力地保护他们的二进制文件免受反病毒检测,并使恶意软件分析师难以进行静态分析和反向工程。恶意软件作者经常使用打包器和加密器来混淆可执行内容。打包器是一个程序,它将一个正常的可执行文件,压缩其内容,并生成一个新的混淆的可执行文件。加密器与打包器一样,不是压缩二进制文件,而是对其进行加密。换句话说,打包器或加密器将可执行文件转变为难以分析的形式。


当一个二进制文件被打包时,它透露的信息非常少;你不会发现字符串透露出任何有价值的信息,导入的函数数量会减少,程序指令会被掩盖。为了理解一个打包的二进制文件,我们需要移除应用于程序的混淆层(解包);要做到这一点,首先要了解打包器的工作原理。


当一个正常的可执行文件通过打包器时,可执行文件的内容被压缩,并且它添加了一个解包存根(解压程序)。然后,打包器将可执行文件的入口点修改为存根的位置,并生成一个新的打包可执行文件。当打包后的二进制文件被执行时,解包存根会提取原始二进制文件(在运行期间),然后通过将控制权转移到原始入口点(OEP)来触发原始二进制文件的执行,如下图所描述。

九维团队-青队(处置)| 恶意软件的混淆技术(五)


要解开一个打包的二进制文件,既可以使用自动工具,也可以手动操作。自动化方法可以节省时间,但并不完全可靠(有时成功,有时不成功),而手工方法则很费时,但一旦掌握了技巧,它就是最可靠的方法。



01

手动拆包


要解开用打包器打包的二进制文件,我们通常要执行以下一般步骤。

第一步:识别OEP。如前所述,当一个打包的二进制文件被执行时,它会提取原始二进制文件,并在某个时间点将控制权转移到OEP。原始入口点(OEP)是恶意软件被打包前的第一条指令(恶意代码开始的地方)的地址。在这一步,我们确定打包的二进制文件中的指令,它将跳转(引导我们)到OEP。
第二步:执行程序,直到达到OEP。其目的是让恶意软件存根在内存中解包,并在OEP处暂停(在执行恶意代码之前)。
第三步:涉及将解包的程序从内存中转储到磁盘。
最后一步:涉及修复转储文件的导入地址表(IAT)。

在接下来的几个小节中,我们将详细研究这些步骤。为了演示前面的概念,我们将会使用一个用UPX打包器打包的恶意软件。接下来的内容中所涉及的工具和技术将会为我们建立一个手动解包过程的概念。

UPX打包器打包恶意软件参考链接:https://upx.github.io/


(未完待续)



—  往期回顾  —


九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)



关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)

九维团队-青队(处置)| 恶意软件的混淆技术(五)

原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 恶意软件的混淆技术(五)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月2日16:53:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-青队(处置)| 恶意软件的混淆技术(五)http://cn-sec.com/archives/1488647.html

发表评论

匿名网友 填写信息