题目描述
菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗
Solution
先分析文件的类型,和可打印字符串:

我们看到有字符串done!!!the flag is,但没直接显示出来,说明 Flag 可能是根据某个字母表按照一定算法去构建的。
这个程序像题目介绍的那样,通过做游戏,把所有的灯点亮,就能得到 Flag:

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

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

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

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

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

我们现在有两个思路:
- 编写一段 Python 代码帮我们重现这个加密过程
- 查找 Cross Ref 看看是谁调用了这个函数
因为这个数组很啰嗦,编写 Python 代码比较熬人心态,我们回到函数开始的地方,按右键选择Jump to xref...

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

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

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

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

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

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

