###第21关
这一关不再是给出一个网址然后解谜,而是用到上一关得到文件——package.pack以及readme.txt, readme有关于这一关的提示:
We used to play this game when we were kids
When I had no idea what to do, I looked backwards.
这一关主要过程是对package.pack文件不断进行解压。根据上一次解压得到的结果,判断下一次解压用zlib还是bz2,以及判断得到的数据是正向的还是要look backwards.
最后解压出来的结果是sgol ruoy ta kool, reverse一下得到look at your logs
也就是说,每次解压的时候,我们要添加一些信息,形成logs. 最后,我们把这个logs打印出来,就可以得到通关信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import bz2 import zlib from pprint import pprint
def uncompress(data, logs): if data[ : 2] == 'x\x9c': logs.append('*') return zlib.decompress(data) elif data[ : 2] == 'BZ': logs.append('#') return bz2.BZ2Decompressor().decompress(data) elif data[-2 : ] == '\x9cx': logs.append('@') return zlib.decompress(data[::-1]) elif data[-2 : ] == 'ZB': logs.append('$') return bz2.BZ2Decompressor().decompress(data[::-1]) else: raise ValueError
def solve(): data = open('unreal/package.pack').read() logs = [] while True: try: data = uncompress(data, logs) except: print "Decompress ends!" break logs.pop(0) print data pprint(''.join(logs).replace('*', ' ').split('@'))
if __name__ == "__main__" : solve()
|
最后得到通关信息——copper,http://www.pythonchallenge.com/pc/hex/copper.html
1 2 3 4 5 6 7 8 9 10
| [' ### ### ######## ######## ########## ########', ' ####### ####### ######### ######### ######### #########', ' ## ## ## ## ## ## ## ## ## ## ##', ' ## ## ## ## ## ## ## ## ## ##', ' ## ## ## ######### ######### ######## #########', ' ## ## ## ######## ######## ######## ######## ', ' ## ## ## ## ## ## ## ## ', ' ## ## ## ## ## ## ## ## ## ', ' ####### ####### ## ## ######### ## ## ', ' ### ### ## ## ########## ## ##']
|