直接IDA打开分析,这个exe是32位程序。
关键窗口函数,String字符串从v18~v25,共8个字符。
字符串处理核心代码区。sub_4010F0对字符串 ZJSECaNH3ng,进行处理,直接扣出来,运行一下。
// TestDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
typedef DWORD _DWORD;
int sub_4010F0(char* a1, int a2, int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
for (i = a2; i <= a3; a2 = i)
{
v5 = i;
v6 = a1[i];
if (a2 < result && i < result)
{
do
{
if (v6 > a1[result])
{
if (i >= result)
break;
++i;
a1[v5] = a1[result];
if (i >= result)
break;
while (a1[i] <= v6)
{
if (++i >= result)
goto LABEL_13;
}
if (i >= result)
break;
v5 = i;
a1[result] = a1[i];
}
--result;
} while (i < result);
}
LABEL_13:
a1[result] = v6;
sub_4010F0(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
char src[20] = { 0 };
strcpy_s(src, "ZJSECaNH3ng");
sub_4010F0(src, 0, 10);
printf("%s\n", src);
system("pause");
return 0;
}
运行结果:3CEHJNSZagn,v7~v17。根据以下这块代码
if ( String == v7 + 34
&& v19 == v11
&& 4 * v20 - 141 == 3 * v9
&& v21 / 4 == 2 * (v14 / 9)
&& !strcmp(v4, "ak1w")
&& !strcmp(v5, "V1Ax") )
{
MessageBoxA(hDlg, "U g3t 1T!", "@_@", 0);
}
v18=v7+34=“3”+34=“U”
v19=v11=“J”
v20=(3v9+141)/4=“W”
v21=4(2*(v14/9))=“P”
接下来v22~v25值,仔细阅读代码,发现在此进行处理
memset(&v26, 0, 0xFFFFu);
v26 = v23;
v28 = v25;
v27 = v24;
v4 = sub_401000((int)&v26, strlen(&v26));
memset(&v26, 0, 0xFFFFu);
v27 = v21;
v26 = v20;
v28 = v22;
v5 = sub_401000((int)&v26, strlen(&v26));
v4=“ak1w”,v5=“V1Ax”,sub_401000其实是base64加密,这个是猜测出来的,因为后台字符串列表看到了.rdata:00407831 00000041 C BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
这就是base64加密的字符,通过base64解密得到,ak1w->jMp,V1Ax->WP1,对比上面字符相等,得到v22=“1”,v23~v25=“jMp”。
整理一下: flag{UJWP1jMp}