实验吧 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 = {
' x x<br>x x<br> xxxxx<br> x<br> x':'',
'xxxxx<br>x <br> xxxx<br> x<br>xxxxx':'',
' xx<br> x x <br> x <br> x <br>xxxxx':'',
' xxx <br>x x <br> xx <br> x <br>xxxxx':'',
' xxx <br>x x<br> xx <br>x x<br> xxx ':'',
' xxx <br>x x<br>x x<br>x x<br> xxx ':'',
} 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艺术的更多相关文章
- Linux/Unix 桌面趣事:文字模式下的 ASCII 艺术与注释绘画
boxes 命令不仅是一个文本过滤器,同时是一个很少人知道的有趣工具,它可以在输入的文本或者代码周围框上各种ASCII 艺术画.你可以用它快速创建邮件签名,或者在各种编程语言中留下评论块.这个命令可以 ...
- 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 ...
- Atom IDE开发工具, ASCII艺术评论, ninimap 插件
1 ASCII Art Comments One neat trick is to use ASCII art to create huge comments visible in the minim ...
- ASCII 大文字生成器
display text in large ASCII art fonts 显示大ASCII艺术字体 这种东西在源码声明或者软件初始化控制台打印时候很有用. 例如打开: http://www.oran ...
- 063 Python必备库-从人机交互到艺术设计
目录 一.概述 二.Python库之图形用户界面 2.1 PyQt5 2.2 wxPython 2.3 PyGObject 三.Python库之游戏开发 3.1 PyGame 3.2 Panda3D ...
- 十个提升你Emacs生产力的高招
转载 十个提升你Emacs生产力的高招 Emacs是世界上最好的编辑器(真的有很多人这么认为).不要以为emacs只是在编写程序时很牛X,其实只要你真正精通了emacs,会发现她几乎在所有用到打字 ...
- 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则 摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...
- [SHELL进阶] (转)最牛B的 Linux Shell 命令 (四)
1.查看ASCII码表 man 7 ascii 很多人初学编程都会接触到ascii码的概念,有时候为了查某个符号的ascii值,可能还得翻箱倒柜找出当年的课本?Linux Manpage里面其实包含 ...
- SymPy库常用函数
简介 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计 ...
随机推荐
- hystrix项目实战
闲话少说: 总共分6步: (1)添加hystrix依赖以及监控的依赖 <dependency> <groupId>org.springframework.cloud</g ...
- Luogu P3305 [SDOI2013]费用流 二分 网络流
题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让 ...
- linux文件或目录权限修改后如何恢复(备份了权限就能恢复)
操作系统 RHEL5 如果你在linux上执行了如下操作chmod -R 777 / 或者 chmod -R 700 /那么恭喜你,你的系统即将崩溃,重启之后,你进不了图形界面,而且很多服务都起不来 ...
- 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 ...
- Pandas透视表(pivot_table)详解
介绍 也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为pivot_table.虽然pivot_table非常有用,但是我发现为了格式化输出我所需要的内容 ...
- Python 排序和numpy排序,得到排序后索引序列(及源list的序列)
Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...
- git status -s命令解析
git status -s 以精简的方式显示文件状态. git status 输出的命令很详细,但有些繁琐. 如果用 git status -s 或 git status --short 命令,会得到 ...
- 3.Zuul-过滤器
1.什么是Zuul? 路由+过滤器=Zuul,核心是一系列的过滤器 2.Zuul的过滤器: pre:可以在请求被路由之前调用 route:在路由请求时候被调用 post:在route和error过滤器 ...
- Hadoop记录-hive merge小文件
1. Map输入合并小文件对应参数:set mapred.max.split.size=256000000; #每个Map最大输入大小set mapred.min.split.size.per.no ...
- C#设计模式(5)——建造者模式
1.建造者模式介绍 在软件开发中,有时我们要创建一个复杂的对象,这个对象由几个子部件按一定的步骤组合而成,这时候我们就可以使用建造者模式了.说到建造者我们首先想到的是盖房子,盖房子简单的说有三个步骤: ...