HITCON Badge 2019 秘辛: MCU ARM TrustZone challenges / 李倫銓、張元、黃偉峻 === MCU:M2351 From Nucoton - Cortex_M23 - trustzone - low cost and low power 彩燈=第二關,公佈家解法就不發獎品囉 ### 硬體安全重要應用2 = 零件防盜、原廠價值 汽車破解鑰匙、汽車改裝,可能每個零件都綁 ID?成本高,但避免山寨品,增加產品原廠價值 現有的車子並沒辦法達到,因為現在都會有自行定義的認證+Protocol,所以兩條線的電影只存在舊的時代。 做好加密,對於銷售、產品價值都是有幫助的。 軟體安全的最後防線: 簽章+驗證Key 加密的 key 放在哪裡? 建議包起來,然後從底層丟,一個包一個。 (上層) app > driver/api > os/firmware > hardware (底層) 不用在單一層做加密,因為有機會把記憶dump出來,如果做加密或驗證,那麼難度就變高了。 ### TrustZone 概念 目的:有效保軟體層,拉存放成本拉高。 (1) 外接硬體模組 (2) 直接... > :point_up: 求投影片 [color=red] :::info Call for HITCON Badge 2020 > [name=alan@hitcon.org] ::: 工商:ctftime.org/event/811 MCU ARM Challenge --- ### Intro :::info Source Code & Challenge [RELEASE](https://github.com/yuawn/HITCON-badge-2019) ::: #### Trustzone - secure env separation - normal world (non-secure world) - ui, app, etc - Secure world - tee - Hardware Architecture - NS bit in register - Software Implementation - tee os - TEEGRIS - Samsung - trusty - Google - OP-TEE - Open Source - TA (Trusted App) #### HitconBadge - Non-secure - led - simple cli - snake - Secure - lock record - key, token - cryptom 24 LEDs (1) 貪食蛇 50 分 (2) 玩到 26374847 , _nsc_ 代表無法從trust zone存取 (3) strcpy() 塞入很長的長長長長長長字元 Payload:alias aaaaaaaaaaaaaa\x0c\ab0\xce\cfa hello Send "aaaaaaaaaaaaaa\x0c\ab0\xce\cfa" Overwriting Pwned_NS() 0x100538d8 + 1 (thumb) 沒 + 1 無效。 ### exploitation ### make TrustZone great again ### Github https://github.com/yuawn/HITCON-badge-2019 ## Step 2 ### Secure Code ### info Command >> info 逆向之後,有個UID跟硬體的system ticket >> setname >> setname %p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p... 算好數量 + %p >> setname %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c...%pAAAA >>setname %c%c%c%c%c%c%pAAAA => char* 無限次去改setname,無次去查詢info,然後,建議寫個程式去跑,講師是跑 25mins啦… 其實找 MCU:M2351Z1AAAE 找文件都有,可以進一步去看,然後多試試。 Reversing Secure Region Binary ## 最後一個關卡 。isPwned() 。`return flag== 0xfaceb00c;` 藏在這裡,去做覆寫。 nsc_unlock() :unlock … 遇到不是合法的字元,機會中止掉。 | 4 byte | 1 byte | tokensize | | ---------- | -------- | --------- | | token size | checksum | token | 而且還有做絕對值檢查:abs() 或是 -num... int a = 0x80000000,b; b = abs(a); 2 的補數運算,-4748324748 做個NOT +1 ,就變成自己原本的樣子… >> 有PoC unpack_request() 中再做一次。 >> Write Flash ... 這題目心機好重哦 Q"Q 透過ROP去做,可以Contorl flow ###### tags: `HITCONCMT2019`,`HITCONCMT`,`HITCON`