CrackMe_Cruehead分析
Cruehead-CrackMe-3
爆破难度:⭐⭐
算法分析难度:⭐⭐
压缩包名:003-Cruehead-CrackMe-3.rar
运行程序初步了解程序作用

没有明显的交互点,可用x64dbg运行查看
利用exeinfo pe查壳
用exeinfo pe打开该程序即可
可以看到这是一个32位的可执行程序

程序没有壳
程序执行流程


程序先判断是否有CRACKME3.KEY这个文件,如果文件不存在则直接跳过读取文件,运行主窗口程序,并且主窗口名显示位Uncracked
需要创建CRACKME3.KEY这个文件

读取文件后,将对文件的内容进行检测,这里文件里的数据大小必须为0x12个字节(18个字节)

然后再调用两个函数进行处理,最后是创建窗口并显示
总结:程序首先会先读取当前目录下的CRACKME3.KEY,CRACKME3.KEY的内容大小需要是18字节,再经过函数处理后输出结果
破解
暴力破解
根据字符串查找的方法找到关键的跳转指令,从后往前查找并进行更改尝试

这个是弹出提示破解成功指令

这个是主窗口名显示破解成功的指令

文件大小破解

文件存在破解
若不创建合规长度(18字节)的CRACKME3.KEY文件,则需要修改上面四个跳转点,完成完全破解
当创建好了文件,就只需要修改最上面的两个跳转点即可实现完全破解
当然也能够通过修改对应的寄存器或内存值达到相同的结果
算法分析
程序核心算法函数在读取文件后进行调用,跟进进行分析

前两行指令,初始化寄存器
第三行指向从文件里读取的内容,然后再给ebx低位bl初始化为0x41
进入循环处理,将文件内容与bl进行异或然后替换,并将异或的结果累加到0x4020F9上,0x4020F9的初始值为0
循环到bl为0x4f,即总共对文件里前14个字节进行处理

循环后,esi指向了后面的字节地址

函数返回后将0x4020F9的值与0x12345678进行异或并赋值给0x4020F9
再次调用函数后,将文件中第15个字节到18个字节的内容赋值给eax寄存器
最后,将eax寄存器与前面累加后0x4020F9里的值进行比较,相等的话即破解成功
下面给出生成破解文件的python脚本
a = 0x61
b = 0x00000000
c = 0x12345678
with open('CRACKME3.KEY', 'wb') as w:
for i in range(0x41, 0x4f):
# python会将0x开始的值自动转为int类型,所以需要int.to_bytes()函数将其转为二进制
w.write(a.to_bytes(1, byteorder='little')) # 设置小端字节序
b += a ^ i
w.write((b ^ c).to_bytes(4, byteorder='little')) # 第一个参数是字节数,默认为1
int.to_bytes()可以查看官方文档
总结
总体来说难道不大,整个算法还是很清晰

浙公网安备 33010602011771号