實驗吧解題筆記——程式設計(一)
0.說明
每五個題目寫作一篇writeup,第一行對應解題筆記(一)……
1.百米
題目描述
題目是這個樣子的,很顯然需要我們程式設計,獲取網頁中需要我們計算的表示式的值,然後提交上去獲得flag。
分析
首先,我們使用Python中的requests這個第三方庫去獲取網頁內容,使用以下語句獲得這個網頁的html文件。
get_url = 'http://ctf5.shiyanbar.com/jia/'
post_url = 'http://ctf5.shiyanbar.com/jia/index.php?action=check_pass'
session = requests.session()#建立一個requests的會話物件
html = session.get(get_url).content#使用上面建立的物件去開啟網頁,並獲取html文件內容
接下來,我們使用Python中的BeautifulSoup庫去解析獲得我們想要的內容,只需短短几行語句加上一點耐心,再複雜的內容也可以分解出來。使用以下語句得到
標籤後的表示式。soup = BeautifulSoup(html, 'html.parser')
expr = soup.p.div.get_text())#獲取到需要計算的表示式
這段語句這麼簡單是因為我取了個巧,因為這個html文件中只有一個p標籤,所以直接獲取p標籤下div標籤的內容,再取得div標籤中的值,就得到了我們需要計算的表示式。執行結果如下:
需要注意的是,在這裡我們獲得的表示式是str格式的,我們並不能直接去計算,這裡需要用到python中一個內建的函式eval(),它可以計算字串中python表示式的值。還有一點需要注意的是這裡還設了個小坑,表示式中的乘號是以英文字元“x”表示的,我們需要把它替換成“*”,所以計算語句如下。
num = eval(expr.replace('x', '*'))
接下來,我們只需把計算結果以post方式提交上去就可以了,需要使用burpsuite抓包看到瀏覽器是怎麼把我們的計算結果提交到伺服器的,再自己編寫payload,並使用requests的post()方式提交結果。最後的語句如下:
payload = {'pass_key' :str(num)}
post = session.post(post_url, payload)
print(post.text)
使用print語句可以把網頁的返回結果直接打印出來,最後在輸出結果中可以找到KEY。
完整的程式如下:
from bs4 import BeautifulSoup
import requests
get_url = 'http://ctf5.shiyanbar.com/jia/'
post_url = 'http://ctf5.shiyanbar.com/jia/index.php?action=check_pass'
session = requests.session()
html = session.get(get_url).content
soup = BeautifulSoup(html, 'html.parser')
expr = soup.p.div.get_text()#獲取到需要計算的表示式
num = eval(expr.replace('x', '*'))
print(num)
payload = {'pass_key':str(num)}
post = session.post(post_url, payload)
print(post.text)
2.迷宮大逃亡
//TODO
3.獎券
題目描述
某抽獎活動的獎券號碼是6位數(100000-999999),請計算其中不含“4”的號碼的獎券數量。
答案格式為:CTF{X},X為不含“4”的號碼的獎券數量
分析
使目用Python遍歷字串,判斷字串中是否含有字元‘4’,如果有不計數,沒有的話總數加1。程式碼如下:
sum = 0
for i in range(100000, 999999 + 1):
if '4' in str(i):
continue
else:
sum += 1
print(sum)
看別人的writeup時發現了下面這個只有兩行程式碼的解法,要讀懂的話需要對reduce和map的特性有一定了解。
from functools import reduce
print(reduce(lambda x,y:x+y,map(lambda i:0 if '4' in str(i) else 1,range(100000,999999+1))))
4.三羊獻瑞
//TODO
5.找素數
//TODO