發表文章

目前顯示的是 2022的文章

文章總列表

VOLVO CEM Crack (3) P1/2 CEM Crack

圖片
這篇文章介紹如何攻擊P1/2的CEM,盡量深入淺出把 俄羅斯人vtl 的傑作介紹一下。透過10分鐘閱讀,一窺組合語言的奧妙,還有時間差攻擊(timing attack)的奧妙。完整 討論串 也可以慢慢讀 VOLVO P1/P2的CEM密碼是6個0-99的數字,能寫成AA BB CC DD EE FF。CEM使用車用電子大廠日本 瑞薩半導體 的MCU。VTL大叔顯然是箇中高手,找出比對密碼的關鍵程式如下 上面是瑞薩處理器的指令,組合語言。手寫組語是古代人技能,現代人還看祖語叫 苦命人 !簡單翻譯一下:CMP是Compare縮寫,比對兩個數值,輸入數值和正確答案 正確答案放在記憶體位置0xFFE000,正確答案第一位 輸入密碼放在記憶體位置[FB - 7] 比對其實是減法:結果非0代表不同!緊接JNE指令Jump if NOT-EQUAL,如果不同跳到0xFFCAF9。前五組CMP/JNE比對密碼前5個數字。這個結構的弱點是: 猜錯立刻跳走 ,攻擊者能簡單觀測 執行時間 ,判斷猜對或猜錯 下面是具體攻擊手法,AA=10執行時間多了 百萬分之三秒 ,第一個答案出來了 假如正確答案是AA=10,BB=11 AA=0,BB/CC/DD/EE/FF亂數產生,測試1000次,平均執行時間(X+0)us AA=10,BB/CC/DD/EE/FF亂數產生,測試1000次,平均執行時間(X+3)us 繼續攻擊BB,手法一樣,慢慢拷問CEM挖出密碼! AA BB=10 0,CC/DD/EE/FF亂數產生,跑1000次,平均執行時間(Y+0)us AA BB=10 11,CC/DD/EE/FF亂數產生,跑1000次,平均執行時間(Y+3)us 看到這裡還沒關掉網頁的您,已經學會時間差攻擊(timing attack)的精髓了!我把這個攻擊手法介紹給同事,不愧宅宅工程師,眼睛立刻發出光芒! 後記 寫程式比對密碼要有耐心,比完再跳出來,再補上一小段random delay增強安全性。外面的壞人會部署timing attack,不要挖坑給自己跳 上面程式額外的細節:輸入密碼重排過再比。VOLVO還是有額外多補上保護,觀察每道指令裡的數值,並不是連續的-7, -9, -5, -10, -8, -6。如果去看他的 程式碼 ,不同CEM編號打亂的方法還不同 感謝VTL大神,把難懂的組合語言翻譯成C c

VOLVO CEM Crack (2) P3 CEM Communication

圖片
這裡記載vdash/p3-tools通訊紀錄,記載high-level大概做哪些事,記錄 在此 和CEM連線前,會先確認軟體版本。比如F114讀出很多內部(看不懂)欄位 開始寫入ECU之前,使用7DF廣播ID通知所有裝置進入Programming session。這個封包大概灌了1000次,灌到確認所有裝置都保持安靜 開始對 CEM動手,先確認CEM已經在Programming Session,通過Security Access。這裡送出一組正確答案(seed, key),有興趣能拿 前一篇 的原始碼算看看 在Programming Session,不時會出現Tester Present封包,讓ECU保持在Programming mode 精彩的地方來了,Tester需要download(灌入ECU)一段資料,長度是0x3126 = 12582bytes灌到記憶體0x0430。下載完畢,觸發0x31 start routine,對應的參數正好是0x430。這段灌進去的程式有個行話叫Secondary BootLoader(SBL) 大概能腦補為什麼這樣設計 記憶體0x430寫了某些東西進去,再用"start-routine"啟動,很像注入一段程式。原則上可以用 ODA工具 去看看,我還沒勤勞到去讀組語。這一步也能作為額外的安全性,要灌入特定軟體才能做某些操作 一般CEM內部只放MCU,儲存空間頂多是內建的SRAM或Flash,頂多再放上EEPROM(超弱防護力)。這些記憶體比手機的Flash或DRAM可靠很多,汽車不允許行駛中記憶體壞掉吧…但是容量不大,塞入所有應用成本會太貴。把bootloader做成兩段式,看用途載入不同程式很合理 雖然這麼說… Teala電動車主電腦也是跑Linux,現在新車有漂亮液晶螢幕也是,上面都有DRAM和Flash。真的要設計這種機器,也不是做不出來 另外說句好笑的... 以前CEM密碼直接燒在EEPROM裡,開蓋即有答案 要寫入新設定,必定是讀出舊的,修補再寫回。VOLVO的CAR config長度254bytes,讀取位置在0x61100,開頭有些checksum之類的。這裡的記憶體位址,未必對應到真實的MCU記憶體位址。UDS通訊協定傳入的位址,到了軟體也能再轉一手存入 讀出來的參數,para0=9代表XC60

VOLVO CEM Crack (1) P3 CEM CRACK

圖片
先來張圖!改開機畫面像開新車,每次看都開心 這系列文章介紹VOLVO CEM(Central Electronic Module)保護,這類中文資料應該不多,讓有興趣的人參考。我並非汽車從業人員,從有限的觀點寫下筆記,寫錯了請用力嘲笑 想改開機畫面指南 需要一顆VOLVO DICE,這個很容易買 D5T5 的VDASH透過Internet和筆電上的DICE工作,可以 做那些事 都有簡單的說明 另外一套工具, 瑞典人 寫了P3-Tool,這裡也有 介紹 研究工具是 一套Pi 和一顆 USB-CAN D5T5的VDASH D5T5團隊的VDASH透過OBD2 port和汽車打交道。他能診斷VOLVO car:使用UDS通訊協定讀取錯誤碼,D5T5團隊深入研究(逆向工程)原廠診斷工具,吐出每個錯碼的意義 VDASH也能配置汽車,例如修改開機畫面。首先要解開CEM安全保護,下圖是VDASH嘗試破解CEM的通訊紀錄,他也依賴UDS通訊協定 我感興趣的是UDS, 以前 不得其門而入,現在能說個兩句了 開始說UDS(Unified Diagnose Service) 工業標準讓大家在同個平台創新,例如3GPP之於4G/5G行動通訊,IEEE之於Ethernet/ WiFi 汽車電子充滿濃濃的ISO味,讓品牌商和ECU廠商脫鉤。 ISO-14229 UDS Protocol 定義通訊方式,下面表格列出所有服務。透過OBD2 port讓讀取錯誤碼,更新軟體,修改配置變得可行 UDS只定義通訊規格,各家廠商在其上自訂安全機制。作為旁觀者,準備一套樹莓派加CAN-to-USB能在旁偷窺。藉著觀測VDASH的通訊紀錄,學習UDS通訊。搜尋"UDS 0x27",慢慢看也看得懂。拜中國所賜,也有很多高品質的 中文資料 VOLVO P3 CEM保護 CEM是主電腦,手機安裝 Car Scanner Pro 能查詢不少內部狀態,例如電瓶狀態,機油溫度,逆向工程原廠診斷工具即可得知。進階操作得先通過UDS 0x27 Security Access考驗,認證通過,才允許底層操作 VOLVO的SEED/KEY算法已經不是秘密了。第一個連結包括2600個討論,涵蓋P1/P2/P3 CEM破解,甚至有P1/P2 Car Config,讀吧!第二個連結是Arduino在 Teensy bo

社區調漲管理費10%

圖片
縣市長選舉,社區應該爭取了一個投開票所,大家下樓投票,也處理管理費調漲10%。靠著挨家挨戶拜託,這個議題終於過關了!這篇文章聊一下為什麼這次會成功,還有兩年前為什麼失敗 社區概念上三種房型,面積40/50/60,戶數均等。我們的管理費公式比較特別 BEFORE: 基本費1000 + 坪數*25 AFTER: 基本費1100 + 坪數*27.5 這公式很難看出設計精神,兩年前投票後,我拆解出原本的精神如下 面積40以內,一坪50 面積>40,一坪25 社區三種房型我都住過,我家消耗的資源和面積無關,每戶只收基本費才對。也有人說,面積大代表持分多,管理費也要跟著多。似乎都有道理,所以社區算是把兩種觀點都揉進去了 兩年前的投票,試著改變兩件事 取消基本費 , 全用面積計價 調高費率 調結構非常凶險:40變少,50持平,60增加,被加錢的人天生會反對,等於一開始就先聚集三分之一反對票。加上管理費調漲,變成 40持平 ,50小增,60大增。好像哪裡怪怪的,漲價怎麼有人費用不變?毫不猶豫,先反對再說 阻力最小的路徑 不碰費率結構,分攤比例不變;大家都平均調漲10%,符合直覺 挨家挨戶拜託,見面三分情,有講有機會 我個人的結論 照面積算錢,簡單直覺;社區管理規定抄來抄去,抄到照面積算錢的機率最高 主流做法真的合理嗎?我覺得不大對勁 收費結構只能設定一次, 最初的那一次 ,請下好離手

玩CAN bus的傢伙們 (4) 修理USB-CAN Dongle

圖片
下面介紹的裝置,我前後在淘寶買了10個,最近遇到問題了 玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN 下圖是UDS通訊的封包,第一個byte(游標處)應該是照順序0123456789ABCDEF,但是下圖的順序就錯了,22/2E/23/2F/20/21。這讓封包分析極困難,還得用手排過才能看 問題能用下面指令重現,讓數值依序上升,有跳號容易看得出來   cangen can0 -I 726 -L 8 -D i -g 1 所以接下來要修韌體bug,以下操作都在RPi裡面操作 首先用git抓codebase回來 git clone https://github.com/candle-usb/candleLight_fw 編輯source code,設定CAN transceiver的S-PIN和LED-PIN到正確的位置 Edit candleLight_fw/include/config.h S-PIN沒有正確拉low,那麼TX不會啟動,無法送封包 LED沒正確配置,收到封包LED不會閃爍 我拿電錶測量IC-pin和這些接點,找到對的連結 編譯軟體,這裡是從github文件抄出來,如果成功,candleLight_fw.bin會出現在目錄下 mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/gcc-arm-none-eabi-8-2019-q3-update.cmake make candleLight_fw 燒錄軟體,把boot-pin從12切到23,插拔USB讓MCU進入DFU(Device FW Update),正確的話,Linux執行dmesg會跳出下面訊息。關鍵數字0483/df11,這是STM32的DFU模式標準編號 先用apt-get安裝dfu-util,韌體更新工具。這些工具一般會保護韌體,先用以下命令解開。操作前先注意:這個命令會洗掉本來的韌體喔... dfu-util -s 0:force:unprotect -a 0 -D candleLight_fw.bin 韌體保護解開,用以下命令就能燒錄軟體,不用手工操作dfu-uitil make flash-candleLight_fw 最後把boot-pin從23裝回12,插拔USB以後

ESP32(10) CAN Logger功能驗收

圖片
插在OBD2上的樣本二號像是平安符,注意,第三片小板子上去了。這篇是這系列的最後一篇了,我們來看看它的功能 [Put them together,功能確認] 先前比較少著墨軟體,這裡聊一下軟體設計 驗證部分我使用Linux的的 CAN-Utils 套件,他是Volkswagen Group Electronic Research編寫的( 版權宣告 ),這一系列工具非常方便。下面的命令會間隔1ms灌包,封包數值會遞增,方便檢查有無掉封包 cangen can1 -g1 -L8 -Di 實驗完成,真的有檔案跑出來 第一個封包序號0x114,最後序號0x15934F,一共1413961封包,和圖二編輯器行號吻合,沒掉封包。連續錄送1500秒,大約1秒942發。CAN本身會塞一些stuffing bit,這大概125K CAN極速 本來在一個task收CAN和寫資料,加深CAN queue還會掉封包。開出專門寫SD卡的task,並且入口的queue放深一點,從此不掉封包 如 前一篇 所述,電源供應元件有發熱問題,跑上面實驗會熱當,上車會掛。改buck不知道要多久,靈機一動:如果一枚LDO太燙,那就放兩顆吧。我果然是天才啊,立刻過關 [Configuration As Service] 這次編寫軟體有個新嘗試,把設定和RTOS相關資料結構塞入structure,取代一堆#define和全域變數。過往他們散在軟體裡不容易看出關聯,現在這樣是要花點記憶體,我感覺還不錯。既然能讀SD卡,也有機會開機讀取設定後,動態修改組態 [上車吧] 趁晚上涼快開車出來實驗,要搞車子,地下室有蚊子,白天又很熱,還是晚上好 很快發現不合用的地方:要等車子CAN封包停止,軟體才關檔。一輪實驗要10分鐘,直接關電檔案大小都是0什麼都沒有。在書桌上寫那麼爽,一出來立刻踩坑 果斷修改機制:檔案寫滿16000筆記錄,關檔開下一個檔案,搭配一顆LED,開新檔切換亮暗,用眼睛能判斷是否斷電。回去再多補上一顆按鈕,做完實驗按下立刻關檔 [CAN封包分析指南] 假如想分析CAN log,找到駕駛座車門打開或關閉的封包要怎麼做?想30秒再繼續看 我錄了一份log包含以下操作,用寫好的分析工具把log轉成 報告 ,報告對所有封包作圖。比起閱讀log file,看圖舒服很多吧 門開著,開始實驗 (關門1秒,開門3秒)* 5

ESP32(9) Low Power 2

圖片
買10支iPhone14是大土豪,我買10片EVB當奈米土豪。這一路做下來,會燒壞幾片呢 [樣品二號] 前一篇 沒達成最低耗電,這次想拿空板直接測,我有點抗拒剪USB線,畢竟TYPE-C的線不多,我也沒做USB測量電流小道具(好像該做一個) 第二招是解焊3.3V LDO,直接對3.3V供電。反正都要動手了,樣品二號的設計圖順便畫一下。這次我讓V_usb跳到另外一片板子的LDO,想測量V_usb電流也做得到了 操起熱風槍解焊完,修改電源,收發線路,SD卡插槽,再用熱熔膠加固。樣品二號誕生了 [Low Power第二輪] 樣品二號做完了, Test Code 可以回收再利用測試。這回我的手藝不錯,一次搞定 UART可以印 SD卡可以寫 CAN封包可以收發 懶病發作,繼續板子會動,直接跑軟體吧… 咦26uA,實驗做完了!至於理論值20uA驗證,量出每個元件breakdown,先放過自己吧。所以 前一次 沒搞定反映我低劣的工藝水平QQ [運作耗電] Low Power還沒結束,運作耗電繼續要填坑。用LDO供電,從12v降轉5v的壓差7v全部會發熱;這顆小小的SOT-23熱呼呼的!我用Pi的can-utils套件,產生不同速度的CAN封包測試耗電,得到下面的結果。最高速2ms操作太久還會熱當,科科 20mA operation, 140mW, CAN packet interval = 100ms 30mA operation, 210mW, CAN packet interval = 10ms 40mA operation, 280mW, CAN packet interval = 4ms 60mA operation, 420mW, CAN packet interval = 2ms 我調過CPU參數,降頻,打開FreeRTOS tickless idle都沒效。他們文件說CAN bus啟動, CPU會操作在最高速 !我猜是CPU調速度,APB clock速度跟著動,這些周邊又簡單做統一吃APB clock,導致CPU不能降速 哎呀,把周邊擺上去跟做到位是兩件事,下顆IC再繼續加油吧;不然客人用了CAN bus耗電降不下來,這還是不到位 但是供電的線路,長期還是要從LDO變成buck,或是元件本身要很省電… 這系列Low power大概還會再有第三篇,繼續折騰,換上buc

ESP32(8) Low Power

圖片
Low Power我踩過不少坑(如下),做起來曲折離奇,不得不解。雖然內心十分抗拒,還是得咬著牙搞定。這篇也是盡量原汁原味,呈現我做的傻事 http://lihgong.blogspot.com/2019/05/volvo-xc60-2.html http://lihgong.blogspot.com/2019/05/volvo-xc60-5low-power.html [Low Power 規格] CAN logger在汽車運作中,吃不到50mA,這程度對發電機完全無感,問題不大先忽視 引擎熄火開始吃電瓶,70Ah電瓶一顆約莫7000台幣,待機電流必須做得小才不會弄壞電池。定義規格:待機1年,吃1%電瓶,待機電流要壓到80uA。鉛電池自放電是每個月3%~10%,我訂的規格算是很嚴苛 70Ah*0.01 = 365*24h* 80uA Low Power選零件先決定一半:極小值是20uA!這裡的規格不開藍芽或無線網路 ESP32-C3 deep-sleep mode耗電量5uA TJA1042/3 standby mode耗電量10uA 5V LDO靜態耗電2.5uA 3.3V LDO靜態耗電2.5uA [先搞定硬體] CAN logger放車上,要搞定12v轉5v,拿先前做過的板子跳線加工一下。電源也加個二極體稍微隔離(理論上USB也要隔離,PCB已經做好沒辦法改)。跳線連接頭避免拉扯,用熱溶膠盡量固定,免得實驗做一半要維修。我的工藝水準真的有限,下面這團東西,感覺很不可靠啊 下圖是設計IDEA,原型驗證過做小板子會好得多 [睡眠機制] 先思考什麼時候要睡覺 汽車運作中,CAN Logger開始紀錄封包到SD卡,寫寫寫 等汽車熄火,CAN封包還會持續一段時間,最後停止 封包停止,ESP32-C3 SDK,接收CAN封包函數timeout設成4秒,然後去睡覺 [睡下去] 斷電前要做這些事 把所有GPIO pin review一輪,一般是設成input or output,檢查pull-up/ pull-down,避免從IO pin漏電。基本上low power這個是基本功 讓CAN收發晶片進Standby Mode省電,電流壓到10uA。這個狀態CAN bus任何擾動(bit#0, dominate)都會在RX pin輸出high-to-low,用這根pin喚醒ES

ESP32(7) 打通SD Card

圖片
這篇介紹怎麼打通SD card介面,因為太簡單了,先講古填充版面 [SD卡與我] 2009當阿兵哥感嘆被國家糟蹋的時光,必須做點什麼補償。放假我操起 J-Link 對S3C2410開發板寫Bootloader,十分健康的假日休閒。13年過去了,開發ESP32招數依舊差不多 開發板的SD卡槽連上SPI介面,從SPI Driver開始寫,照SD卡規範刻下圖那種狀態機,和創見2G記憶卡當朋友,不知不覺做起讀卡機了!小時候硬碟不開機,用DOS跑fdisk /mbr能救回 MBR (Master Boot Record),長大親手讀出記憶卡的MBR令我感動萬分!後續掛上FatFs,儲存空間搭配檔案系統才好用 感動另一面是恐懼,巨大的工作量忘不了(SPI/ SD-CARD IF/ DMA/ FATFS)。我玩STM32就很懶得弄;這次想做CAN bus logger,再怕都要搞定 source:  http://www.dejazzer.com/ee379/lecture_notes/lec12_sd_card.pdf [ESP32-C3] 隨手在網路找到 範例1 ,範例用ESP32-C3加上Lua Firmware不能用;倒是接線不是很複雜,先安定神經一下。稍微撈了ESP32-C3 SDK的文件,這幾篇看來有點用 FAT Filesystem Support SD/SDIO/MMC Driver SD SPI Host Driver 他們指出ESP32-C3 SDK有個簡單好用的 範例 ,去 SDK folder 撈到底下的範例 /HOME/.platformio/package/framework- espidf/examples/storage/sd_card/sdspi/main/sd_card_example_main.c 範例充滿註解,改一下針腳定義,編譯完就會動了!大概太多人都需要用SD卡,原廠SDK直接幫裝好給大家用也合情合理了 [速度考量] 勿在浮沙築高台,架起來後要看看有沒有坑 SPI初始資料結構有個欄位疑似能提高SPI clock,我試著從20Mhz拉高到24/25/26/40,全部都不能用,看起來只能跑20Mhz;也可能是杜邦線頻率上不去,這就不得而知了 修改範例,塞for-loop寫入4MB數據測試速度,大概15秒寫完,等於一秒鐘寫273KB。汽車50