导语:本文将讲述如何使用Angr将自己伪造成C&C服务器,从而发现恶意软件的全部功能。
对于安全研究人员来说,在分析恶意二进制文件时,由于这些文件已经提前进行了反逆向分析的处理,所以最困难的事情就是摸清恶意文件所具有的各种功能。另外,如果这些功能只能由攻击者通过其后台控制中心远程操纵,那事情就会变得更加复杂。总而言之,出于各种原因,研究人员虽然会追踪到许多新的恶意软件,但很多时候却无法进行完整的动态分析,例如恶意软件是怎样通过让目标设备的基础架构崩溃或通过隔离运行,来避免使用C&C服务器,从而逃避检测。所以要在这些情况下,分析攻击者的远端服务器与恶意样本之间的通信协议通常会比较麻烦。所以要想得到恶意软件的通信协议,研究人员就必须创建一个虚拟化的服务器或采取各种攻击环境不断欺骗样本进行攻击,只有通过这种方法,研究人员才能发现恶意软件的全部功能。根据分析代码的大小和复杂程度或分析目标,分析任务的工作量也不一。
在本文中,我将列举一个虚构的具有RAT(远程访问木马)功能的研究样本,且假设该木马的攻击命令都是根据C&C服务器接收到的命令来执行的。因此,为了创建一个模拟攻击者的服务器,我们就必须了解服务器与安装在受害者设备上的样本之间的通信协议。
不过在此过程中,我并没有使用典型的逆向分析和调试工具来分析样本的所有内部过程,而是将部分分析的过程委托给我所发现的一个新工具——angr。
何为angr
angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。angr是一个基于python的二进制漏洞分析框架,它将以前多种分析技术集成进来,¬¬¬它能够进行动态的符号执行分析(如,KLEE和Mayhem),也能够进行多种静态分析。
这个工具可以用于不同的分析目的,angr在其网站上列出了很多相关的例子,如果感兴趣,你可以去看看。不过在本文中,研究人员将会重点关注符号执行的分析功能,你可以把它简单理解为对程序的分析,通过这些分析,你就可以确定那些执行不同攻击任务的代码需要得到哪些通信协议。
由于该工具的复杂性,为了便于理解,研究人员将对创建的代码进行简单分析,以说明它的用途,比如下面的这段代码:https://gist.github.com/halos/15d48a46556645ae7ff2ecb3dfc95d73
angr的分析过程
angr的分析过程大致有以下4步:
1.将二进制程序载入angr分析系统;
2.将二进制程序转换成中间语言;
3.将IR语言转换成语义较强的表达形式,比如,这个程序做了什么,而不是它是什么。
4.执行进一步的分析,比如,完整的或者部分的静态分析(依赖关系分析,程序分块)、程序空间的符号执行探索(挖掘溢出漏洞);
我会在本文中,用代码模拟一个RAT,它会接收来自函数'call_home'的C&C指令,初始化全局变量‘c2_resp’ 的值,该变量将包含一些我假定的C&C顺序。然后执行‘exec_order’函数,根据该结构中包含的信息,该函数将执行一些操作或其他操作。
由于结构的不同字段所采用的值会在代码开始运行时被定义为常量,且它们包含随机值,所以分析人员在分析时,是不能轻易的发现这些C&C线索的。
但是,在模拟的实验环境中分析恶意软件时,由于研究人员缺少生成它们的源代码,所以研究人员只能采用编译好的二进制文件代码。以下就是用C语言编译之前,研究人员从‘exec_order’函数中发现的所有内容。
如果再往深的分析一点,研究人员就可以得到一个更容易理解的汇编代码。
以上这段代码就显示的是一个很容易让人理解的结构,不过由于它是一个有组织的代码,且由于它的长度也会使其分析变得困难。所以当研究人员深入了解该函数时,可以看到如下图中的内容。
然而,在日常的恶意软件中,这些类型的程序的逻辑通常不那么清楚,并不是因为他们的创建者不知道如何编程,而是因为他们试图阻碍他们知道将要完成他们创建的研究。
为了用angr工具来研究本文所模拟的样本,研究人员需要知道4个内存地址的值,以指导angr工具在哪里以及如何工作:
1.将要学习的代码是在哪里开始的?
2.将要学习的代码在哪里结束?
3.将要找到哪些部分的代码?
4.是否可对变量就行修改?
前两项将为angr工具划定将要分析的范围,以评估所有可能的通信过程,从而避免分析那些无用的分析过程,加快分析效率。在第三项中,研究人员将用几个地址标出想要分析的代码范围,并将分析的重点放在这些地方。第四项将指向来自服务器的“缓冲区”,根据不同的值或其他值,让分析目标指向研究人员标记的不同重点范围。
从上图的代码中可以看到,分析函数是从地址0x0804844d开始的,因此它被分配给常量START_ADDR。要找到的地址存储在FIND_ADDRS列表中,例如,从执行分支中添加指令“push str.Creando_file: __ s”的地址0x8048483以创建一个文件(地址为0x804847b的块)。
研究人员之所以举出这个代码示例,只是想指出,要用C语言编译的可执行文件‘a.out’来将分析器初始化为起始地址。另外,研究人员还指出服务器响应缓冲区(BUFF_ADDR)将成为分析的变量,根据该变量,研究人员是可以找到停止分析的地址。最后,研究人员会利用angr来探索带有所有这些标记的代码,并且该工具还会将分析结果以人类理解的方式打印显示出来。
上图中出现的第一个条目说的是,如果C&C要命令目标设备的木马,就必须删除一个文件(在地址0x80485050处运行的操作),它会发送一个'缓冲区',字节为“00 E9 BB 64 D4 D4 01 1F AF 78 09 6E 00 00 00 00 00 00 00 00”。
然后,通过explanation/curiosity,显示如何通过使用BUFF_ADDR内存地址的内容来达到这个地址。应该注意的是,由于angr工具是在位级工作的,因此只有20个字节的缓冲区出现了相关的分析标记(‘c2_resp_0_160[159:128]’)。
第一个约束条件表示第四个DWORD必须包含值0x64bbe900(T_FILESYSTEM,因为它可以在C语言源代码中看到)。但是,在第三个字节的内容中会出现三个限制:它不同于0xaff80c17和0xc6e6ef6b,并且还必须包含值0x1f01d4d4。虽然第三个限制就足够了,但在模拟执行时,如果要让angr避免进入某些分支,就要让第三个字节输入不同的‘if’值。如果查看研究人员创建的C代码,第三个字节对应的是‘fs_order’字段,该字段会首先将其与常量FSO_CREATE(第55行)和FSO_WRITE(第67行)进行比较,当它等于常量FSO_DELETE(第71行)时,就会进入删除分支。
这些信息都将帮助我们理解通信协议以获得新的感染指标,建立一个伪装成攻击者的服务器,修改样本缓冲区的运行方式。除此之外,我们还可以直接通过关注某些功能等方式直接修改样本来加速分析过程。