Crackme 24

来源:互联网 发布:iphone手机编程软件 编辑:程序博客网 时间:2024/05/16 10:37

这里写图片描述
还是上个系列
首先用OD打开搜索字符串
这里写图片描述
找到字符串的位置
这里写图片描述
发现判断条件,EBX 必须等于 0xAFFCCFFB
这里写图片描述
[4012D9] 必须等于 EB 26才能破解该软件,所以只需要两个条件
这里写图片描述
那么BX的值是由谁决定的呢
这里写图片描述
代码段由谁决定的呢
这里写图片描述

#bx = 0xfbfc30a3for i in range(0x0,0x100):    for j in range(0x0,0x100):        s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:]))        s = int(s,16)        if i^s^0xfbfc30a3 == 0xaffccffb:            print hex(i)+hex(j)

我们现在缕一下思路
1.我们要注册必须跳转到注册成功的语句(机器指令必须是EB 26),跳转的语句由[4012D9]处内存决定。而内存是由下面的代码计算出来的

004012B9   .  03C3          ADD EAX,EBX                              ;  tr(name) + serial004012BB   .  3105 D9124000 XOR DWORD PTR DS:[4012D9],EAX            ;  0x00584554 ^ ax004012C1   .  C1E8 10       SHR EAX,10                               ;  ax >> 10004012C4   .  66:2905 D9124>SUB WORD PTR DS:[4012D9],AX              ;  [4012d9] - ax

2.我们要完成下面的匹配及 BX == 0xAFFCFFB,那么BX由谁决定的,由下面的代码决定的(内存4011EC –4012DC异或形成的)。一开始以为这段数据是定值,最后发现有部分位置数据有变那就是[4012D9](也在数据范围内,由上面的代码生成)

004012DD   >  AD            LODS DWORD PTR DS:[ESI]                  ;  [4011ec]004012DE   . |33D8          XOR EBX,EAX                              ;  ax ^ bx004012E0   . |49            DEC ECX

解题:
我们的突破点在第二个条件。首先计算[4012D9]内的值应为多少现在已经确定了后前个字节(EB 26)首先令前后个字节[4012DB] 、[4012DC]为00 00,然后让程序直接跑到 CMP(注:这里有个大坑,绊了我半天,当设置一般断点时 将会把内存设置为0xCC 所以在数据段中不能设断点,这也太坑了)
这里写图片描述
然后观察BX的值,可以写脚本了
这里写图片描述

#爆内存脚本#bx = 0xfbfccfa3  i = 0x58 j = 0x54for i in range(0x0,0x100):    for j in range(0x0,0x100):        s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:]))        s = int(s,16)        if i^s^0xfbfccfa3 == 0xaffccffb:            print hex(i)+hex(j)

这里写图片描述
所以那两处的内存为0x58 0x54
内存出来了我们就相当于知道了[4011D9]处的内存开始解第一点
他计算内存的算法很简单
这里写图片描述
直接写注册机,有个地方一直使得答案不正确,那就是(xor&0x0000FFFF) - shr我已开始没有加括号 然而- 的优先级大于&。
直接导致计算错误,也是调了半天

s = raw_input("name:")name = s+'\x00'*(0x10-len(s))num = 0x58455443for i in range(0,len(s)):    temp = int('0x'+'0'*(2-len(hex(ord(name[i+3]))[2:]))+hex(ord(name[i+3]))[2:]+ '0'*(2-len(hex(ord(name[i+2]))[2:]))+hex(ord(name[i+2]))[2:] + '0'*(2-len(hex(ord(name[i+1]))[2:]))+hex(ord(name[i+1]))[2:]+ '0'*(2-len(hex(ord(name[i]))[2:]))+hex(ord(name[i]))[2:],16)    num += tempwhile 1:    serial = 1    n = num + serial    n = '0x'+hex(n)[-9:-1]    n = int(n,16)     xor = 0x00584554 ^ n    shr = n>>0x10    if ((xor&0x0000FFFF) - shr) == 0x26EB and hex(xor)[:6] == "0x5854":        print serial        #break    else:        serial += 1    if serial%0x100000 == 0:        print serial    #[0x584554 ^ ax] - ax >> 10 = 0x585426EB 

用python跑的很慢,用c比较好。但不影响最后的答案
这里写图片描述
这里写图片描述

0 0
原创粉丝点击