恶意代码分析实战第五章 IDA Pro 课后练习(1-11)
参考恶意代码分析实战一书,结合参考答案和i春秋课后题讲解视频,动手实践整理如下。
目录
2.使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?
4.将精力集中在位于0x1000757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?
5.IDA Pro识别了在0x16001656处的子过程中的多少个局部变量?
6.IDA Pro识别了在0x16001656处的子过程中的多少个参数?
7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe/c。它位于哪?
10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较如果对rootwork的字符串比较是成功的(当memcmp返回0),会发生什么?
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发送。