AB PLC固件提取与逆向分析


01、概 述

在前面的文章中,我们重点对罗克韦尔AB PLC进行了硬件拆解,探讨了CIP通信协议中存在的安全问题。在本篇文章中,我们将进一步深入分析,从硬件层面入手,对Micro850 PLC进行固件提取与逆向分析,同时对上位机生成字节码的过程进行梳理,并分析其中存在的安全隐患。

02、固件提取

PCB布局请参考先前文章《AB PLC与CIP协议安全研究》。

对设备提取固件的方式有很多,如通过JTAG、SWD调试引脚配合openocd等片上调试程序进行提取,或直接通过UART串口提取。经分析,固件位于Flash芯片M29W320ET中,但该芯片采用的是BGA封装,不便直接使用探针提取,分析外围电路也没有找到很好的切入点,最终决定将其吹焊下来后使用编程器进行提取。

首先用隔热胶带将芯片外围元件保护起来,防止热风枪损伤周边元件,涂抹助焊剂后,使用热风枪取下Flash芯片。

将吹焊下来的Flash芯片放入BGA烧录座,使用RT809H编程器提取固件。

03、技术分析

3.1固件初探

提取出来的固件存在字节序问题,在开始分析之前通过脚本对其进行了修复。

结合binwalk可以大致分析出固件的内存布局:

上电时触会发位于Initial Code区域的复位中断,配置好Vector Base寄存器和Watchdog,以及一系列片选寄存器之后就会跳转到2080-LC20-OS_AB的代码区域内开始跑主要逻辑。值得注意的是最后有一段区域附带了一段有关项目信息的7-zip压缩文件,在下文会对其进行分析。

该设备的主控芯片是飞思卡尔(后被NXP收购)的MCF5372,采用ColdFire架构。该架构是其推出的32位嵌入式处理器架构,基于经典68K指令集优化而来,融合了RISC设计理念以提高性能与能效。其精简指令集在保持代码紧凑性的同时,支持工业控制、网络通信、汽车电子等实时性要求高的场景,具备低功耗、高集成度及丰富外设接口。

IDA对ColdFire架构的支持性有限,我们需要在汇编层面对整个固件进行逆向分析。

结合芯片手册,我们对qemu进行了二次开发来更好适配mcf520,对该固件进行模拟运行和调试。

进一步分析后,我们发现固件运行在ThreadX RTOS中,关于系统部分这里不再赘述,感兴趣可以参考
https://github.com/eclipse-threadx/threadx。

本文主要关注代码编译运行的流程,通常AB PLC的工程师使用ST、梯形图等高级语言编写程序,经开发环境编译生成得到字节码,接着字节码下载到PLC内部,被虚拟机翻译为ColdFire机器码,最终在主控芯片上运行。整个过程如下图所示:

3.2. 字节码分析

Micro800系列的PLC使用的上位机是CCW(具体介绍可参考前面的文章)。CCW的工程文件包含基本配置、项目元数据以及相关源代码。此外,CCW通过CIP协议实现与PLC的通信,完成工程的上传和下载。

在工程师将工程下载至PLC时,CCW会编译代码并生成一系列文件。分析CIP流量可知,传输的数据包含MICRO850_Pou_PROG1.xtc和IDS00103等文件,MICRO850_Pou_PROG1.xtc为字节码,IDS00103为工程文件(经过7z压缩,用于备份)。部分流量如下图所示:

CCW的工程编译是基于微软Visual Studio的
Microsoft.Build.Engine.dll框架来实现的,经过调试,它会新开一个进程来执行编译并通过管道获取编译结果。

进程名及其参数依然可以调试得到:

FileName为PhoenixClientPropi.exe,隶属于CAM ISaGRAF 5编译器,其运行参数如下:

CCW在生成字节码时,首先将项目代码统一转换成了stf代码文件,再将其编译成txt后缀的中间文件:

编译过程可以在dci.dll中跟踪到:

随后在中间文件的基础上进一步构造出了*.rtc文件,一个rtc文件由一系列类似于TLV(Tag-Length-Value)结构的数据构成:

前面的TAG为0x18时代表后续的value类型为字节码,对应写入的函数如下:

这里做字节码解析依赖的一个HashMap是事先初始化的,它1将一系列向量结构与对应的key做了绑定,而向量结构规定了特定字节码在语法上接受的参数个数和参数类型等信息。

最终形成的字节码如下图所示:

04、攻击场景

PLC在工业自动化中扮演着重要角色,但也面临多种威胁,常见的攻击面如下:

●在固件侧:CCW在读取工程时,PLC内备份的工程文件会被上传,并对其进行反序列化,该操作没有进行额外检查,因此这里容易造成反序列化漏洞从而实现恶意代码执行。

●在协议侧:除之前文章提到的攻击方式外,字节码也面临一系列安全问题(例如在CIP协议中也是被明文传输)。利用中间人黑客可以轻易篡改字节码,劫持PLC的工作逻辑,甚至下发恶意代码,对工业生产造成严重影响。

最后,为了更直观地展示潜在的危害,我们构造了一个劫持字节码的攻击过程。

编写梯形图程序,通过控制输入点I-01、I-02、I-03的逻辑值,将输出端I/O指示灯1、2、3点亮,如图所示:

在工程下载过程中,对MICRO850_Pou_PROG1.xtc字节码流量进行劫持篡改,重复前面操作,同样通过控制I-01、I-02、I-03输入点逻辑值,此时观察指示灯却发现是0、2、4被点亮,表明PLC的控制逻辑已被篡改。

05、总 结

Micro800系列 PLC 的固件与字节码技术体现了工业控制系统的典型架构,其安全性依赖于封闭性和物理隔离。通过逆向工程可深入理解其运行机制,同时也揭示了工控设备在协议安全和固件保护方面的潜在风险,此类研究对我们工控安全防护和漏洞防御具有重要意义。

相关文章

【STM32F103ZET6开发板】第1-4讲:开发板程序下载

IK-ZET6开发板程序下载内容本文档描述了IK-ZET6开发板常用的3种下载程序的方式:ISP一键下载:IK-ZET6开发板上设计了一键下载电路,一根USB线即可下载程序。JLINK仿真器下载:需要...

【分享】keil显示内存和存储占用百分比进度条工具

简介[Keil5_disp_size_bar]以进度条百分比来显示keil编译后生成的固件对芯片的内存ram和存储flash的占用情况,并生成各个源码文件对ram和flash的占比整合排序后的map信...

零代码编程:用ChatGPT批量提取flash动画swf文件中的mp3

文件夹:C:\迅雷下载\有声绘本_flash[淘宝-珍奥下载]\有声绘本 flash,里面有多个flash文件,怎么转换成mp3文件呢?可以使用swfextract工具从Flash动画中提取音频,下载...

做了个DAPLINK下载器,高速!附烧录教程

我做了一个基于CH32V305FBP6的高速DAPLINK。当初做这个项目是为了烧录原厂的wch-linke固件。后来发现原厂的linke固件只支持USBFS,而且CDC串口最大只能921600波特率...

阿波罗 STM32F767 开发板资料连载第四十六章 NAND FLASH 实验

1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第四十六章 NAND FLASH 实验...