看见s马上敲空格,看见x敲x,看见m敲m,然后弹出Now you know everything you need to know再次开始游戏
![](https://upload-images.jianshu.io/upload_images/19589241-46f18ac3287d6ea5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-4e67a05c5ae6299b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看来是我太菜了,可以通关的
![](https://upload-images.jianshu.io/upload_images/19589241-3c773ae190c6a0c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
函数sub_40158A()是程序的全部执行流程,我们可以看见卡在LETS PLAY下面的函数是sub_401507(),也就是说刚刚玩游戏断在了这里
![](https://upload-images.jianshu.io/upload_images/19589241-9eb99b2264523687.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
比较一下可以发现,sub_401507()是输入判断没错了
进入sub_401507(),v6是传入的第二个参数与sub_401260()有关,return也和sub_401260()有关
说明sub_401260()很关键
![](https://upload-images.jianshu.io/upload_images/19589241-ef6b6d41b2d92c2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-e0a99b71e1e07f32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-19a443b4ee854a6e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
进入sub_401260(),是个bool函数
判断:
一、用户输入是否是超时(v5=-1超时)
二、输入是否正确(v5==v3正确)
![](https://upload-images.jianshu.io/upload_images/19589241-b7f15a39377ac35c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这道题的flag和用户输入无关,是通关即可得flag的类型
解决思路:
一.od动态调试强制通关
二.找flag生成代码,直接生成flag
一、od调试
所有test al,al处下断点,将eax的值改为1
![](https://upload-images.jianshu.io/upload_images/19589241-85a2fdff6f2662fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
得到个什么玩意儿???key is not...
![](https://upload-images.jianshu.io/upload_images/19589241-db69a47b6f726a5d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
好,因为所有的判断都交给了sub_401260,把判断结果修改即可
sub_401260中v5 != -1 && v5 == v2;的两处判断和loc_4012AD有关,nop掉这个跳转,或者修改cmp的比较内容为相同也可以
![](https://upload-images.jianshu.io/upload_images/19589241-dbad831dd05ae934.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
参考ida的汇编知道,在od里智能查找字符串 UDDER FAILURE! http://imgur.com/4Ajx2可以得到sub_401260的入口
![](https://upload-images.jianshu.io/upload_images/19589241-bec35ec130560bb6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-f55a45fd2a9fb07a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
把跳转nop掉
![](https://upload-images.jianshu.io/upload_images/19589241-df02f93e0472c33f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-782f1cc039409d66.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
运行程序,等它运行结束得到flag,然后我们也看到了之前的“key is not”原来是没有把test al,al改完啊,后面还有,真的key在后面
![](https://upload-images.jianshu.io/upload_images/19589241-088ef1231fe83795.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-e1e81dab21aa20ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
直接提交flag:no5c30416d6cf52638460377995c6a8cf5
二.找flag生成代码,直接生成flag
两个do-while循环里是flag的生成代码,太麻烦了不想看....