X‘NUCA高校联赛——unravelmfc

本文详细记录了作者在X'NUCA高校联赛中解决unravelmfc挑战的过程。通过逆向工程,分析了MFC程序的控制流,解密步骤包括:寻找关键API如EnableWindow和GetDlgItem,处理动态数据,以及解决加密算法。在解题中遇到了加壳和控制流混淆,通过动态调试和内存dump等手段逐步解析。总结了寻找消息处理函数的多种方法,并分享了解密脚本和参考资料。
摘要由CSDN通过智能技术生成

RE

unravelmfc

题目提示:烦人的windows底层api

解题思路:

  1. 打开程序,发现确定按钮不能点击
    用Resources Hacker改变空间属性以后重新打开,发现确定按钮仍然无法打开
    查找关键api,EnableWindow
    // hWnd:被允许/禁止的窗口句柄
    // bEnable:1 允许,0 禁止
    BOOL EnableWindow(HWND hWnd,BOOL bEnable)
    
    发现程序中多处调用EnableWindow,且有多处禁止了这个按钮,对程序进行patch
    再次,打开程序,发现按钮可以点击了,但是点击之后无法查看对应的消息处理函数
  2. 乱找了一通api,找到了比较关键的API:GetDlgItem,才定位到消息处理函数
    //返回窗口中,指定参数ID的子元素的句柄
    //需要明确的概念,标识符!=句柄,该函数的返回值是子元素的句柄
    HWND GetDlgItem(
    HWNDhDlg, // handle to dialog box
    intnIDDlgItem// control identifier
    );
    
    后来发现自己蠢了,这里至少还有两种更方便的方法去找消息处理函数
    1. IDA找不到汉字的提示消息,但是OD查找字符串可以找到"恭喜"两个字。
    2. 寻找对应的消息处理函数
  3. 后面逐步分析,发现这个程序还是加了壳并且做了控制流混淆的。
    如何对抗花指令?
    1. 笨方法:动态调试观察程序大体意思
    2. 清洗指令(未尝试)
    找到对应的消息处理函数就容易了,加密的步骤共有三步:
    1. 输入长度应该是66位,分两步处理输入

    2. 前半段输入,先按如下步骤处理:

       ```
       v6 = 0;
       for ( i = 0; i < halflen; ++i )
       {
       v7 = (v7 + 1) % 256;
       v6 = (v6 + (unsigned __int8)byte_875088[v7]) % 256;
       v3 = byte_875088[v7];
       byte_875088[v7] = byte_875088[v6];
       byte_875088[v6] = v3;
       v2 = i + input_flag;
       *(_BYTE *)(i + input_flag) ^= byte_875088[((unsigned __int8)byte_875088[v6] + (unsigned __int8)byte_875088[v7])
                                               % 256];
       }
       ```
      

      需要注意的是,数组byte_875088的数据会在程序运行过程中改变,需要从内存中dump。

    3. 对上一步的结果,作类似于base64的变换,每3个字符替换成4个字符,替换规则如下:
      111111 112222 222233 333333
      每一块再加上23,最后与字符串"$HM%/NEX,79PBN\C/BQLVSW,*/'8T#UMC4%EG@@@,.%5"比较。(需要注意的是ida的静态分析结果中也有类似的字符串,我们仍然需要从内存中dump该字符串)

    4. 后半段输入,先是改变了默认delta的TEA加密,共分4段,key在数组dword_875048中,直接用静态分析的就可以。(因为delta改变了,findcyrpt插件居然没有查出来,不过没关系,可以看出来)

        v7 = 32;
        v18 = v14;
        v4 = v15;
        v15 = 0;
        v20 = v4;
        v9 = 0;
        do
        {
          v9 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值