Lab 9-1
https://blog.csdn.net/weixin_41487541/article/details/123198110?spm=1001.2014.3001.5502
Lab 9-2
1. 在二进制文件中,你看到的字符串是什么?
首先使用peid进行查看,发现无壳。IDA打开Lab09-02.exe之后查看字符串:
可以看到有一些分配失败提示。
2. 当你运行这个二进制文件时,会发生什么?
什么都不会发生。
3. 怎样让恶意代码的攻击负载运行?
首先IDA中进行静态分析
可以看到获取当前可执行文件的路径函数,又调用了_strrchr函数查找在GetModuleFileNameA函数返回的路径中,最后一个‘\’的位置,使用_strcmp进行字符串比较,若相同则进入loc_40124C,不同则执行结束。
使用OD动态分析,看看获取到的字符串都是什么:
在执行到00401236处的字符串比较函数时,注意栈上的两个字符串,就是 _strcmp所需的字符串参数。Lab09-02.exe为GetModuleFileNameA函数和_strrchr函数所获取的,ocl.exe为固定的。所以比较失败,程序会直接结束,也就是因为这样,程序运行后什么都不会发生。为了继续使得程序执行,更改Lab09-02.exe名为ocl.exe。在OD中00401240处下断点查看程序EIP
此时EIP指向40124C。
4. 在地址0x00401133处发生了什么?
初始化了两个字符串,Str = 1qaz2wsx3edc ;Str1 = ocl.exe
5. 传递给0x00401089的参数是什么?
IDA中找到目标函数,可知一个是int类型的ecx,一个是string类型的Str。
OD中在004012BD处下断点,观察栈中内容:0012FC6C和0012FC70既是两个参数。
6. 恶意代码使用的域名是什么?
IDA中跟进004012BD处的sub_401089函数,能够看出这个是for循环的结构 。
OD中步进该函数看看循环完成后的结果
观察eax可知域名为www.practicalmalwareanalysis.com。
7. 恶意代码使用什么汇编函数来混淆域名?
观察问题6中的for循环,这就是for循环中的主体执行语句,可以看到有很多逻辑操作。所以程序使用Str参数来混淆域名。
Lab 9-3
1. Lab09-03.exe导入了那些DLL?
peid查壳发现无壳,StudyPE打开二进制文件。
再使用IDA打开二进制文件,找到导入模块中的LoadLibraryA函数(该函数将指定的模块加载到调用进程的地址空间中,通常被恶意软件用来加载DLL)双击该函数并查看其交叉引用。
发现有两处调用了LoadLibraryA,跟进分析
可以看到分别加载了DLL3.dll和user32.dll,所以一共导入了6个DLL。
2. 3个DLL要求的基地址是多少?
3个DLL基地址都是10000000。
3. 当使用OllyDbg调试Lab09-03.exe时,为3个Dll分配的基地址是什么?
IDA中分析Lab09-03.exe,查看内存窗口。
DLL2基地址为003D0000,DLL1基地址为10000000。这与上一题StudyPE中查看的结果不同,这是由于PE装载所导致的。同时,不同操作环境地址也可能不同。DLL3是通过LoadLibraryA动态加载的,OD中在0040103C处下断点,单步步过之后再次查看内存窗口。
DLL3基地址为00440000。
4. 当Lab09-03.exe调用DLL1.dll中的一个导入函数是,这个导入函数都做了些什么?
IDA分析Lab09-03.exe,发现在00401006处调用了DLL1Print。StudyPE查看DLL1的导出表,发现也只有一个导出函数DLL1Print。
IDA打开DLL1.dll,找到DLL1Print函数。发现该函数调用sub_10001038之前压入了两个参数,其中一个是字符串"DLL 1 mystery data %d\n",一个是dword_10008030中的内容。通过%d推断sub_10001038是一个输出函数,dword_10008030既是输出的数据。
双击dword_10008030查看其交叉引用,跟进第一条条目查看。dword_10008030既是GetCurrentProcessId函数的返回值,也就是当前进程的Pid。
所以Dll1Print函数就是打印出 DLL 1 mystery data "进程id"。
5. 当Lab09-03.exe调用WriteFile函数时,它写入的文件名是什么?
首先在IDA中找到WriteFIle函数,其中0040102B处的ecx是WriteFile要写入的文件句柄参数,找到ecx的内容,也就找到了写入的文件名。不难发现ecx就是DLL2ReturnJ函数的返回值。
IDA打开DLL2.dll,定位到DLL2ReturnJ函数。发现dword_1000B078处的内容既是函数返回值,双击dword_1000B078查看其交叉引用。
跟进第一条条目,发现CreateFileA函数创建了一个temp.txt文件。所以WriteFIle函数写入的文件名就是temp.txt。
6. 当Lab09-03.exe使用NetScheduleJobAdd函数创建一个job时,从哪里获取第二个参数的数据?
IDA中定位到调用NetScheduleJobAdd处,第二个参数即为ecx所代表的Buffer,该参数是指向描述要提交的job的AT_INFO结构的指针。在Lab09-03.exe的分析中没有看到对[ebp+Buffer]的赋值,但是在00401068处看到对DLL3GetStructure函数的调用,结合NetScheduleJobAdd参数来猜测,第二个参数可能由DLL3中的DLL3GetStructure获取。
IDA打开DLL3,定位到DLL3GetStructure函数。看到对内存中dword_1000B0A0的处理,查看此处的交叉引用。
跟进第一条条目。
可以看到此处是一些数据的赋值,该区域也就是问题答案。NetScheduleJobAdd函数的第二个参数是一个结构体_AT_INFO,在IDA中结构体窗口中增加该结构体:点击Insert,选择 Add standard structure,选择_AT_INFO。
然后点击1000B0A0处进入内存窗口, 点击Edit下的Struct var,然后选择刚刚添加的结构体。
然后回到刚才分析的1000B0A0处IDA可以识别出该结构体。
其中AT_INFO结构体
所以NetScheduleJobAdd函数的第二个参数来自DLL3中的DLL3GetStructure函数。
7. 在运行或调试Lab09-03.exe时,你会看到Lab09-03.exe打印出三块神秘数据。三个神秘数据分 别是什么?
DLL1打印的数据第四问中以分析过。IDA中分析Lab09-03.exe时,可以看到分别对DLL2Print和DLL3Printhh函数的调用。
IDA打开DLL2,定位到DLL2Print函数。同第四问中分析的一样,可以看到在调用sub_1000105A函数前压入了两个参数:"DLL 2 mystery data %d\n"和eax。
查看dword_1000B078处的交叉引用。
跟进第一条条目。
可以看到dword_1000B078存放的既是对temp.txt文件创建后的句柄。
IDA打开DLL3,定位到DLL3Print。
查看offset WideCharStr处的交叉引用并跟进。
MultiByteToWideChar函数将字符串映射到 UTF-16(宽字符)字符串,10001004处将ping www.malwareanalysisbook.com在内存中的偏移地址保存,然后利用MultiByteToWideChar函数将刚才的偏移地址进行字符串转换,返回值既是WideCharStr。
DLL1中的神秘数据是当前进程的PID。
DLL2中的神秘数据是temp.txt的句柄。
DLL3中的神秘数据是ping www.malwareanalysisbook.com在内存中的地址。