题目名称
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
运行程序显示,随便输入数字字符串点击按钮,没有任何提示。
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!}
此题目挖坑不少,选手必须清楚识别出干扰的花指令和冗余代码。
中间出现比较多的错误算法分支和事件消息处理。还有必须去除
反调试代码,方可减小阻力,实现快速解题。