这个题本次攻防大赛的热身题,难度不算太大,坑就坑在是vmp壳,好吧今天把这个硬骨头啃了吧 : )
首先,还是查壳,没啥说的 vmp2.0.7
根据vmp系列脱壳教程,这个壳是1.8以上的方案进行脱壳。先拖入OD,下一个API断点 VirtualProtect (教程建议是下硬件断点,可能是我的OD有问题,硬件断点断不下来,只能是F2断点了 T_T)
然后F9开始跑,测试到第5次跑飞……
那么就在第四次的时开始候单步跟踪,先跳出VirtualProtect 函数 ,然后对代码段设置,内存访问断点
然后F9继续运行,断下来后,在ESP的地方跟踪内存数据,找到SEH结构化异常的上面35C地址那块,下一个硬件写入断点,并取消之前的内存访问断点
然后继续F9运行,再次断下来,这次再在代码断下内存访问断点,然后多次F9运行,注意观察栈帧的变化,快到SEH的地方就接近OEP了,此时已经跟踪到解压后的代码段,然后进行一下代码分析。
完成分析后,代码就还原了,然后单步跟踪,发现OEP
发现OEP后,同时我们也注意到栈帧部分被压入了3条数据,这个就是VMP偷取的代码,我们需要进行还原,于是在当前位置查找一段 0000000000的内存段
然后,对VMP偷取的代码进行patch。最后跳转到OEP 也就是 jmp 012319C9
接着我们把当前的 01231FB5 设置为新的EIP,就可以进行dump内存操作了,填好起始地址和入口地址后,点击脱壳
把脱壳的文件保存为 dump.exe 然后尝试运行,发现不能运行,直接崩溃掉了
于是猜到可能是重定向表的问题造成,用PE编辑器修改一下这里,然后保存。
再次运行,OK !!
然后可以载入OD进行动态分析了。
为了方便调试,我们知道程序运行后,会提示输入字符串,那么我们先找到输入字符串的地方。
然后开始单步跟踪到这里,就是完成字符串输入后
继续跟踪,我们发现一个base64的字符串:dQkLdqXP=mLMAa8p=lnncQcq/GEPdGKXcNDl=Mnr=pcoBGPQdG1NA3Aw
那么另外一个字符串就是base64的字典了,也就是:0123456789+/=ABCDEFGHIabcdefghiJKLMNOPQRSTUVWXYZjklmnopqrstuvwxyz
于是,我们就可以根据这个对base64zi'f字符串进行解密:
坑了,竟然是乱码,还以为就这样搞定了呢,后来请教了一下大神,他说是字典有问题,于是我仔细的看了一下,确实
字典里面按说是不应该有‘=’ 这个字符的,按base64的说法这个是占位用的来补足字节数。所以按照大神的指点,我把大神的脚本用C++重新写了一遍(也是为了更好的理解反向分析的过程),终了跑出来了 T_T
最后,就是见证奇迹的时刻到了 * ^_^ *