序言:
这几天有点感冒,看反汇编代码就头晕,看不下去了休息、休息浪费了一天比赛时间。算法在比赛结束前已经搞得清清楚楚,只可惜没来得及用python写个高效率穷举的程序。在群里发誓要把它破出来,所以现在补上破文,以免浪费了时间和精力。对第三段注册码的穷举我使用了彩虹表(索引)的办法,弥补了python执行效率低的问题,脑洞大开,代码都贴上了,希望思路可以供今后借鉴。
本题作者构思全面,涵盖了TLS、虚拟机、内存校验、SMC、多线程、密码学算法(RSA)、大数运算等反调试、反分析手段。难度算高的了,也许作者是奔着防御组冠军去的,如果对算法第三段部分再进行严谨构思,应该算很棒的作品了。
按以往惯例,文章末尾都会总结一下,本文破例,就写在前面了,需要建议各位新手的是对付这样的算法很复杂、流程很乱的作品,应合理使用OD的RUN跟踪功能,记录执行过的每条重要指令和跳转,动态记录注释信息和寄存器内容,随时重放函数和执行流程,助你准确调试分析,动态图演示一下:
一、查壳、PE格式,了解作品(套路了)
//查壳 Microsoft Visual C/C++(2005)[msvcrt]
//算法侦查:Big number:406490 Referenced at 40213C-->提示了作品可能包含大数运算
//PE格式检查:TLS 3 FUNC:402D00 402D20 402D30 -->提示了作品可能利用TLS反调试
//双击运行查看界面,命令行模式,输入错误注册码,弹出对话框,运行时间略久,怀疑计算量不少
二、TLS反调试
//OD载入,断TLS,勾选隐藏OD插件配置,TLS跟踪一遍发现对开了插件的OD没有影响,开了很多线程,比较卡。
三、主流程、VM分析
粗略翻一下代码,找到402D40关键函数,在402D40下断
很快就能跟到虚拟机部分:
//ECX指向了下表Array1
//ESI指向了下表Array2,[ESI+0x14]指向了EIP,EIP包含操作数同时又指向了函数入口
//Array2表整理如下:
//Array1表整理如下:
//还原VM程序如下:
//断点403571就可以跟踪到虚拟机每次调用的函数入口
四、算法流程一:根据第三节VM,搞清楚 CALL 402700 才可完成破解
//现在重新开始,断点 402700 的末尾附近貌似死循环的位置,等待全局变量赋值
//赋值了全局变量[0x99B6EC]为1,改变了线程1的流程,线程1将此处末尾代码进行SMC,
//断点会出问题,必须跟踪线程1,待线程1修改完代码后再来此处断点继续跟踪算法流程。
//线程1,修改主算法流程末尾代码
//现在SMC之后,流程才能显现出来
//线程1将全局变量重新置0,主流程算法可以继续
//子算法程序,为了避免RDTSC反调试,可以断点在00401EFE
//密文与表A异或20字节,变成密文2:(假设输入“12345678”)
//1549780652036258484424751705102781884386113 / 98765432109876543210123 = 15691529100101820131
//也就是说倒过来要求密文1前20字节为:(21、22、62、63字节密文已经在上文推理出)
//“PWU]TSUQXZ[]]_WBAC@E”
//进行穷举注册码明文前28位:(结果已剔除特殊符号)
//即注册码前28位:UFdVXVRTVVFYWltdXV9XQkFDQEUt
五、算法流程二
//也就是作者希望我们能够求解这个大数的开根号结果
//13095069099216326605010245808779535277211541324456558063162414338128147458401^0.5 =
//114433688655117320765854989491151409201
//算出密文23-61字节:(21、22、62、63字节密文已经在上文推理出)
//PSWPVUQPQ\^Y\_XCCBDB@NBL@BXVZUTSV\YSY\\
//穷举注册码第29-84位穷举:(已剔除特殊符号)
//即注册码前84位:UFdVXVRTVVFYWltdXV9XQkFDQEUtLVBTV1BWVVFQUVxeWVxfWENDQkRCQE5CTEBCWFZaVVRTVlxZU1lcXC0t
六、算法流程三(本题最难的部分)
//断4022C5
//中间有些格式转换
//最后CALL 401A90出来在4023C7处比较密文是否如下:
//跟到如下关键算法
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课