总的来说这道题是不好的。为什么?因为有bug。后面我会提到。因为这个bug导致这个题很多解(无数个解)。很多人脑子都不动就作出答案了。这个没有达到作者想要达到的目的。然后从正常的设计来说,还算是凑合的。给你打60分,保你及格,不能再多了:)
有很多人说这道题很难,有很多反调试。然而这并没有什么卵用,为什么呢?且看下文
首先看下程序:
根据hex可以发现。文件没加壳。没有做任何保护。直接ida怼一波。真正的粉丝,从来都没听说过什么OD和windbg,我们只用hex和IDA。
既然什么保护都没做。那就老规矩。直接看字符串:
也可以直接看导入函数:
然后引用跟一下就可以来到一个地方:
在这里我们看到了“OK”。在往上还能看到:
这种特征非常非常明显了吧?程序主要流程就在这里。。。然后你仔细看看这个函数基本这个题就做出来了(起码你已经找到核心点了)其实这里面我是为了大家理解,才这么写的。我的实际操作比这个要风骚的多啦。我在分析的时候。看到字符串有如下信息:
如上图所示。看到这个消息我就知道算法十有八九就在这里。为什么?因为只有在加密解密还有进行编码和hash的时候才有可能出现buffer太短。(后面会讲到,这里其实是摩尔斯密码的加密算法)长度不够的情况。然后直接跟上去。算法就直接被我定位到啦:)
然后不要着急。再看看字符串。字符串里面有太多信息可以挖掘啦。只要你有想象力:
这已经很明显告诉你这个程序可能会出现base64编码啦。这也是一个重要提示。(虽然你跟进去之后ida不能溯源。但是你知道算法有可能会有base64编码那就已经足够啦。逆向破解思路最重要。只要有一点点思维的火花,就可以解题了:)
除了这些,还能看到什么?如下图:
看到这个想到什么?!没错,就是摩尔斯密码。也许你会质疑:就凭借字符串,你怎么确定程序就是用了摩尔斯密码?没错,确实无法直接下定论。但是,我刚才说了。逆向整个过程就是靠思路。这个思路可能是错的,也可能就是正确答案。这无所谓的。想法对不对并不重要,重要的是你有没有自己的想法?因此思路绝对最重要的。逆向破解,思路为王。所以说在看到这些字符串的时候要大胆猜测。接下来就是小心验证。
好的,我们还没开始分析,光凭借字符串就已经得到很多的信息了。现在先总结一下:
a) 直接找到了关键跳转
b) 定位到了关键算法
c) 可以知道算法中很可能用到了base64编码和摩尔斯密码。
现在继续分析关键跳转所在的函数。这个函数的地址是:0x434EF0。这里面有很多if判定。大多数都是退出代码:
然后跟上去看一看可以发现有反调试的东西
(反调试部分后面详细说)
。然而我逆向程序从来不用动态调试。所以这些东西对我来说并没什么卵用:)
程序的关键逻辑在这里:
基本的流程就是:读取用户收入信息。然后做两次base64编码,再用国密算法SM3计算一个hash(你也可以认为就是用SM3加密)。计算完hash之后转换成16进制。然后将Hash值的后64位和用户输入进行比较。如果正确则进入一个“迷宫”迷宫就是密码学中的小游戏。就像迷宫一样:
大家看到迷宫不要方。相信我,迷宫就是吓唬新手的。其实很简单:
上图就是迷宫图。(这种迷宫还是最简单的迷宫)把里面的数据(byte_49B000)复制处理整理一下:
如上图所示,迷宫就出来了。其中X就是障碍,不能走(为了形象、直观我表示为X。其实原数据是1)0是可以走的位置。然后这个迷宫的解就出来了:
入口→下→右→下→右→右→右→右→下→下→下→左→左→上→左→左→下→下→下→右→右→右→下→右→右→右→下→右→右→上→上→左→上→左→上→上→上→上→上→右→右→上→出口
那么问题来了。我现在自己能走出去。但是具体的操作是什么我不知道。也就是说,上文提及的“上下左右”在编码中是如何表示的?“上下左右”的表示在编码中可不一定真的就是“WSAD”或者“SXZY”哦。因此这就需要分析了。其实也很简单。一看就知道啦:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课