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

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 解题要点


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



CTF--2016XDCTF全国网络安全大赛之reverse5_第1张图片


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


然后找到入口函数_WinMain@16


CTF--2016XDCTF全国网络安全大赛之reverse5_第2张图片


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


CTF--2016XDCTF全国网络安全大赛之reverse5_第3张图片


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


CTF--2016XDCTF全国网络安全大赛之reverse5_第4张图片


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


CTF--2016XDCTF全国网络安全大赛之reverse5_第5张图片


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


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


CTF--2016XDCTF全国网络安全大赛之reverse5_第6张图片


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

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


CTF--2016XDCTF全国网络安全大赛之reverse5_第7张图片

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


CTF--2016XDCTF全国网络安全大赛之reverse5_第8张图片


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

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



CTF--2016XDCTF全国网络安全大赛之reverse5_第9张图片


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


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


可以看windows的消息机制。


CTF--2016XDCTF全国网络安全大赛之reverse5_第10张图片


进入窗体处理,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

CTF--2016XDCTF全国网络安全大赛之reverse5_第11张图片

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

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

CTF--2016XDCTF全国网络安全大赛之reverse5_第12张图片



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



CTF--2016XDCTF全国网络安全大赛之reverse5_第13张图片


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

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


CTF--2016XDCTF全国网络安全大赛之reverse5_第14张图片



CTF--2016XDCTF全国网络安全大赛之reverse5_第15张图片

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

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

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

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

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

而1002才是输入框标记。


CTF--2016XDCTF全国网络安全大赛之reverse5_第16张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第17张图片


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

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

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


CTF--2016XDCTF全国网络安全大赛之reverse5_第18张图片


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



CTF--2016XDCTF全国网络安全大赛之reverse5_第19张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第20张图片


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


经过程分析,跟踪调试。


CTF--2016XDCTF全国网络安全大赛之reverse5_第21张图片


过程和算法为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)

//结果判断比较


CTF--2016XDCTF全国网络安全大赛之reverse5_第22张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第23张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第24张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第25张图片

CTF--2016XDCTF全国网络安全大赛之reverse5_第26张图片CTF--2016XDCTF全国网络安全大赛之reverse5_第27张图片CTF--2016XDCTF全国网络安全大赛之reverse5_第28张图片


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


相等即可。整理后为



CTF--2016XDCTF全国网络安全大赛之reverse5_第29张图片


CTF--2016XDCTF全国网络安全大赛之reverse5_第30张图片


对密文进行逆向解码,因为是对称加密算法可以还原。代码自行编写:

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 学习总结


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

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

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




你可能感兴趣的:(逆向工程,反汇编,二进制,技术文章)