老铁们可以自行理解下英文,我就说个大概内容,让8盏灯全部都亮,那就算完事,flag就会自己出来。
先把它丢进IDA反编译下。
看到这里,猜测sub_457AB4()大概就是打印flag的地方了,双击切进去看下。
果然,看到了flag is心情很激动,但是看到flag经由这么多数据得到,懒癌的我倒吸了一口凉气。 这道题有多种方法,其中一种就是把这些数据拷贝出来,然后手写程序跑出flag,算法好的同学也可以用BFS(广度优先搜索)试试。题目这意思,也不排除是考这个算法。
我只想用最简单省事的方法搞定它:使用IDA控制程序执行顺序。 这种方式有两种方法:
patch程序,将jnz改成jz 如果我这里将byte_532E28数组下标为34567改成 !=1,直接按2,满足这个if条件,那么flag就能自己出来。简单粗暴,无任何条件直接跳入sub_457AB4拿到flag。将光标移至要修改的地方,tab键返回汇编代码界面 这里就能看出来,有多个jnz对应着 ==1的逻辑,将光标移至jnz,然后edit => patch program => change Byte。
jnz对应的是75,这里将其改成74,也就是jz。 修改完,我们再进行edit => patch program => Apply patchs input to file,再点击确定,就可以将修改重写入exe了。 按F5,重新生成伪代码,我们看看现在程序的逻辑。 打开程序直接输入2,flag到手!
首先我们进行IDA对exe的动态调试,在main之后任意一个地方下断点。 按F9,这里我推荐使用Remote Windows debugger模式。Local Windows debugger也行,但是我的IDA Pro 7.0出现了奇奇怪怪的问题,为了稳妥不被无关紧要的事情耽搁时间,建议直接Remote Windows debugger。 找到IDA目录,然后翻看IDA_Pro_v7.0_Portable\dbgsrv,点击win32_remote运行。 然后返回IDA,填入127.0.0.1 然后点击ok,运行。 这里的general registers是断点中记录的变量,其中EIP指针代码了接下来要跳转的位置,我们找到执行打印flag地方的函数地址。
然后按两次F8,再切到game界面,flag到手!
