步骤1:入口点定位与断点设置
首先使用IDA Pro打开目标文件Lab09-02.exe,分析并确认main函数的入口地址为0x00401128。启动OllyDebug,按F3快捷键载入Lab09-02.exe。在反汇编窗口中按下Ctrl+G,输入地址0x00401128跳转至主函数入口,按下F2键在该处设置断点。
步骤2:运行程序并观察栈数据
按下F9键运行程序,程序中断在断点处。连续按F8(单步步过)执行,观察反汇编窗口中的一系列mov指令,这些指令正在将字节数据写入栈空间。注意栈中出现两次0(字符串结束符),这表明程序正在栈上构建两个独立的字符串。
步骤3:内存窗口查看隐藏字符串
在堆栈窗口中右键点击存放数据的地址,选择“数据窗口中跟随”。持续按F8执行,直到内存窗口中数据写入完毕。此时可以清晰地看到在栈上生成的两个字符串:一个是1qaz2wsx3edc,另一个是ocl.exe。
步骤4:API函数参数与返回值分析
继续按F8执行至GetModuleFileNameA函数调用处。在调用前观察堆栈中的参数,确认第二个参数是用于存储路径的缓冲区,第三个参数是缓冲区长度。执行该函数后,在内存窗口跟随缓冲区地址,发现该位置已被写入当前程序的完整路径(如桌面路径+Lab09-02.exe)。
步骤5:IDA结合OD识别未知函数
执行至地址0x00401217处,遇到一个未知调用函数。此时切换到IDA Pro查看该地址对应的函数,确认为strrchr,用于查找字符串中最后一次出现指定字符的位置。为了在OD中显示该函数名,在IDA中点击File -> Produce file -> Create MAP file...导出符号文件。回到OD,使用插件LoadMapEx加载该MAP文件,此时反汇编窗口中原本未识别的地址已显示为strrchr。
步骤6:触发条件分析与验证
继续按F8执行至strcmp函数处。观察堆栈窗口,发现该函数正在比较两个字符串:一个是通过GetModuleFileNameA获取的当前文件名(如Lab09-02.exe),另一个是之前在栈中构建的ocl.exe。
分析可知,程序逻辑要求当前文件名必须为ocl.exe才能继续执行Payload。将Lab09-02.exe重命名为ocl.exe并运行,通过Process Explorer观察到程序未直接退出,而是持续运行,成功触发了恶意负载。
实验结果
通过OllyDebug动态调试,成功在内存地址中定位到了恶意代码构建的两个关键字符串1qaz2wsx3edc和ocl.exe。分析发现,程序调用GetModuleFileNameA获取自身路径,并使用strrchr提取文件名,随后通过strcmp将当前文件名与ocl.exe进行严格比对。当文件名不匹配时程序直接退出,只有在将程序重命名为ocl.exe后,才绕过了自我检测,成功激活了恶意代码的后续攻击负载。
个人收获 本次实验深刻体会到了动静结合分析的高效性。通过IDA导出的MAP文件解决了OD无法识别系统函数符号的问题,极大地提升了代码可读性。同时,掌握了栈数据追踪技巧,理解了恶意代码利用栈空间动态构建敏感字符串以对抗静态字符串扫描的手段。此外,通过分析文件名自校验逻辑,我对恶意代码的反调试和环境检测机制有了更直观的认识。
本文作者:Linxiong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!