13.1 Lab16-01
首先,将可执行文件拖入IDA中。
我们可以看到有三处都调用了sub_401000函数,并且代码都在哪里停止执行。由于没有一条线从这些方框中引出,这就意味着函数可能终止了程序。
右侧每一个大框中都包含一个检查,这个检查决定是调用sub_401000函数,还是让恶意代码继续运行。
函数sub_401000非常可疑,因为没有从它返回运行,所以进一步研究这个函数。
函数sub_401000以一个_exit调用结束,终止了这个恶意代码。ShellExeuteA调用通过参数/c del Lab16-01.exe,启动cmd.exe,从硬盘上删除恶意代码。ton过检查,我们发现79个对sub_401000函数的交叉引用,其中大多数是来自于上图中的反调试代码。
BeingDebugged标志
用位置fs:[30]将PEB结构载入EAX,然后取第二个字节并一如BL寄存器。
进程在运行一个调试器时,PEB结构中偏移量2处的BeingDebugged属性被设置为1,单位了恶意代码在调试器中正常运行,我们需要将其置为0.首先,我们选择手动设置。
首先,dump指令到达BeingDebugged处。
:::success
dump fs:[30]+2
:::
使用插件。
ProcessHeap标志
** **
使用fs:[30]将PEB结构载入到EAX中,然后将偏移0x18处的ProcessHeap移入EAX中,然后ForceFlags(ProcessHeap偏移0x10)移入EAX,将ForceFlags与0比较。
在这个位置上,IDA加入了错误指令db 3Eh,可以使用显示机器码的方法来试验。
:::success
dump ds:[fs:[30]+0x18]+0x10
:::
可以手动也可以使用插件,将此处改为0填充。
NTGlobal标志
用fs:[30]将PEB结构载入EAX中,访问NTGlobalFlag并将其移入EAX处。比较NTGlobalFlag与0x70,然后进行判定。
使用如下命令到达NTGlobalFlag处。
:::success
dump fs:[30]+0x68
:::
也可以使用插件。
题目
- 这个恶意代码使用了哪些反调试技术?
恶意代码通过检查BeingDebugged、ProcessHeap,以及NTGlobalFlag标志的状态来判断自己是否运行在调试器中。
- 当每种反调试技术成功执行时,有什么现象
如果恶意代码的任意一种反调试技术成功,那么它将终止,并从硬盘上删除自身。
- 如何应对这些反调试技术?
在恶意代码运行过程中,你可以使用IDAPro手动修改这些跳转标志,但这样往往事倍功半,因为恶意代码会非常频繁地检查内存结构。替代方法是手动或者使用PhantOm或ImmunityDebugger(mmDbg)PyCommandhidedebug之类的OllyDbg插件来修改恶意代码检查的这些数据结构。
- 如何在调试过程中手动修改检测的数据结构
用OllyDbg单步转储并修改这些结构,入上分析过程所示。
- 哪一种OllyDbg插件可以帮你逃避恶意代码的反调试技术?
OllyDbg的插件PhantOm和ImmDbgPyCommandhidedebug都可以逃避这些恶意代码的检查。
13.2 Lab16-02
题目
- 在命令行中运行Lab16-02.exe时,会发生什么?、
显示需要4字节的密码。
- 当使用猜测的命令参数运行Lab16-02.exe时,会发生什么?
显示密码错误。
- 命令行密码是什么?
- 使用IDAPro加载Lab16-02.exe。在main函数的何处可以找到strncmp函数?
0x0040123A.
- 在默认设置下,将这个恶意代码加载到OlyDbg中会发生什么?
用OllyDbg的默认设置将程序载入OllyDbg时,程序会立即终止。
- Lab16-02.exe中PE结构的独特之处是什么?
使用PEID进行查看。
存在一个.tls节,说明这个程序可能存在反调试技术。
- 回调(callback)发生在哪些位置?(提示:在IDAPro中使用Ctrl+E组合键。)
- 恶意代码使用哪一种反调试技术使它在调试器中立即终止运行?如何避免这种检查?
查看回调函数。
检查类名,如果是“OllyDbg”就退出。
使用spy++查看。类名确实是OllyDbg。
可以使用PhantOm插件进行绕过。
这样就可以绕过了。
- 当你禁用反调试技术后,你在调试器中看到的命令行密码是什么?
使用OD启动程序,跳转到字符串对比的位置。
密码应该是前4个字节,byrr。
- 调试器中找到的密码在命令行中运行有效吗?
使用bzrr,成功。(所使用的的OllyDbg插件较为完善,反调试技术被自主清除。)
- 哪种反调试技术为调试器和命令行设置不同的密码?如何防御它们?
OutputDebugstringA的结果和BeingDebugged的属性被用作解码算法的输入。可以使用PhantOm插件,确保BeingDebugged属性被置为0,并且你可以使用NOP替换0x401051处add指令。
13.3 Lab16-03
题目
- 当使用静态分析法分析这个二进制文件时,你看到了哪些字符串?
看到了导入函数,还有/c del、>>NULL、cmd.exe字符串。
- 当运行这个二进制文件时会发生什么?
没有发生什么。
- 如何重命名它,才能使这个二进制文件正常运行?
使用OD跳转到字符串对比位置。OD里把反调试的这个jle跳转给换成jmp跳转即可绕过本反调试,拿到真正的文件名:
所以重命名为peo.exe即可。
- 这个恶意代码使用了哪些反调试技术?
QueryPerformanceCounter技术
GetTickCount技术。
在这之后紧接着调用了函数sub_401300:和之前的反调试一个路子,不过如果发现在调试了会触发自我删除,一样可以修改跳转条件来绕过。
- 对每一种反调试技术而言,如果恶意代码确定它运行在调试器中,它将做什么?
对于QueryPerformanceCounter反调试,会修改判断的字符串;对于GetTickCount反调试,会产生导致程序奔溃的异常;对于rdtsc反调试,会触发自我删除程序
- 为什么反调试技术在这个恶意代码中能够成功?
通过使用SEH异常,使得程序在调试器中运行比实际中慢得多,从而确保这种反调试能够成功。
- 恶意代码使用了什么域名?