python challenge

[Python Challenge通关]第6关 now ther

2018-12-07  本文已影响0人  jianggushi
channel

挑战地址,点我

分析

右键查看网页源代码看一下:

<html> <!-- <-- zip -->
<head>
  <title>now there are pairs</title>
  <link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<center>
<img src="channel.jpg">
<br/>
<!-- The following has nothing to do with the riddle itself. I just
thought it would be the right point to offer you to donate to the
Python Challenge project. Any amount will be greatly appreciated.

-thesamet
-->

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick">
    <input type="hidden" name="business" value="thesamet@gmail.com">
    <input type="hidden" name="item_name" value="Python Challenge donations">
    <input type="hidden" name="no_note" value="1">
    <input type="hidden" name="currency_code" value="USD">
    <input type="hidden" name="tax" value="0">
    <input type="hidden" name="bn" value="PP-DonationsBF">
    <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but04.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
    <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

</body>
</html>

中间一长段的注释是在说捐赠的事情,并且作者说明了与这一关的问题没有关系。

那唯一的提示,就是最上面的 `` zip 常见的是压缩包的意思,其实还有拉链的意思,这就和图片对应起来了。

再看下这一关的主题now there are pairs,关键词 pairs 成对的,zip 左侧还有一个箭头指向 html

联想一下这些线索,猜想把 url 中的 html 替换为 zip http://www.pythonchallenge.com/pc/def/channel.zip

确实如此,我们下载 channel.zip 压缩包,解压看一下。

里面有 910 个数字命名的文本文件,其中有一个 readme.txt,打开看一下:

welcome to my zipped list.

hint1: start from 90052
hint2: answer is inside the zip

根据提示,去找下名字为 90052 的文件:

Next nothing is 94191

这和第 4 关类似,也是一个链表结构,用代码实现看下,这里用到了 zipfile 包来解压 zip 文件。

#!/usr/bin/env/ python3

import zipfile
import re

infile = "channel.zip 文件路径"

# 使用 zipfile 包解压并读取文件内容到 files
files = {}
with zipfile.ZipFile(infile) as fzip:
    for name in fzip.namelist():
        with fzip.open(name) as f:
            files[name] = f.read().decode("utf-8")

# readme.txt 中 nothing 初始值
nothing = "90052"

while True:
    f = nothing + ".txt"
    if f in files:
        print(files[f])
        result = re.search(r"Next nothing is (\d+)", files[f])
        try:
            nothing = result.group(1)
        except:
            break

输出结果:

Next nothing is 67824
Next nothing is 46145
Collect the comments.

提示信息 Collect the comments.,网页源码并没有什么有意义的 comments,也许 comments 也在压缩包里面?

查看下 zipfile 包的文档说明,有个 getinfo 方法,

调用该方法会返回一个 ZipInfo Objects,这个对象确实有个 comment 属性。

和上面的联系起来,在遍历整个链表的时候,获取每个文件的 comments 看下:

#!/usr/bin/env/ python3

import zipfile
import re

infile = "/home/roger/Documents/Resource/channel.zip"

# 使用 zipfile 包解压并读取文件内容到 files
files = {}
fzip = zipfile.ZipFile(infile)
for name in fzip.namelist():
    with fzip.open(name) as f:
        files[name] = f.read().decode("utf-8")

# readme.txt 中 nothing 初始值
nothing = "90052"

while True:
    f = nothing + ".txt"
    # 获取 comment 并输出结果
    print(fzip.getinfo(f).comment.decode("utf-8"), end="")
    if f in files:
        # print(files[f])
        result = re.search(r"Next nothing is (\d+)", files[f])
        try:
            nothing = result.group(1)
        except:
            break

输出内容:

****************************************************************
****************************************************************
**                                                            **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE NN      NN  **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE  NN    NN   **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **
**   OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **
**   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE     NN      **
**                                                            **
****************************************************************
 **************************************************************

comment 中的字符组成了一个单词 hockey,用它来替换当前页面的 url 得到 http://www.pythonchallenge.com/pc/def/hockey.html

打开看到如下内容:

it's in the air. look at the letters.

翻译一下:它在空气中。 看看这些字母。,回头看下那些字符,hockey 是由 O X Y G E N 组成的,连起来就是 oxygen,这也是一个单词,氧气的意思,和提示内容符合。

oxygen 替换 url 得到下一关真正的入口了 http://www.pythonchallenge.com/pc/def/oxygen.html

参考资源:

  1. zipfile 官方文档
上一篇下一篇

猜你喜欢

热点阅读