main中的结构很好分析

401C40函数:

XORCalc函数(401B80函数):

给出了4个异或关系用来限制输入的flag:

s[0] ^ s[1] = 84,s[7] ^ s[8] = 19,s[14] ^ s[15] = 18,s[17] ^ s[18] = 77

所以重点应该放在dword_407E48s上

使用JumpToXref功能找到关键函数:

根据题目(数据结构)以及程序中字符串

猜测这个题是字典树的实现,以及字符串的添加与匹配

那么思路就有了:判断的是我们输入的flag,在分段添加进入字典树之后,与原有的字典树匹配

IDA找其构造的函数,401900函数:

一步一步调试可以得到这些中间值

这一段的过程是:在内存中生成这些字符串

逻辑是:将字符串转为节点

需要的是407E48,来自于4078F8,相当于字典树的根节点:

那么就需要正向构造这棵树:根据IDA逻辑手动构造:

这就是flag中出现的字符,且需要满足异或的关系

根据长度,flag[9:13]长度为4,为c7Mk

import string
ch = string.letters + string.digits

t = []
for i in ch:
	for j in ch:
		if ord(i) ^ ord(j) == 84:
			t.append(i + j)
print "input[0:2] :",t

t = []
for i in ch:
	for j in ch:
		if ord(i) ^ ord(j) == 19:
			t.append(i + j)
print "input[7:9] :",t

t = []
for i in ch:
	for j in ch:
		if ord(i) ^ ord(j) == 18:
			t.append(i + j)
print "input[14:16] :",t

t = []
for i in ch:
	for j in ch:
		if ord(i) ^ ord(j) == 77:
			t.append(i + j)
print "input[17:19] :",t

得到flag[0:2]为c7,flag[16:19]为ct9,flag[7:9]为kx,flag[14:16]为tf

长度为2的只剩一个了,得flag[2:4]为ct

连起来:c7ctc7Mkxc7Mkctfct9c7M

 

 

PLUS:

原作者的出题思路以及CrackMe源代码

https://bbs.pediy.com/thread-222959.htm

使用strings查看CM,发现: