题目描述

菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗

Solution

先分析文件的类型,和可打印字符串:

007-1.png

我们看到有字符串done!!!the flag is,但没直接显示出来,说明 Flag 可能是根据某个字母表按照一定算法去构建的。

这个程序像题目介绍的那样,通过做游戏,把所有的灯点亮,就能得到 Flag:

007-2.png

我们进入 IDA 打开 Strings 窗口(View → Open Subview → Strings)找到相关字符串:

007-3.png

双击进入,然后列出哪些函数对它有调用:

007-4.png

我们发现有一个函数对它进行引用,进入查看:

007-5.png

按下 F5 反编译,查看源代码的大致结构:

007-6.png

源代码中列出了两个数组,这两个数组应该就是字母表,配合下面的for循环进行编码运算得到 Flag:

007-7.png

我们现在有两个思路:

  • 编写一段 Python 代码帮我们重现这个加密过程
  • 查找 Cross Ref 看看是谁调用了这个函数

因为这个数组很啰嗦,编写 Python 代码比较熬人心态,我们回到函数开始的地方,按右键选择Jump to xref...

007-8.png

之后就来到了这个地方,继续刚才的步骤:

007-9.png

然后我们就来到了main()函数,可以发现当且仅当所有灯泡都亮着的时候我们才会进入刚才的 Flag 编码函数:

007-10.png

在这里我们可以直接把判断逻辑给改掉,让程序清零的时候直接出 Flag。我们选择 Edit → Patch Program → Assembly,可以看到当前的汇编代码:

007-11.png

对比 AMD 的技术手册,我们把jnz命令改成jz命令:

007-12.png

在 IDA 中选择 Edit → Patch Program → Change byte:

007-13.png

把所有的!=都改成==后,选择 Edit → Patch Program → Apply Patches to… 保存成新的文件。打开运行新的文件,按下0把程序清零,直接出 Flag:

007-14.png