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,发现: