0x00 game初步分析
老铁们可以自行理解下英文,我就说个大概内容,让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。
ox01 patch game
将光标移至要修改的地方,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到手!
0x02 修改eip指针
首先我们进行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到手!
0x03 总结
- IDA修改程序执行逻辑,有两种方式:patch和修改eip指针。详细操作方法已介绍。
- 实操赢得经验,困难搏得心态