UDS协议安全CTF挑战分析

admin 2026-06-13 04:35:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析了UDS协议安全CTF挑战的完整解题过程,涵盖VIN码读取、多级安全访问机制(Level1-5)、内存dump等关键技术点。通过实际CAN总线通信示例展示了ISO-TP多帧传输、Seed-Key认证、会话控制等UDS核心机制,提供了从基础接口识别到高级内存取证的全流程实战经验。 综合评分: 87 文章分类: CTF,车载安全,漏洞分析,逆向分析,实战经验


cover_image

UDS协议安全CTF挑战分析

vstral vstral

看雪学苑

2026年6月12日 17:59 上海

在小说阅读器读本章

去阅读

挑战来源:https://vsec.blockharbor.io/

Challeng website:https://proving-grounds.blockharbor.io/

由于官方的在线似乎要$79,我是用yichen师傅的docker版本:https://github.com/yichen115/UDSCTF

Getting Started

Can you find the interface?

What is the name of the CAN interfaceavailableonthevirtualterminal?

在页面:https://core.ed.vsec.blockharbor.io/block/test?tab=Simulations

打开uds challenge

使用ip link查到CAN interface为vcan0

UDS Challenge

VIN获取

题目:Retrieve the VIN of the simulation using UDS.

需要使用22UDS服务读取VIN码(VIN码:车辆识别码,俗称车架号,由17位字符(字母+数字)组成,每辆车独一无二)

0xF190代表VIN码请求,22为SID(服务号),F190为DID(数据标识符)

VIN比较长,所以需要一次请求,多帧响应,使用流控帧(FC)和连续帧(CF)

第一条7df#0322f190:发送一个UDS请求:读取VIN(DID=F190)

CAN ID:7DF(功能地址:广播给所有ECU)

数据部分:03 22 F1 90(ISO-TP单帧结构:[PCI][DATA…])

03是什么? PCL(Protocol Control Information)是相当于发送数据协议的指示 0x03 = 单帧 + 长度三字节(高4位0表示单帧,低四位3表示后面有3字节数据) 22 F1 90是什么?  22:服务号(ReadDataByIdentifier),F1 90:DID(VIN)

第二条:7E0#3000000000000000:这是ISO-TP Flow Control帧(FC)

7E0:ECU接收ID(Request ID)

FC结构:[PCI][BlockSize][STmin]…

PCL:

| 值 | 含义 | | — | — | | 30 | 继续发送 | | 31 | 等待 | | 32 | 中止 |

完整流程:

1. 我 → ECU
7E0#0322F190

2. ECU → 我
7E8#10 xx ...   (First Frame)

3. 我 → ECU(FC)
7E0#30 00 00 ...

4. ECU → 我
7E8#21 ...
7E8#22 ...

接收到:

  vcan0  7E0   [4]0322 F1 90
  vcan0  7E8   [8]101C 62 F1 90554453
  vcan0  7E0   [8]3000000000000000
  vcan0  7E8   [8]214354467B 56494E
  vcan0  7E8   [8]2259494348454E 30
  vcan0  7E8   [8]2330313132323333
  vcan0  7E8   [2]247D

10 1C:(第一帧、高四位=1),1C:总长度 = 1C = 28字节

去除UDS响应头62 F1 90

21 42:去除21,(序号为1)

Level1 flag 获取 (安全级别1)

描述:需要理解 UDS 安全访问机制,完成 seed-key 交换,通过安全访问 Level1 后读取 DID:C1C2

UDS安全访问机制

UDS安全访问机制就是SecurityAccess,SID = 0x27,作用是:在执行敏感诊断操作前,先让测试仪“解锁ECU”

典型的敏感操作包括:刷写固件、写入数据、清除故障码、执行例程、控制ECU行为等。

  • 核心流程:Seed-Key

这不是一个账号密码,而是一个挑战-响应机制

流程如下:

Tester -> ECU: 2701
请求安全等级 1 的 seed

ECU -> Tester: 6701 xx xx xx xx
返回seed

Tester 本地计算:
key = f(seed)

Tester -> ECU:2702 key
发送key

ECU -> Tester:6702
解锁成功

27:SecurityAccess 服务

67:0x27的正响应,0x27 + 0x40 = 0x67

| 子功能 | 含义 | | — | — | | 0x01 | 请求 Level 1 seed | | 0x02 | 发送 Level 1 key | | 0x03 | 请求 Level 2 seed | | 0x04 | 发送 Level 2 key | | 0x05 | 请求 Level 3 seed | | 0x06 | 发送 Level 3 key | | 奇数为请求seed | | | 偶数为发送key | |

seed为ECU返回给tester的随机数,例如67 01 A1 B2 C3 D4

seed = A1 B2 C3 D4

key是测试仪根据seed计算出来的结果,然后发回给ECU,如果匹配则解锁成功

响应情况:

请求: 27 01

响应:67 01 12 34 56 78

若key成功:

请求:27 02 xx xx xx xx

响应:62 02

若key失败:

响应:7F2735

7F:负响应
27:原始服务
35:错误key

| 响应码 | 含义 | | — | — | | 0x35 | InvalidKey,key 错误 | | 0x36 | ExceedNumberOfAttempts,尝试次数过多(ECU有锁定时间) | | 0x37 | RequiredTimeDelayNotExpired,延时未结束 | | 0x24 | RequestSequenceError,流程顺序错误 | | 0x12 | SubFunctionNotSupported,子功能不支持 | | 0x22 | ConditionsNotCorrect,条件不满足 |

不同安全等级对应不同权限。(由具体厂商定义)

例如:

| 等级 | 可能权限 | | — | — | | Level 1 | 读取扩展数据、普通测试 | | Level 2 | 写配置、执行部分例程 | | Level 3 | 进入编程会话、刷写固件 | | Level 4+ | 厂商/产线/高权限功能 |

要完成这个题目,通过安全访问 Level1

所以需要发送指令27 01,加上ISO-TP单帧长度字节:7E0#022701

  vcan0  7E0   [3]022701
  vcan0  7E8   [7]06670133 E5 9E 79

与key(0xdeadbeef)异或之后得到ed482096,然后发送即可收到成功响应

  vcan0  7E0   [7]062702 ED 482096
  vcan0  7E8   [3]026702

然后就可以去获取标识符C1C2对应内容

  vcan0  7E0   [4]0322 C1 C2
  vcan0  7E8   [8]101E 62 C1 C2 554453

拿到第一帧:10 1E表示首帧,1E表示总长度30字节

下一步发送流控帧 FC,让ECU继续发送后续连续帧

cansend vcan0 7E0#3000000000000000

 vcan0  7E0   [4]0322 C1 C2
  vcan0  7E8   [8]101E 62 C1 C2 554453
  vcan0  7E0   [8]3000000000000000
  vcan0  7E8   [8]214354467B 32375F
  vcan0  7E8   [8]2273656375726974
  vcan0  7E8   [8]23795830725F 4331
  vcan0  7E8   [4]2443327D

注意这里的30 00 00 00 00 00 00 00

现在进行逐字节解析:

第一个30:Flow Control(FC)这不是普通数据,而是流控控制消息

30 00 00 的格式是:

| 字节 | 含义 | | — | — | | 0x30 | Flow Control + Continue To Send (CTS) | | 0x00 | Block Size(一次允许发送多少帧) | | 0x00 | Separation Time(帧间隔) |

27 Level3 flag 获取 (安全级别3)

描述: 需要切换到编程会话,并使用更复杂的密钥算法,通过安全访问 Level3 后读取 DID:C1C2

切换到编程会话:7E0#021002

02:ISO-TP单帧长度,表示后面有2个字节

10:UDS服务号,0x10 = DiagnosticSessionControl(诊断会话控制),相当于切换会话

02:子功能,0x02 = Programming Session(编程会话)

成功效应:50 02

50 = 0x10 + 0x40(正响应)

02 = 编程会话

  vcan0  7E0   [3]021002
  vcan0  7E8   [5]0450020032

请求seed:022703

用给定算法算出key

# 步骤3: 计算级别3key (复杂算法)
#&nbsp;key&nbsp;= ((seed <<&nbsp;7) | (seed >>&nbsp;25)) ^&nbsp;0xCAFEBABE +&nbsp;0x12345678
#&nbsp;key&nbsp;= (key&nbsp;&&nbsp;0xFFFF0000) | ((key&nbsp;&&nbsp;0x0000FFFF) ^&nbsp;0xABCD) ^&nbsp;0xDEADBEEF

发送回ECU验证:06270679278C05

然后获取D1D2数据:

cansend vcan0 7E0#0322D1D2 cansend vcan0 7E0#3000000000000000

dump 内存获取 flag (安全级别5 + 内存dump)

描述: 最高难度的挑战,需要完成级别 5 安全访问,然后通过 0x23 服务 dump 内存寻找 flag

获取级别5seed,然后计算出密钥,通过认证

&nbsp; vcan0 &nbsp;7E0 &nbsp;&nbsp;[3]022705
&nbsp; vcan0 &nbsp;7E8 &nbsp;&nbsp;[7]06670517&nbsp;A8&nbsp;187C
&nbsp; vcan0 &nbsp;7E0 &nbsp;&nbsp;[7]06270696&nbsp;D9 AC&nbsp;32
&nbsp; vcan0 &nbsp;7E8 &nbsp;&nbsp;[3]026706

然后通过 0x23 服务 dump 内存寻找 flag

通过认证解锁后,使用ReadMemoryByAddress按地址范围读取内存,最后在dump数据搜索flag。

0x23 = ReadMemoryByAddress:地址 + 长度,而非通过DID读取 0x22为通过DID读取,这是它们的区别

# 使用0x23 ReadMemoryByAddress服务
# 格式: 0x23 + 格式标识符 + 地址 + 大小
# 格式标识符0x14表示: 1字节大小 + 4字节地址

# 示例: 读取0x40000000开始的80字节
7DF#0723144000000050

复位启动 flag 获取

cansend vcan0&nbsp;7E0#021101

ctfuser@1218612ee3c0:~/challenge$&nbsp;candump vcan0 |&nbsp;grep 7E8
&nbsp; vcan0 &nbsp;7E8 &nbsp; [8] &nbsp;10 1F 62 00 00 55 44 53
&nbsp; vcan0 &nbsp;7E8 &nbsp; [8] &nbsp;21 43 54 46 7B 52 65 73
&nbsp; vcan0 &nbsp;7E8 &nbsp; [8] &nbsp;22 65 74 5F 54 68 45 5F
&nbsp; vcan0 &nbsp;7E8 &nbsp; [8] &nbsp;23 55 44 53 5F 53 65 72
&nbsp; vcan0 &nbsp;7E8 &nbsp; [5] &nbsp;24 76 65 72 7D

#

看雪ID:vstral

https://bbs.kanxue.com/user-home-930155.htm

*本文为看雪论坛优秀文章,由 vstral 原创,转载请注明来自看雪社区

第十届安全开发者峰会【议题征集】-欢迎投稿

往期推荐

我们绕过了 GarudaDefender 整套 Frida 检测,但这已经不是重点了

一次 Flutter App 实战:还原 encData 参数解密流程

单机DMA劫持HyperV!调试+取证两种思路解决2026腾讯游戏安全技术竞赛决赛

Android风险环境检测——签名校验

和爱豆更近一步——爱豆聊天App反调试绕过

球分享

球点赞

球在看

点击阅读原文查看更多


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:看雪学苑 vstral vstral《UDS协议安全CTF挑战分析》

评论:0   参与:  0