步骤1:静态分析准备与MAP文件生成
首先使用Strings工具扫描Lab09-02.exe,发现静态字符串中仅包含1qaz2wsx3edc和ocl.exe,未发现明显的域名明文。接着启动IDA Pro加载样本,在入口函数列表中定位到main函数地址为0x401128。为了提高动态调试时的代码可读性,在IDA中点击菜单栏File->Produce file->Create MAP file,导出包含函数符号信息的MAP文件,保存至本地目录。
步骤2:OllyDbg环境配置与初始断点设置
启动OllyDbg调试器,按F3键打开Lab09-02.exe文件。点击右键菜单选择插件LoadMapEx,加载步骤1中导出的MAP文件,此时汇编代码中的地址旁将显示具体的函数名称。按下Ctrl+G快捷键,输入目标地址0x401128跳转到主函数入口处,按下F2键在该地址设置断点。最后按F9运行程序,程序成功中断在入口点。
步骤3:分析文件名校验导致退出的问题
按F8单步执行指令,观察底部的堆栈窗口。首先看到程序压入了两个字符串参数:1qaz2wsx3edc和ocl.exe。继续F8步过GetModuleFileNameA函数调用,并在内存窗口中查看缓冲区,确认程序成功获取了当前完整路径。随后程序调用strrchr查找最后一个反斜杠,紧接着调用strcmp将提取的文件名与ocl.exe进行对比。由于当前文件名为Lab09-02.exe,对比结果不为0,导致程序执行exit指令直接退出。
步骤4:绕过校验并触发网络行为
关闭调试器,将样本文件重命名为ocl.exe。在OllyDbg中重新加载该文件,再次运行至strcmp指令处。此时校验通过,程序未发生跳转退出。继续向下执行,在底部的模块列表窗口中可以观察到程序动态加载了ws2_32.dll、mswsock.dll等网络通信库,说明Payload已被触发。
步骤5:解密C2域名分析
继续执行至地址0x00401133,此处有一条CALL sub_401089指令。在调用前检查堆栈窗口,确认传入的参数分别为:密文缓冲区地址和密钥字符串1qaz2wsx3edc的指针。按下F7步入sub_401089函数内部,通过单步执行观察寄器变化,确认算法为循环异或(XOR)。执行完该函数返回后,在数据窗口跟随EAX寄存器,查看解密后的内存数据,成功还原出明文字符串www.practicalmalwareanalysis.com。
步骤6:验证进程创建行为
继续向下跟踪代码至地址0x40106E,此处调用了CreateProcessA。通过查看栈中传入的参数,可以确认恶意代码正在准备创建新的子进程。结合网络连接行为,判断该步骤旨在下载执行后续的恶意载荷或建立反向Shell,完成恶意功能的最终落地。
实验结果
本实验成功复现了恶意样本Lab09-02.exe的运行逻辑。初始运行时程序瞬间退出,经动态调试确认是因为文件名不符触发了基于strcmp的自毁机制。将文件重命名为ocl.exe后,程序顺利通过校验并加载了网络库。通过在地址0x00401133处跟踪关键函数调用,利用硬编码密钥1qaz2wsx3edc成功解密出了隐藏的C2域名www.practicalmalwareanalysis.com。最后,验证了程序在0x40106E处通过CreateProcessA创建子进程的行为,完整还原了其从自检到外联的攻击链。
个人收获 通过本次实验,我深刻体会到了动静结合分析在恶意代码逆向中的重要性。利用IDA导出MAP文件辅助OllyDbg调试,极大地提升了代码阅读效率和定位速度。技术上,我掌握了识别简单异或加密的方法,理解了文件名校验作为一种基础的反分析手段如何影响程序流。此外,熟练运用OD的断点、内存查看和堆栈分析功能,使我对恶意代码的底层机制和C2架构有了更直观、深入的理解。
本文作者:Linxiong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!