2022年春秋杯冬季赛-reindeer game

工具准备:

1、 pyinstxtractor.py

2、uncompyle6

思路综述:

1、正常通过游戏;

2、①从python打包而成的exe入手;

②用pyinstxtractor.py工具拆包,拿到游戏的py源码;

③分析逻辑,找出得到flag的部分或者修改游戏胜利条件。

3、其他方法,可以尝试通过游戏修改器,更改关键数值(具体步骤本文并没有列出)。

详述:

题目是一个驯鹿🦌吃姜饼的游戏:题目要求吃30个,不太擅长游戏的小伙伴可能很久都不能过关。

这一题很明显是用python写的游戏,并且用了pyinstaller 进行了打包:

接下来的思路就来了,拿到源py代码,不就随意发挥了,有打包工具就有拆包工(pyinstxtractor.py),注意这里的拆包工具,历史版本太多。

版本网址一:https://github.com/extremecoders-re/pyinstxtractor

版本网址二:https://sourceforge.net/projects/pyinstallerextractor/files/dist/pyinstxtractor.py/download?use_mirror=nchc

版本三:网上查询,接下来的是别的博主改写的,可以直接用(也都算是用下来比较好的);

https://blog.csdn.net/qfcy _/article/details/113245876

拿到拆包工具后:

python3 pyinstxtractor.py reindeer.exe

之后会生成一个对应的包:

进入包中主要寻找二个部分,第一个就是reindeer的文件,实际上这是一个pyc文件,只是又由于拆包时造成的,直接加上.pyc后缀即可;

接下来就是对reindeer.pyc的反编译,需要用到工具:uncompyle6

uncompyle6 -o reindeer.py reindeer.pyc

执行后生成py源代码,这时就可以看到整个游戏的逻辑;

部分展示图:

大概分析完逻辑后,这里看到有一个重要的模块astar模块,这里是作者自己写的,所以在打包的时候应该已经打包在一起了;可以去拆的包查找:

这就是第二部分: 将astar.pyc文件同样反编译为py文件

如果缺少pygame模块的可以自行安装一下,之后就可以正常运行reindeer.py文件。

到这里我们已经拿到游戏的大部分源码了,可以直接通过修改吃姜饼的数量完成游戏,一定要注意修改的数值大小(不可为0,否则就失去了游戏的意义);修改的关键值:TO_WIN

这个方法适合追寻解题速度同时又不想失去游戏的乐趣的师傅;

根本就不想玩游戏的师傅,在分析游戏逻辑时,就发现拿到flag的关键;逻辑胜利,直接来到

def victory(time)

:这里,发现flag藏在了getczekolada()中,直接进入astar.py

这里就是一个gzip的压缩,直接一个解压缩,就可得到flag值

import gzip
data = b'\x1f\x8b\x08\x00\xd6\x03\xa0c\x02\xffK\xcbIL\xaf\xb60J4JLN2\xd3\xb5\xb400\xd65\xb14\x06\xb2\x8cR\x92t\xd3\x0cM\x8c\rS,\r\x92\xcdR\x0ck\x01\xc7Y,\xef*\x00\x00\x00'
print(gzip.decompress(data))
#b'flag{82a2acb6-9803-4936-92db-f1431d90c6d1}'

下面这幅图是:修改姜饼个数为1(4s通关🦌);

总结

1、小白文章,如果发现错误还请各位师傅指出。

2、中间踩的空较多,算是趟水的人,各位请放心食用。

补充:

作者师傅说了有彩蛋,彩蛋开启之术,同时按下0,1,2数字键(不要使用小键盘哦):