CrackMe 001-002

CrackMe001

abexcm5

爆破分析

利用智能搜索寻找关键字符串

双击进入关键的地址后,我们可以看到这里有一处跳转

(如果跳转了就是对了,没跳转就是错了)

知道了这个 只要让程序强制跳转就好了,将je改成jmp强制跳转,或者

改成jne让序列号错了才跳转

算法分析

通过暴力爆破我们已经知道程序的关键点在哪里

往上翻我们可以发现到GetDlgItemTextA函数 用于检测我们输入的序列号

我们从这里分析

GetVolumeInformationA函数 用于获取该程序所在磁盘位置的名字

同时发现字符4562 ABEX

lstecatA函数 将一个字符串追加到另一个字符串

程序继续运行可以发现程序将字符串合并

加密的地方 给dl 赋值为2 后面可以看出来是做两次循环

这里加密是给固定地址上的值加1

加密后的结果

加密后的结果再合并字符

lstrcmpA函数 比较两个字符串 相等为零

输入正确的序列号

CrackMe002

Cruehead-CrackMe-3

算法分析

首先程序会检测当前目录下有没有CRACKME3.KEY

再读取该文件

这里我们看出来他只读了18个字符

F7进call 程序的加密部分

这里可以看出它将文件内的字符和从0x41(A)开始到0x4F(N)每次加一和后面的14个字符做异或 将异或的结果累加到地址0x4020F9

函数退出后,程序将累加的结果和0x12345678异或

判断后四位字符和异或后的结果是否一致

serial=14*'a'
flag=[]
sum=0
for i in range(18):
flag.append(0)
for i in range(len(serial)):
sum+=+ord(serial[i])^(65+i)
for i in range(14):
flag[i]=serial[i]
key=hex(sum^0x12345678).replace('0x','')
print(key)
flag[17] = chr(int(('0x'+key[0:2]),16)) #小端存储
flag[16] = chr(int(('0x'+key[2:4]),16))
flag[15] = chr(int(('0x'+key[4:6]),16))
flag[14] = chr(int(('0x'+key[6:8]),16))

out = ''.join(flag)
print(out)

with open("C:\CRACKME3.KEY", "wb+") as f:
f.write(bytes(out.encode()))
f.close()

 

posted @ 2023-02-20 21:28  Map1eaf  阅读(48)  评论(0)    收藏  举报