The Python Challenge : http://www.pythonchallenge.com/

Level 0:

看提示图片中为2**38,计算值为274877906944。

Hint: try to change the URL address.

下一关地址:http://www.pythonchallenge.com/pc/def/274877906944.html

Level 1:

Hint 1:K->M  O->Q  E->G

此提示可看出是位移计算,都是位移两位

Hint 2:g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

想必是利用Hint 1的唯一算法转换字符串,得到下一关的地址信息,需要注意的是转换是在26个字母中转换的,不多说,上代码

  1. s = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
  2. def change_str(s):
  3. if s is 'y':
  4. return 'a'
  5. if s is 'z':
  6. return 'b'
  7. if s.isalpha() and s not in 'yz':
  8. return chr(ord(s)+2)
  9. return s
  10.  
  11. ns = map(change_str, s)
  12. print ''.join(ns)

解密得到:i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

根据提示,使用同样的方法转换map,得到ocr

下一关地址:http://www.pythonchallenge.com/pc/def/ocr.html

Level 2:

根据提示密码藏在图片的书中,或者页面源码中,看了下图片果断F12,看到页面源码中有一大段字符串,提示找出重复最少的

  1. import collections
  2. def mycount(s):
  3. lit = []
  4. lit_num = []
  5. for item in s:
  6. if item in lit:
  7. continue
  8. lit.append(item)
  9. for item in lit:
  10. num = s.count(item)
  11. lit_num.append(num)
  12. return collections.OrderedDict(zip(lit, lit_num))
  13.  
  14. dic = mycount(s)
  15. for k, v in dic.iteritems():
  16. print k, '=', v

由于字符是有顺序的,所以这里我使用了有序的字典,进行存储字符跟出现次数,得到结果为;equality

下一关地址:http://www.pythonchallenge.com/pc/def/equality.html

Level 3:

Hint :One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.

找到这么一个小写字母,两边都是三个大写字母,要求:xXXXxXXXx

两边都是连续的三个大写字母,所以再边上就要是小写字母,不然就不满足要求了

在哪里找这些字符呢??查看页面源码,发现有一大串字符串,一定是在这里找了。

使用正则表达式进行查找字符串,附上代码:

  1. regex = r"[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]"
  2. REGEX = re.compile(regex)
  3. result = REGEX.findall(s)
  4. print result

得到:['qIQNlQSLi', 'eOEKiVEYj', 'aZADnMCZq', 'bZUTkLYNg', 'uCNDeHSBj', 'kOIXdKBFh', 'dXJVlGZVm', 'gZAGiLQZx', 'vCJAsACFl', 'qKWGtIDCj']

取的小写字母得:linkedlist

访问:http://www.pythonchallenge.com/pc/def/linkedlist.html,得到linkedlist.php

下一关地址:http://www.pythonchallenge.com/pc/def/linkedlist.php

Level 4:

点击图片跳转页面显示:and the next nothing is 44827

查看页面源码发现: urllib may help. DON'T TRY ALL NOTHINGS, since it will never
end. 400 times is more than enough.

尝试把nothing改为44827,页面跳转显示:and the next nothing is 45439

根据提示应该是要一直访问,访问400次就的到下一关页面

  1. import urllib
  2. from bs4 import BeautifulSoup
  3.  
  4. def challenge(noth):
  5. url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={}".format(noth)
  6. responce = urllib.urlopen(url)
  7. html = responce.read()
  8. soup = BeautifulSoup(html, 'lxml')
  9. body_text = soup.find('body').text
  10. nothing = (body_text.split('.')).pop()
  11. if 'html' == nothing:
  12. print 'Congratulations!!!!-----------------------------------------------'
  13. print body_text
  14. else:
  15. print '-----------------------------------------------------------------'
  16. print body_text
  17. nothing = (body_text.split(' ')).pop()
  18. try:
  19. if isinstance(int(nothing), int):
  20. return challenge(nothing)
  21. except ValueError:
  22. nothing = int(noth) / 2
  23. print nothing
  24. print '--------------------------------------------------------------'
  25. return challenge(nothing)

查看记录得到:peak.html

下一关地址:http://www.pythonchallenge.com/pc/def/peak.html

Level 5:

这题有点坑爹,找不到突破点,百度了下,根据发音的到需要用pickle处理数据,晕....

查看源码,下载banner.p,打开看了下,确实像是pickle处理过的,使用pickle处理得到

  1. [[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)], [(' ', 95)]]

看到元组的第一个元素不是空格就是#,第二个元素可能是个数,尝试了下

  1. import pickle
  2. f = open('banner.p')
  3.  
  4. l = pickle.load(f)
  5. print l
  6. print '\n'.join([''.join([p[0] * p[1] for p in item]) for item in l])
  7.  
  8. for item in l:
  9. for p in item:
  10. s = p[0] * p[1]
  11.  
  12. f.close()

果真是一幅图

  1. ##### #####
  2. #### ####
  3. #### ####
  4. #### ####
  5. #### ####
  6. #### ####
  7. #### ####
  8. #### ####
  9. ### #### ### ### ##### ### ##### ### ### ####
  10. ### ## #### ####### ## ### #### ####### #### ####### ### ### ####
  11. ### ### ##### #### ### #### ##### #### ##### #### ### ### ####
  12. ### #### #### ### ### #### #### #### #### ### #### ####
  13. ### #### #### ### #### #### #### #### ### ### ####
  14. #### #### #### ## ### #### #### #### #### #### ### ####
  15. #### #### #### ########## #### #### #### #### ############## ####
  16. #### #### #### ### #### #### #### #### #### #### ####
  17. #### #### #### #### ### #### #### #### #### #### ####
  18. ### #### #### #### ### #### #### #### #### ### ####
  19. ### ## #### #### ### #### #### #### #### #### ### ## ####
  20. ### ## #### #### ########### #### #### #### #### ### ## ####
  21. ### ###### ##### ## #### ###### ########### ##### ### ######

坑爹!坑爹!

下一关地址:http://www.pythonchallenge.com/pc/def/channel.html

Level 6:

Hint:查看页面源码,发现注释zip,可能与Zip文件有关

将channel.html改为channel.zip,还真有zip文件;

打开zip文件,看到有个readme.txt,内容如下:

welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip
发现其他文件名都是数字,于是采用zipfile模块处理文件,献上代码:

  1. import zipfile
  2.  
  3. file_zip = zipfile.ZipFile('channel.zip')
  4. files = file_zip.namelist()
  5. def item(start):
  6.  
  7. if start in files:
  8. with file_zip.open(start) as f:
  9. content = f.read()
  10. print content
  11. result = '{}.txt'.format(content.split(' ').pop())
  12. return item(result)
  13. else:
  14. result = start.split('.')
  15. print 'The result is: ', result[0]
  16.  
  17. if __name__ == '__main__':
  18. item('90052.txt')

程序最后得到:Collect the comments.

comment??哪里来的comment,想到可能是文件的,查看到zipfile有个comment属性

于是修改程序,收集每个文件的comment,

  1. import zipfile
  2.  
  3. file_zip = zipfile.ZipFile('channel.zip')
  4. files = file_zip.namelist()
  5. lst = []
  6. def item(start):
  7.  
  8. if start in files:
  9. with file_zip.open(start) as f:
  10. content = f.read()
  11. com = file_zip.getinfo(start).comment
  12. lst.append(com)
  13. print content
  14. result = '{}.txt'.format(content.split(' ').pop())
  15. return item(result)
  16. else:
  17. result = start.split('.')
  18. print 'The result is: ', result[0]
  19.  
  20. if __name__ == '__main__':
  21. item('90052.txt')
  22. result = ''.join(lst)
  23. print result

得到:

  1. ****************************************************************
  2. ****************************************************************
  3. ** **
  4. ** OO OO XX YYYY GG GG EEEEEE NN NN **
  5. ** OO OO XXXXXX YYYYYY GG GG EEEEEE NN NN **
  6. ** OO OO XXX XXX YYY YY GG GG EE NN NN **
  7. ** OOOOOOOO XX XX YY GGG EEEEE NNNN **
  8. ** OOOOOOOO XX XX YY GGG EEEEE NN **
  9. ** OO OO XXX XXX YYY YY GG GG EE NN **
  10. ** OO OO XXXXXX YYYYYY GG GG EEEEEE NN **
  11. ** OO OO XX YYYY GG GG EEEEEE NN **
  12. ** **
  13. ****************************************************************
  14. **************************************************************

访问:http://www.pythonchallenge.com/pc/def/hockey.html

得到:it's in the air. look at the letters.

还没完成,看到comments里有些字母,“OXYGEN”,将hockey改为oxygen得带下一关地址

下一关地址:http://www.pythonchallenge.com/pc/def/oxygen.html

持续更新

The Python Challenge 闯关笔记的更多相关文章

  1. the python challenge闯关记录(0-8)

    0 第零关 2**38 = 274877906944 下一关的url:http://www.pythonchallenge.com/pc/def/274877906944.html 1 第一关 移位计 ...

  2. the python challenge闯关记录(9-16)

    9 第九关 是一张图,上面有很多的黑点,查看网页源代码发现了上一关的提示: 还发现了一大串的数字 感觉又是一个使用PIL库进行图像处理的题,百度后知道要将这些点连接起来并重新画图.但是不能在原始图上修 ...

  3. Python Challenge 第一关

    偶然在网上看到这个,PYTHON CHALLENGE,利用Python语言闯关,觉得挺有意思,就记录一下. 第0关应该算个入口吧,试了好几次才试出来,没什么代码就不写了.计算一个结果出来就行. 第一关 ...

  4. Python 爬虫闯关(第一关)

    在学习爬虫时,遇到了一个有意思的网站,这个网站设置了几个关卡,需要经过爬虫进行闯关,随着关卡的网后,难度不断增加,在闯关的过程中需要学习不同的知识,你的爬虫水平也自然随之提高. 今天我们先来第一关,访 ...

  5. XSS Challenges闯关笔记

    前言 做xss做疯了再来一个. 地址:https://xss-quiz.int21h.jp/ ,这个貌似是日本的一个安全研究员yamagata21做的. 做到第九关就跪了,而总共有二十关.一半都还没有 ...

  6. 某xss挑战赛闯关笔记

    0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...

  7. W3CSchool闯关笔记(Bootstrap)

    该闯关内容与JS闯关衔接. 每一题的答案均在注释处, 第一关:把所有的HTML内容放在一个包含有container-fluid的class名称的div下(注意,是所有的HTML内容,style标签属于 ...

  8. W3CSchool实战闯关笔记(JavaScript)

    //handsome /** *ugly **/ 第一关注释 // 举例 var myName; // Define myName below this line 第二关声明变量 // Setup v ...

  9. W3CSchool闯关笔记(JQuery)

    <script> $(document).ready(function(){ }); </script> <!-- Only change code above this ...

随机推荐

  1. php实现:当未登录时转到登陆页面

    判断session是否存在,不存在则跳转到登录页面session_start(); if ( !$_SESSION['xxx'] ) {    header("Location: login ...

  2. 从 AVFrame 中取出帧(YUV)保存为 Mat 格式

    由于 cnblogs 不支持科学公式,完整内容请移步原文链接 原文地址:从 AVFrame 中取出帧(YUV)保存为 Mat 格式 从 AVFrame 中取出帧(YUV)保存为 Mat 格式 本文档针 ...

  3. bulk_create(lst) 批量创建数据

    # 批量创建数据 # Create your views here. from django.db import models from django.shortcuts import HttpRes ...

  4. WPF 使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  5. OpenStack 虚拟机冷/热迁移功能实践与流程分析

    目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...

  6. ElasticSearch的中文分词器ik

    一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用. 二.IK ...

  7. Java中File类的基本用法

    File类的基本用法 java.io.File类:代表文件和目录.在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到此类. File类的常用构造方法:public File(Strin ...

  8. 配置本地访问远程Linux系统服务器的jupyter notebook

    环境情况 远程服务器上配置了anaconda 本地主机没有安装anaconda(其实安不安装都无所谓,有浏览器就行) 配置步骤如下 登录远程服务器 生成配置文件 jupyter notebook -- ...

  9. Python密码登录程序的思考--学与习

    # 初学者的起步,对于开始的流程图结构还不太熟悉 #   思考: 1,write()与writelines()的区别,前者确定为字符串,后者为序列(列表,字典.元组等),自动为你迭代输入#      ...

  10. [转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解

    基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解 不明觉厉 只要是人做的东西 就会有bug 就会有安全问题 就看发现bug 或者是发现安全问题 有没有收益了 会用linux的都是比较熟 ...