法一

先运行程序看看,只有getflag能点
img
这个猜测CE应该能破
查壳32位无壳,IDA查看
main()函数没什么有价值信息
查找字符串看看
img
BJD{}长得就很像flag跟进

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
INT_PTR __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
CHAR String[100]; // [esp+0h] [ebp-64h] BYREF

if ( a2 != 272 )
{
if ( a2 != 273 )
return 0;
if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
{
sprintf(String, Format, ++dword_4099F0);
if ( dword_4099F0 == 19999 )
{
sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);
SetWindowTextA(hWnd, String);
return 0;
}
SetWindowTextA(hWnd, String);
return 0;
}
EndDialog(hWnd, (unsigned __int16)a3);
}
return 1;
}

Format 点进去是‘您已经点了 %d 次’
说明dword_4099F0存的是点击次数
然后判断是否点击19999次,输出BJD{1999902069a45792d233ac}
说明flag是BJD{1999902069a45792d233ac}
CE验证也是对的
img

法二

这题还可以用动态调试解决
X32dbg 打开
先搜索一下字符串
img
跳转到40704c
img
简单阅读一下汇编语句
先将寄存器eax压入栈中
调用函数401410
将寄存器eax中的值赋值给4099F0地址结合之前静态分析可知4099F0就是点击次数
然后移动指针
寄存器eax中的值与0x4ELF比较0x4ELF即为19999
Jne就是若不相等就跳转到4013D0
而中间的内容大概看一下就是输出flag的
所以jne这条语句就是关键的判断,我们将他nop掉
img
F9运行,随便点一下就出现flag了
img