恶意代码分析实战 Lab 6-2 习题笔记

来源:互联网 发布:pmp网络班还是面授班 编辑:程序博客网 时间:2024/06/01 14:36

Lab 6-2

问题

1.main函数调用的第一个子过程执行了什么操作?

解答: 也是一样的,先按照书中的步骤走一遍

先是静态分析一下

这里

导入的有文件操作的相关函数,和Sleep这个函数

然后我们再看下一个导入的DLL

这个

会发现这里导入了这些东西,InternetOpenAInternetOpenUrlAInternetReadFile这三个函数比较有趣,估计是会打开一个网络里面的URL然后在读取一些东西下来本地

我们看字符串

字符串

然后从这些字符串中我们可以大概知道这个函数会连接网络,然后从一个网址(OpenUrl)上面打开一个文件(ReadFile)然后获取一个命令(get command)最后执行一个命令(Parsed command)

然后动态分析的我就不过了,比较简单,也不能分析出来什么东西

我们用IDA打开这个文件,然后会发现这个程序和上一个分析的一样,会调用一个判断当前网络是否可用的函数

函数

sub_401000函数如果网络可用,返回1,如果不可用,返回0

然后实在不懂什么是子过程,看答案才发现说的就是这个函数sub_401000


2.位于0x40117F的子过程是什么?

解答: 这个我们Lab 6-1就已经详细分析过了,就printf函数

函数


3.被mian函数调用的第二个子过程做了什么?

解答: 这个的话,其实说的就是这里这个调用函数sub_401040

函数

然后我们分析一下

这里

我们会发现这里压入了一个值Internet Explorer 7.5/pma,然后调用函数InternetOpenA函数,那这个值其实就传递给了InternetOpenA

InternetOPen

这是MSDN的解释说明,只压了一个值,说明函数只用了lpszAgent这个参数,然后这个参数代表什么意思

函数

然后这是用作HTTP协议里面的user agent的,而InternetOpenA将初始化对WinINet库的使用,然后通过这个压入的数据来设置User-Agent字段

然后,继续看汇编代码

下一段代码

后面已经自动标注了这些压栈的数据是什么意思

我们也可以查看MSDN来确认这些数据的意思

MSDN

按照栈的数据特性,先进后出,我们可以查看最后被压入栈中的数据

这个

这里已经被标注出来了,所以我们也不过多的纠结细节的问题,知道方法就好了

hInternet是调用了InternetOpenA后的返回值

MSDN中也说了这个参数的具体

MSDN

然后我们可以看到,这里也只传入了一个hInternetlpszUrl,因为其他的入参都是为0,所以这里会打开一个http://www.practicalmalwareanalysis.com的句柄,然后User-Agent是上面设置的Internet Explorer 7.5/pma

下面

然后我们会发现eax,也就是InternetOpenUrlA的返回值,被移动到了[ebp+hFile]中,其实返回值也就是个hFile格式的东西,然后这个值和0比较,如果相同,则ZF=1,然后JNZ不跳转,也就是继续沿着红色那根线执行

红色的线

如果hFile等于0了,我们看一下会执行什么

执行

这里会调用printf然后输出Error 2.1: Fail to OpenUrl\n

然后便是调用一些清理函数,然后做一些清理工作,然后便是退出

然后如果不等于0

上传

这里便是调用InternetReadFile从打开的网页中读取数据了,如果没有读到任何数据,调用这里

这里

这里就printf了一个Error 2.2: Fail to ReadFile\n,然后便是清理和返回值退出

这里

然后便会进行一连串的比较,然后这里,这里一开始的是[ebp+Buffer],但是后面的是什么就不得而知了

我们可以通过这样变换得到如下变化后的代码

这样

[ebp+Buffer]是等价于[ebp-210h],那后面的[ebp-20fh]就是等价于[ebp-210h+01h]也就是[ebp+Buffer+1],后面的以此类推,最终可以得到的就是和书上一样的结论,是依次比较了[ebp+Buffer+1][ebp+Buffer+3]的值

然后要比较的值转换成ASCII值之后就是<!--,按照书上的说法,这是HTML中注释的开始部分(鄙人对HTML不熟哈哈)

然后书中假设是这个Buffer是通过InternetReadFile下载的网页的字符数组(也就是有一个一个字符组成的数组,区别字符串数组),然后由于Buffer指向的是网页的开始的一条HTML注释,然后程序通过比较这个来判断是否是网页

然后我们来做一下这个重新定义栈

按住ctrl k,然后跳出一个窗口之后,定义Array(数组)

定义

然后这里设置长度为512字节,宽度为1

定义2

然后最后这个栈就会显示成正常的样子,也就是这样的

栈

然后前面那里的Buffer就会显示正常的值了

代码接着就是比较这个Buffer[0] - Buffer[3]的值,如果这个值为<!--了,那么就会将Buffer[4]的值存入AL

Buffer[4]

然后便会返回EAX然后结束这个程序

然后我退出这个函数看,这个返回值不同会影响什么

退出

然后会发现这里,al被移动到了[ebp+var_8],然后又被移动回eax,如果返回的是0值的话,就会跳转到红线那里继续执行,那里是退出函数,如果返回不为0的话,就执行绿线的代码

al最后别移动到了ecx中,然后调用printf来输出这么一句话Success...

然后后面就是调用了Sleep函数,之前push过一个0EA60h

EA

0EA60h等同于60000d毫秒,也就是60秒,最后程序会Sleep一个一分钟

所以这个程序最终会从一个网页里面的注释里面,找到一个需要执行的代码,不过这个需要执行的代码只有一个字符(很少有一个字符的命令吧,一个列目录都是dir三个字符)


4.在这个子过程中使用了什么类型的代码结构?

解答:这个子过程使用的结构是就是一个字符数组,InternetReadFile会将读到的字符流,写入这个数组中,然后一个一个的比较这个字符的头4个字符,如果等于<!--就将第5个字符用al返回


5.在这个程序中有任何基于网络的特征的指示吗?

解答: 这个特诊就是会打开一个访问一个特殊的网址http://www.practicalmalwareanalysis.com

然后会使用Internet Explorer 7.5/pmaUser-Agent

可以使用这两个特征来识别病毒


6.这个恶意代码的目的是什么?

解答: 这个恶意代码的目的是从恶意网址上获得一个要执行的远程命令,然后休眠一分钟,如果没有获得这个命令,则退出

本文完

原创粉丝点击