python challenge 20解题总结
python challenge 20网址:www.pythonchallenge.com/pc/hex/idiot.html,查看网页源码后,可以看到idiot2.html,于是打开网址:www.pythonchallenge.com/pc/hex/idiot2.html,查看网页的源码就看到了but inspecting it carefully is allowed,于是想到需要用到httplib模块,并且需要用认证的信息,于是源代码如下。
import httplib, base64 base64_login = base64.encodestring('%s:%s' % ("butter", "fly"))[:-1] headers = {"Authorization": "Basic %s" % base64_login} conn = httplib.HTTPConnection("www.pythonchallenge.com") # Needless to say that normally we wouldn't know about the exact byte # ranges yet and thus probably use infinite loops instead ... for n in range(30203, 30314): headers["Range"] = "bytes=%s-%s" % (n, n + 1) conn.request("GET", "/pc/hex/unreal.jpg", "", headers) response = conn.getresponse() data = response.read() if data: print data # We now know that our username is "invader". for n in (2123456744, 2123456743): headers["Range"] = "bytes=%s-%s" % (n, n + 1) conn.request("GET", "/pc/hex/unreal.jpg", "", headers) response = conn.getresponse() print response.read() # We learned that "the password is your new nickname in reverse", thus: # "redavni". Further, that "it is hiding at 1152983631". headers["Range"] = "bytes=1152983631-1152983632" conn.request("GET", "/pc/hex/unreal.jpg", "", headers) response = conn.getresponse() h = open("data.zip", "wb") h.write(response.read()) h.close() # Unzip the file and read the "readme.txt" it contains.
python challeng 21 解题总结
这一关没有需要进入的网页,但是需要上一关得到一个文件,解析这个文件内容就行了。(用户名: butter; 密码: fly)
源代码如下:
import zlib, bz2 h = open("package.pack") # Hides within the ZIP file we got at the data = h.read() # end of level 20. h.close() output = [] while True: if data.startswith("BZh"): data = bz2.decompress(data) output.append("#") elif data.startswith("xx9c"): data = zlib.decompress(data) output.append(" ") elif data.endswith("x9cx"): data = data[::-1] output.append("n") else: break print "".join(output)
下一关网址:www.pythonchallenge.com/pc/hex/copper.html
python challeng 22 解题总结
python challenge 22网址:www.pythonchallenge.com/pc/hex/copper.html,查看网页源代码会发现一个提示:maybe white.gif would be more bright,于是打开和下载www.pythonchallenge.com/pc/hex/white.gif,发现这个gif是多帧的,差不多在图像的正中间有比黑色稍微亮一点的颜色……那些颜色出现在小键盘一样布局的3*3的9个位置上。然后一次当作方向向量描点处理.
源代码如下:
import Image, ImageSequence img = Image.open("white.gif") # http://www.pythonchallenge.com/pc/hex/white.gif out = Image.new("P", (125, 125)) pix = out.load() pos = [25, 25] for x in [list(f.getdata()).index(8) for f in ImageSequence.Iterator(img)]: if x == 19698: pos[0] -= 1 pos[1] -= 1 elif x == 19700: pos[1] -= 1 elif x == 19702: pos[0] += 1 pos[1] -= 1 elif x == 20098: pos[0] -= 1 elif x == 20100: pos = [pos[0] + 10, pos[1] + 10] elif x == 20102: pos[0] += 1 elif x == 20498: pos[0] -= 1 pos[1] += 1 elif x == 20500: pos[1] += 1 elif x == 20502: pos[0] += 1 pos[1] += 1 pix[pos[0], pos[1]] = 200 out.save("solution.png")
下一关的网址:www.pythonchallenge.com/pc/hex/bonus.html(用户名:butter,密码:fly)
python challeng 23 解题总结
python challenge 23网址:www.pythonchallenge.com/pc/hex/bonus.html,查看网页源代码会发现两个提示:(1)this is an undocumented module;(2)va gur snpr bs jung?。由第一个提示就能想到this这个模块,但是第二个提示是进行一些处理过的字符串,如果是使用linux或者unix,就会发现:
grep -i "va gur snpr bs" *
this.py:Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
换成英文就是:
In the face of ambiguity, refuse the temptation to guess.
于是就得出答案,下一关的网址就是:www.pythonchallenge.com/pc/hex/ambiguity.html(用户名:butter,密码:fly)
python challeng 24 解题总结
python challeng 25 解题总结
python challenge 25网址:www.pythonchallenge.com/pc/hex/lake.html(用户名:butter,密码:fly)。查看网页源代码可以看到一个提示:can you see the waves。于是想到去看网址:www.pythonchallenge.com/pc/hex/lake1.wav,果然存在这个音频文件,看到关数以及拼板的数量,于是一直下载到lake25.wav.这是一个奇怪的帧率音频文件。让我们的波形编辑器打开它,看看它是什么样子。嗯,有一个明确的行为期3样本,而不是我们期望在所有的音频。也许它并不是在所有的音频,但一些其他形式的数据编码,说一个形象,一个拼图的一部分。如果我们除以3(3个字节,每个像素),我们得到完整的拼图3600。
源代码如下:
## template = "http://butter:fly@www.pythonchallenge.com/pc/hex/lake%i.wav" ## fname=r'd:25_lake%d.wav' ## for i in range(1, 26): ## urllib.urlretrieve(template % i,fname%i) ## # 完成拼接 ## l=[] ## for i in range(1,26): ## f=wave.open(ur'd:25_lake%d.wav'%i,'rb') ## l.append(f.readframes(f.getnframes())) ## f.close() ## im=Image.new('RGB',(300,300)) ## for i in range(25): ## im.paste(Image.fromstring('RGB',(60,60),l[i]),( 60*(i%5),60*(i//5))) ## im.show()
python challenge 26解题总结
python challenge 26网址:www.pythonchallenge.com/pc/hex/decent.html(需要用户名和密码的话,用户名为butter,密码为fly),查看网页源代码以及图片会发现:
# be a man - apologize!
# 图中是抓耳挠腮的猴子,下面有句话 Hurry up, I'm missing the boat
# 网页注释中有 <!-- you've got his e-mail -->
# 联想到前面第19关解一个邮件里面的音频文件,当时没有记那个email地址
# 回去找,是 leopold.moz@pythonchallenge.com
# 发封邮件到这个地址,既然要道歉,就说sorry吧
# 得到如下输出
# 发件人 Leopold Mozart <leopold.moz@pythonchallenge.com>
# 发送至 keep.studying.everyday@gmail.com
# 日期 2010年1月5日 下午11:58
# 主题 Re: my broken zip Re: sorry
# 邮送域 mail-yw0-f121.google.com
#
# Never mind that.
#
# Have you found my broken zip?
#
# md5: bbb8b499a0eef99b52c7f13f4e78c24b
#
# Can you believe what one mistake can lead to?
# 这让我想到第24关的那个mybroken.zip
# 看来要想办法根据md5修复这个zip文件
# 用winrar修复失败
# 又没有思路了。。。
# 看攻略的解法:
# 信中的最后一句意思是你能相信错了一个字节就会出现这个吗?暗示你那个zip文件有一个字节错了。
# 所以修复方法是,枚举每个字节的所有可能值,然后算md5,直到与已知的正确md5值相同为止。
# 从修复好的zip文件里打开gif文件,里面显示 speed ==> http://www.pythonchallenge.com/pc/hex/speed.html
# 地址不对
# 猜吧,发现正确的是speedboat ==> http://www.pythonchallenge.com/pc/hex/speedboat.html
源代码如下:
def level_26(): data=open(ur'd:mybroken.zip','rb').read() for i in range(len(data)): for c in range(256): newdata=data[:i]+chr(c)+data[i+1:] if hashlib.md5(newdata).hexdigest()=='bbb8b499a0eef99b52c7f13f4e78c24b': open(ur'd:mybroken_repaired.zip','wb').write(newdata) # 修复好的文件打开里面的mybroken.gif, 图中显示 speed print 'repaired.' return
下一关网址:www.pythonchallenge.com/pc/hex/speedboat.html(用户名:butter,密码:fly)
python challenge 27 解题总结
python challenge 28解题总结
python challenge 28网址:www.pythonchallenge.com/pc/ring/bell.html(用户名是repeat 密码是 switch )
- 图片是瀑布,湖,丛林,图片上面似乎覆盖着很多长短不一的竖条
- many pairs ring-ring
- 提示 RING-RING-RING say it out loud
- 再次失去思路
- 一个攻略说,传说中ring-ring-ring 反复读会变成green
- 另一个则说,会变成grin
- 先看grin ==> http://www.pythonchallenge.com/pc/ring/grin.html
- 网页上提示 you are not happy - you are feeling sick.
- 再看green ==> http://www.pythonchallenge.com/pc/ring/green.html
- 网页上提示 yes! green!
- 解码图片上短竖条中的g值
源代码:
def level_28(): im=PngImagePlugin.PngImageFile(ur'd:bell.png') l=[] for y in range(im.size[1]): for x in range(im.size[0]): l.append(im.getpixel((x,y))[1]) print l[:10] paris=[(l[i],l[i+1]) for i in range(0,len(l),2)] # 根据"my paris" 将像素两两分为一组 # 可以看出基本上每个paris内两像素之差都为42 print paris[:10] diffs=[abs(i[0]-i[1]) for i in paris] # 计算两两像素之差的绝对值 print diffs[:10] d=[x for x in diffs if x!=42] # 过滤掉差值等于42的 print d s=''.join([chr(x) for x in d]) # 剩下的差值转为字符 print s # 输出 whodunnit().split()[0] ? # 到此就有些让我奇怪了,whodunnit是到结尾才知道谋杀犯的侦探小说的意思,怎么会联想到Python发明人Guido Van Rossum ? # 难道是发音像 who done it 谁做了这些 print 'Guido Van Rossum'.split()[0] # 输出 guido ==> http://www.pythonchallenge.com/pc/ring/guido.html # 从官方wiki看到获取所有像素的g值的更好方法是 ## im=Image.open(ur'd:bell.png') ## green=im.split()[1] ## greendata=green.getdata()
下一关的网址:www.pythonchallenge.com/pc/ring/guido.html(用户名是repeat 密码是 switch )