實驗吧 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())

 

 

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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com