M03 · CTF
拆 SuperBlob,算出真 CDHash
載入含 entitlements 的樣本,在 SuperBlob 找到 CodeDirectory,讀出 version/flags/hashType, 並確認實驗室真算的「完整 32-byte CDHash」就是 codesign 的 CandidateCDHashFull。
程式碼簽章實驗室
模型邊界:CDHash 用瀏覽器 crypto.subtle 真算 SHA-256(雪崩無法造假,與 codesign 的 CandidateCDHashFull 一致)。 但 CMS 簽章鏈僅標 ad-hoc/有 CMS,不偽造 Apple 私鑰簽章驗證(DESIGN.md §5.6 / §10)。上傳檔案不離開瀏覽器。
過關目標
- 讓 codeDirectory.versionHex 達到 "0x20500"
- 讓 codeDirectory.flagNames 達到 ["ADHOC","RUNTIME"]
- 讓 codeDirectory.hashTypeName 達到 "SHA256"
- 用自己的話解釋:為何 CDHash 的「完整 32-byte」才是真值,codesign 顯示的 40 個 hex 只是截斷?
解答是「操作模擬器到對的狀態 + 能說出原理」,非提交 flag 字串。互動式自動評分為 roadmap 項目;目前以自我檢核完成。
提示
卡住時
CDHash 是「對整個 CodeDirectory blob 做一次 SHA-256」。完整值是 32 bytes(64 hex),不是顯示用的 20-byte 截斷。
走錯方向時
flags 0x10002 拆成 ADHOC(0x2) + RUNTIME(0x10000);RUNTIME 就是 hardened runtime。
想更深入
ad-hoc 代表「只有 cdhash、沒有 CMS 背書」。能跑,但沒有「誰簽的」。
相關指令
codesignotool