M02 · CTF
分辨架構與找到簽章入口
用解剖器讀出 cpusubtype,正確分辨 arm64 與 arm64e;接著在 LINKEDIT 找到 LC_CODE_SIGNATURE,說出它指向的 SuperBlob 類型與其中的 CodeDirectory slot。
Mach-O 解剖器
模型邊界:本工具真解析 Mach-O 結構(對照本機 otool 驗證), 但不做 CMS 簽章驗證、不算 CodeDirectory CDHash(M03)。上傳的檔案全程留在你的瀏覽器,不會上傳。僅在自有/獲授權的樣本上練習(DESIGN.md §10)。
過關目標
- 讓 header.cpuSubtypeName 達到 "ARM64_ALL"
- 讓 header.isArm64e 達到 false
- 讓 codeSignature.superBlobMagic 達到 "EMBEDDED_SIGNATURE"
- 用自己的話解釋:若同一支程式改成 arm64e,cpusubtype 與指標完整性(PAC)會有什麼不同?
解答是「操作模擬器到對的狀態 + 能說出原理」,非提交 flag 字串。互動式自動評分為 roadmap 項目;目前以自我檢核完成。
提示
卡住時
arm64 與 arm64e 的 cputype 相同;差別在 cpusubtype(ARM64_ALL=0 vs ARM64E=2)與 caps 的 PAC 位元。
走錯方向時
簽章不是 load command 本身的內容,而是 LC_CODE_SIGNATURE 指向 __LINKEDIT 裡的一段 SuperBlob。
想更深入
內建樣本是 ad-hoc 簽章的 arm64(非 arm64e)。CDHash 真算與 CodeDirectory 全解是下一章 M03。
相關指令
otoollipocodesign