今天做的題目是:
題目給了兩個檔案:一個是密碼檢查器 level1.py ,另一個是已加密的 flag level1.flag.txt.enc。這題並不需要暴力破解,而是要讀懂程式碼 ── 密碼其實寫在程式裡。
題目檔案
level1.py(密碼檢查 + 解密邏輯)
level1.flag.txt.enc(被 XOR 加密的 flag)
解題步驟與思路
一、下載檔案並確認目標:
wget https://artifacts.picoctf.net/c/12/level1.py
wget https://artifacts.picoctf.net/c/12/level1.flag.txt.enc
ls -1
二、讀取並檢視 level1.py:
cat level1.py
程式內容(重點摘錄):
def str_xor(secret, key):
# extend key to secret length...
return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])
flag_enc = open('level1.flag.txt.enc', 'rb').read()
def level_1_pw_check():
user_pw = input("Please enter correct password for flag: ")
if( user_pw == "8713"): # ← 密碼直接寫在這裡
print("Welcome back... your flag, user:")
decryption = str_xor(flag_enc.decode(), user_pw)
print(decryption)
return
print("That password is incorrect")
密碼是 直接寫死 在程式裡,為"8713",而解密方式是把密文和密碼做逐字元 XOR。
三、直接執行程式並輸入密碼:
python3 level1.py
#程式提示:Please enter correct password for flag:
#在提示出現時輸入:8713
程式會輸出解密後的結果(flag):picoCTF{545h_r1ng1ng_1b2fd683}
小小心得
題目設計常用的出題套路之一:把「密碼檢查」邏輯放在附件的程式中,鼓勵參賽者閱讀程式碼而非暴力破解。
str_xor 函數把密文與密碼按位 XOR(把 key 循環延伸到與 secret 一樣長度),這是非常常見的簡單對稱「流式」加密手法,既然密碼(key)在程式內明文出現,直接把它帶入就能成功解密。
讀程式碼是 CTF 很重要的基本功:很多題目的解法都隱藏在提供的腳本或資源裡。