恶意代码分析实战第五章 IDA Pro 课后练习

参考恶意代码分析实战一书,结合参考答案和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导出函数做了什么?

12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

13.DllMain直接调用了多少个 Windows api?多少个在深度为2时被调用?

14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

15.在0x10001701处是一个对 socket的调用。它的3个参数是什么?

16.使用MSDN页面的 socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?

17.搜索in指令( opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行 Vmware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测Vmware的证据吗?

18.将你的光标跳转到0x1001D988处,你发现了什么?

19.如果你安装了 IDA Python插件(包括 IDA Pro的商业版本的插件),运行Lab0501py,一个本书中随恶意代码提供的 IDA Pro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?

20.将光标放在同一位置,你如何将这个数据转成一个单一的ASCI字符串?

21.使用一个文本编辑器打开这个脚本。它是如何工作的?



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

问题

1.DllMain的地址是什么?

DllMain在.text节的0x1000D02E处。

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

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

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

方法二:

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

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

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

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

gethostbyname在.idata节的0x100163CC处。

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

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

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

 

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

窗口最底下的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键,跳转到被调用处

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

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

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处。

双击

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

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

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

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

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

双击

远程shell会话

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

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

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

 

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

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

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

其中将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连接发送出去。

息。

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

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

 

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

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

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

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

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

12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

在sub_10004E79处的函数中,调用了 GetSystemDefaultLangID、send和 sprintf这三个API。这个函数应该重命名有意义的名字,例如 GetSystemLanguage。

 

找到函数后双击,然后使用users xrefs chart,可以查看被调用的API函数如图所示。

 

13.DllMain直接调用了多少个 Windows api?多少个在深度为2时被调用?

DllMain直接调用了 strncpy、 strnicmp、 CreateThread和 strlen这些API。进一步地,调用了非常多的API,包括 Sleep、 WinExec、 gethostbyname,以及许多其他网络函数调用。

 

注意Dllmain不是Dllentrypoint

 

 

14.0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

恶意代码会休眠30秒。

 

点进去可以看到

加上0D

乘法 3E8h(十进制1000)

16进制计算器进行计算

30000毫秒 30秒

 

15.在0x10001701处是一个对 socket的调用。它的3个参数是什么?

三个参数分别是6、1和2。

 

这里需要注意的是参数的顺序 为2,1,6

 

16.使用MSDN页面的 socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?

它们对应的3个符号常量分别是IPPROTO_TCP、 SOCK_STREAM和 AF_INET。

 

 

比较容易理解

17.搜索in指令( opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行 Vmware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测Vmware的证据吗?

在0x100061DB和0x564D5868处分别调用了in指令,用于检测虚拟机。使用交叉引用,还可以在调用函数中发现 Found Virtual Machine字符串。

 

输入ED 选择查找所有

 

 

 

 

 

18.将你的光标跳转到0x1001D988处,你发现了什么?

在0x1001D988处可以看到一些看起来随机的数据。

 

随机的数据

 

 

19.如果你安装了 IDA Python插件(包括 IDA Pro的商业版本的插件),运行Lab0501py,一个本书中随恶意代码提供的 IDA Pro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?

如果运行Lab05-01.py,会看到这段数据被反混淆得到一个字符串。

 

配置

自带的idc 天生就认识

 

20.将光标放在同一位置,你如何将这个数据转成一个单一的ASCI字符串?

按下A键,就可以将其变为一个可读的字符串了: xdoor is this backdoor, string decoded for Practical Malware Analysis Lab : )1234.

21.使用一个文本编辑器打开这个脚本。它是如何工作的?

该脚本的工作原理是,对长度为0x50字节的数据,用0x55分别与其进行异或,然后用 PatchByte函数在 IDA Pro中修改这些字节。

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页