crackMe

用IDA打开 查看主函数

看到关键函数401830

函数的前半部分是对输入的密码的操作 这部分操作不需要细看 动态调试中会自动执行

但要注意红框部分是一个反调试 上网查看绕过反调试需要将关键跳转jz jnz等patch为jmp

函数的后半部分是对处理后的密码v15再进行一些操作(应该只是简单的赋值)然后将结果跟byte数组异或后得到v17 也要注意这里有两个if都是反调试

可以看到最后的成功的条件是v14==43924 而操作v14的函数也就是401470

看到函数中的操作如果要符合v14的话应该就是要v17等于字符串 即dbappsec

那么v17已知 要求输入的密码v15就只需要知道byte数组是什么了 这时候就要上动态调试了 先找到异或的操作(可以在IDA中通过伪代码定位汇编代码的地址 然后再在od或x32dbg对应的地址下断点)

可以看到这个就是进行异或的地方了 在x32dbg对应的地址下断

然后要patch上述3个反调试的点 先分别找到它们的地址

可以看到这个对应cmp eax,2 的操作也就是上面的反调试代码 将这个jz patch为jmp

另外两个也可通过关键字来找到对应的汇编指令

也将它们patch为jmp

再运行到异或的断点

可以看到ecx即是byte数组的值 全部运行完后得到数组

[0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]

写脚本异或

key = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]

v17 = 'dbappsec'

flag = ''
for i in range(len(key)):
	key += hex(ord(v17[i]) ^ key[i]).strip('0x')

import hashlib
flag_md5 = hashlib.md5(flag.encode(encoding='UTF-8')).hexdigest()
print(flag_md5)

d2be2981b84f2a905669995873d6a36c

发表评论

您的电子邮箱地址不会被公开。