buu-re-97

[HDCTF2019]MFC

前言

最近刷的题难度都不是很高,主要都是学习新知识。这题主要是考察C++ 的MFC的(主要是加了个vmp1的壳,vmp的壳好像都都挺难脱的)。

参考资料:

简单了解一下MFC

MFC(微软基础类库),主要是作用在Windows平台的GUI开发(不过好像已经有点过时了)

Windowns消息机制

  • API 应用程序编程接口(Application Programming Interface)

WindowsAPI函数是通过C实现的,主要在windows.h头文件中进行了声明

  • 窗口和句柄

一个Windows应用程序至少要有一个窗口,称为主窗口。窗口时屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口,利用窗口可接受用户输入及显示输出。

而每个窗口都有一个唯一标识的句柄(HWND

  • 消息和消息队列

Windows程序设计是一种基于“消息”的事件驱动模式。简单来说就是:对于一个窗口,操作系统会感知各种事件(如点击鼠标,键盘敲击等),这些事件被包装成消息,应用程序通过一个虚幻来不断从消息队列中取出消息,并进行响应。

简单了解一下xspy的使用

界面很简单,长这样

1

用法就是把那个“放大镜”拖到要检测扫描的窗口上就行了

作用:可以扫出这个窗口的一些基本信息,包括监听的消息和处理该消息的函数地址(我是这么理解的)

本题解法

硬岔vmp先不管,打开文件弹了个窗

2

xspy扫一下

3

得到的信息:

  • 窗口句柄(HWND=001FADE)

  • 句柄后括号里面那串信息(创建窗口时的类名):944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b

  • 一个奇怪的消息监听:OnMsg:0464,func= 0x00402170(mfc.exe+ 0x002170 )

PS:这里解释一下OnMsg,0x0464可以理解为消息内容(其他WM开头那些是属于系统消息),后面的func可以理解为,接受到这个消息后所跳转的响应函数

直接写个脚本发送这条消息给这个窗口触发一下试试(不会写,抄其他师傅的exp学习一下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
HWND h = ::FindWindowA(NULL, "Flag就在控件里");
//找到对应窗口的HWND,参数:创建窗口时的类名、窗口标题
//所以这样也行 HWND h = ::FindWindowA("944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b", NULL);
if (h)
{
SendMessage(h, 0x464, NULL, NULL); //发送消息
} //参数:HWND(窗口句柄)、消息内容、后面俩可以理解为消息需要附带的参数
//不需要就是NULL
system("pause");
return 0;
}

触发后窗口变了

4

这已经提示得很明显了,上DES解密,密文就是长串类名

5

Comments