题目链接: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':'',
'xxxxx<br>x&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;xxxx<br>&nbsp;&nbsp;&nbsp;&nbsp;x<br>xxxxx':'',
'&nbsp;xx<br>&nbsp;&nbsp;x&nbsp;x&nbsp;&nbsp;<br>&nbsp;&nbsp;x&nbsp;&nbsp;<br>&nbsp;&nbsp;x&nbsp;&nbsp;<br>xxxxx':'',
'&nbsp;xxx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x&nbsp;<br>&nbsp;&nbsp;xx&nbsp;<br>&nbsp;x&nbsp;&nbsp;&nbsp;<br>xxxxx':'',
'&nbsp;xxx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x<br>&nbsp;&nbsp;xx&nbsp;<br>x&nbsp;&nbsp;&nbsp;x<br>&nbsp;xxx&nbsp;':'',
'&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;':'',
} 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 = {
"": re.compile(r" xxx <br/?>x x<br/?>x x<br/?>x x<br/?> xxx <br/?>"),
"": re.compile(r" xx<br/?> x x <br/?> x <br/?> x <br/?>xxxxx<br/?>"),
"": re.compile(r" xxx <br/?>x x <br/?> xx <br/?> x <br/?>xxxxx<br/?>"),
"": re.compile(r" xxx <br/?>x x<br/?> xx <br/?>x x<br/?> xxx <br/?>"),
"": re.compile(r"xxxxx<br/?>x <br/?> xxxx<br/?> x<br/?>xxxxx<br/?>"),
"": 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())

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

实验吧 ASCII艺术的更多相关文章

  1. Linux/Unix 桌面趣事:文字模式下的 ASCII 艺术与注释绘画

    boxes 命令不仅是一个文本过滤器,同时是一个很少人知道的有趣工具,它可以在输入的文本或者代码周围框上各种ASCII 艺术画.你可以用它快速创建邮件签名,或者在各种编程语言中留下评论块.这个命令可以 ...

  2. linux ascii艺术与ansi艺术

    Linux终端下的ASCII艺术 http://zh.wikipedia.org/zh-tw/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2%E5%8F%B2 电子游戏史 h ...

  3. Atom IDE开发工具, ASCII艺术评论, ninimap 插件

    1 ASCII Art Comments One neat trick is to use ASCII art to create huge comments visible in the minim ...

  4. ASCII 大文字生成器

    display text in large ASCII art fonts 显示大ASCII艺术字体 这种东西在源码声明或者软件初始化控制台打印时候很有用. 例如打开: http://www.oran ...

  5. 063 Python必备库-从人机交互到艺术设计

    目录 一.概述 二.Python库之图形用户界面 2.1 PyQt5 2.2 wxPython 2.3 PyGObject 三.Python库之游戏开发 3.1 PyGame 3.2 Panda3D ...

  6. 十个提升你Emacs生产力的高招

    转载 十个提升你Emacs生产力的高招   Emacs是世界上最好的编辑器(真的有很多人这么认为).不要以为emacs只是在编写程序时很牛X,其实只要你真正精通了emacs,会发现她几乎在所有用到打字 ...

  7. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)

    1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...

  8. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (四)

    1.查看ASCII码表 man 7 ascii  很多人初学编程都会接触到ascii码的概念,有时候为了查某个符号的ascii值,可能还得翻箱倒柜找出当年的课本?Linux Manpage里面其实包含 ...

  9. SymPy库常用函数

    简介 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计 ...

随机推荐

  1. hystrix项目实战

    闲话少说: 总共分6步: (1)添加hystrix依赖以及监控的依赖 <dependency> <groupId>org.springframework.cloud</g ...

  2. Luogu P3305 [SDOI2013]费用流 二分 网络流

    题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让 ...

  3. linux文件或目录权限修改后如何恢复(备份了权限就能恢复)

    操作系统 RHEL5 如果你在linux上执行了如下操作chmod -R 777 / 或者 chmod -R 700 /那么恭喜你,你的系统即将崩溃,重启之后,你进不了图形界面,而且很多服务都起不来 ...

  4. 1053. Path of Equal Weight (30)

    Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of ...

  5. Pandas透视表(pivot_table)详解

    介绍 也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为pivot_table.虽然pivot_table非常有用,但是我发现为了格式化输出我所需要的内容 ...

  6. Python 排序和numpy排序,得到排序后索引序列(及源list的序列)

    Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...

  7. git status -s命令解析

    git status -s 以精简的方式显示文件状态. git status 输出的命令很详细,但有些繁琐. 如果用 git status -s 或 git status --short 命令,会得到 ...

  8. 3.Zuul-过滤器

    1.什么是Zuul? 路由+过滤器=Zuul,核心是一系列的过滤器 2.Zuul的过滤器: pre:可以在请求被路由之前调用 route:在路由请求时候被调用 post:在route和error过滤器 ...

  9. Hadoop记录-hive merge小文件

    1. Map输入合并小文件对应参数:set mapred.max.split.size=256000000;  #每个Map最大输入大小set mapred.min.split.size.per.no ...

  10. C#设计模式(5)——建造者模式

    1.建造者模式介绍 在软件开发中,有时我们要创建一个复杂的对象,这个对象由几个子部件按一定的步骤组合而成,这时候我们就可以使用建造者模式了.说到建造者我们首先想到的是盖房子,盖房子简单的说有三个步骤: ...