工具准备:
1、 pyinstxtractor.py
2、uncompyle6
题目是一个驯鹿🦌吃姜饼的游戏:题目要求吃30个,不太擅长游戏的小伙伴可能很久都不能过关。
这一题很明显是用python写的游戏,并且用了pyinstaller 进行了打包:
接下来的思路就来了,拿到源py代码,不就随意发挥了,有打包工具就有拆包工(pyinstxtractor.py),注意这里的拆包工具,历史版本太多。
版本网址一:https://github.com/extremecoders-re/pyinstxtractor;
版本网址二:Download PyInstaller Extractor from SourceForge.net
版本三:网上查询,接下来的是别的博主改写的,可以直接用(也都算是用下来比较好的);
pyinstxtractor.py 的改进 - 反编译pyinstaller生成exe的工具_qfcy_的博客-CSDN博客_pyinstxtractor
拿到拆包工具后:
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
def getczekolada():
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'
return gzip.decompress(data).decode('utf8')
这里就是一个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数字键(不要使用小键盘哦):