文章目录
车联网安全入门------CAN总线逆向(ICSim)
🚀🚀孩子正在找实习,可以从事嵌入式,二进制安全,物/车联网安全,可私信或者联系rui6737321@gmail.com
🚀🚀最近对于车联网安全非常有兴趣,但是不知道怎么入门,无意间发现了ICSim,可以用来简单模拟一下汽车,学习了一段时间后决定写一下笔记,怕自己学完就忘记了(仅供学习参考)。
介绍
🚀🚀ICSim 是一个用于模拟车辆仪表集群的工具,专门为 SocketCAN 设计。SocketCAN 是 Linux 内核中的一个模块,用于支持控制器局域网(CAN)接口。
主要特点
- 仪表集群模拟:ICSim 可以模拟车辆仪表盘,包括速度表、转速表、燃油表等。这对于开发和测试基于 CAN 总线的汽车电子系统非常有用。
- 与 SocketCAN 集成:ICSim 与 Linux 的 SocketCAN 接口集成,允许用户通过标准的 SocketCAN 工具与模拟器进行通信和调试。
- 教育和开发:它是汽车网络和协议学习的一个极佳工具,可以帮助工程师、研究人员和学生理解 CAN 总线的工作原理和应用。
使用场景
- 软件开发:在开发车辆电子控制单元(ECU)时,可以使用 ICSim 进行初步测试,而无需实际的车辆硬件。
- 教学和培训:提供一个虚拟的车辆环境,便于教学 CAN 总线通信。
- 调试和验证:与实际车辆硬件的连接前,先在模拟环境中验证通信和功能。
🚀🚀项目地址如下所示:
zombieCraig/ICSim: Instrument Cluster Simulator (github.com)
🚀🚀安装教程如下:
车联网安全入门------ICSim模拟器使用-CSDN博客
逆向
🚀🚀其实上篇文章我们已经展示了如何通过重放攻击去操控汽车,但是我们有一个地方没有解释,那就是我们如何找到对应的can报文?所以接下来我会来介绍一下如何找到我们想要的CAN报文。
二分法
🚀🚀首先必须得是经典的二分法,核心思想很简答,就和二分查找一样,我们先将报文对半分,使用如下命令:
shell
split -l 15000 candump-2024-06-01_104423.log a
🚀🚀将30000条数据对半分,然后分别发送给can设备,看一下哪一半报文产生了你需要的动作,那就保留下来继续二分,循环,最后就能找到了。
频率统计法
🚀🚀上面的方法虽然有用,但是有些时候太慢了,特别是对于那种只出现几次的can报文,我们显然可以通过频率分析来找到他们,代码如下所示,我都加上了详细的代码:
python
import sys
def read_can_data(file_path):
"""
读取文件并提取CAN ID和数据。
参数:
file_path (str): 文件路径。
返回:
tuple: (CAN ID 列表, CAN 数据列表)
"""
result_id = []
result_data = []
with open(file_path, "r") as file:
for line in file:
parts = line.split(' ')[2]
can_id = parts.split('#')[0]
result_id.append(can_id)
result_data.append(parts)
return result_id, result_data
def print_id_counts(result_id):
"""
打印每个CAN ID出现的次数。
参数:
result_id (list): CAN ID 列表。
"""
unique_ids = set(result_id)
for can_id in unique_ids:
print(f"{can_id}: {result_id.count(can_id)}")
def search_data_by_id(result_data):
"""
根据用户输入的CAN ID搜索并打印对应的数据。
参数:
result_data (list): CAN 数据列表。
"""
while True:
inp = input("please input id: ")
for data in result_data:
if inp in data.split("#")[0]:
print(data)
def main():
"""
主函数,执行读取数据、打印统计信息和搜索数据功能。
"""
if len(sys.argv) < 2:
print("Usage: python script.py <input_file>")
return
file_path = sys.argv[1]
result_id, result_data = read_can_data(file_path)
print_id_counts(result_id)
search_data_by_id(result_data)
if __name__ == "__main__":
main()
read_can_data
函数用于读取文件并提取CAN ID和数据,返回一个包含CAN ID和数据的元组。print_id_counts
函数用于打印每个CAN ID出现的次数。search_data_by_id
函数根据用户输入的CAN ID搜索并打印对应的数据。main
函数是程序的入口,执行读取数据、打印统计信息和搜索数据的功能。if __name__ == "__main__":
确保脚本作为主程序运行时调用main
函数。
shell
python can.py candump-2024-06-01_104423.log
🚀🚀调用py代码之后显示如下:
324: 126
305: 118
136: 1246
18E: 1246
40C: 42
143: 1246
21E: 310
333: 122
1CF: 623
1DC: 623
309: 126
13F: 1246
405: 42
191: 1247
294: 310
17C: 1246
13A: 1246
454: 42
1B0: 620
244: 1066
158: 1246
428: 42
5A1: 12
1A4: 623
133: 1247
166: 1246
095: 1246
1AA: 620
039: 821
188: 24
1D0: 620
183: 1246
320: 126
161: 1247
164: 1246
37C: 126
19B: 6
please input id: 19B
19B#00000F000000
19B#00000F000000
19B#00000E000000
19B#00000F000000
19B#00000E000000
19B#00000F000000
🚀🚀对于那种出现次数很少的代码,我们就可以仔细研究一下,刚好就发现这个19B就是开车门,因为我们有过几次开关车门的动作,就被记录下来了。
瞪眼法
🚀🚀这个主要就是通过我们的sniffer来动态显示我们的数据包,通过我们的眼睛发现关键报文,比如汽车加速时有个报文数据一直在规律增长,就可以猜测是控制汽车油门的报文,这部分主要是看我们能不能发现报文的变化,如果后期有可能的话出个视频教程会清楚一点(挖坑),这里就简单介绍一下。
cansniffer
🚀🚀cansniffer能够动态显示我们的can报文变化状态,对于can报文的逆向起到很大的帮助作用,使用命令如下所示:
cansniffer -c vcan0
🚀🚀特别值得注意的就是,使用按下#键,然后enter,就可以屏蔽一些变化数据,更便于我们进行观察:
SavvyCAN
🚀🚀前面文章有介绍,不会使用的同学可以回去看一下。
🚀🚀然后就是SavvyCAN里面的sniffer,就会发现和之前那个命令行工具cansniffer很相似,这个的话,红色是无规律变化,绿色是有规律变化,下方还能过滤报文,非常好用哈!
🚀🚀使用右上角notch功能也能实现屏蔽一些变化,便于我们观察,而且我们还能点击View Bits来观察每一个字节是如何使用的。
🚀🚀还有更加逆天的功能,那就是画图,我们简单来看一下,这个是我按下油门之后的数据,详细的过程我会单独写一篇文章(狠狠挖坑),内容就是如何分析一段CAN报文,确定其功能以及如何攻击,感觉越来越好玩了!
总结
🚀🚀这篇文章简单介绍了一下常见的几种CAN逆向方法,希望能够帮助到大家,谢谢!!!