恶意代码分析实战9-3

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战9-3相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析lab09-03.exe文件。先来看看要求解答的问题
Q1.lab09-03.exe导入了哪些dll
Q2.dll1.dll,dll2.dll,dll3.dll要求的基地址是多少
Q3.当使用Ollydbg调试Lab09-03.exe时,为dll1.dll,dll2.dll,dll3.dll分配的基地址是什么
Q4.当lab09-03.exe调用dll1.dll中的一个导入函数时,这个导入函数都做了什么
Q5.当lab09-03.exe调用WriteFile函数时,写入的文件名是什么
Q6当lab09-03.exe调用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据
Q7运行或调试lab09-03.exe时,会看到打印出三块神秘数据。dll1的神秘数据,dll2的神秘数据,dll3的神秘数据分别是什么
Q8如何将dll2.dll加载到IDA中,使得它与ollydbg使用的加载地址匹配

通过peview可以看到
分别导入了以下四个dll
在这里插入图片描述

还有些dll可能在程序运行时加载,需要ida分析,一般会需要loadlibrary

Q1.lab09-03.exe导入了哪些dll
A1.导入的dll有:kernel32.dll、NetAPI32.dll、DLLI.dll和DLL2.dl
在imports窗口找到loadlibrary
在这里插入图片描述

双击
然后ctrl+x,查看交叉引用
在这里插入图片描述

p表示函数调用,r表示读取
我们要关注的调用,先看第一个p
可以看到
在这里插入图片描述

在调用时其第一个参数是dll3.dll
再看一下第二个
在这里插入图片描述

其参数是use32.dll
那么也就是说程序其实一共导入了这六个dll
再看第二个问题
peview载入dll1.dll
在这里插入图片描述

可以看到映像基地址是0x10000000
在这里插入图片描述在这里插入图片描述

dll2,dll3都是如此
Q2.dll1.dll,dll2.dll,dll3.dll要求的基地址是多少
A2.这三个DLL都要求相同的基准地址: 0x 10000000
回答第三个问题
使用od载入
在这里插入图片描述

载入后单击m按钮,显示内存的情况,如上所示
在这里插入图片描述

在上图可以看到dll1地址为10000000,dll2地址为001d0000
这个地址是动态的,可能再做一次,或者在不同系统上就不一样了
而dll3.dll是程序中利用loadLibrary动态加载的
找到地址
在这里插入图片描述

在od中跳到401041
在这里插入图片描述

然后在其下一行下断点,执行,在点击M
在这里插入图片描述

此时就可以看到dll3的地址是001f0000
Q3.当使用Ollydbg调试Lab09-03.exe时,为dll1.dll,dll2.dll,dll3.dll分配的基地址是什么
A3.dll1地址为10000000,dll2地址为001d0000,dll3.dll地址是001f0000

为了回答第4个问题
ida载入dll1.dll
找到dll1print
在这里插入图片描述

Q4.当lab09-03.exe调用dll1.dll中的一个导入函数时,这个导入函数都做了什么
A4.DLL1Print 被调用,它打印出“DLL 1 mystery data”,随后是一一个全局变量的内容
调用了sub_10001038
跟进去
在这里插入图片描述

可以看到这个函数是有两个参数
在这里插入图片描述

第一个参数是字符串
字符串里有%d,\\n。
这种我们之前分析过,其实sub_10001038是printf
第二个参数在eax中
往上看,可知来自dword_10008030
双击查看
在这里插入图片描述

然后ctrl+x查看交叉引用
可以看到一个是w一个是r
关注的是值被改写时是什么情况,所以双击查看第一个
在这里插入图片描述

可以看到它保存的其实就是GetCurrentProcessId的返回值,也就是当前进程的id值
回到ida分析exe
在这里插入图片描述

找到了writefile
看到第一个参数是hfile,保存的是要写入的文件句柄
而第二个参数是要写入的内容,也就是malware….字符串
为了知道文件名称,所以需要分析的是第一个参数
可以看到它其实是dll2returnj的返回值
所以需要ida分析dll2.dll
先看一下dll2print
在这里插入图片描述

这里同样有打印的操作,要打印的数据保存是在eax,来自dword_1000b078
在这里插入图片描述

双击后查看交叉引用,如上图所示
分析w
双击进去
在这里插入图片描述

可以看到之前是调用了createfile,打开temp.txt的句柄就保存在dword_1000b078
前面打印函数打印也就是这个句柄
接下来分析dll2returnj
在这里插入图片描述

主要就是讲dword也就是temp.txt的句柄赋给eax,之后就返回了
回到分析exe的ida
在这里插入图片描述

可以看到,dll2reurnj返回的eax就是temp.txt文件的句柄
那么后面的writefile函数写入的文件也就是temp.txt
Q5.当lab09-03.exe调用WriteFile函数时,写入的文件名是什么
A5.写入的文件名是temp.txt
回到第6个问题
定位到相应位置
在这里插入图片描述

在调用它之前看看发生了什么
在这里插入图片描述

先是加载了dll3.dll到内存中
之后是调用getprocaddress获取dll3.dll中的dll3print的地址
之后call [ebp+var_8]来执行该函数
接着调用getprocaddress获取dll3getstructure的地址
然后call [ebp+var_10]执行该函数
我们使用ida载入dll3.dll
先看dll3print
在这里插入图片描述

和之前的分析过程一样,我们知道它要打印的数据为widecharstr
双击跟进后查看交叉引用
在这里插入图片描述

先看第一处
在这里插入图片描述

可以看到在它之前调用了Multibyteyowidechar
这个函数的作用就是将多字节的形式转换成宽字符的形式
它要转换的内容是lpmultibytestr,其实就是上面的ping…字符串
将其转换成宽字符的形式后将其保存到widecharstr
Q7运行或调试lab09-03.exe时,会看到打印出三块神秘数据。dll1的神秘数据,dll2的神秘数据,dll3的神秘数据分别是什么
A7.神秘数据1是当前进程的标识。神秘数据2是打开temp.xt文件的句柄,神秘数据3是字符串ping www. malwareanalysisbook. com在内存中的位置

接着分析dll3getstructure
在这里插入图片描述

可以看到这个函数有一个参数,将其赋给eax
结合分析exe时看到的调用
在这里插入图片描述

传入的参数是edx
而edx的值是buffer的内容
在这里插入图片描述

而这个buffer其实就是一个局部变量
也就是说在调用dll3strcture时其参数就是局部变量的地址
回到dll3.dll的分析
在获取到地址之后
在这里插入图片描述

把dword的值赋给eax指向的地址中,也就是前面说的buffer
我们跟进,查看交叉引用
在这里插入图片描述

看第一个w的
在这里插入图片描述

可以看到是一系列的move赋值的操作
这些数据的地址会保存在buffer里,而buffer保存在ecx,而之后ecx是作为netschedulejobadd的第二个参数
在这里插入图片描述

这段其实就是at_info结构体的数据
Q6.当lab09-03.exe调用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据
A6.Lab09-03.exe 从DLL3GetStructure中获取NetScheduleJobAdd调用的缓冲区,它动态地解析获得第二个参数的数据

解决最后一个问题
ida载入dll2.dll时选择manual load
在这里插入图片描述

点击ok后会要求我们输入地址
在这里插入图片描述

看看od中dll2的地址
在这里插入图片描述

为1d0000
在ida中输入
启动后如图
在这里插入图片描述

这里的地址是1d1000
是因为这是text段,这和od中看到的是一样的
在这里插入图片描述

说明ida与od加载的地址匹配了
Q8如何将dll2.dll加载到IDA中,使得它与ollydbg使用的加载地址匹配
A8.当使用IDAPro加载DLL时选择手动加载,当提示时,输入新的映像基准地址。本例中,地址是0x1d0000

参考
1.《恶意代码分析实战》

以上是关于恶意代码分析实战9-3的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战14-02

恶意代码分析实战11-2

恶意代码分析实战15-3