在这里插入图片描述


 




本科/专科信息安全专业

计算机网络、操作系统




实验目的
本章实验重点在于分析由C++编写的恶意程序。
本次实验中我们将会学习分析恶意代码如何实现与远程服务器进行文件的上传和下载的交互。
此外,为了进一步进行动态分析,我们会通过手动搭建ftp服务端,
以及通过ApateDNS重定向请求来诱导恶意代码在我们分析机中实现完整的操作。




预备知识
1.IDA
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。

IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻研究领域的重要工具。

它支持数十种CPU指令集其中
包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

2.Peview
用于浏览程序PE文件格式头部中的信息。




实验环境
服务器:Windows 7
在这里插入图片描述

辅助工具:Peview,IDA,ApateDNS,Ftpserver




Q1.在0x401040处的函数采用了什么参数?

Q2.哪个URL被用来调用URLDownloadToFile?

Q3.这个程序做了什么事情?




Q1.在这个程序中,你可以从有趣的字符串中了解到什么?

Q2.导入函数表告诉你关于这个程序的什么信息?

Q3.在0x4011D9处创建对象的目的是什么?它有什么虚函数吗?

Q4.哪个函数可能被在0x401349处的call [edx]指令 调用?

Q5.如何简易地搭建这个恶意代码所预料的服务器,不用连接到互联网,就能完整地分析这个恶意代码呢?

Q6.这个程序的目的是什么?

Q7.在这个程序中实现虚函数调用的目的是什么?




首先载入IDA
在这里插入图片描述
在这里插入图片描述

第一个call是在401008,是一个对new操作符的调用,表明它正在创建一个对象
在这里插入图片描述
在这里插入图片描述

接着通过mov指令,对象的引用 [返回值]
分别被赋给var_8,var_4
在这里插入图片描述

在401019处,var_4赋给了ecx,说明它将被作为函数调用的this指针传递进去。
在这里插入图片描述

指向URL http://www.practicalmalwareanalysis.com的指针,
在这里插入图片描述

在这里插入图片描述
随后被存储在对象的开头位置,之后调用sub_401040
在这里插入图片描述

在401044处看到ecx中的this指针被访问,并赋给var_4,
在这里插入图片描述

接着是其他参数入栈,
在这里插入图片描述

之后就是调用URLDownloadToFile。
在这里插入图片描述

为了获得将要使用的url参数,

this指针在401050处被读取(var_4赋给eax),
在这里插入图片描述

随后在401053处访问了存储在对象中的第一个数据元素
(在main中可知第一个元素就是url字符串)
在这里插入图片描述

,并将其压入401055处的栈中(将URl字符串压入栈中)
在这里插入图片描述

Q1.在0x401040处的函数采用了什么参数?

A1.在0x401040地址处的函数并不带任何参数,但它在ECX中传递了一个对象索引,含义为this指针

Q2.哪个URL被用来调用URLDownloadToFile?

A2.对URLDownloadToFile函数的调用使用http://www.practicalmalwareanalysis.com/cpp.html 作为URL参数值。

Q3.这个程序做了什么事情?

A3.这个程序从远程服务器下载文件,并把它存储到本地系统的C:\tempdownload.exe中。
在这里插入图片描述




Peview载入
在这里插入图片描述

这里看到了home ftp client,ftp的一个网址,这表明这个程序可能是一个ftp客户端程序
在这里插入图片描述

Q1.在这个程序中,你可以从有趣的字符串中了解到什么?

A1.最有趣的字符串是ftp. practicalmalwareanalysis.com和Home ftp client, 这表明这个程序很可能是FTP客户端软件。




查看其导入函数

在这里插入图片描述

FindNextFile,FindFirstFile表明可能会搜索系统上的文件
在这里插入图片描述

一些ftp相关的函数更增强了我们的猜测
在这里插入图片描述

Q2.导入函数表告诉你关于这个程序的什么信息?

A2. 这一程序导入了函数FindFirstFile和FindNextFile,
这表明这个程序很可能会搜索受害主机的文件系统。
而导入了函数InternetOpen、InternetConnect、FtpSetCurrentDirectory与FtpPutFile,
这告诉我们这一恶意代码会上传受害主机的文件到一个远程FTP服务器




在这里插入图片描述

接下来载入IDA

在这里插入图片描述

401521处调用WSAStartup初始化win32网络功能
在这里插入图片描述

401533调用gethostname获取主机名,
在这里插入图片描述
获取的结果存在name变量,这里将其 【n键】重命名为local_hostname
在这里插入图片描述

接着将C:\*压栈,
在这里插入图片描述
调用了sub_401000,跟入
在这里插入图片描述

看到了循环结构
在这里插入图片描述

在循环之前
在这里插入图片描述

看到了FindFirstFile
在这里插入图片描述

在循环结构里面

有FindNextFile
在这里插入图片描述
【用来遍历文件】

加之传入的参数C:\*

我们可知这是在搜索C盘下的文件

在循环里看到很多字符串操作函数
在这里插入图片描述
在这里插入图片描述

那么我们分析下程序在搜索什么

strncmp将操纵字符串与.doc比较,如果找到了doc后缀的文件,
在这里插入图片描述
则往左边走
在这里插入图片描述

4011db调用new操作符来创建一个对象,然后开始初始化对象,在这里插入图片描述

对象存储在var_15

在这里插入图片描述

4011f2到401204将虚函数表写入对象的起始偏移处
在这里插入图片描述

因为new操作符创建对象之后off_4060dc马上被写入到对象中,
在这里插入图片描述

所以我们知道这是一个虚函数表

双击查看off_4060dc

在这里插入图片描述

可以看到它保存了指向sub_401440地址的函数指针

我们给sub_401440重命名为docObject_Func1
在这里插入图片描述

doc文件对象创建之后

在这里插入图片描述

在这里插入图片描述
跳转到4011f2,在这里插入图片描述在这里插入图片描述

然后执行到loc_401222,然后跳到loc_40132f
在这里插入图片描述
在这里插入图片描述



回到sub_401000
在这里插入图片描述在这里插入图片描述

如果没有找到doc文件,则往右边走,继续查看文件是否已pdf后缀结束。如果是的话,往左边走
在这里插入图片描述

同样通过new创建一个不同类型的对象,在off_4060D8有一个不同的虚函数表

在这里插入图片描述

给sub_401380重命名为docObject_Func2
在这里插入图片描述

在这里插入图片描述

pdf文件对象被创建之后来到4012b1
在这里插入图片描述

然后执行到40132f,和doc对象被创建之后所执行的位置是一样的
在这里插入图片描述在这里插入图片描述

回到sub_401000,如果不是pdf也不是doc,则会来到4012da

会创建一个其他类型的对象来表示所有其他的文件类型
在这里插入图片描述

给off_4060E0处的在这里插入图片描述在这里插入图片描述

重命名为otherfunc
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

最后也会来到40132f

可以看到会引用存储在var_148变量中的对象,
在这里插入图片描述

调用它在虚函数表中的第一个函数指针

这里注意一下,0x401349处的call指令,待会儿回到第4个问题会用到
在这里插入图片描述

我们先来看pdf对象调用的函数。

也就是4060d8处的函数,即Object_Func2
在这里插入图片描述

调用InternertOpen函数初始化互联网连接,
在这里插入图片描述
然后InternetConnect建立到的FTP连接

在这里插入图片描述

之后调用FtpSetCurrentDirectory改变ftp当前路径到pdfs目录,
在这里插入图片描述

并开始上传文件到远程服务器,将文件名用主机名和序号填充成%s-%d.pdf的格式
在这里插入图片描述

再查看doc的
在这里插入图片描述

双击跟入

可以看到基本上和pdf的处理差不多,不过这里是改变ftp当前路径到docs目录,上传doc文件到远程服务器
在这里插入图片描述
在这里插入图片描述

再来看看4060e0的otherfunc

在这里插入图片描述

这个函数没做什么

所以我们知道恶意代码只是上传doc和pdf文件




Q3.在0x4011D9处创建对象的目的是什么?它有什么虚函数吗?

A3.在0x00401ID9地址创建的对象是一个 .doc文件。
这个对象在偏移0x00401440地址处有一个虚函数,它将把文件上传至远程FTP服务器。




Q4.哪个函数可能被在0x401349处的call指令调用?

A4.在0x00401349处的虚函数调用将调用在0x00401380、0x00401440 的一个虚函数。




Q6.这个程序的目的是什么?

A6.这个程序会搜索受害主机的硬盘驱动器,并上传所有doc和.pdf后缀的文件到远程FTP服务器上。

而这里为什么要用虚函数呢?
因为使用虚函数可以使这段代码修改或扩展时更加容易,
在需要添加对不同文件类型支持时,
只需要简单地实现一个新对象并修改对象创建后的代码即可




Q7.在这个程序中实现虚函数调用的目的是什么?

A7.实现虚拟函数调用的目的是让代码对不同文件类型执行不同的上传函数

下载一个ftp服务器,启动
在这里插入图片描述

注意给其上传的权限,上图中设置了访问目录为c盘根目录
在这里插入图片描述

在c盘根目录创建两个空的文件夹,分别为docs,pdfs,可以再新建两个文件,注意后缀名pdf和doc
在这里插入图片描述

再启动ApateDNS(需要安装.net环境才能运行),他可以将响应DNS请求设置为任何你指定的IP地址。
在这里插入图片描述

我们如下所示,在current gateway设置为127.0.0.1,点击Start Server。然后启动lab20-2.exe

在这里插入图片描述

如上所示,看到会请求
在这里插入图片描述

此时查看c盘根目录下的docs文件夹 以及pdfs文件夹

在这里插入图片描述

在这里插入图片描述

其文件名也印证了我们前面在IDA中的分析。




Q5.如何简易地搭建这个恶意代码所预料的服务器,不用连接到互联网,就能完整地分析这个恶意代码呢?

A5.这一恶意代码会使用高层API函数连接到一个远程的FTP服务器,我们可以下载并建立一个本地FTP服务器,并将DNS请求重定向至这一服务器,以充分分析该恶意代码。

配套学习资源
1.《恶意代码分析实战》