这是一个基于UDS(Unified Diagnostic Services)协议的CTF挑战环境,旨在测试对汽车诊断协议的理解和安全分析能力。挑战包含多个层次的flag获取,从基础的协议理解到高级的内存dump分析。仅仅是把题目功能测试好了,题目场景没有考虑过,也没想过怎么给选手提供 UDS 安全访问算法的提示等信息,因此可以直接将编译好的二进制程序给选手,在里面把 flag 信息隐去,让选手逆向得到安全访问算法。
所有代码由 AI 编写,可能存在错误( iso14229 来源于:https://github.com/driftregion/iso14229 )
本挑战包含五个flag:
- 读取VIN码获取flag (DID:
0xF190) - 通过安全访问级别1读取DID:0xC1C2获取flag (DID:
0xC1C2) - 通过安全访问级别3读取DID:0xD1D2获取flag (DID:
0xD1D2) - 通过安全访问级别5读取内存获取flag (0x23服务)
- 系统启动时会往外发送flag,复位即可获取flag (CAN ID:
0x7E8)
# 构建&运行镜像
./deploy.sh
# SSH连接即可解题
ssh ctfuser@localhost -p 2222 # 密码: ctfpassword难度: ⭐
描述: 基础的UDS协议理解,直接读取DID F190即可获得flag。
# CAN消息格式
7DF#0322F190难度: ⭐⭐
描述: 需要理解UDS安全访问机制,完成seed-key交换,通过安全访问Level1后读取DID:C1C2。
# 步骤1: 请求seed
7DF#022701
# 步骤2: 计算key (key = seed ^ 0xdeadbeef)
# 假设收到seed: 0x12345678
# 则key = 0x12345678 ^ 0xdeadbeef = 0xccd9f897
# 步骤3: 发送key
7DF#062702CCD9F897
# 步骤4: 读取flag
7DF#0322C1C2难度: ⭐⭐⭐
描述: 需要切换到编程会话,并使用更复杂的密钥算法,通过安全访问Level3后读取DID:C1C2。
# 步骤1: 切换到编程会话
7DF#021002
# 步骤2: 请求级别3 seed
7DF#022703
# 步骤3: 计算级别3 key (复杂算法)
# key = ((seed << 7) | (seed >> 25)) ^ 0xCAFEBABE + 0x12345678
# key = (key & 0xFFFF0000) | ((key & 0x0000FFFF) ^ 0xABCD) ^ 0xDEADBEEF
# 步骤4: 发送级别3 key
7DF#062704 + calculated_key
# 步骤5: 读取flag
7DF#0322D1D2难度: ⭐⭐⭐⭐
描述: 最高难度的挑战,需要完成级别5安全访问,然后通过0x23服务dump内存寻找flag。
# 步骤1: 请求级别5 seed
7DF#022705
# 步骤2: 计算级别5 key (最复杂算法)
# key = seed ^ 0x12345678 ^ 0x87654321
# key = (key >> 13) | (key << 19)
# key = (key & 0xFF00FF00) | ((key & 0x00FF00FF) ^ 0x55555555)
# key = key + 0xDEADBEEF ^ 0xCAFEBABE
# 步骤3: 发送级别5 key
7DF#062706 + calculated_key# 使用0x23 ReadMemoryByAddress服务
# 格式: 0x23 + 格式标识符 + 地址 + 大小
# 格式标识符0x14表示: 1字节大小 + 4字节地址
# 示例: 读取0x40000000开始的80字节
7DF#0723144000000050- 程序基址:
0x40000000 - 服务端实现了ELF文件自映射,访问0x40000000时返回完整ELF文件内容,在其中可获得flag
难度: ⭐
描述: 监听CAN总线,复位重启服务获取flag消息。
# 监听CAN总线消息
candump vcan0 | grep 7E8
# 或者重启ECU触发启动消息
7DF#021101# 构建并运行
docker build -t udsctf:latest .
docker run -d --name udsctf-container --privileged -p 2222:22 udsctf:latest
# SSH连接
ssh ctfuser@localhost -p 2222
# 密码: ctfpassword
# 启动CAN接口
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
# 运行解题脚本
python3 solve.pyUDSCTF/
├── uds_server.c # UDS服务器实现
├── iso14229.c # ISO14229协议栈
├── iso14229.h # 协议头文件
├── solve.py # 解题脚本
├── Makefile # 编译配置
├── Dockerfile # Docker配置
├── docker-compose.yml # Docker编排
└── README.md # 题目描述
- 仔细分析UDS协议格式和ISO-TP多帧传输
- 理解ELF文件格式有助于内存分析
- 使用十六进制编辑器查看dump文件
- 注意安全访问的会话要求
- 多帧传输需要正确处理流控帧
祝你好运!🚗🔧