解题
方法一
下载程序,运行一下:
点确定,有会弹出一个新的窗口:
点击Command按钮,左上角的数字就会增加,大概是要我们点击一万次:
PEiD查加壳:
并没有加壳,是MFC编程的小软件。所以我们用IDA打开,是没法查看伪代码的:
查看字符串也没有找到有用的信息,只有一个标题的From1:
直接用OD打开,动态调试:
MFC程序停在统一的外层入口处7770A9E0,直接Ctrl+G或者点击断点跳转到我们内层程序:
右键->查找->所有参考文本:
其实上面的DeZmqMUhRcP8NgJgzLPdXa就是加密后的flag,有人直接就知道它是flag了,但我开始没注意到,我是看到之前按我们运行程序的时候看到的字符串“点击一万次有flag”,点击它查看一下:
单步调试,发现程序调用了msvbvm60.rtcMsgBox(调用一个消息框):
运行了这行汇编之后就会显示这个框:
点击确定之后,就到了这一行代码:
再往下就是返回msvbvm60.66051D33的程序领空:
返回到msvbvm60.66051D33里调用工程4模块的函数:
之后就是在msvbvm60模块里逐层的返回、交叉调用:
最终再回到最里层的函数:
它再调用工程4模块的函数:
这个函数再跳转到比较点击次数最终输出函数,00401880:jmp 工程4.00401C80:
往下到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不跳
所以我们只要在这修改标志位ZF、修改0x40的大小或者修改JE等多类方法阻止程序的跳转,让它正常输出flag即可:
我们直接把ZF标志位修改成0,让程序不跳转输出flag:
DeZmqMUhRcP8NgJgzLPdXa明显是加密后的flag,为Base58
Base58在线解码的网站:http://www.metools.info/code/c74.html:
得到flag:flag{c1icktimes}
方法二:
这道题其实挺简单的,首先运行程序,搜一下字符串:
定位到“ghjljzlkaslkkndnl”这里,为什么不定位到“点击一万次有flag”呢,因为他是程序一开始的消息框,后面触发的按钮事件才是主程序。
接下来我们只能一个一个试了,在主程序里的各个跳转都下断,然后运行一下程序,看看那个跳转了,哪一个就是关键跳咯:
最后我们定位到了这个je,把它改为jnz,成功弹窗:
这里需要注意以下一下,这一串字符串是base58加密的
成功拿到flag:flag{c1icktimes}