不算前言的前言:拖了这么久,才发现这个专题没有想象中的简单,学习的路径大致是Step7->S7comm->MC7 code->firmware,我会用尽量简短的语言把前两部分讲清楚,前两部分的知识或者经验扎实的话对整个PLC CPU的体系结构会产生全面而感性的认知。

  从上周五到这周三,困在西门子PLC固件逆向分析上已经有几天时间了,昨天我突然意识到可能是我现在的知识储备并能够支撑我的“雄心壮志”,因此我选择返回原点,再把和固件分析相关的知识如S7comm和MC7 code再仔细研究一遍,确保理解完全;再一个就是多给国外相关的研究者发送Email求助,目前为止发出了七封Email,只收到了两封回复,其中一封说关于这个的研究是confident,不能share,对此我表示理解;第二封邮件表达了愿意伸出援手的善意,我还在继续和他用蹩脚的英文进行交流。最后,昨天晚上走在路上,想到西门子公司PLC的产品线少说也有七八条,光是S7系列的就是迭代了十几年,主控芯片体系结构更是形形色色,包含了ASIC/FPGA,为此付出努力的员工成千上万,凭借自己几天的时间没头绪也不是什么着急的事儿,只能说慢慢来吧。

SFC(System Function Chart):

SFB(System Function block):

FB(Function Block):

DB(Data Block):

SDB(System Data Block):

0.1  固件的定义

IEEE的软件工程术语标准词典中对固件(firmware)的定义如下

The combination of a hardware device and computer instructions and data that reside as read-only software on that device.

简单翻译,硬件设备、计算机指令和作为只读软件驻留在设备上的数据的集合。最后一句话中又是数据又是软件让人感觉矛盾,我的理解是:不同的体系结构(如哈佛/冯诺依曼)对数据和软件的区分不同。

1.1  固件型号

本次实验中要分析的PLC 为Siemens S7-400系列的412-5H,具体的订货号为6ES7 412-5HK06-0AB0。固件下载网址为https://cache.industry.siemens.com/dl/files/550/109474550/att_832504/s1/4125hk06_v601.exe?download=true

1.2 CPU_HD

从这个文件的命名可以大致猜测,HD=hardware describe,是硬件描述的意思。从下图展示的文件内容也印证了这个猜测。在Step7中的firmware update对话框中,首先要手动选择并加载该文件,之后由Step7读取该文件内容,主要读取该固件对应的版本号(V601)和适用CPU的订货号(6ES7 412-5HK06-0AB0),当且仅当此时PLC CPU的订货号相符,才可以在线更新固件。CPU_HD文件后续还引导Step7在线固件更新程序寻找其他固件文件,分别有BG_ABL(包含PLC的订货号)、CPU_RK(写到ROM/flash内定义实时操作系统和主要固件功能)、CPU_KO(Lattice FPGA的比特流文件)和CPU_SG。

在Step7的在线更新固件功能中,固件文件的加载顺序是CPU_HD->CPU_ABL->CPU_RK->CPU_KO->CPU_SG。

1.3 CPU_KO

从下图展示的文件起始内容可以看出,该文件是Lattice公司LFE2M20SE-6F256 FPGA芯片比特流配置文件,该FPGA工程的top名为f3k31.ncd。初步猜测FPGA的目的在于执行用户控制逻辑的MC7 code,这也可以理解,因为如果执行MC7 code和通信(S7/HTTP)由同一个CPU完成的话,势必会影响MC7 code的精确实时周期执行。对于Lattice FPGA的二进制比特流文件的逆向分析,目前网络上已经有了一些公开资料,尝试将比特流文件逆向成寄存器网表(netlist)。其次,从软/硬件角度分别寻找CPU和FPGA之间的接口(MC7 code中必定会调用SFC/SFB等操作系统函数)。

[工控安全]西门子S7-400 PLC固件逆向分析(一)的更多相关文章

  1. 西门子S7系列PLC的主要种类及应用软件

    德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金.化工.印刷生产线等领域都有应用.西门子(SIEMENS)公司的PLC产品包括LOGO,S7-200,S7-300,S ...

  2. 如何快速掌握plc或工控机与其他设备的modbus通讯协议?包括格式与实际过程 RT,本人从事工控行业多年,对于PLC与触摸屏也算比较熟悉,唯独对这个通讯协议比较难理解,请教高人指导,从什么地方开始下手,或者是说如何正确理解报文格式或正确写入

    Modbus协议是OSI模型的第七层的应用层通讯协议,定义了不同类型设备间交换信息方式,以及信息的格式. Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单 ...

  3. 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

    一.   引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...

  4. 构建虚拟工控环境系列 - 西门子虚拟PLC

    一. 概述 跟随着工控安全一路走来,工控安全市场今年明显有相当大的改善,无论从政策还是客户需求,都在逐步扩大中.但是,搞工控安全研究的人员却寥寥无几.一方面工控安全是个跨学课的技术,需要了解多方面的知 ...

  5. 工控随笔_03_西门子_Step7项目打开后CPU显示问号解决方法

    我们在利用西门子的S7-300/400 PLC的编程软件Step7的时候会出现下面如图所示的问题. 在打开项目的时候,我们会在Simatic Manager里面看到CPU以及一些其他一些组件显示问号. ...

  6. 【转】工控老鬼】西门子S7200入门&精通【1】S7200硬件大全

    转载地址:http://blog.sina.com.cn/s/blog_669692a601016i5f.html     工控老鬼提醒以下的信息和资料可能不全或者不准确,如有疑问可以查阅西门子中国网 ...

  7. 工控安全-PLC指纹提取的几种方法

    前言:PLC为可编程逻辑控制器,采用S7协议.其硬件本身存在许多漏洞,可以利用kali里面的漏洞模块或者modbus工具对其进行攻击,甚至直接可以进行未授权访问,只要其开启对外网的端口服务,那么我们就 ...

  8. [工控安全]“祝融”—一种针对PLC控制系统的欺骗攻击病毒

    “祝融”作为一种针对传统PLC控制系统的欺骗攻击病毒,所述的典型的PLC控制系统通常包括两部分: 用于组态.编程.监视.控制的工程师站(通常是PC设备) PLC控制器(通常如西门子.施耐德.三菱等厂家 ...

  9. 工控随笔_16_西门子_S7-200.Smart软件安装兼容性说明和错误代码:error code hr=0x80070430

    现在西门子的软件是更新换代太快了,前几年还是Step 7 Micro/Win,后来又出了S7-200 Smart PLC,理所当然的编程调试软件也水涨船高,出了新的Step 7  Micro/Win ...

随机推荐

  1. 16_Linux网络配置

    A类:255.0.0.0        8 0 000 0001 - 0 111 1111 127用户回环,1-126 2^7-1个A类地址 容纳多少个主机:2^24-2 主机位全0:网络地址 主机位 ...

  2. 【python 3】 字典方法操作汇总

    基础数据类型:tuple 1.1  新增 dic["key"] = value                            字典中没有key就添加,有key就覆盖 dic ...

  3. golang Mysql -- Tx

    Transaction 事务 事务处理是数据的重要特性.尤其是对于一些支付系统,事务保证性对业务逻辑会有重要影响.golang的mysql驱动也封装好了事务相关的操作.我们已经学习了db的Query和 ...

  4. idea Debug快捷键

    快捷键 介绍 F7 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内, 如果该方法体还有方法,则不会进入该内嵌的方法中 * F8 在 Debug 模式下,进入下一步,如 ...

  5. 补充资料——自己实现极大似然估计(最大似然估计)MLE

    这篇文章给了我一个启发,我们可以自己用已知分布的密度函数进行组合,然后构建一个新的密度函数啦,然后用极大似然估计MLE进行估计. 代码和结果演示 代码: #取出MASS包这中的数据 data(geys ...

  6. css3 calc()的用法

    转载自:css3 calc()的用法 说明:calc(四则运算):任何长度值都可以使用calc()函数进行计算:和平时的加减乘除优先顺序一样一样的: 特别注意:calc()里面的运算符必须前后都留一个 ...

  7. Zookeeper初始(一)

    量大,服务器压力大.需要用到分布式,集群. 问题1:三台机器,一个请求如何落到一台机器上?如何协调工作 问题2:集群如何选取leader? 问题3:既然是分布式,集群,一个请求只能有一台机器接接收并处 ...

  8. 基于百度通用翻译API的一个翻译小工具

    前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发 ...

  9. jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别

    基础概念 jdbc(Java DataBase Connectivity)是java连接数据库操作的原生接口.JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型.作为A ...

  10. python -- 返回函数、匿名函数、装饰器

    返回函数 高阶函数的参数可以是函数,那么其返回值也可以是函数. 闭包 对于高阶函数,内部函数可以引用外部函数的参数和局部变量.当调用外部函数返回内部函数时,相关参数和变量都保存在返回的函数(即内部函数 ...