恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

参考恶意代码分析实战一书,结合参考答案和i春秋课后题讲解视频,动手实践整理如下。

目录

1.DllMain的地址是什么?

2.使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?

3.有多少函数调用了gethostbyname?

4.将精力集中在位于0x1000757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?

5.IDA Pro识别了在0x16001656处的子过程中的多少个局部变量?

6.IDA Pro识别了在0x16001656处的子过程中的多少个参数?

7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe/c。它位于哪?

8.在引用\cmd.exe/c的代码所在的区域发生了什么?

9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E54的交叉引用。)

10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较如果对rootwork的字符串比较是成功的(当memcmp返回0),会发生什么?

11.PSLIST导出函数做了什么?


Lab 5-1  只用 IDA Pro分析在文件Lab05-01.dll中发现的恶意代码。这个实验的目标是给你一个用IDA Pro动手的经验。如果你已经用IDA Pro工作过,你可以选择忽略这些问题,而将精力集中在****恶意代码上。

问题

1.DllMain的地址是什么?

DllMain在.text节的0x1000D02E处。

用IDA Pro加载了恶意DLL以后,我们就直接来到了位于0x1000D02E处的DllMain函数。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

两种方法:查找现在的地址

方法一:键盘的空格可以切换到反汇编的位置

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

方法二:

图形模式下如何查看地址呢

需要通过勾选Options-General菜单的Line Prefixes选项来在图形模式下看到行号,或者使用空格键在图形模式和传统模式之间切换,这样不改变选项也能看到行号。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

DllMain是我们开始分析的地方,因为所有从DllEntrypoint到DllMain之间执行的代码一般是由编译器生成的,我们不应该陷进去分析编译器生成的代码。

2.使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?

gethostbyname在.idata节的0x100163CC处。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

双击就可以查看到它的反汇编结果。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

3.有多少函数调用了gethostbyname?

在整个恶意代码中,gethostbyname被5个不同的函数调用了9次。

 

使用到Ida的交叉引用这个功能,光标保持在gethostbyname处,按下Crl+X键,

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

窗口最底下的Line 1 of18表明存在对gethostbyname的9处交又引用。

一些版本的IDA Pro会计算两次交叉引用:类型p是被调用的引用,类型r是被“读取”的引用(因为是对一个导入项call dword ptr[..],所以CPU必须先读取这个导入项,再调用它)。

这里主要看P,但P的个数并不是函数的个数,sub_10001074重复出现,算作一个,一次你有五个函数调用了gethostbyname。

4.将精力集中在位于0x1000757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?

如果在0x1000757处对gethostbyname调用成功,恶意代码会发起对pics.practicalmalwareanalysis.com的DNS请求。

按G键,跳转到被调用处

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

其中,gethostbyname方法用了一个参数,应该是一个包含了域名的字符串。因为,我们需要往回看一点,确定gethostbyname被调用时,EAX中的值是多少。从前面可以看到off_10019040被赋给了EAX。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

双击这个偏移,在这里我们能看到字符串[ This is RDO]pics. practicalmalwareanalysis.com。正如在上图中看到的,对字符串的指针又加上了0xD字节的偏移,因此gethostbyname使用的EAX是一个指向pics.practicalmalwareanalysis,com的指针。在EAX基础上加0xD偏移后得到URL位置,这个调用会对该域名发起一个DNS请求,以获得其IP地址。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

5.IDA Pro识别了在0x16001656处的子过程中的多少个局部变量?

在0x10001656处的函数中,IDA Pro识别出23个局部变量。

6.IDA Pro识别了在0x16001656处的子过程中的多少个参数?

在0x10001656处的函数中,IDA Pro识别出1个参数。

 

局部变量呢一般是以var开头的或者如下图右边带负号的是局部,正的是参数,所以一共23个局部变量和1个参数。

7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe/c。它位于哪?

字符串cmd.exe/c出现在0x10095B34处。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

双击

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

8.在引用\cmd.exe/c的代码所在的区域发生了什么?

那段代码看起来是为攻击者开启一个远程shell会话

请注意,该字符串位于该PE文件的xdoors_d节中的0x10095B34处。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

检査对这个字符串的交叉引用,只看到一处位于0x100101D0,在那里,该字符串被压到栈上。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

该处往上走可以看到在该字符串被引用之前有一个字符串

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

双击

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

远程shell会话

往下查看,有一系列的recv和send调用。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E54的交叉引用。)

操作系统版本号被保存在了dword_1008E5C4中。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

 

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

对这个函数也可以进行交叉引用,关注“写”操作修改的这一条。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

进入EAX,可以看到EAX被赋给dword_1008E5C4,而EAX是前一条指令函数调用的返回值。因此,我们需要确定该函数返回什么。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

为此,我们双击sub_10003695在反汇编窗口中査看它。该函数包括了一个GetversionExA的调用,用于获取当前操作系统版本的信息,如下所示:

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

其中将dwPlatformId与数字2进行比较,来确定如何设置AL寄存器。如果PlatformId为VER_PLATFORM_WIN32_NT,AL会被置位。这里只是简单地判断当前操作系统是否Windows2000或更高版本,我们可以得出结论,该全局变量通常会被置为1。

10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较如果对rootwork的字符串比较是成功的(当memcmp返回0),会发生什么?

注册表项HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTime和WorkTimes的值会被查询,并通过远程shell连接发送出去。

息。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

位于0x1000FF58处的远程shell函数从0x1000FF58开始包含了一系列的memcmp函数。其中,在0x10010452,可以看到与rootwork的memcmp,如下所示

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

如果该字符串为rootwork,则在处的jnz不会跳转,而1的代码会被调用。看一下sub—_100052A2的代码,可以看到它査询了注册表中HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Worktime和Worktimes键的值,然后将这一信息返回给2处传给该函数的网络socket。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

 

11.PSLIST导出函数做了什么?

PSLIST导出项可以通过网络发送进程列表,或者寻找该列表中某个指定的进程名并获取其信

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

查看该Dll的导出表。双击,也即导出项代码的起始处。这个函数选择两条路径之一执行,这个选择取决于sub_160836C3的结果。

sub_1009363函数检查操作系统的版本是Windows Vista/7,或是Windows XP/2003/2000。

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

恶意代码分析实战第五章 IDA Pro 课后练习(1-11)

这两条代码路径都使用CreateToolhelp32Snapshot函数,从相关字符串和API调用来看,用于获得一个进程列表。这两条代码路径都通过send将进程列表通过socket发送。