携带种子的的can逆向过程

以20250709种子启动模拟器

./controls -s 20250709  vcan0
./icsim -s 20250709 vcan0

经检索了解,对于使用的固定种子,主要是锁定随机数生成的初始状态,确保每次运行时CAN ID的生成序列完全一致,因此对于使用种子启用进行can逆向时,二分法和统计法以及fuzz都可使用

这里有个不使用fuzz,快速确定canid的方法

使用Savvy工具的sniffer,初始不对模拟器进行操作,然后点击notch按钮,之后进行操作,通过肉眼即可观察到变化

这里进行加速操作

img

发现仅有一处在发生变化,因此加速控制的canid=0x607,且快速确定速度控制字段

这里的原理是

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

同理转向控制的canid为0x478

img

开关门控制的canid为0x6D7

img

这里也没有问题

同理既然知道id,接下来就可以使用fuzz,来查找控制字段

加速控制

img

锁定到控制字段,最终结果

加速:607#00XX000000000000    其中XX高位为0,低七位为速度变化大小
减速:607#00XX000000000000    其中XX高位为1,低七位为速度变化大小

转向控制

img

锁定到控制位置,最终结果

左转 478#0000000000010000 
右转 478#0000000000020000 
双闪 478#0000000000030000 

车门控制

img

锁定到控制位置,最终结果

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

img

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文件中,进行重放

img

这里未触发转向

紧接着是46A

img

这里重放不触发转向灯,但是单独发送上述的帧则触发了转向效果

这里是因为重放文件中仅有帧,不包含时间戳和接口名导致的,通过如下命令筛选

img

再次重放就没有问题

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

img

这里就不可以,存在一些干扰信息,因此需要对控制字段进行fuzz

这里还是使用Savvy好用,直接锁定带有数值的位置

img

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

img

最终结果如下:

左转: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

进行测试

img

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

img

最终确定如下结果:

车门控制:6E9#000000000X
控制逻辑与之前一致

3、通过二分法,测试加减速控制

img

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

img

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

img

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

img

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

img

选择xab二分

img

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

img

选择xab

img

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

img

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

img

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

img

最终确定控制字段

控制逻辑与之前一致

posted @ 2025-10-23 21:25  dr4w  阅读(1)  评论(0)    收藏  举报