Q
Lab09-02:使用OllyDbg分析恶意代码Lab09-02.exe,回答以下问题。
1.在二进制文件中,你看到的静态字符串是什么?
2.当你运行这个二进制文件时,会发生什么?
3.怎样让恶意代码的攻击负载(payload)获得运行?
4.在地址0x00401133处发生了什么?
5.传递给子例程(函数) 0x00401089的参数是什么?
6.恶意代码使用的域名是什么?
7.恶意代码使用什么编码函数来混淆域名?
8.恶意代码在0x0040106E处调用CreateProcessA函数的意义是什么?
Lab09-03:使用OllyDbg和IDAPro分析恶意代码文件Lab09-03.exe.这个恶意代码加载3个自带的DLL(DLL.dl、DLL2.dll、 DLL3.dll) ,它们在编译时请求相同的内存加载位置。因此,在OllyDbg中对照IDA Pro浏览这些DLL可以发现,相同代码可能会出现在不同的内存位置。这个实验的目的是让你在使用OllyDbg看代码时可以轻松地在IDA Pro里找到它对应的位置。
- Lab09-03.exe导入了哪些DLL?
- DLLI.dll、 DLL2.dll、 DLL3.dll 要求的基地址是多少?
- 当使用OllyDbg调试Lab09-03.exe时,为DLLI.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?
- 当Lab09-03.exe调用DLLI.dll中的一个导入函数时,这个导入函数都做了些什么?
- 当Lab09-03.exe调用WriteFile函数时,它写入的文件名是什么?
- 当Lab09-03.exe使用NetScheduleJobAdd创建-一个job时,从哪里获取第二个参数的数据?
- 在运行或调试Lab09-03.exe时,你会看到Lab09-03.exe打印出三块神秘数据。DLL 1的神秘数据, DLL 2的神秘数据,DLL 3的神秘数据分别是什么?
- 如何将DLL2.dll加载到IDA Pro中,使得它与OllyDbg使用的加载地址匹配?
A
Lab09-02
1、在IDA Pro中查看strings,看到的是一些报错字符串和导入函数名称,参考答案以后发现还有cmd
字符串。这是因为IDA Pro
的strings窗口显示的字符串默认最小长度是5,需要在setup里面设置。(Unicode选项也比较常见,记得选上),也可以使用strings.exe
程序
2、运行程序很快就退出,使用Process Monitor
捕获到了一些文件操作和注册表操作,没有太多有价值的信息。
3、运行之前将文件命名为ocl.exe
,看IDA伪代码很清晰。
也可以动态运行,在00401240
执行之前改ZF
寄存器为1。改变程序执行逻辑,相当于把文件名给改成了ocl.exe
4、在地址0x00401133
处是在栈上创建了字符串,这个字符串在后面被用来混淆域名。
5、在此处传入的参数是1qaz2wsx3edc
和一个缓冲区。
在0x4012BD
处打断点,查看栈上数据
6、攻击者使用的域名是www.practicalmalwareanalysis.com
,添加断点到0x4012CC
处,观察栈上数据。
7、解密域名的主要逻辑在sub_401089
,通过字符串1qaz2wsx3edc
异或加密过的域名信息来完成解密工作。
8、这部分代码显然是一个反向shell,将cmd的输入,输出,错误绑定到socket,并且wShowWindow
被赋值为0,不显示窗口。
Lab09-03
1、有六个导入的DLL,导入表中有四个,LoadLibrary函数调用了两个。
查看交叉引用
2、三个文件基址都是要求0x10000000
,使用PEView
查看即可。
3、基址如下图所示
DLL1和DLL2在导入表中,都是被立即加载的,DLL3是被动态调用的。在0x004010417
下断点。在OD的内存映射界面查看基址重定位的结果,只有DLL1在预定的0x10000000
位置。
4、
运行程序结果如下。
IDA Pro中查看DLL1,查找dword_10008030
的交叉引用 ,看是什么时候被赋值的。发现是调用了GetCurrentProcessId
以后的结果。
OD中动态运行,拿到的进程ID是0xBC8
(十进制3016)
接下来用Process Monitor验证一下,重新调试程序
而且新建了文件temp.txt
,文件内容是malwareanalysisbook.com
同理分析DLL2的两个函数DLL2Print
函数打印的是CreateFileA
的执行结果,也就是文件句柄。
5、写入的文件名是temp.txt
,WriteFile
的hFile
参数是DLL2ReturnJ
返回的文件句柄。
6、第二个参数是从DLL3GetStructure
函数返回的一个指向全局变量stru_5EB0A0
的指针,通过查询MSDN中NetScheduleJobAdd
的参数发现第二个参数是一个名为AF_INFO
的struct
??梢栽?code>Structures窗口添加一个结构体(使用快捷键Insert
)
进入stru_5EB0A0
的内存位置,选择Edit -> Struct Var
。
7、可以看到DLL3打印出的是宽字符串的地址转换为十进制的结果。在调用00401041 FF15 20504000 call dword ptr ds:[<&KERNEL32.LoadLibrar>;
之后 DLL3的_DllMain就执行完毕了,这时候就能根据内存映射界面DLL3的基址加上0xB0c0
的偏移找到内存中的宽字节字符串了。
7、神秘数字上面已经分析完毕。
8、在加载到IDA Pro时候,选择手动加载(Manual Load),如下。
可以看到此时IDA Pro中显示的地址就和OD中的地址一致了。