zoukankan      html  css  js  c++  java
  • 实验吧 ASCII艺术

    题目链接:http://ctf5.shiyanbar.com/ppc/acsii.php

    首先我们先理清题意,题目的意思是将下面这样这些小叉叉组成的数字,连起来输入得到flag,并且要在两秒以内。

    两秒以内好解决,用 requests.session()就可以了。

    输入框输入用requests.post也没问题。

    最让人头疼的是如何将图像转化成数字。

    我第一个想法是数叉的个数,但是0和8叉的个数一样,无法分辨

    后来我想到,用字典匹配的方法,此题的数字并不多,我通过查看代码,将对应关系找到

     

    但是新的问题又来了,用于分割不同数字的<br>数量不确定(有2个, 3个;而且形式也不同,有<br />,<br/>)

     

    这对分割整个字符串造成很大困难,我接触的正则达不到这种效果,所以我先将这个字符串进行了“清洗”,通过对比字典的格式,我发现空格和/是可以去掉的,而后根据正则<br><br>可以将多数分割出来。

    s1 = ss[0].replace(' ','').replace('/','')

    这时候又出现了一个问题

     

    根据正则匹配规则,三个<br>的情况只会截断前两个,还有一个<br>留在了后面的字符串,我同样利用正则将开头带<br>的去掉。

                  qqq = re.search('^<br>',string)
                  if qqq:
                         string = string[4:]

    再讲得到的数字拼接,提交得到flag。

     

    这是我的渣脚本

    import re
    import requests
    
    
    dict1 = {
    '&nbsp;x&nbsp;&nbsp;&nbsp;x<br>x&nbsp;&nbsp;&nbsp;&nbsp;x<br>&nbsp;xxxxx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x<br>&nbsp;&nbsp;&nbsp;&nbsp;x':'4',
    'xxxxx<br>x&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;xxxx<br>&nbsp;&nbsp;&nbsp;&nbsp;x<br>xxxxx':'5',
    '&nbsp;xx<br>&nbsp;&nbsp;x&nbsp;x&nbsp;&nbsp;<br>&nbsp;&nbsp;x&nbsp;&nbsp;<br>&nbsp;&nbsp;x&nbsp;&nbsp;<br>xxxxx':'1',
    '&nbsp;xxx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x&nbsp;<br>&nbsp;&nbsp;xx&nbsp;<br>&nbsp;x&nbsp;&nbsp;&nbsp;<br>xxxxx':'2',
    '&nbsp;xxx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x<br>&nbsp;&nbsp;xx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x<br>&nbsp;xxx&nbsp;':'8',
    '&nbsp;xxx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x<br>x&nbsp;&nbsp;&nbsp;x<br>x&nbsp;&nbsp;&nbsp;x<br>&nbsp;xxx&nbsp;':'0',
    }
    
    s = requests.session()
    r = s.get('http://ctf5.shiyanbar.com/ppc/acsii.php')
    html = r.content.decode('utf-8')
    # print(html)
    ss = re.findall('style="color:red">(.*)</div>',html)
    key = ''
    s1 = ss[0].replace(' ','').replace('/','')
    s2 = re.findall('(.*?)(<br><br>|<br><br><br>|<br><br><br><br>)',s1)
    # print(s2)
    for i in s2:
           string = i[0]
           if string !='':
                  qqq = re.search('^<br>',string)
                  if qqq:
                         string = string[4:]
                  # print(string)
                  key += dict1[string]
    print(key)
    url = 'http://ctf5.shiyanbar.com/ppc/acsii.php'
    postdata = {'inputNumber':key,'submit':'%E6%8F%90%E4%BA%A4'}
    r1 = s.post(url,postdata)
    html = r1.content.decode('utf-8')
    print(html)

    因为觉得自己的代码太垃圾,看了前辈的代码确实厉害。。

    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup 
    import re 
    
    
    patterns = { 
        "0": re.compile(r" xxx <br/?>x   x<br/?>x   x<br/?>x   x<br/?> xxx <br/?>"),
        "1": re.compile(r" xx<br/?>  x x  <br/?>  x  <br/?>  x  <br/?>xxxxx<br/?>"), 
        "2": re.compile(r" xxx <br/?>x   x <br/?>  xx <br/?> x   <br/?>xxxxx<br/?>"), 
        "8": re.compile(r" xxx <br/?>x   x<br/?>  xx <br/?>x   x<br/?> xxx <br/?>"), 
        "5": re.compile(r"xxxxx<br/?>x    <br/?> xxxx<br/?>    x<br/?>xxxxx<br/?>"), 
        "4": re.compile(r" x   x<br/?>x    x<br/?> xxxxx<br/?>     x<br/?>    x<br/?>") # 匹配<br/>0次到1次,避免了后面我的纠结
    }
    url = "http://ctf5.shiyanbar.com/ppc/acsii.php"
    
    r = requests.get(url)
    soup = BeautifulSoup(r.content, "html.parser") # 用parser编译代码
    material = str(soup.find_all("div")[1]).replace(u'xa0', ' ') # 查找div标签打印
    # 使用BeautifulSoup 的结果,与直接decode("utf-8")差距在空格是否编译
    results = {}
    for i, pattern in patterns.items(): # 返回i对应键,pattern对应键值
        for m in pattern.finditer(material): # 执行前面字典里re.compile的匹配,匹配的是material里匹配的内容
            results[m.start()] = i # 执行对象m.start()返回的是首个索引指针,将指针地址和值对应加入字典
    
    res = ""
    for i in sorted(results): # 排序是乱的,这样按照索引从小到大排序
        res = res + results[i] # 将数字拼接
    
    payload = {"inputNumber":res, "submit":"提交"}
    r = requests.post(url, data=payload, cookies=r.cookies)
    soup = BeautifulSoup(r.content, "html.parser")
    print(soup.find(id="msg").get_text())

    我在后面加了一些自己的理解,以便日后可以理解。

    知识要大家一起分享,但带上原文链接是对作者的尊重。
  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/6896191.html
Copyright © 2011-2022 走看看