题目链接:https://www.ichunqiu.com/battalion
取文本框中内容的函数是GetWindowTextW,给GetWindowTextW下断点,运行,5次F9之后,才可以在文本框中输入字符,随便输入123456789,鼠标放在click上后就从running状态变成了Paused,继续运行,会将输入拷贝到另一个地方,然后调用PostMessage函数。
用IDA动态调试,可以看到PostMessage函数各个参数的值,lParam是输入的个数,wParam是输入的内容。hWnd是接收消息的窗口句柄。
(只有前几次调试的时候会执行到PostMessage,后面调试都一直在循环调用GetWindowTextW出不来)
发送消息的函数:SendMessage
寄送消息的函数:PostMessage
消息的接收:GetMessage、PeekMessage
PostMessageW的第一个参数是接收消息的窗口句柄,查看它的交叉引用,发现了一共被两个函数使用。
查看402990,hWnd是调用CreateWindowExW之后得到的窗口句柄。
RegisterClassW注册一个窗口类,以便在调用CreateWindow或CreateWindowEx函数时使用。CreateWindow只是将某个WNDCLASS定义的窗体变成实例。 WndClass中的成员lpfnWndProc指向一个回调函数,是窗体的消息处理函数,回调函数格式如下。
会把输入的字符给wParam,字符个数给lParam。
查看消息处理函数4027F0
程序会对每一个输入做累加和异或,计算完之后,会判断一下输出+i*2累加之和是否为0x4B6,如果是,则显示窗口。写程序,将chText与0x4B6异或,得到FLAG。
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
int chText[]={0x4F0,0x4DA,0x4D7,0x4D1,0x48c,0x4ff,0x4f5,0x4fe,0x4e3,0x4f8,0x4e7,0x4ff,0x4e3,0x4e9,0x4f0,0x4f3,0x485,0x480,0x484,0x4F2,0x4F4,0x4F3};
for (int i=0;i<22;i++)
{
printf("%c",chText[i]^0x4B6);
}
system("pause");
return 0;
}
flag{ICHUNQIU_FE362DBE}
这两天忙着准备比赛,没时间完成任务了,唉,从6月份就开始说7月份比赛,但是一直都偷懒没准备(因为只是替补)结果happy了,替补上场了,下次无论在什么位置,都要好好准备。临阵磨枪,ctf的题真的好难啊,比样本可难分析多了。