0%

Python Challenge (Level 18)

第18关

看到两张很相似的图片,再根据提示can you tell the difference,很容易就会想到两张图相减,看看结果是什么。很遗憾,得到的结果还是一张类似的图片,没有通关信息。

Page Source里面有提示

it is more obvious that what you might think

这里that应该是than!?,也就是说,我们似乎想得太复杂了。左右两张图图像内容是一样的,只是亮度不同。亮度->brightness。URl换为brightness,但是好像没什么变化。View Page Source你就会发现提示信息变了

maybe consider deltas.gz

把deltas.gz下载下来,解压后发现里面是一些16进制的信息,分为左右两栏。记得前面提到这一关是要tell the difference,对于这两栏的信息,我们要用到difflib来比较它们。然后,把得到的信息进行decode,输出到文件。最后发现,得到的文件是三张图片,里面包含通关信息。

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
# -*- coding:utf-8 -*-

import gzip
import codecs
import difflib
import re

f = gzip.open('deltas.gz', 'rb')
contents = f.read()
f.close()

lines = contents.strip().split('\n')
str1 = []
str2 = []
for line in lines:
# 左右两列分开
str1.append(line[0 : 53])
str2.append(line[56 : 109])

str_diff = list(difflib.Differ().compare(str1, str2))
# 得到的结果有三种,分别以'-','+', ' '开头,具体含义可以看difflib官方手册
png_datas = [''.join(filter(lambda l : l[0] == c, str_diff)) for c in ' -+']

for i in range(len(png_datas)):
png_data = re.sub(r'[^0-9a-fA-F]', '', png_datas[i])
png_data = codecs.getdecoder('hex')(png_data)[0]
with open(('png%d' % i), 'wb') as handle:
handle.write(png_data)

得到的三张图片里包含的信息为../hex/bin.htmlbutterfly.
下一关地址 http://www.pythonchallenge.com/pc/hex/bin.html 用户名:butter,密码:fly