题目链接: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. Ubuntu下安装Goldendict(翻译软件)

    Ubuntu直接安装 sudo apt-get install goldendict 通过源码安装 失败 下载词典 http://blog.sina.com.cn/s/blog_c58823b3010 ...

  2. 漫谈php框架之中间件

    市面上常见的php框架有很多,最近因为有技术需求,所以对常见的php框架的中间件进行了一些了解.各个框架尽管在目标上对php框架的定义大同小异,但是在实现方式上却各有不同,且看下文: 定义 首先什么是 ...

  3. selenium-server-standalone 和selenium-server, selenium-java的区别

    https://stackoverflow.com/questions/30865539/selenium-server-standalone-jar-vs-selenium-java-jar

  4. BeautifulSoup获取图片

    参看文档:https://www.cnblogs.com/forever-snow/p/8506746.html

  5. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  6. 2017-12-18python全栈9期第三天第四节之str的索引与切片

    #!/user/bin/python# -*- coding:utf-8 -*-s = 'zdlswwzl's1 = s[0]print(s1)s2 = s[-1]print(s2)s3 = s[0: ...

  7. Kafka技术内幕 读书笔记之(三) 消费者:高级API和低级API——消费者消费消息和提交分区偏移量

    消费者拉取钱程拉取每个分区的数据,会将分区的消息集包装成一个数据块( FetchedDataChunk )放入分区信息的队列中 . 而每个队列都对应一个消息流( KafkaStream ),消费者客户 ...

  8. ruby数组操作方法汇总

    1.数组定义 arr1 = [] arr2 = Array.new arr3 = ['1','2','3'] 2.输出 print arr3,"\n" #123 puts arr3 ...

  9. Spark源码解析 - Spark-shell浅析

    1.准备工作 1.1 安装spark,并配置spark-env.sh 使用spark-shell前需要安装spark,详情可以参考http://www.cnblogs.com/swordfall/p/ ...

  10. webService的介绍与简单使用

    webService开发项目介绍: 1 Webservice:跨语言跨平台的远程调用技术.Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. ...