运行程序,第一感觉这玩意儿怎么像电路图开关,看下面的英文说什么,果然玩的是开关游戏,游戏的意思是从上到下有8条线路,如果选择n那么n-1、n、n+1线路的状态都会发生改变,直到8条线路的开关状态都是on时,游戏通过。
就在我试玩游戏,单个输入1、2、3,同时输入1 2 3 ,迭代输入2 3 4 5 6 7 8 1观察数据变化规律时,得到了flag,不小心通关了游戏。带着疑惑出题人想要的答案是2 3 4 5 6 7 8 1吗开始了逆向
之前文章讲过的技巧和知识,就不再详细描述了,如果有不明白的地方建议按照做题题目顺序查看。
string页面ctrl+f搜索flag字符串
进入done!!the flag is字符串的伪代码页面,发现在堆栈里压入了很多字符串,而且在成功函数之后,所以怀疑这些字符串是flag。
压入字符串后对每个字符串做了两种异或处理,v6对应的地址是ebp-88h,v7是rbp-87h,v8是rbp-86h......所以&v6到&v63+56的地址是按变量名顺序增长的
既然怀疑目前页面是获得flag的页面,那我们就看下什么函数调用了目前的页面,回到汇编页面选则xrefx to
弹出这个,尴尬
那么我们就翻到汇编最上面,看是从哪里跳过来的,跟上去
我们可以发现是sub_45F400这个函数,使用目前页面函数sub_45E940
在sub_45F400函数的伪代码里我们可以看见,当8条线路都是on时调用sub_457AB4函数,即调用sub_45F400函数,所以我们可以确定,sub_45F400函数页面就是flag生成的页面。
所以写出解密代码
一、把数据提炼出来
二、分成两个数组,运算得到flag