在这里顺便学习了一下与 WinMain 函数有关的一些知识Win Main 百度百科 以及 WinMain函数参数介绍
用ida32位打开文件
进入主函数WinMain
找到主函数
字符串解析
通过代码
GetDlgItemTextA(hDlg, 1000, &String, 0xFFFF);
知道了String是我们输入的flag。
通过代码
if ( strlen(&String) == 8 )
我们知道flag的长度应该是8
第51行函数sub_4010F0(&v7, 0, 10)
进入sub_4010F0函数
C语言编写代码:
#include
using namespace std;
//v7,0,10
int sub(char a1[],int a2,int a3){
int result;
int i;
int v5;
int v6;
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(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
int main(int argc, const char *argv[]) {
char a[30]={90, 74, 83, 69, 67, 97, 78, 72, 51, 110, 103};
sub(a,0,10);
cout<<a<<endl;
return 0;
}
运行结果如下
分析56行,双击观察v23
可知v23为string[5],快捷键N依次修改
继续分析sub_401000函数
由上图可知此函数为base64加密,返回关键函数
由69行,70行可知有两段字符串加密后得到ak1w,V1Ax,解密得 jMpWP1
if ( String == v9 + 34 // sub_4010F0函数后的第一位等于51+34=85-->'U'
&& v21 == v13 // 第2位,等于v13,即sub_4010F0函数返回值的第5位值-->'J'
&& 4 * v22 - 141 == 3 * v11
&& v23 / 4 == 2 * (v16 / 9)
&& !strcmp(v6, "ak1w") // 第6,7,8行代码base64之后,需要等于"ak1w"
&& !strcmp( // 第3,4,5行代码,加密之后等于V1Ax
v7,
"V1Ax") )
{
MessageBoxA(hDlg, "U g3t 1T!", "@_@", 0);
}
将v6,v7解密之后得到WP1jMp,再结合第1,2位得到flag