WriteUp – WHCTF 2017

Reverse – CRACK ME

0x00 前言

  • 注意:本题目在10月28日晚上的信息安全部培训中当作例子进行了讲解,现提供完整解题思路。
  • 我在比赛中没有做这道题(那时候忙着带军训),现在补上一些分析。

0x01 环境准备

  • Windows系统电脑/虚拟机
  • IDA Pro 7.0,下载地址(校园网):CSTA文件服务器 – 逆向资源区
  • 需要管理员帐户,路径不能有中文,建议登录到Administrator用户进行(开启方法:控制面板-计算机管理-用户和组-用户-Administrator-取消“帐户已禁用”-设置密码)。

0x02 题目概况

  • 题目要求:获得注册码
  • 题目提供文件:zip文件,解压后仅获得exe文件一个
  • 需要的前序知识:
    • 了解Windows GUI编程简单基础
    • 了解Intel 80×86处理器的寄存器和汇编指令
  • 题目难度(1-5):大一 5.0,大二 4.0,大三及以上 2.0。

0x03 静态分析

  • 首先使用32位的IDA打开exe程序,按照默认的配置即可。
  • IDA分析完成后,主界面为如下状态:
  • 此时选中的是WinMain方法,WinMain方法一般是微软MFC程序或者.NET程序的主方法。但是要注意对于GUI应用程序来说,主方法的目的只有一个,那就是加载应用程序的“单例”,开始进行主运行循环(Main RunLoop)*。所以我们没办法在主运行循环开始之前寻找所需的代码。

主运行循环:主运行循环(Main RunLoop)是iOS应用开发中的概念,因为实际上大多数GUI系统的实现都大体相同,所以这里借用iOS的概念进行说明。一般而言,在GUI应用程序启动的时候,都会加载一个所谓的“应用程序单例”,在iOS中这个类的名字叫UIApplication,它的作用就是为了支撑整个GUI。在GUI运行过程中,实际上是出于一个永不停止的循环中。程序反复等待用户的操作,比如点击了按钮或者输入了文本。在用户做了相应的操作之后,GUI管理器(在iOS中一般是UIControl)会向特定的对象发送消息,用户只需要编写一些回调方法,就可以实现在特定的条件下执行特定的代码。例如在用户点击某个按钮的时候进行一些数据的处理。据我所知,iOS、Android、Java AWT/Swing都是这样的工作模式(实际上可能绝大多数的GUI实现都是这样)。

  • 该程序在点击注册按钮之后会弹出对话框,考虑这个过程,可能注册码校验的过程在点击注册按钮的回调方法中。
  • 所以本题的初步思路可以用字符串查找的方法,查找的字符串为MessageBox,然后再向前定位或许就可以找到关键代码进行分析。

在MFC应用程序设计中,MessageBox类可以用于显示一个简单的对话框窗口,而不是一个大型的窗口(这种窗口在Java中称为JFrame,我没做过MFC的开发,不太清楚在MFC中叫什么),其特点是要依赖于一个特定的“大型窗口”才可以工作。本例中弹出的“哎,注册码错了,你得换个新的呦!”显然属于MessageBox,而显示MessageBox一定在做完了注册码校验之后,故向前定位或许就可以找到关键代码。

0x04 通过动态调试定位关键代码

  • 使用字符串搜索功能进行字符串查找,查找内容为MessageBox
  • 找到的第一处位于sub_4016E0子程序中,按下F5按钮进行反编译,获得伪代码。
  • 在return语句之前任意一句下断点,然后选择调试程序为Local Windows debuger,启动这个程序。然后点击注册按钮,程序并未触发断点。
  • 这说明我们寻找到的这个MessageBox不是当前的执行逻辑可以到达的,那我们就寻找下一个,下一个MessageBox位于子程序sub_401720中。
  • 按照和之前一样的方法,按F5反编译然后再下断点,执行程序。
  • 这次程序在断点处停住了,说明我们可能找到了关键位置的后面,现在再向前定位即可。我们将子程序sub_401720更名为callFailedMessageBox
  • 然后我们再在程序中搜索callFailedMessageBox,目的是定位到调用子程序的地方,这就是向前定位,这次我们定位到了loc_40161F标号处。
  • 这段代码是没办法进行反汇编的,原因是函数栈不平。但是这里我们可以直接分析汇编代码。我们将loc_40161F标号改为checkFailedLabel。然后看右侧的注释CODE XREF,它代表了上面代码中跳转到此标号的位置,IDA提供了便捷功能可以快速到达此位置,我们双击注释即可,其实跳转的地方就在上方。
  • 上面的代码就是我们要分析的关键代码了,虽然是汇编语言,但是有一定汇编语言的知识的话也是不难看懂的。

0x05 注册逻辑的分析

  • 这部分我过两天再补充,有些同学可能还需要自己做一下。