Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Japan VCC 2025 問題解説
Search
smz
October 24, 2025
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Japan VCC 2025 問題解説
smz
October 24, 2025
More Decks by smz
See All by smz
cartagaitai #2 Car Hacking Village CTF問題解説
smz
0
390
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Building Adaptive Systems
keathley
44
3.1k
Rails Girls Zürich Keynote
gr2m
96
14k
We Are The Robots
honzajavorek
0
280
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Everyday Curiosity
cassininazir
0
250
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Transcript
Japan VCC 2025 問題解説 cartagaitai勉強会#4 @smz 1
今⽇のコンテンツ • Japan VCC 2025で出題された、RAMNを使⽤した問題3問を解説します ◦ チュートリアル ◦ シリアルコンソール ◦
パスワードをください 2
チュートリアル 3
問題⽂ 4 CANメッセージをリバース・エンジニアリングして、RAMNの物理的なコントロールがどのバイト に対応しているかを特定してください。デフォルトのRAMN画⾯を使うと、解析の助けになりま す。コントロールを以下に設定すると、画⾯上にフラグが表⽰されます。 • ブレーキ:0xED_ • アクセル:0xDD_ •
ステアリングホイール:0xF0_ • エンジンキー:0x01 • ライト:0x02 • サイドブレーキ:0x01 ※ _は任意の桁を表します
スクリーンに表⽰されるCANデータを⾒ながら各種スイッチを操作 5 出典:RAMN Documentation “Hardware Overview” https://ramn.readthedocs.io/en/latest/hardware/overview.html CAN ID ペイロード
スクリーン上で各CAN IDのペイロード がスイッチの操作に連動して変化する
微調整は必要だが問題の通りに合わせるだけ 6 flag{froggyfren}
シリアルコンソール 7
問題⽂ 8 ECU DはUARTでフラグをブロードキャストしています
flag{mayor_appro4ch} 9 • RAMN DocumentationでECU DのUART端⼦を特定してUSBシリアル変換で接続し、 minicom等を使⽤しビットレート115200で確認するだけ • 過去に同じような出題があり覚えていたので実際には資料を⾒るまでもなかった 過去問(Automotive
CTF 2024)を予習していたとき Japan VCC 2025での接続図
パスワードをください 10
問題⽂ 11 フラグを読み出すための秘密のUSBコマンドがあります。 そのコマンドの使い⽅を⾒つけられますか? ヒント:#を⼊⼒してCLIモードに⼊る必要があります ※ファームウェアの添付あり(ECUA_Redacted.hex)
RAMNにUSB接続すると確かにコマンドが打てる 12
⽂字列を⼿がかりにコマンド処理部分を特定 13 • flag <⽂字列>というコマンド を処理する • FUN_080019ecでパスワード が有効であるかを確認してい る
パスワード検証関数(FUN_080019ec)を読む 14 • この関数から呼ばれる関数はない • いくつかグローバル変数を使うが、す べてファームウェア内の固定値 こういうときは...
15 AIが解きました、以上。
パスワード検証のロジック 16 • ⽂字数をカウントし、11⽂字か検証 • ⼀⽂字ずつforループで検証 ◦ 検証する⽂字位置(pos)を配列から取得 • 戻り値ok_flagは11回(⽂字)のループ全てで
条件式を満たすと1になる ◦ ok_flag = ok_flag & 条件式 • 条件式 ◦ (複雑な演算) == entered_password[pos] ◦ (複雑な演算)結果が正しいパスワードのpos ⽂字⽬
固定整数除算の最適化 17 • (複雑な演算)=((PTR_DAT_08001b20[idx + (uint)((ulonglong)0x4EC4EC4F * (ulonglong)idx >>0x22) *
-0xd] ^ PTR_DAT_08001b24[pos]) - (pos * pos + 3 & 7)) ◦ 配列のインデックスをマジックナンバー0x4EC4EC4Fを使って計算している ◦ これは idx mod 13 = idx + idx / 0xd * -0xdをコンパイラが最適化したもの • ⼀般に除算命令は遅いため、32bit整数の除算 x / dは x * magic >> ( 32 + post_shift )のように乗算と右シフトで最適化される ◦ magicとpost_shiftはすべてのxで誤差が⽣じないように計算される ◦ gccでの実装はgcc/expmed.cのchoose_multiplier() ◦ 理論的基盤はGranlund-Montgomery, Division by Invariant Integers using Multiplication(1994)による
Solverを書いて解く 18 def solve_password(): password = ['?'] * 11 #
11文字のパスワード for i in range(11): pos = PTR_DAT_08001b18[i] # この反復でチェックする位置 # インデックス計算 idx = pos * 7 + 3 # 期待される文字を計算。idx % 13は固定整数除算最適化の結果に対応 expected = (PTR_DAT_08001b20[idx % 13] ^ PTR_DAT_08001b24[pos]) - ((pos * pos + 3) & 7) password[pos] = chr(expected) return ''.join(password) # ”ELITEHAXXOR”が返る >flag ELITEHAXXOR flag{medi3val_scr3w}
EOF 19 Thank you!