首先在detect it easy中进行查壳
可以得到以下信息
-
文件大小:81.50 KiB
-
文件类型:PE32(32位Windows可执行文件)
-
操作系统兼容性:Windows XP(但可能兼容更高版本)
-
程序类型:GUI程序(非控制台程序)
-
编译器:Microsoft Visual C/C++(版本 19.00.23026)
-
链接器:Microsoft Linker(版本 14.00.23026)
-
工具链:Microsoft Visual Studio 2015
-
编译模式:LTCG(链接时代码优化)/ C++
-
语言:C++
-
包含PDB调试信息:是(有绝对路径PDB)
-
调试数据位置:
-
偏移:
0x00010044 -
大小:
0x65(101字节)
-
-
PDB版本:7.0
这是一个 32位 GUI 程序 (Windows XP 兼容),所以入口是 WinMain(不是 main)。
然后进入IDA中查看
WinMain 直接调用了 DialogBoxParamW,说明这是一个基于对话框的 GUI 程序 。关键逻辑在 DialogFunc 这个对话框过程函数里。
在 IDA 的函数列表(Functions window)里找 DialogFunc,或者按 Ctrl + F 搜索 DialogFunc。
如果没找到这个名字,可以:
-
双击
WinMain里的DialogFunc(IDA 会跳转过去) -
或者在 汇编视图 里看
DialogBoxParamW的第四个参数(通常是 push 一个地址)

程序要求两个输入:
-
String→ 从控件 1001 获取(应该是邮箱输入框) -
v11→ 从控件 1002 获取(应该是注册码/flag 输入框)
📧 邮箱验证条件:
if ( strstr(String, "@") && strstr(String, ".") && strstr(String, ".")[1] && strstr(String, "@")[1] != 46 )
要求:
-
包含
@ -
包含
. -
.后面至少还有一个字符(防止以点结尾) -
@后面的字符不能是.(防止@.出现)
只要邮箱格式大致正确即可 ,比如 a@b.c 就满足。
Flag的验证逻辑
if ( strlen(v11) == 16
&& v11[0] == 67 // 'C'
&& v11[15] == 88 // 'X'
&& v11[1] == 90 // 'Z'
&& v11[14] == 65 // 'A'
&& v11[2] == 57 // '9'
&& v11[13] == 98 // 'b'
&& v11[3] == 100 // 'd'
&& v11[12] == 55 // '7'
&& v11[4] == 109 // 'm'
&& v11[11] == 71 // 'G'
&& v11[5] == 113 // 'q'
&& v11[10] == 57 // '9'
&& v11[6] == 52 // '4'
&& v11[9] == 103 // 'g'
&& v11[7] == 99 // 'c'
&& v11[8] == 56 ) // '8'
当输入:
-
邮箱:任意有效邮箱(如
test@test.com) -
注册码:
CZ9dmq4c8g9G7bAX
然后就可以确定flag