恶意代码分析实战-实验15

本文最后更新于:2022-01-13 下午

Lab 15-1

分析

使用IDA打开程序,看到当前的代码,有几个红色的地方,此时已经被混淆过,让IDA的识别出现了问题。

D将指令转为数据,然后跳过E8C,重新构造代码,即可看到正确的汇编代码。

重新构造了汇编代码之后,分析一下程序的流程,首先是检查是否携带参数,这里注意下,argc默认是1,携带一个参数就是2,然后这里的ebp+8argc参数稍微说明一下。

首先main有三个参数,argcargvenvp,此时形成栈帧,那么当前栈的ebp+4就是返回地址,再下面就是压入栈的参数了,参数从右向左入栈,那么ebp+8就是argc。这里拿OD动调的来看一下,就明白了。

继续分析,如果参数不对的话,就会跳转到0x40105E处,这里是输出错误的情况

然后是参数的比较,看到这里是ebp+c,刚才已经分析过了,这就是main函数的第二个参数argv,再看它赋值给eax之后,又是eax+4,这是argv是个数组,如果带参数的话,那么argv[1]才是参数。

看到这三处都是在比较参数的指定位置是否是指定的字符,也就是pdq,那么想要输出正确的条件,就需要输入参数pdq

问题

1. 这个二进制程序中使用了何种对抗反汇编技术?

通过在正确的语句前,加一个机器码0xE8,这是call指令的机器码,它会将后面的代码识别称为要call的地址,依次来欺骗反汇编。

2. 这个二进制程序使用了什么流氓机器码来欺骗反汇编过程?

0xE8

3. 这种对抗反汇编技术被使用了多少次?

一共使用了5次

4. 什么命令行参数会让程序输出“Good Job”?

pdq

Lab 15-2

分析

使用IDA打开程序,看到部分的代码被识别成为了数据,重新识别一下。

发现混淆有E8E9EB这三个十六进制值,分别是call指令和jmp指令,分别对应的重新识别即可。

还有这个地方,实际上就是书中说的,一个字节用在了两个汇编指令之中。首先正常执行,会执行mov ax, 5EBhxor eax, eaxjz short near ptr loc_4012E6+2这三个语句此时注意这个跳转指令是跳到loc_4012E6+2这个地方,这里也就是4012E8,看IDA中并没有这个地址。

实际上这个地址的开始就是EB这个字节的开始,然后后面是05就是一个jmp指令了,第一次EB是作为mov ax, 5EBh,中给ax赋值的值,第二次是作为跳转指令。

重新构造了指令之后,框选所有的代码,按下P即可重新创建函数,再按F5就可以查看伪代码。

看到整体的流程,在初始化网络之后,会获取hostname然后进行处理,主要是如果是字母Z会替换成A,如果是z会替换成a,如果是数字9会替换成0,其他的则会在原来ascii码的基础上加一。这个变化后的值会作为USER-AGENT,打开一个URL。读取网页内容,再其中搜索Bamboo::后的内容。

但是从401216401300的代码并没有被翻译成伪代码,不知道为什么。这部分的内容尝试打开一个URL。sub_40130F是将exe的名字进行复制。

读取内容,然后创建一个叫Account Summary.xls.exe得文件,再将内容写入。

执行这个文件

问题

1. 程序初始化请求的URL是什么?

http://www.practicalmalwareanalysis.com/bamboo.html

2. User-Agent域是如何产生的?

是通过hostname来通过一些改变来形成的。

3. 初始化请求时,程序在内存页中查找什么?

在查找Bamboo::

4. 程序如何处理它从页中提取的信息?

获取之后会再尝试打开一个URL,然后获取网页的信息写入Account Summary.xls.exe文件之中。

Lab 15-3

分析

使用IDA打开程序进行分析,看到是一个进程遍历的程序,它会遍历所有的进程,同时遍历进程的所有线程和模块。

模块遍历

线程遍历

sub_4013D1是一个出现错误的时候,提示错误的函数,调用GetLastError获取错误号,再打印出来。

函数刚开始就会修改返回地址,这里先将0x400000eax,然后or eax ,0x148C此时eax等于0x40148C,这就是想要的返回地址,再写入到[ebp+0x4]这个地址之中,这就是原先返回值得地址。

在IDA中查看一下返回地址的函数,存在混淆。看到红色的地方,是jmp指令,那么大概又是通过跳转的混淆。

重新构造指令之后,查看,发现这段代码主要目的是构造一个结构化异常处理,看到框中的代码把自己的处理函数加入了SEH链中。然后通过xor ecx,ecxdiv ecx这两条指令来触发异常。

继续查看这个函数,看到一些指令都没有被识别。

重新构造指令。首先会调用两次解密函数sub_401534,解密一些信息。然后下载资源到指定文件。

然后以隐藏方式启动这个文件

加密的信息,前三行是第一个解密函数解密的信息,最后一行是第二个。

解密函数非常简单,就是一个取反的操作。

解密后的URL

但是有一个问题,就是第二部分密文,没办法进行解密,因为解密函数判断要解密的第一个字节是不是0,但是要解密的信息,起始是0x403040,这里是0,所以导致没办法进行解密。

我们自己解密一下,看到是一个exe名称。

问题

1. 恶意代码怎样被初始化调用?

通过修改主函数的返回地址,在主函数返回的时候,进行调用。

2. 恶意代码都做了什么?

解密一个URL,在上面下载资源保存为spoolsrv.exe并且执行

3. 恶意代码使用了什么URL?

http://www.practicalmalwareanalysis.com/tt.html

4. 恶意代码使用了什么文件名?

spoolsrv.exe