Crackme 23

这题很好,一环扣一环。
首先PEID查看
这里写图片描述
第一次见MASM32 汇编直接编写。前几道题有高级语言编写,有现成的反编译工具。但这道题没有,只能手工OD调试
用OD加载搜索字符串
这里写图片描述
发现破解成功的条件是ax == 0x10,
这里写图片描述
于是找给ax 赋值的代码,ax的值与[403166]有关
这里写图片描述
于是利用内存断点,找到所有写入[403166]有关的代码
这里写图片描述
设置内存断点,发现了猫腻
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
分析得[403188] + 0x9112478 必须为0
将内存断点设在[403188],找到了下面的算法

00401361   .  8D3D 8C314000 LEA EDI,DWORD PTR DS:[40318C]                   ;  name
00401367   .  0FBE05 683140>MOVSX EAX,BYTE PTR DS:[403168]                  ;  ax = i
0040136E   .  03F8          ADD EDI,EAX
00401370   .  FE05 68314000 INC BYTE PTR DS:[403168]                        ;  i ++
00401376   .  A1 88314000   MOV EAX,DWORD PTR DS:[403188]                   ;  密码的16进制
0040137B   .  8B25 A0314000 MOV ESP,DWORD PTR DS:[4031A0]
00401381   .  40            INC EAX                                         ;  密码 ++
00401382   .  FF05 88314000 INC DWORD PTR DS:[403188]
00401388   .  3307          XOR EAX,DWORD PTR DS:[EDI]                      ;  密码 ^ name[i] 这里有个坑4字节异或
0040138A   .  A3 88314000   MOV DWORD PTR DS:[403188],EAX                   ;  密码 = 上式
0040138F   .  803D 68314000>CMP BYTE PTR DS:[403168],10                     ;  if i != 10 loop

算法有了注意这里有个坑,00401388 . 3307 XOR EAX,DWORD PTR DS:[EDI]这里是与四字节异或,小端序要转成大端序
最后写出exploit

name = raw_input("name:")
s = 'A'+name+'\x00'*(0x14-len(name)) #A 用来填充
s = bytes(s).decode('ascii')
print s
sub = 0xffffffff - 0x9112478 + 1
for i in range (0x10,0,-1):
    string = '0x'+'0'*(2-len(hex(ord(s[i+3]))[2:]))+hex(ord(s[i+3]))[2:]+ '0'*(2-len(hex(ord(s[i+2]))[2:]))+hex(ord(s[i+2]))[2:] + '0'*(2-len(hex(ord(s[i+1]))[2:]))+hex(ord(s[i+1]))[2:]+ '0'*(2-len(hex(ord(s[i]))[2:]))+hex(ord(s[i]))[2:]
    sub ^= int(string,16)
    sub -= 1
print sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值