打开程序:
就一个这个玩意儿,没有输入框,没有啥的,打开IDA反编译一下:
直接找到WinMain,发现里面只有一个对话框API(如果只有一个对话框,那真就没有输入框了),CallBack函数是DialogFunc
进入DialogFunc
有个GetDlgItemText,我实在没搞懂,明明没有用MFC画出对话框,为什么要来一个GetDlgItemText获取输入框内容,并传给了edit_string。还调用了MessageBox(感觉没必要)
也就是这一题几乎和Win32没关系,就是纯密码题
这里有几个比较坑的点,sub_4010F0这个函数的第一个参数是地址,但是我们追进去发现IDA对类型判断有误
所以要手动将int a1改成 int* a1
也包括后来的sub_401000
很明显这里不可能传的是整形,不然计算后面偏移就没有意义
所以也要手动改成char* a1
这个函数应该是对v7~v16这一块内存进行加密,直接把这一段函数扒下来,放到电脑跑
cpp
int sub_4010F0(int* a1,int a2,int a3)
{
int i = 0;
int v5 = 0;
int v6 = 0;
int result = 0;
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;
}
至此,v7开始的数组加密已经全部被我们知道
接下来是sub_4010F0,跟进去发现
有字符表,基本上就是base64加密了,打开在线网站直接解密
ak1w->jMp
V1Ax->WP1
按照这个解密,v7[0],v10,v8,v16,v4,v5都知道了
解密后flag为 UJWP1jMp 即flag{UJWP1jMp}