CTF--2016XDCTF全国网络安全大赛之reverse5

    xiaoxiao2021-03-25  90

    0x01 题目介绍

    题目名称      reverse5 题目描述 File: reverse5.exe Size: 121344 bytes File Version: 1.0.0.1 Modified: Friday, September 30, 2016, 01:24:54 MD5: 01C16460135B1BA4BCA48E3AB0173A17 SHA1: 06ACD42197A5F52A9CCFEC0B12EE52F647B1E71D CRC32: 1D3A0115

    0x02 解题要点

    运行程序显示,随便输入数字字符串点击按钮,没有任何提示。

    IDA载入看看,等待分析完成,选中代码部分,键盘F5实现伪代码转化。

    然后找到入口函数_WinMain@16

    进入之后到了主函数入口,红色标记位置是内部系统main函数的真正入口。

    下面的才是真正的函数入口,也就是我们用户经常开发编写的代码入口函数winmain函数。

    下图是进入主函数之后的主要代码部分

    进入之后发现有线程函数创建,注意此处标记。跟踪进去,看线程函数实体。

    也就是线程函数部分,是主要的执行体。

    跟踪进去,看线程函数实体。发现主要是反调试和一些干扰花指令

    IsDebuggerPresent函数 https://msdn.microsoft.com/en-us/library/ms680345.aspx

    花指令函数和无用的代码分支

    然后继续往下分析代码,左侧为命令参数,右侧为对话框入口。

    说明程序接收了外部的命令行参数,实现了数据的输入。

    底部有对应的窗口函数创建,就是一开始我们双击之后的用户输入编辑框和确认检查按钮。

    注意DialogFunc函数,是一个窗口回调函数,实现的是消息的实体循环处理部分。不太懂的

    可以看windows的消息机制。

    进入窗体处理,ID为1001的情况下进入这个分支。发现有关键函数。

    获取文本内容函数GetWindowTextA,

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v=vs.85).aspx

    和计算文本长度函数GetWindowTextLengthA。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms633521(v=vs.85).aspx

    同样的,也发现使用了数据设置和退出函数。

    SetWindowText函数 https://msdn.microsoft.com/en-us/library/windows/desktop/ms633546(v=vs.85).aspx

    进入窗体处理,ID为2的情况下进入这个处理。发现有用户自定义的内部函数

    进入窗体处理查看初始化,发现1001和1002为句柄赋值关键函数。

    那么这之间到底有什么关联吗?多个ID可能触发多个事件。

    文中没有解释的相关函数读者可以自己查阅微软官方文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ff468925(v=vs.85).aspx

    然后联系前面的代码中出现的ID事件,那么分析发现1001的ID事件是个花指令干扰,

    因为无论你怎么填写数据到输入框,都不能计算正确。因为没有获取此事件进行处理,

    也就是根本没有读取你的输入窗口数据。因为1001标记是程序的按钮。

    而1002才是输入框标记。

    那么根据前面的分析,那么我们抛弃1001的思路,进入1002,发现并没有处理1002的事件代码。

    于是陷入了死循环。此时,我们注意我们的程序前面分析的执行流程,发现有个窗口之前,

    命令行指令数据操作,于是跳转到此处。byte_41B3B0可疑之处。

    跟踪到此处变量引用的地方,发现在事件处理结束后,有代码操作。事件ID为无符号整数2。

    进入此处,发现有对用户命令输入参数的代码处理过程,于是推断此处才是真正的逆向分析的考点。

    经过程分析,跟踪调试。

    过程和算法为des,base64算法和xor异或算法.执行顺序

    sub_401020((int)&byte_41B3B0, v5, (int)&v7)//base64运算

    sub_402DB0(&v7, (int)&v18)

    //xor异或运算

    sub_4024F0((int)&v7, v26, &v9, (int)v16)//des算法运算sub_402E20(&unk_41B370, v16)

    //结果判断比较

    密文数据比较追踪,&unk_41B370为静态存储的密文, v16则为用户输入之后进行运算后的密文。

    相等即可。整理后为

    对密文进行逆向解码,因为是对称加密算法可以还原。代码自行编写: 1 sub_4024F0((int)&v7, v26, &v9, (int)v16)    //des算法运算 2 sub_402DB0(&v7, (int)&v18)        //xor异或运算 3 sub_401020((int)&byte_41B3B0, v5, (int)&v7)    //base64运算

    结果输出为:

    XDFLAG{this_1s_a_small_di8h_for_y0u_today!}

    0x03 学习总结

    此题目挖坑不少,选手必须清楚识别出干扰的花指令和冗余代码。

    中间出现比较多的错误算法分支和事件消息处理。还有必须去除

    反调试代码,方可减小阻力,实现快速解题。

    转载请注明原文地址: https://ju.6miu.com/read-22441.html

    最新回复(0)