查壳,是32位程序,无壳,拖入IDA
使用一个FindCrypto的IDA插件
查一下加密,应该是一个哈希加密,可能是md5
我们先可以在线解密一下找到的这个md5的密文看一看
得到了一串字符,不是flag,我们去分析一下main函数
int __cdecl main_0(int argc, const char **argv, const char **envp) { DWORD v3; // eax DWORD v4; // eax char Str[260]; // [esp+4Ch] [ebp-310h] BYREF int v7; // [esp+150h] [ebp-20Ch] char String1[260]; // [esp+154h] [ebp-208h] BYREF char Destination[260]; // [esp+258h] [ebp-104h] BYREF memset(Destination, 0, sizeof(Destination)); memset(String1, 0, sizeof(String1)); v7 = 0; printf("pls input the first passwd(1): "); scanf("%s", Destination); if ( strlen(Destination) != 6 ) { printf("Must be 6 characters!\n"); ExitProcess(0); } v7 = atoi(Destination); if ( v7 < 100000 ) ExitProcess(0); strcat(Destination, "@DBApp"); v3 = strlen(Destination); sub_40100A((BYTE *)Destination, v3, String1); if ( !_strcmpi(String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") ) { printf("continue...\n\n"); printf("pls input the first passwd(2): "); memset(Str, 0, sizeof(Str)); scanf("%s", Str); if ( strlen(Str) != 6 ) { printf("Must be 6 characters!\n"); ExitProcess(0); } strcat(Str, Destination); memset(String1, 0, sizeof(String1)); v4 = strlen(Str); sub_401019((BYTE *)Str, v4, String1); if ( !_strcmpi("27019e688a4e62a649fd99cadaafdb4e", String1) ) { if ( !(unsigned __int8)sub_40100F(Str) ) { printf("Error!!\n"); ExitProcess(0); } printf("bye ~~\n"); } } return 0; }
很清楚的看到是将两个输入的两个字符串用strcat函数拼接起来,然后进行MD5加密
所以第一段字符串就是123321,第二段就是~!3a@0
我们运行一下程序
得到一个文件
打开rtf文件得到flag
flag{N0_M0re_Free_Bugs}