Crackme 24

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


#bx = 0xfbfc30a3
for 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) + serial
004012BB   .  3105 D9124000 XOR DWORD PTR DS:[4012D9],EAX            ;  0x00584554 ^ ax
004012C1   .  C1E8 10       SHR EAX,10                               ;  ax >> 10
004012C4   .  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 ^ bx
004012E0   . |49            DEC ECX

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

#爆内存脚本
#bx = 0xfbfccfa3  i = 0x58 j = 0x54
for 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 = 0x58455443
for 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 += temp
while 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值