1. 程式人生 > >實驗吧解題筆記——程式設計(一)

實驗吧解題筆記——程式設計(一)

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