-
-
[原创]Polarisctf招新赛-UDS
-
发表于: 9小时前 196
-
送分题,仅模拟了 UDS 诊断中 27 服务的使用。
题目已经给出算法且给出使用方法,无论是人工手动计算或者使用 AI 写交互脚本都可以,学习为主。
plus 更偏向 UDS 实战,同时也添加了实战中存在的限制,如空闲时间为 3 秒、防爆破、防抓包以及更高级的算法等级策略。
本题给了两个附件:BLE 的流量包和 CAN 的日志。本次还是主要以介绍 UDS 服务为主。
ble.pcapng 是一个 BLE 蓝牙流量包,这里我们可以使用 tshark 提取流量包中的有用数据。
示例分析:
至此,我们流量包已经分析完了,那么我们提取出来的值有什么用呢?
打开 1.txt,不难发现开头和结尾是特殊字符,分别代表着私有协议的起始控制帧和结束控制帧。


那么其次,中间的内容是什么呢?
不难发现每行为 18 个字节,很符合一个固件分片的特征:2 字节索引 + 16 字节数据。那么,我们可以尝试修复这个固件。
拿到固件后,我们依然没办法分析内容。这里我们通过固件的数据不难发现,这个固件被加密了。
那么,我们该如何解密这个固件?首先分析另一个附件,也就是 can.asc。
在流量的末尾处我们会发现很明显的诊断记录:
接着,我们按照数据结构划分,不难分析出在使用 22 F1 90 命令时,返回了 62 F1 90 加上一串数据,这明显意味着积极响应。根据数据结构对内容进行删除并解密:
可以得到:
得到了 key,刚好 16 字节,敏感的人已经可以猜测到是 AES 加密了,此时对固件进行解密。
这样,我们就可以得到一个可分析的 AARCH64 结构固件了。
分析过程不再赘述,无论是通过 AI 解析固件,还是模拟执行固件,都是可以的。
拿到了固件,就差最后一步:获取 flag。
这里我给出了 8 个诊断服务,我们需要理解其使用方法和排除干扰项,这里直接给到使用步骤。
这里因为设置了会话空闲时间,导致在无操作时会返回到默认会话(10 01),从而无法执行其他服务。那么我们写一个交互代码即可。那么我们该如何得到可用的参数呢?这里我们可用通过观察服务的错误码来判断这个服务是否支持这个参数。

这里我们可以对比NRC错误码标判断,当服务不支持这个参数时,返回的时0x12,也就是子服务不支持此功能;当输入正确的值时,会返回0x33,也就是没有经过27服务认证,22服务也是同理。所以,我们只需要对这些值进行爆破即可。
(正常来说可以使用 3E 服务进行会话维持,但是出题人比较菜,3E 写了没作用,不过不影响做题,给大家磕了。)
最后脚本如下:
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!