MFC框架简介
什么是mfc?
MFC库是开发Windows应用程序的C++接口。MFC提供了面向对象的框架,采用面向对象技术,将大部分的Windows API 封装到C++类中,以类成员函数的形式提供给程序开发人员调用。
简单来说,MFC是一种面向对象,用于开发windows应用程序的框架,突出特点是封装了大部分windows API,便于开发人员使用(写win挂方便)。
MFC程序的运行过程分为以下四步:
- 利用全局应用程序对象theApp启动应用程序。
- 调用全局应用程序对象的构造函数,从而调用基类(CWinApp)的构造函数,完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来。
- 进入WinMain函数。在AfxWinMain函数中获取子类的指针,利用指针实现上述的三个函数,从而完成窗口的创建注册等工作。
- 进入消息循环,一直到WM_QUIT。
那么问题来了,我们如何逆向mfc程序呢?
因为其封装了大部分windows API,逆向起来也复杂了不少,因为需要了解大量的windows api 并且熟悉windows编程。
下面进行讲解。
MFC如何逆向
如下图,是MFC框架软件的基本界面,可以看到,就是一堆button,主要逆向也是check button。
那么,对于MFC逆向,我们主要需要知道的是,当我们执行某个操作(点击某个按钮)的时候,程序会执行什么处理函数。
在mfc中,程序是使用消息机制来实现操作响应的,这个是消息映射表的代码:
其中这个AFX_MSGMAP_ENTRY中的最后一个成员AFX_PMSG就是一个函数指针,指向了当前控件绑定的函数。同时,这个nID成员描述的是当前控件的ID,利用这个ID就能确定我们所寻找的控件。然后这个AFX_MSGMAP结构体则会记录一个指向AFX_MSGMAP_ENTRY的指针,于是查找控件的注册函数的思路可以缩小为:
- 找到AFX_MSGMAP
- 找到控件的ID — 关键就是找ID
那么,我们又该怎么找到控件ID呢,俗话说“工欲善其事,必先利其器”,作为逆向分析人员,肯定要选择好分析的工具了,很庆幸,我们站在巨人的肩膀上,针对mfc软件程序的逆向分析,前辈们已经开发了一些非常好用的小工具,我们可以直接使用它们。
例如:
- xspy
- ResourceHacker
- 彗星小助手
其中我们主要用的是xspy,mfc分析利器
如下图所示
逆向实验-以CTF赛题为例讲解
demo1 - MFC初探
打开程序软件
程序的标题Flag就在控件中,然后界面内容是让我们找一个key。
很明显,我们需要找到两个东西
- 标题找Flag(也就是找窗口句柄)
- 内容找key
根据这些内容,告诉我们我们去找控件,然后这时候就要掏出
xspy了。
不然的话,我们如果使用老一套经典分析流程,die+ida对用架构分析,会发生下面这样的事。
首先die查个架构,查个壳
好家伙,VMP壳,PE32
ida走起,如下图,emmm…
这样的话,我们很难继续往下分析,所以我们使用xspy分析。
使用方法如下图
首先我们找到了Flag_enc
(944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b)
我们知道特定的,窗口句柄叫 HWND
然后我们可以发现一条特殊的onMsgOnMsg:0464,func= 0x00402170(MFC1.exe+ 0x002170 )
为什么特殊呢,因为只有它并不是以宏的形式出现,应该是作者自定义的消息,没有button等东西,所以程序怎么点击都无法触发任何效果;并且传入一个特殊数字0464,来触发效果。
那么,我们需要去发送这条消息来出发func函数以获取我们需要的key
使用 API FindWindow 获取窗口句柄,SendMessage发送消息,得到了key
{I am a Des key}
最后DES解密即可
flag{thIs_Is_real_kEy_hahaaa}
帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
Junk_instruction-西湖论剑
下面,再讲解一道大型比赛的赛题来实验
打开,看到这个朴素的界面可以鉴定是MFC框架。
我们看到了一个input,还有一个check button,很明显,我们首先就需要去找check button的id&注册函数。
xspy-MFC分析
check按钮的id为03e9,同时窗口存在OnCommand: notifycode=0000 id=03e9,func= 0x00C72420(Junk_Instruction.exe+ 0x002420 )函数。
那么对应的check逻辑肯定在基址+偏移0x002420处。
打开ida,找到check函数 sub_402420 ,如下图
可以看到有一个条件判断:if ( (unsigned __int8)sub_402600(v2 + 16) )。一眼顶针,
两个分支分别是弹出正确和错误的对话框,为什么呢?if else函数体内容基本一样。
当然我们还是动态调试一下
所以enc函数很明显就是sub_402600
这个函数中就出现了很多垃圾指令了,也就对应上题目名称Junk_instruction了。
去花-IDA分析
爆红
花指令,经典call $+5起手,就是先用一个call压好返回地址,再把栈里的返回地址弹出来,改一下,压回去,如此反复。
去掉也很简单,我们把下述累死指令块全部nop掉即可,有好几处,一模一样。
当然,我们使用idapython脚本自动去花
加密
去除花指令,简单审计
发现是对程序进行RC4加密,最后还对输入进行了个倒叙
去花后,整理一下,代码如下
解密
首先提取密文,利用插件Lazy_ida
5BD6D026C8DD197E6E3ECB16917DFFAFDD7664B0F7E58957829F0C009ED045FA
key–>qwertyuiop
cyberchef 得解
flag{973387a11fa3f724d74802857d3e052f}