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

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

知识要大家一起分享,但带上原文链接是对作者的尊重。
原文地址:https://www.cnblogs.com/zhaijiahui/p/6896191.html