恶意代码分析实战第9章实验

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在内存中的地址。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值