iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
自我挑戰組

新手挑戰 picoCTF:資安入門紀錄系列 第 25

picoCTF 學習日誌 — keygenme-trial

  • 分享至 

  • xImage
  •  

今天的題目是:
https://ithelp.ithome.com.tw/upload/images/20251007/20178898d31k7BxFGR.png
目標是透過分析程式邏輯,生成正確的 license key 或 flag。


解題步驟與思路
一、檔案下載與初步觀察:
我從 picoCTF 下載了題目檔案 keygenme-trial.py。
打開檔案後發現,有 username_trial 與 bUsername_trial 兩個變數,分別是字串與 bytes。
靜態部分的 flag 前綴與後綴:

key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_"
key_part_static2_trial = "}"

動態部分 key_part_dynamic1_trial 被設為 xxxxxxxx,需要透過程式邏輯計算。
程式使用 hashlib.sha256() 對 username 產生動態 key。


二、嘗試在 webshell 直接用 Python 計算 SHA256 並組合 flag:

import hashlib
username = "GOUGH"
h = hashlib.sha256(username.encode()).hexdigest()
positions = [4,5,3,6,2,7,1,8]
dynamic = ''.join(h[p] for p in positions)
full_key = f"picoCTF{{1n_7h3_|<3y_of_{dynamic}}}"
print(full_key)

https://ithelp.ithome.com.tw/upload/images/20251007/20178898X4GFyKRrjo.png
其中輸出包含"picoCTF{{1n_7h3_|<3y_of_{dynamic}}"
正當我以為我成功找到Flag了,卻發現驗證失敗...🥲🥲


三、分析程式邏輯:
利用 grep 與 sed 找到程式中處理 key 的函式 check_key

if key[i] != hashlib.sha256(username_trial).hexdigest()[4]:
    return False
...
dynamic = h[4] + h[5] + h[3] + h[6] + h[2] + h[7] + h[1] + h[8]

dynamic 部分依據 SHA256 的十六進位字串選取特定 index,這裡的 index 順序 [4,5,3,6,2,7,1,8] 很重要。發現原本 helper script 與手算的 dynamic 部分順序一致,但提交仍錯誤...


遇到的困難
原本以為只要計算 SHA256 並依 index 取值即可,但提交後不正確。

可能原因:
username 的大小寫或 bytes/str 版本不同。
靜態前綴、後綴可能有細微差異。
也可能是題目在伺服器端還有其他驗證機制(例如隱藏的空白或 bytes 處理)。


學習與收穫
透過分析 Python 原始碼,可以理解 keygen 題目中「動態 key 生成邏輯」:
靜態部分 + SHA256 後取指定 index。
熟悉了用 grep、sed 快速定位關鍵函式與變數。

練習了:
bytes 與 str 的差異、hashlib.sha256 的使用、對照原始程式邏輯確認 flag 組合方式。

雖然目前 flag 還沒找到...但應該也算掌握到核心流程,希望對後續解題會有幫助。
這題已經花我好多時間ㄌ,改日再戰!
或是有沒有大神可以救我🥺


上一篇
vault-door-training(Java)— 從原始碼拿到 flag
下一篇
pico CTF - Buffer Overflow
系列文
新手挑戰 picoCTF:資安入門紀錄27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言