• 实验吧 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())

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

    知识要大家一起分享,但带上原文链接是对作者的尊重。
  • 相关阅读:
    请求的详细资料级别没有事实表
    BIEE汇总数据如何放在后面
    Biee仪表盘中提示空值如何去掉
    UFT测试本地应用程序登陆小实例(描述性编程)
    Mysql找回丢失密码
    linux下Mysql多实例实现
    如何从零安装Mysql
    Linux系统下yum源配置(Centos 6)
    Linux系统管理常用命令用法总结(2)
    Linux系统管理常用命令用法总结(1)
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/6896191.html
Copyright © 2020-2023  润新知