bugku-逆向-11、不好用的ce

下载程序,运行一下:
bugku-逆向-11、不好用的ce

点确定,有会弹出一个新的窗口:
bugku-逆向-11、不好用的ce

点击Command按钮,左上角的数字就会增加,大概是要我们点击一万次:
bugku-逆向-11、不好用的ce

再用PEiD看一下有没有加壳:
bugku-逆向-11、不好用的ce

并没有加壳,是MFC编程的小软件。所以我们用IDA打开,是没法查看伪代码的:
bugku-逆向-11、不好用的ce

查看字符串也没有找到有用的信息,只有一个标题的From1:
bugku-逆向-11、不好用的ce

直接用OD打开,动态调试:
bugku-逆向-11、不好用的ce

MFC程序停在统一的外层入口处7770A9E0,直接Ctrl+G或者点击断点跳转到我们内层程序:
bugku-逆向-11、不好用的ce

右键->查找->所有参考文本:

bugku-逆向-11、不好用的ce

其实上面的DeZmqMUhRcP8NgJgzLPdXa就是加密后的flag,有人直接就知道它是flag了,但我开始没注意到,我是看到之前按我们运行程序的时候看到的字符串“点击一万次有flag”,点击它查看一下:
bugku-逆向-11、不好用的ce

单步调试,发现程序调用了msvbvm60.rtcMsgBox(调用一个消息框):
bugku-逆向-11、不好用的ce

运行了这行汇编之后就会显示这个框:
bugku-逆向-11、不好用的ce

点击确定之后,就到了这一行代码:
bugku-逆向-11、不好用的ce

再往下就是返回msvbvm60.66051D33的程序领空:
bugku-逆向-11、不好用的ce

返回到msvbvm60.66051D33中调用工程4模块的函数:
bugku-逆向-11、不好用的ce

之后就是在msvbvm60模块中逐层的返回、交叉调用:
bugku-逆向-11、不好用的ce

最终再回到最里层的函数:
bugku-逆向-11、不好用的ce

它再调用工程4模块的函数:
bugku-逆向-11、不好用的ce

这个函数再跳转到比较点击次数最终输出函数,00401880:jmp 工程4.00401C80:
bugku-逆向-11、不好用的ce

往下到00401E21:test ah,0x40; 判断点击的次数,决定跳转的方向,测试ah的第7位(0100 0000)是否为1。ah的第7位是1,则说明它已经计数到了一万次,则test的结果是1,ZF标志位置0,不跳转,输出flag;否则ah的第7位不是1,则说明它还没有计数到了一万次,则test的结果是0,ZF标志位置1,跳转,不输出flag。
00401E24:je short 工程4.00401E97; 跳转,不输出flag。JE看零标志位,zf = 1则JE跳转,ZF = 0则JE不跳
bugku-逆向-11、不好用的ce

所以我们只要在这修改标志位ZF、修改0x40的大小或者修改JE等多种方法阻止程序的跳转,让它正常输出flag即可:
bugku-逆向-11、不好用的ce

我们直接把ZF标志位修改成0,让程序不跳转输出flag:
bugku-逆向-11、不好用的ce

DeZmqMUhRcP8NgJgzLPdXa明显是加密后的flag,开始以为是Base64,结果解码失败:
bugku-逆向-11、不好用的ce

后面觉得可能是Base家族中的其他编码方式:base32、base16、base58、base91、base92、base36、base62、base85、base128、base52、base56、base58、base94。百度搜了一下,发现是Base58编码,找到一个Base8在线解码的网站:http://www.metools.info/code/c74.html
bugku-逆向-11、不好用的ce

得到flag:flag{c1icktimes}。