好友
阅读权限10
听众
最后登录1970-1-1
|
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 pizzabamboo 于 2022-6-9 12:42 编辑
实验二 动态分析实践
【实验目的和要求】
熟悉OllyDbg和IDA Pro的使用,用其分析恶意文件,分析DLL文件的导入过程;分析DLL提供的函数的具体功能;熟悉API函数功能及其涉及到的参数理解;分析netschedulejobadd、at_info。
【实验工具】
PeEdtior、OllyDbg、IDA Pro等
【实验步骤】
1、样本导入了哪些 DLL?
一共六个:KERNEL32.dll;NETAPI32.dll;DLL1.dl1;DLL2.dll;DLL3.dll;user32.dll
直接查看到四个:
往下翻,看到DLL3.dll,带着个LoadLibraryA。于是接着找别的LoadLibraryA,能够看到还有个user32.dll
2、DLL1.dll、DLL2.dll、 DLL3.dll要求的基地址分被是多少?
都是10000000
3、DLL3.dll导入方式和前面2个DLL有何不同?
DLL3.dll是显式链接,执行过程中实时加载,执行完后卸载。前面两个是隐式链接,一开始就加载到了内存中。
4、当使用OllyDbg调试样本时,为DLL1.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?是否符合第2步DLL声明的基地址相同?为什么出现这种情况?
(OD查看-内存)
00590000,005C0000,10000000;不同;进行了基地址重定位,因为他们预设的基地址都是10000000.
5、样本调用DLL1.dll中的一个导入函数,该函数名称是什么?
KERNEL32.dll
6、分析该函数功能。(提示:分析该导入函数用到的参数及该函数调用的其他函数,如分析GetCurrentProcessId函数功能。)DLL1打印的数据是什么?
GetCurrentProcessId作用:获取当前进程一个唯一的标识符打印的数据:47600(pid)里面的指令,以及对应语句执行的寄存器状态:
6.1样本调用了WriteFile函数,分析WriteFile函数功能及其参数。
WriteFile函数功能:从文件指针指向的位置开始将数据写入到一个文件中, 如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中参数:HANDLE hFile,//文件句柄LPCVOID lpBuffer,//数据缓存区指针DWORD nNumberOfBytesToWrite,//你要写的字节数LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针
6.2当样本调用WriteFile函数时,它写入的文件名是什么,写入该文件的内容是什么?(提示:结合样本及样本导入的DLL2.dll进行分析;找到某个地址,分析不同函数对其引用;IDA中,选中某个地址,然后快捷键X键,可以显示引用于该地址的函数地址)DLL2打印的数据是什么?
要想知道WriteFile函数写入的文件名是什么,只要找到参数里的文件句柄就好。可以看到,这里的ecx存着hFile,观察前面的语句能够知道,这里的ecx肯定和DLL2ReturnJ的返回值有关。
于是我们打开DLL2.dll,找到DLL2ReturnJ函数
不难发现,这里的dword_1000B078就是返回值,我们找找看这个值
跟进第一个就能看到,CreateFileA这个函数创建了个temp.txt文件,即CreateFileA函数写入的文件名为temp.txt。如果CreateFileA成功的话,会返回一个打开的指定文件的句柄 ,这里是存在eax里面的,所以dword_1000B078就是存的temp.txt这个文件的句柄。
OD调试运行一下,打开创建的temp.txt文件,就能看到写入的内容了:
我们在IDA里面找到DLL2Print这个函数,能够发现这里压的两个参数eax和"DLL 2 mystery data %d\n"。
于是在OD里面调试一下,看看eax是什么
16进制里100就是256。所以DLL2Print打印的就是eax的值,也就是文件的句柄。
7.1当样本使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?从这里获取什么信息?
找到NetScheduleJobAdd这个函数,我们能看到第二个参数是Buffer,被存放在ecx里面,是指向AT_INFO结构的指针。这里是将[ebp+Buffer]的值付给了ecx,不过我们并不知道这个值是多少,于是找到上面的DLL3GetStructure函数,对DLL3进行调试。
找到DLL3GetStructure,发现他用eax存放返回值stru_1000B0A0,于是找一下stru_1000B0A0的值。
找到stru_1000B0A0后,添加结构体AT_INFO,然后点击Edit下的Struct var,再看的话能够识别出该结构体。
所以NetScheduleJobAdd函数的第二个参数来自DLL3中的DLL3GetStructure函数。
7.2 DLL3打印的数据是什么?
找到DLL3Print函数,发现有两个参数,我们找一下offset WideCharStr
MultiByteToWideChar函数将字符串映射到 UTF-16(宽字符)字符串,10001004处将ping www.malwareanalysisbook.com在内存中的偏移地址保存,然后利用MultiByteToWideChar函数将刚才的偏移地址进行字符串转换,返回值既是WideCharStr。
DLL3打印的是ping www.malwareanalysisbook.com在内存中的地址。
【实验小结】 扩展知识:
https://docs.microsoft.com/en-us/windows/win32/api/lmat/nf-lmat-netschedulejobadd
https://docs.microsoft.com/en-us/windows/win32/api/lmat/ns-lmat-at_info |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|