题目描述
菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗
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: