PythonChallenge系列-P8 bzip2解压缩

PythonChallenge系列-P8 bzip2解压缩

Jan 3, 2014
Coding
PythonChallenge, Python

Work Hard #

解谜P7之后,转至第八题P8,其URL为

http://www.pythonchallenge.com/pc/def/integrity.html

一张蜜蜂采蜜的图片,下面提示“Where is the missing link?”。蜜蜂区域可以点击,点击弹出身份验证窗口

需要用户名和密码,服务器提示“inflate”(膨胀,充气)。再看网页源码,蜜蜂的点击区域使用HTML的map标签实现的,当然这与题目应该无关,但其中有两行重要提示:

un: 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'

pw: 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'

un应该是username,pw应该是password,这里的用户名密码应该就是前面身份验证窗口的用户名密码。

看到这两串字符,我首先想到的是url的编码。看了一下HTML URL Encode Reference觉得也不对。

这个编码应该是和身份验证相关的编码吧。

google “web authentic encryption”,全部结果都是SSL,应该就是它了。

再 google “python ssl”,第一个结果就是Python关于ssl的官方文档。这里面提到了base64编码,会不会是这个?

将上面两串字符分别复制到 http://www.base64decode.org/ 通过base64编码进行decode,发现解码后仍是混乱无意义的字符。也许这样做法是不对的。

inflate究竟是什么意思?直到我知道了inflate对应的deflate是一个压缩算法。它是无损压缩。试着使用Python中的zlib去解码字符串(import zlib;print zlib.decompress(un);),发现提示错误“incorrect header check”。查了一下,原因是zip编码的字符串开头是PK(即文件头是PK)(wikipedia:zip 文件头)。

那么BZ是什么文件头?bzip2。尝试用bzip2去解决。发现可行。

代码 #

#-*- coding: utf-8 -*-
import bz2

un = b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw = b'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'

username = bz2.BZ2Decompressor().decompress(un)
password = bz2.BZ2Decompressor().decompress(pw)

print (username) #huge
print (password) #file

解谜 #

用bzip2解压网页源码中的un和pw字符串,分别得到huge和file。用huge作用户名,file作密码,登陆身份验证窗口,成功解谜P8,并打开了第9题。

http://www.pythonchallenge.com/pc/return/good.html

Python知识点 #

  • deflate压缩算法,也就是zip压缩算法
  • bzip2压缩和解压缩