上次打算挑战这160个CM,结果做了几个就没再动了,这次补了点基础我又回来了,这次我将再一次挑战160个CM,争取今年年底之前完成攻略!加油!
之前写的002太烂了,这次从002开始全部重写!
环境准备
- Windows 10 21H1 虚拟机
- Detect It Easy
- IDA
- x32/x64dbg
收集信息
程序运行需要msvbvm50.dll,去网上随便下一个放到程序同目录下就ok
接下来,DIE查一下:
32位GUI程序,用VB5.0写的,无壳
VB程序是我第一次遇到,搜一下VB逆向相关文章,也许会有所帮助:VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)
用户名+序列号的登录形式,破解方式有两种:
- 暴力破解,修改验证逻辑
- 逆向序列号生成算法,自己算序列号
本题的暴力破解太简单了,就不介绍了,在逆向程序逻辑的时候改一下跳转就行,这里以逆程序密码生成和验证为主。
逆向序列号生成算法
IDA 先上,因为点击OK了以后,会有对话框弹出,在IDA里导入表搜VB的对话框函数名:rtcMsgBox
由查阅资料(收集信息那里有写)可知,函数名是rtcMsgBox,函数的调用特征是,连着lea和push 总共5个参数然后call然后隔一行紧接着另一个call
然后ctrl + x
该函数查看交叉引用,找到调用的地方:
有四个地方调用了这个函数,随便进一个看看:
嗯,找对地方了,往上找一找,找到判断逻辑上面看看:
简单分析了一下,这里大概是把一个变量拿出来和"AKA-"
进行拼接,然后把拼接后的结果和另一个变量进行对比
接下来动态分析看看,根据搜索字符串找到函数地址,然后往上翻一翻,找到刚刚静态分析不太确定的地方下断点,窗口里随便输入点啥让程序断下来,这里是判断逻辑:
红框处是跳转判断的地方,判断用的si的值来源于上面字符串对比,如果对比成功返回0,补码是0,inc之后是1,就会不进行跳转,否则对比失败返回1,补码是FFFFFFFF,inc之后变成了0,ZF=1,会触发je跳转
这里的正确密码在之前就计算好了,这里代码只是判断逻辑,要直到正确密码是怎么来的,继续往上找。
这里的密码生成逻辑是相当简单了:
- 获取字符串长度 length
- 计算中间值,mid1 = length * 0x17cfb
- 取出首字母ascii值 val
- 再次计算中间值,mid2 = mid1 + val
- 将mid2转换成十进制,转换成字符串
- 拼接
AKA-
,变成AKA-mid2
这里我用户名的首字母是s,计算:5 \* 17cfb + 73 = 7715A
,转换成十进制:487770
,密码为:AKA-487770
测试: