题目链接: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. org.apache.poi 读取数字问题

    默认呢,POI读取单元格内容为数字的话,自动搞成Dubbo类型的,比如这样: String value1 = row.getCell(0).getNumericCellValue()+"&q ...

  2. Docker下安装Influxdb-1.6.1和Grafana5.2.2

    第一步.安装Influxdb 首先启动docker systemctl start docker 然后安装Influxdb(这里解释一下为啥用docker,因为官网下载的话需要FQ[fan-qiang ...

  3. Javascript的组成——EMACScript、DOM、BOM

    EMACScript:一种规范,JS必须准守它的约定,JS的核心. DOM:文档对象模型,W3C标准,JS访问HTML文档的接口. BOM:浏览器对象模型,没有统一的标准.JS访问浏览器的接口. EM ...

  4. 用Jdbc连接数据库后实现增删改查功能

    增删改用的都是executeUpdate()方法: 查用的是executeQuery()方法 package cn.lideng.dbc; import java.lang.management.Ma ...

  5. zTree基础

    zTree使用 zTree 是一个依靠 jQuery 实现的多功能 “树插件”, 而且拥有较好的浏览器兼容性,有着丰富的功能以及可以自定义样式,足以满足大部分业务的开发. 第一步先导入css及js文件 ...

  6. OpenOCD-JTAG调试

    目录 Todo 概述 断点 快速使用 测试led的断点 NAND调试(进阶) OpenOCD 启动OpenOCD OpenOCD命令 OpenOCD烧录程序 GDB GDB命令 使用条件 使用步骤 E ...

  7. Java NIO中的Buffer 详解

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  8. JAVA-Enum 枚举

    [参考]枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开. 说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有. 正例:枚举名字为 ProcessSta ...

  9. Hadoop记录-技术网站

    Grafan监控:http://docs.grafana.org/ Tez:http://tez.apache.org/install.html 阿里巴巴镜像:https://opsx.alibaba ...

  10. ACdream - 1060 递推数(矩阵+循环节)

    https://vjudge.net/problem/71677/origin 已知A(0) = 0 , A(1) = 1 , A(n) = 3 * A(n-1) + A(n-2) (n ≥ 2) 求 ...