將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’是猜的
解決了~( ̄▽ ̄~)~