Skip to content

Latest commit

 

History

History
283 lines (250 loc) · 8.17 KB

12_gate12.md

File metadata and controls

283 lines (250 loc) · 8.17 KB

1.第12关的入口地址是:http://monyer.com/game/game1/smartboy.php

2.下载源码:

<title>梦之光芒/Monyer——Monyer's Game(第12关)</title>

欢迎您来到第12关

请进入第13关:<textarea>JTRBJTU0JTYzJTdBJTRBJTU0JTVBJTQ3JTRBJTU0JTU5JTc5JTRBJTU0JTU5JTMxJTRBJTU0JTU5JTc4JTRBJTU0JTYzJTMxJTRBJTU0JTYzJTMwJTRBJTU0JTU5JTM1JTRBJTU0JTU5JTMyJTRBJTU0JTYzJTMxJTRBJTU0JTVBJTQ0JTRBJTU0JTRBJTQ2JTRBJTU0JTYzJTc3JTRBJTU0JTU5JTM0JTRBJTU0JTYzJTc3</textarea>

3.分析: 这个密码是通过表单提交的,也就是说要分析这些数据来得出密码。 把这些数据整理可以得: JTRB JTU0 JTYz JTdB JTRB JTU0 JTVB JTQ3 JTRB JTU0 JTU5 JTc5 JTRB JTU0 JTU5 JTMx JTRB JTU0 JTU5 JTc4 JTRB JTU0 JTYz JTMx JTRB JTU0 JTYz JTMw JTRB JTU0 JTU5 JTM1 JTRB JTU0 JTU5 JTMy JTRB JTU0 JTYz JTMx JTRB JTU0 JTVB JTQ0 JTRB JTU0 JTRB JTQ2 JTRB JTU0 JTYz JTc3 JTRB JTU0 JTU5 JTM0 JTRB JTU0 JTYz JTc3 很有规律的样子.把上面的字符串提取出来都提交一遍都不成功。 把上面的内容更存储到passwd.txt 提交脚本:

#  -*-  coding: utf-8  -*-
import time
import random
import urllib2
import urllib
import re

text = ""

class SubmitForm(object):
    """docstring for SubmitForm"""
    def __init__(self, url):
        super(SubmitForm, self).__init__()
        self.url = url

    def post(self, url, data):
        headers = {
              "User-Agent" : " Mozilla/4.0 my test",
              "Accept": "*/*",
              "Host": "monyer.com",
              "Content-Type"  : "application/x-www-form-urlencoded",
              "Content-Length": str(len(data)) ,
              "Pragma" : "no-cache",
              "Connection": "keep-alive"
        }

        request = urllib2.Request(url, data)
        for key in headers:
            request.add_header(key, headers[key])
        response = urllib2.urlopen(request)
        return response.read()

    def receive(self, response, passwd):
        print response

    def pack_form_data(self, passwd):
        values = {
        'pwd' : passwd,
        }
        data = urllib.urlencode(values)
        return data

    def send_pwd(self , passwd):
        data = self.pack_form_data(passwd)
        return self.post(self.url, data)

class GuessPass(object):
    """docstring for GuessPass"""
    def __init__(self, filename):
        super (GuessPass, self).__init__()
        self.filename = filename
        self.triedpass = "triedpass.txt"
        self.channel = SubmitForm("http://monyer.com/game/game1/smartboy.php?")
        self.tried = {}
    def guess_way1(self):
        fdread = open(self.filename, 'r')
        filelist = fdread.readlines()
        passlist = []
        for line in filelist:
            passwd =  line.strip('\r\n')
            passlist.append(passwd)
        self.try_pass(passlist)
        for key in self.tried.keys():
            print key + " : " + str(self.tried[key])

    def juge_pass(self, response):
        key = u'<p>欢迎您来到第12关</p>'.encode('utf-8')
        match = re.findall(key, response)
        for line in match:
            print line.decode('utf-8')
        if len(match):
            return 0
        return 1

    def try_pass(self, passlist):
        print "try_pass"
        for passwd in passlist:
            if self.tried.has_key(passwd):
                self.tried[passwd] = self.tried[passwd] +1
                continue
            response = self.channel.send_pwd(passwd)
            ret = self.juge_pass(response)
            if ret ==1:
                print "passwd find :" + passwd;
                return 1
            time.sleep(0.5)
            self.tried[passwd] = 1
        return 0

        

if __name__ == "__main__":
    # channel = SubmitForm("http://monyer.com/game/game1/smartboy.php?")
    # print channel.send_pwd("JTRB")
    gs = GuessPass('passwd.txt')
    gs.guess_way1()

策略一的做法没有找到密码。看来要继续分析这些字符。

对字符做下统计: JTc3 : 2 JTRB : 16 JTMy : 1 JTMx : 3 JTc5 : 1 JTc4 : 1 JTdB : 1 JTMw : 1 JTYz : 6 JTM1 : 1 JTM0 : 1 JTU5 : 6 JTU0 : 15 JTQ0 : 1 JTQ3 : 1 JTQ2 : 1 JTVB : 2 共计有60个这样的组合JTRB出现16次。是否是那种编码呢?我觉得base64看起来很像。那么就尝试下解码吧。 http://monyer.com/demo/monyerjs/提供多种解码方式。 base64解码后得到如下字符串。 %4A%54%63%7A%4A%54%5A%47%4A%54%59%79%4A%54%59%31%4A%54%59%78%4A%54%63%31%4A%54%63%30%4A%54%59%35%4A%54%59%32%4A%54%63%31%4A%54%5A%44%4A%54%4A%46%4A%54%63%77%4A%54%59%34%4A%54%63%77

看起来有点熟悉的样子,再来下16进制解码: JTczJTZGJTYyJTY1JTYxJTc1JTc0JTY5JTY2JTc1JTZDJTJFJTcwJTY4JTcw

这个怎么还是重复的也像是base64.那么我们再来一次base64解码: %73%6F%62%65%61%75%74%69%66%75%6C%2E%70%68%70 还是刚才的思路,我们再来一次16进制解码: sobeautiful.php god 写了半天脚本去猜,最后发现是怎么个东西。

浏览器输入:http://monyer.com/game/game1/sobeautiful.php出现如下内容:

本页禁止盗链!

--------------------------------------------怎么还有雷--------------------------------------------

为什么会产生盗链?

一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面, 那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片, 那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器会将图片安放 到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题, 那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。 这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现, 这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。 一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。 这个是百度的解释。见http://baike.baidu.com/view/273013.htm。 这么一看就容易了。那我们造一个referer就能搞定啦。不知道chrome怎么修改请求头,支行脚本搞定。

#  -*-  coding: utf-8  -*-
import time
from random import Random
import urllib2
import urllib
import re


class SubmitForm(object):
    """docstring for SubmitForm"""
    def __init__(self, url):
        super(SubmitForm, self).__init__()
        self.url = url

    def get(self):
        return self.__get(self.url)

    def __get(self, url):
        headers = {
              "User-Agent" : " Mozilla/4.0 my test",
              "Accept": "*/*",
              "Host": "monyer.com",
              "Referer" : "http://monyer.com/game/game1/smartboy.php",
              "Pragma" : "no-cache",
              "Connection": "keep-alive"
        }

        request = urllib2.Request(url)
        for key in headers:
            request.add_header(key, headers[key])
        response = urllib2.urlopen(request)
        return response.read()
        

if __name__ == "__main__":
    channel = SubmitForm("http://monyer.com/game/game1/sobeautiful.php")

    print channel.get()

================================================================================ 第13关的页面成功被下载下来啦。就是在get 方法里面添加了一个请求头。"Referer" : "http://monyer.com/game/game1/smartboy.php",