今天挑戰的是:
題目給了兩個檔案:一個密碼檢查程式 level2.py,以及被 XOR 加密的 flag 檔 level2.flag.txt.enc。
這題的重點是 讀懂程式碼,把檔內組合密碼的邏輯還原成可輸入的字串,然後用程式內的 XOR 邏輯把 flag 還原出來。
解題步驟
一、確認檔案:
ls -l level2.py level2.flag.txt.enc
二、閱讀"level2.py"程式碼:
cat level2.py
"level2.py"中的關鍵段落如下(節錄):
if( user_pw == chr(0x64) + chr(0x65) + chr(0x37) + chr(0x36) ):
decryption = str_xor(flag_enc.decode(), user_pw)
print(decryption)
說明:
chr(0x64)、chr(0x65)、chr(0x37)、chr(0x36) 分別代表字元 'd','e','7','6',串在一起就是密碼 de76。
str_xor 函數會把 key 循環延伸到與密文等長後,對應位元做 XOR,得到明文。
三、把 chr(...) 轉成可讀字元(驗證密碼):
python3 - <<'PY'
print(chr(0x64)+chr(0x65)+chr(0x37)+chr(0x36))
PY
#輸出:de76
四、用原程式互動式執行:
#互動式:程式會要求你輸入密碼
python3 level2.py
#在提示出現時輸入:de76
結果(最終 Flag):picoCTF{tr45h_51ng1ng_489dea9a}
原理小解
chr(0xNN) 是把十六進位數轉成相對應 ASCII 字元,讀程式能直接把密碼還原出來,這題就是考你會不會閱讀程式碼。
str_xor 是很常見的輕量對稱加密(把 key 重覆直到和訊息等長再做 XOR);只要 key(密碼)正確,就能把密文恢復為明文。
我學到
練習找 chr()、hex、base64 出現的位置,學會把它們還原成可讀字串。
把任意字串做 XOR 加密/解密,理解「同一 key XOR 兩次會回到原文」這個特性。
不懂時把程式的關鍵行複製到 Python 或線上 REPL,實驗幾次就會懂。