Problem: [BJDCTF 2020]JustRE
思路
- 我不会动态调试,所以使用IDA进行分析
过程
- 2026.1.24 补充:使用 IDA 按下 Shift + F12 在字符串里面找就行。
- 通过打开程序我们知道这个程序是一个带有窗口的程序。
- 在上面菜单栏可以看到有一个 getflag 菜单项,点进去会弹出一个让我们一直单击来得到 flag 的窗口。(如果有时间的话可以一直点点(不是))
- 使用 IDA 打开这个程序,来到后面 Data 区寻找 “您已经点了 1 次” 类似的字符串。转到流程图,按下 F5 生成伪代码。
-
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; }
我们看到需要单击 19999 次(点完鼠标就报废了),我们注意以下语句
sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);
相信学过 C 语言的立刻反应过来了,这是 printf 语句。想必已经知道 flag 是什么了。
总结
- 还是需要学习动态调试啊(悲
