selph
selph
Published on 2021-09-23 / 467 Visits
0
0

160个Crackme系列-002-Afkayas.1

上次打算挑战这160个CM,结果做了几个就没再动了,这次补了点基础我又回来了,这次我将再一次挑战160个CM,争取今年年底之前完成攻略!加油!

之前写的002太烂了,这次从002开始全部重写!

环境准备

  • Windows 10 21H1 虚拟机
  • Detect It Easy
  • IDA
  • x32/x64dbg

收集信息

程序运行需要msvbvm50.dll,去网上随便下一个放到程序同目录下就ok

接下来,DIE查一下:

image-20210923172530427

32位GUI程序,用VB5.0写的,无壳

VB程序是我第一次遇到,搜一下VB逆向相关文章,也许会有所帮助:VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)

image-20210923174550505

用户名+序列号的登录形式,破解方式有两种:

  • 暴力破解,修改验证逻辑
  • 逆向序列号生成算法,自己算序列号

本题的暴力破解太简单了,就不介绍了,在逆向程序逻辑的时候改一下跳转就行,这里以逆程序密码生成和验证为主。

逆向序列号生成算法

IDA 先上,因为点击OK了以后,会有对话框弹出,在IDA里导入表搜VB的对话框函数名:rtcMsgBox

由查阅资料(收集信息那里有写)可知,函数名是rtcMsgBox,函数的调用特征是,连着lea和push 总共5个参数然后call然后隔一行紧接着另一个call

image-20210923185832664

然后ctrl + x该函数查看交叉引用,找到调用的地方:

image-20210923185845152

有四个地方调用了这个函数,随便进一个看看:

image-20210923190204441

嗯,找对地方了,往上找一找,找到判断逻辑上面看看:

image-20210923191740090

简单分析了一下,这里大概是把一个变量拿出来和"AKA-"进行拼接,然后把拼接后的结果和另一个变量进行对比

接下来动态分析看看,根据搜索字符串找到函数地址,然后往上翻一翻,找到刚刚静态分析不太确定的地方下断点,窗口里随便输入点啥让程序断下来,这里是判断逻辑:

image-20210923192923140

红框处是跳转判断的地方,判断用的si的值来源于上面字符串对比,如果对比成功返回0,补码是0,inc之后是1,就会不进行跳转,否则对比失败返回1,补码是FFFFFFFF,inc之后变成了0,ZF=1,会触发je跳转

这里的正确密码在之前就计算好了,这里代码只是判断逻辑,要直到正确密码是怎么来的,继续往上找。

image-20210923220105144

这里的密码生成逻辑是相当简单了:

  1. 获取字符串长度 length
  2. 计算中间值,mid1 = length * 0x17cfb
  3. 取出首字母ascii值 val
  4. 再次计算中间值,mid2 = mid1 + val
  5. 将mid2转换成十进制,转换成字符串
  6. 拼接AKA-,变成AKA-mid2

这里我用户名的首字母是s,计算:5 \* 17cfb + 73 = 7715A,转换成十进制:487770,密码为:AKA-487770

测试:

image-20210923221426046

参考资料

VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)

ASCII Code - The extended ASCII table (ascii-code.com)


Comment