把Crackme拖到IDA里查看
可以看到,程序通过eax跳转,而eax的值很有可能是上面那个call sub_401060决定的。
进入到sub_401060查看,可以看到最后的跳转代码有两个,一个是将eax清零,是错误跳转,一个是将eax赋值1,是正确跳转
直接F5查看代码,关键代码如下:其中a1是传入函数的一个指针,指向我们输入的字符串,
这段代码大致就是将传入的字符串与0x20进行异或,然后将程序存储的一串字符进行减5,然后将两个字符串比较,如果相等就返回1,既成功,否则失败
到这里已经很清楚了,然后用OD来找程序存储的另外一字符串就可以了,首先用ida查看那段代码的地址,在option中设置,
这里解释一下ida里的一串代码,repne scasb在代码中出现了很多次,作用就是计算字符串长度,edi中存放要计算的字符串,ecx中存放算好的字符串长度,eax中存放要查找的字符,如果是0的话就是计算字符串长度
lea edi, [esp+1Ch+var_10]
or ecx, 0FFFFFFFFh 设置循环次数-1
xor eax, eax 设置搜索内容0
xor edx, edx
repne scasb 一直重复搜索到EDI字符串末尾的0
not ecx 得到搜索次数,也就是字符串的完整长度
dec ecx -1得到字符串不包含末尾0的长度
转到OD,转到上述地址,然后F2下断点,F9运行到刚下的断点处,运行程序,发现程序固定的字符串长度为14,
一路运行,直到到比较两个字符串的位置,
找到固定字符串所在位置,然后读取出14个字符,分别为0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01
最后一步,用python解出flag,代码如下:
a=[0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01]
for i in a:
print(chr(i^0x20),end='')