(本文章是参考其他作者的文章写下来的,如有错误,欢迎指正)
1、winmain函数
基于 Windows 的图形应用程序的用户提供的入口点。
2、DialogBoxParamA函数
从对话框模板资源创建模式对话框。 在显示对话框之前,函数会将应用程序定义的值作为WM_INITDIALOG消息的 lParam 参数传递给对话框过程。 应用程序可以使用此值初始化对话框控件。
(图片是该题目在ida(32位)打开后f5反编译的伪代码)
3、关于v7-v17,看到5-15行的注释,[esp+8h]…[esp+30h],编译器为其分配的地址是连续的,且数据类型都是int(占4字节),38-48行进行赋值,推断可能是数组。sub_4010F0((int)&v7, 0, 10)是对v7进行处理,v7是数组首元素的地址,应该是取该数组的前10位进行处理。string是flag,长度=8(这也是通过参考其他博主的题解推测的)
4、sub_4010F0((int)&v7, 0, 10)是对v7-v16进行处理,将sub_4010F0((int)&v7, 0, 10)函数放入visual studio内运行,得到处理后的v7-v16。
(ps:这里第12行(4 * i + a1)是编译器对数组的寻址方式,相当于a1[i],4*i表示该数组的数据类型占4字节)
5、51-54行,推测v20-v22是char类型的数组,因为char占1字节所以分配内存空间是[esp+36h],[esp+37h],sub_401000(&v26, strlen(&v26))是base64加密(可以取看其他博主的题解)。v4、v5分别存放base64加密后的字符
6、MessageBoxA弹出对话框函数,if语句内表达式成立即弹出,题目的提示:在编辑框中的输入值,即为flag,所以if语句内的表达式是flag的关键。
总的来说,取v7-v16数组前10个数进行处理,v20-v22数组和v23-v25数组进行base64加密,满足if表达式的条件。flag由string、v19、v20、v21和解密后的v4、v5构成。
下面是sub_4010F0((int)&v7, 0, 10)在visual studio运行的代码,以及if表达式的部分flag
#include<Windows.h>
#include<iostream>
int __cdecl sub_4010F0(int 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 = 4 * i;
v6 = *(DWORD*)(4 * i + a1);
if (a2 < result && i < result)
{
do
{
if (v6 > *(DWORD*)(a1 + 4 * result))
{
if (i >= result)
break;
++i;
*(DWORD*)(v5 + a1) = *(DWORD*)(a1 + 4 * result);
if (i >= result)
break;
while (*(DWORD*)(a1 + 4 * i) <= v6)
{
if (++i >= result)
goto LABEL_13;
}
if (i >= result)
break;
v5 = 4 * i;
*(DWORD*)(a1 + 4 * result) = *(DWORD*)(4 * i + a1);
}
--result;
} while (i < result);
}
LABEL_13:
*(DWORD*)(a1 + 4 * result) = v6;
sub_4010F0(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
int main()
{
int v7[] = { 90,74, 83,69,67,97, 78,72,51, 110,103 };
int i;
sub_4010F0((int)(&v7), 0, 10);
printf("%c", v7[0] + 34);
printf("%c", v7[4]);
printf("%c", (v7[2] * 3 + 141) / 4);
printf("%c", (v7[7] / 9) * 2 * 4);
return 0;
}
运行结果:
v4 base64解密得jMp,v5得WP1,最后flag{UJWP1jMp}
参考链接:
1、winmain函数:https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-winmain?redirectedfrom=MSDN
2、DialogBoxParamA函数:https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-dialogboxparama?redirectedfrom=MSDN
3、数组的寻址是在这位博主的题解:https://blog.csdn.net/afanzcf/article/details/119682630
4、参考题解:https://www.bilibili.com/video/BV14Z4y1f7DJ/