Crack类的题目也没神马题目描述了,传送门在此。
今天发现IDA原来还有反编译功能,顿时觉得自己之前似乎SB了。然后试用了下,感觉效果还不错。
这题整个程序很简单,就是读入name和pass,然后通过下面的子程序(IDA生成的)来judge:
bool __cdecl sub_401000(const char *username, const char *password) { const char *v2; // esi@1 unsigned int len_user_plus; // kr04_4@1 int len_user; // ebp@1 bool result; // al@2 int i; // eax@3 int *str_con; // edi@4 const char v8; // bl@5 const char *v9; // edi@6 int j; // ecx@6 bool v11; // zf@6 v2 = username; len_user_plus = strlen(username) + 1; len_user = len_user_plus - 1; if ( len_user_plus - 1 == strlen(password) ) { i = 0; if ( len_user > 0 ) { str_con = &global_str; do { v8 = *(_BYTE *)str_con ^ password[i]; ++str_con; password[i++] = v8; } while ( i < len_user ); } v9 = password; j = len_user_plus - 1; v11 = 1; do { if ( !j ) break; v11 = *v2++ == *v9++; --j; } while ( v11 ); result = v11; } else { result = 0; } return result; }
程序很明确,就是将username与一个全局的常量进行xor,然后再将结果与password对比,相等则正确。
00408030 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ................ 00408040 01 00 00 00 05 00 00 00 01 00 00 00 05 00 00 00 ................ 00408050 01 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00 ................ 00408060 04 00 00 00 08 00 00 00 05 00 00 00 03 00 00 00 ................ 00408070 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ................ 00408080 05 00 00 00 03 00 00 00 05 00 00 00 07 00 00 00 ................ 00408090 02 00 00 00 03 00 00 00 02 00 00 00 04 00 00 00 ................ 004080A0 08 00 00 00 02 00 00 00 05 00 00 00 06 00 00 00 ................ 004080B0 04 00 00 00 74 72 79 20 61 67 61 69 6E 21 00 00 ....try again!..
注意这个字符串是每个dword只去某位的一个byte,所以相当于是01、02、03、04、01、05、01、05……
我们可以将username和password分别输入为0、1来测试,会发现程序提示我们正确。
于是,按照要求,使用用户名当username,算出password,计算MD5就是答案了。