将CrackMe.exe拖进IDA进行分析
1.首先看main函数:
sub_401210()的返回值应该为1,所以!sub_401210()为0,进入else。
2.观察sub_401210函数:
可以看到需要满足5个if,才能使得返回值为1。
- 第一个if:
可以看出v1的长度为25,v1[4]为 ‘{‘,v1[8]、v1[10]、v1[15]为’_’,v1[24]为’}’
v1应该就是flag了,那么其前四位应该就是’flag’这四个字母。
到目前为止,v1为:flag{XXX_X_XXXX_XXXXXXXX}
通过百度可以查到,wcstok
是用来对wchar_t
类型的数进行分割的。wcstok(v1, L"{_}")
这句话就是表示对v1在’{‘、’_’、’}’这几个字符处进行分割。
第一次分割,碎片’flag’被遗弃。第二次分割,v4等于XXX。
- 第二个if:
把6815860转换为16进制得到0x680074,0x74对应t,0x68对应h。所以这里说明v4等于thX。
另外v4[4]表示X为’4’。
v5是X,v6是将v5转换成了int型。
- 第三个if:
说明v6等于4,
X为’4’。
v7等于XXXX。
- 第四个if:
sub_401000(v7)的返回值需要为1。
v8等于XXXXXXXX。
- 第五个if:
sub_401800(v8)的返回值需要为1。
3.观察sub_401000()函数:
如果要返回值为1,则v6不能等于0。
如果v4和”62cc0b4ebb0b57b40778179234246c38”相等,则v6等于1。
62cc0b4ebb0b57b40778179234246c38为MD5加密后的结果,解密得your。
your应该就是flag中的XXXX了。
4.观察sub_401180()函数:
v1为输入,v2为v1转化为多字节之后得到的结果。
v2的每一位异或0x66等于20 3 1 15 21 18 3 20
得到v2的每一位为:114 101 103 105 115 116 101 114
所以最后八位为register
异或代码为:
int a[9] = { 20,3,1,15,21,18,3,20 };
int count = 0;
int k = 0;
while (k < 8) {
for (int i = 0; i < 128; i++) {
int c = i ^ 0x66;
if (c == a[count]) {
printf("%c", i);
count++;
break;
}
}
k++;
}
5.得到flag:
flag为:
flag{thx_4_your_register}
其中’x’是猜的
解决了~( ̄▽ ̄~)~