携带种子的的can逆向过程
以20250709种子启动模拟器
./controls -s 20250709 vcan0
./icsim -s 20250709 vcan0
经检索了解,对于使用的固定种子,主要是锁定随机数生成的初始状态,确保每次运行时CAN ID的生成序列完全一致,因此对于使用种子启用进行can逆向时,二分法和统计法以及fuzz都可使用
这里有个不使用fuzz,快速确定canid的方法
使用Savvy工具的sniffer,初始不对模拟器进行操作,然后点击notch按钮,之后进行操作,通过肉眼即可观察到变化
这里进行加速操作

发现仅有一处在发生变化,因此加速控制的canid=0x607,且快速确定速度控制字段
这里的原理是
窗口运行时,它会每 200ms 周期保存一个运行列表,列出该时间跨度内发生变化的所有位。每 200ms,此列表都会备份和重置。如果按下 Notch 按钮,系统将记住在过去 200ms 窗口中设置的所有位,并且如果这些位在将来被切换,则不会为输出着色。因此,它们会在某种程度上被忽略,但仍然可以看到它们在更新。如果反复单击 Notch 按钮,它会将任何新更改的位添加到旧更改的位中。通过这种方式,可以建立一组要忽略的位。取消 Notch 会导致所有已 Notch的位都重置,因此所有更改将再次着色。
同理转向控制的canid为0x478

开关门控制的canid为0x6D7

这里也没有问题
同理既然知道id,接下来就可以使用fuzz,来查找控制字段
加速控制

锁定到控制字段,最终结果
加速:607#00XX000000000000 其中XX高位为0,低七位为速度变化大小
减速:607#00XX000000000000 其中XX高位为1,低七位为速度变化大小
转向控制

锁定到控制位置,最终结果
左转 478#0000000000010000
右转 478#0000000000020000
双闪 478#0000000000030000
车门控制

锁定到控制位置,最终结果
6D7#0000000X00000000 X为控制字段,控制逻辑与之前一致
进阶实验
以为种子,在难度2下重新启动ICSim模拟器,使用SavvyCAN,找到当前模拟条件下与灯控、门控、加速有关的关键帧详细信息。
: icsim [options] <can>
-r randomize IDs
-s seed value
-d debug mode
-m model NAME (Ex: -m bmw)
Usage: controls [options] <can>
-s seed value from IC
-l difficulty level. 0-2 (default: 1)
-t traffic file to use for bg CAN traffic
-m Model (Ex: -m bmw)
-X Disable background CAN traffic. Cheating if doing RE but needed if playing on a real CANbus
-d debug mode
启动难度2
./icsim -s 320220942511 vcan0
./controls -s 320220942511 -l 2 vcan0

1、通过概率统计法,测试转向控制canid
这里依然仅作一次转向,从数量较少的canid包进行
相关频数如下
166: 644
294: 160
158: 644
191: 644
17C: 644
21E: 160
333: 63
1CF: 322
320: 65
5A1: 5
13A: 644
324: 65
1A4: 322
454: 21
1DC: 322
039: 425
428: 22
13F: 644
136: 644
37C: 65
40C: 21
095: 644
1B0: 320
161: 644
305: 61
26B: 518
1D0: 320
405: 22
46A: 13
183: 644
143: 643
18E: 644
1AA: 320
164: 644
133: 644
309: 65
这里频数最低的是5A1
5A1#960000000000623E
5A1#9600000000006210
5A1#960000000000622F
5A1#960000000000623E
5A1#9600000000006210
存放在log文件中,进行重放

这里未触发转向
紧接着是46A

这里重放不触发转向灯,但是单独发送上述的帧则触发了转向效果
这里是因为重放文件中仅有帧,不包含时间戳和接口名导致的,通过如下命令筛选

再次重放就没有问题
因此确定46A为转向控制的canid,但是这里不像之前的分析一样,仅有控制字段有值,可以很快锁定

这里就不可以,存在一些干扰信息,因此需要对控制字段进行fuzz
这里还是使用Savvy好用,直接锁定带有数值的位置

控制字段确实在这个位置,然后逐个缩小范围,最终锁定到该位置

最终结果如下:
左转:46A#0100000000
右转:46A#0200000000
双闪:46A#0300000000
2、通过概率统计法,测试车门控制的canid
这里仅作两次车门开关
320: 72
46A: 15
309: 73
17C: 716
136: 716
095: 717
5A1: 7
133: 716
1B0: 356
18E: 716
405: 24
428: 24
324: 72
1D0: 356
1AA: 356
454: 24
26B: 577
161: 716
143: 716
164: 716
183: 716
6E9: 2
294: 178
158: 716
039: 473
40C: 24
305: 68
166: 716
191: 716
13A: 716
1DC: 358
37C: 72
333: 70
1CF: 358
21E: 178
1A4: 358
13F: 716
这里最少的为6E9
进行测试

经测试,确实可以进行车门的开关,然后对控制字段进行fuzz

最终确定如下结果:
车门控制:6E9#000000000X
控制逻辑与之前一致
3、通过二分法,测试加减速控制

一共有三万条数据,对其进行分割

其中xaa存在加速控制,继续对xaa进行分割

经过重放,发现xac的状态变化最为明显,选取xac作为下一轮二分

发现xae状态变化明显,选取xae二分

选择xab二分

这里每份的变化差别不多,选择xae二分

选择xab

这里只有xad,xaa发生了变化,选择xaa,逐个测试结果

这里26B的触发极为不稳定,多次测试确实可以触发,现在利用fuzz来确定

最终确实是该id,然后利用fuzz,确定控制字段,在有数值的位置进行fuzz

最终确定控制字段
控制逻辑与之前一致

浙公网安备 33010602011771号