【吾爱破解2014CrackMe大赛】【第十组】
算法很简单,不过我手头上没有DES的算法库,或者说,我手头上的DES库算出的结果与源程序不一致,所以就只能算了。这里大致说一下算法吧。 代码开始验证部分都在:00402FB8,很容易就会找到的了。首先,程序会取当前的时间,运算得到一个DWORD的数字a
然后,读入用户名,与a一起运算得到另一个DWORD的数字b
对这个b进行base64加密,得到8位的字符串 #key
然后用这个key作为des的秘钥,加密 {01, 00, 00, 00, 31, 00, 00, 00}。得到key2
最后利用key2DES解码Pass,得到的Pass为一个字符串。到底内容是什么就没有继续研究了。
所以实际上算法可能会有点差异,就不说了。
因为跑到这里关键的地方就已经出现了。
00403F63 > 8B45 F8 MOV EAX, DWORD PTR SS: ;loc_403F63,Get bool
00403F66|.A2 8F534600 MOV BYTE PTR DS:[<byte_46538F>], AL ;Set Flag, 设置成功或失败标志
前面的call返回一个bool类型的数据,然后根据这个数组设置全局byte变量,,这里就是设置bSuccess了,所以就在这里下手,赋值为1就OK了。
00403F63 > 33C0 XOR EAX, EAX ;loc_403F63
00403F65 40 INC EAX
00403F66 A2 8F539090 MOV BYTE PTR DS:, AL ;Set Flag, 设置成功或失败标志
恰好空间足够,3个字节足以爆破了。
前面代码复制的时候出现了错误,实际上修改的代码就只有00403F63一句。最终的修改结果为:
00403F63 > 33C0 XOR EAX, EAX ;loc_403F63
00403F65 40 INC EAX
00403F66 A2 8F534600 MOV BYTE PTR DS:[<byte_46538F>], AL ;Set Flag, 设置成功或失败标志
补上一个keygen。算法挺简单的,程序里面虽然用了DES算法,但是keygen本身并不需要DES算法的。看一下我的记录就知道了。
大概算法如下:
fabs((年+月+日+时+分+秒)*520)-->= a(转INT 64)取int 32
(a+NameLen) --> (INT 64) = b
(b * 520 + 1314) --> (INT 64) = c
BASE64(c) = key (DES)
key2 = DESEncode("1", key);
Check = DESDecode(key2, Pass); -->>Pass = key
if(Check == 1)
Success
值得注意的是 ,注册码一秒一变,所以输入需要非常大的手速,不要紧,反正手速什么的,早就练到登峰造极了。。。哈哈,开个玩笑。
程序获取时间的位置在:
004030BE|.E8 4DA70300 CALL CrackMe.0043D810 ;分
004030DE|.E8 7DA70300 CALL CrackMe.0043D860 ; 秒
对应的改一下就可以了。
本帖最后由 Kido 于 2014-11-5 13:21 编辑
最后成绩:256分
评委评价:攻击成功。
谢谢参与,请继续加油。 学习,支持啊 学习了!楼主棒棒的 学习了!楼主棒棒的!!!!!!! 膜拜楼主啊。 学习了!楼主棒棒的 错了非常的66666
页:
[1]
2