我们从受密码保护的微控制器瑞萨M16C中取出软件



我有一个从事汽车熨斗维修的朋友。 他以某种方式给我带来了一个由自主加热器控制单元焊接而成的微控制器。 他说他的程序员不接受它,并且他希望能够来回传输固件,因为 铁有很多块,它们通常是相同的,但是它们控制的单位是不同的。 似乎这里有块而不是有问题的块,但是软件不同,您无法替换。 由于任务很有趣,所以我决定四处逛逛。 如果这个话题对您来说很有趣,请在猫的下面...

受试者为M306N5FCTFP。 这是M16C / 6N5组的微控制器。 M16C / 60内核是由三菱开发的, 自2003年以来,该公司在MK方面的继任者一直是瑞萨(Renesas),现在这些微控制器以该品牌闻名。

关于微控制器本身的一点点


卵石是采用100引脚QFP封装的16位微控制器。 内核具有1 MB的地址空间,时钟频率为20 MHz,以提高汽车性能。 外设集也非常广泛:两个16位定时器,并可以生成一个三相PWM用于控制电机,各种UART,SPI,I2C自然,两个DMA通道,一个内置的CAN2.0B控制器以及一个PLL。 我认为这对老人很好。 这是文档中的概述图:



由于我的任务是删除软件,因此它对内存也非常感兴趣。 此MK有两种版本:Masked和Flash。 如上所述,我得到了M306N5FCTFP。 关于他,描述内容如下:

  • 闪存版本
  • 128 KB + 4K(附加的4K-所谓的块A,是作为礼物赠送给用户的,用于存储数据,但也可以存储程序)
  • V版本 (汽车版本的温度范围为+ 125°C)

如何从设备中提取开发人员拖了什么


很自然地,您应该开始尝试通过研究芯片开发人员为进行存储器编程任务而集成的机制,来从微控制器中获取一些东西。 该手册指出,制造商将引导加载程序友好地放置在存储器中,以便对设备进行在线编程。



从上图可以看到,存储器分为两部分:用户区和引导加载程序区。 在第二个中,默认的引导加载程序是从工厂加载的,它可以写入,读取,擦除用户内存并通过异步,同步或CAN接口进行通信。 表明可以将其重写为您自己的文本,也可以不进行重写。 最后,可以通过尝试至少通过UART敲标准引导加载程序来轻松地验证这一点。展望:加热器制造商并未理会其引导加载程序,因此您可以朝这个方向进一步挖掘。 立即保留仍然存在并行编程方法的权利,但是由于 我没有程序员,没有考虑这个选项。

在硬件复位期间,通过输入CNVSS,P5_0,P5_5的某种组合可以进入引导加载程序操作模式。 接下来,编写您自己的实用程序以复制内存的内容,或使用完成的实用程序。 瑞萨提供了自己的实用程序,称为“ M16C Flash Starter”,但其读取功能有所减少。 它不会将读取的内容保存到磁盘,而是将其与磁盘中的文件进行比较。 即 实际上,这不是阅读,而是验证。 但是,有一个免费的德语实用程序M16C-Flasher,可以读取固件。 总的来说,最初的工具包被挑选出来了。

关于读取保护




如果引导加载程序没有提供防止未经授权的访问的保护,那么一切将非常简单。 我只是从手册中提供非常免费的翻译。

身份验证功能

用于串行和CAN交换模式。 将编程器发送的标识符与记录在闪存中的标识符进行比较。 如果标识符不匹配,则不接受程序员发送的命令。 但是,如果复位向量的4个字节为FFFFFFFFh,则不比较标识符,从而允许执行所有命令。 标识符是从第一个字节开始依次存储在地址0FFFDFh,0FFFE3h,0FFFEBh,0FFFEFh,0FFFF3h,0FFFF7h和0FFFFBh的7个字节。

因此,为了访问程序,您需要知道珍惜的7个字节。 再一次,展望未来,我使用相同的“ M16C Flash Starter”连接到MK,并确保零和FF的组合不起作用,并且必须以某种方式解决此问题。 通过第三方渠道发起攻击的想法立即浮出水面。 我已经开始假装自己是头上的头巾,这使我能够测量电源电路中的电流,但是我决定互联网很大,并且已经发明了大多数自行车。 在进行了几次搜索查询后,我很快在hackaday.io上找到了名为Serge'q3k'Bazanski的项目,名为“反向工程东芝R100 BIOS”。 在此项目的框架内,作者实质上解决了完全相同的问题:从MK M306K9FCLR提取固件。 而且-那时他已经成功地完成了任务。 一方面,我有点不高兴-一个有趣的谜语没有被我解决。 另一方面,任务从寻找漏洞变成了对漏洞的利用,这有望提供更快的解决方案。

简而言之,q3k以完全相同的逻辑从分析电流消耗开始研究,在这方面,它处于更为有利的条件下,因为 他有ChipWhisperer,但我仍然没有这个东西。 但是因为 他的第一个消除消耗电流的探针被证明是不合适的,并且他无法从噪声中分离出有用的东西,他决定尝试对响应时间进行简单的攻击。 事实是,引导加载程序会在执行命令期间拉出BUSY输出,以通知主机它正忙或准备执行下一条命令。 根据q3k的假设,测量从发送标识符的最后一位到删除繁忙标志的时间可以用作枚举期间的信息源。 当通过枚举密钥的第一个字节检查此假设时,仅在一种情况下才真正发现时间偏差-当第一个字节等于FFh时。 为了方便测量时间,作者甚至通过关闭石英谐振器并向时钟输入施加666 kHz方波来减慢MK,以简化测量过程。 之后,成功选择了标识符并检索了软件。

第一煎饼-耙子


哈! 我以为...现在,我将程序快速铆接到板上的STM32VLDiscovery c STM32F100,它将发送代码并测量响应时间,并在终端中吐出测量结果。 因为 带有目标控制器的面包板以前是通过USB-UART适配器连接到PC的,为了不更改面包板上的任何内容,我们将以异步模式工作。



在启动引导程序启动时,输入CLK1被拉到地,他意识到他们希望从他那里进行异步通信。 这就是我使用它的原因-吊架已经焊接好了,我只用电线将两块板连接起来:发现板和目标板为M306。

有关级别统一的注意事项:

因为 由于M16的端子具有TTL电平,而STM32的具有LVTTL(简化,请参见数据表,以获取详细信息),因此必须进行电平匹配。 因为 这不是一种可以像众所周知的电池那样工作,工作和工作的设备,但实际上它只能在桌子上连接一次,所以我不必理会电平转换器:STM32的5伏MK消化输出电平,在3伏的意义上,它被认为是“ 1” ,来自M16的输出将馈入5V耐压STM32输入,这样就不会感到不舒服,而且我们也不要忘记将RESET M16置于开漏模式。 我已经忘记了,这是浪费时间的2小时。
这个最低限度足以了解彼此的腺体。

攻击软件的逻辑如下:

  1. 我们与控制器建立连接。 为此,必须等待复位完成,然后以超过20 ms的间隔发送16个零字符。 这是为了制定出自动确定汇率的算法,因为 接口是异步的,MK对其频率一无所知。 发射机的起始速度应为9600波特,装载机将以此速度计算。 之后,如果需要,您可以在9600-115200范围内的五种可用汇率中请求其他汇率(尽管在我的情况下,装载机拒绝在115200上工作)。 我不需要更改速度,因此我只是请求引导加载程序版本来控制同步。 我们通过FBh,加载程序以诸如“ VER.1.01”的行作为响应。
  2. 我们发送“ unlock”命令,其中包含密钥的当前迭代,并测量直到清除忙碌标志为止的时间。

    该命令由F5h代码,标识符区域开始的地址的三个字节(在我的情况下,对于M16C内核为0FFFDFh),长度(07h)和标识符本身组成。
  3. 我们测量了标识符的最后一位的传输与忙碌标志的删除之间的时间。
  4. 我们增加了要排序的密钥字节(初始阶段为KEY1),返回到步骤2,直到对当前字节的所有255个值进行排序为止。
  5. 我们将统计信息重置到终端(或者,或者我们在“机上”执行分析)。

为了与目标MK通信,我在STM32中使用了USART来测量时间-输入捕捉模式下的计时器。 为简单起见,唯一的事情是,我没有测量密钥的最后一位与删除标志之间的时间,而是测量了传输开始与标志之间的时间。 原因是最后一位可能改变,并且在异步模式下,捕获输入没有任何附加内容。 同时,UART是硬件,传输时间基本相同,不应有任何明显的错误。

结果,对于所有值,结果都是相同的。 完全相同。 计时器的时钟频率分别为24 MHz,时间分辨率为41.6 ns。 好吧,好的,我试图放慢目标MK。 一切都没有改变。 这里的问题浮现在脑海:我做错了什么,就像q3k一样? 经过比较,发现了区别:它使用同步交换接口(SPI),而我是异步(UART)。 在这里的某个地方,我提请注意开始时错过的那一刻。 即使在同步和异步引导加载程序模式的接线图上,就绪输出的名称也不同:



同步时为“忙”,异步时为“监控”。 我们看一下表格“ Standart串行I / O模式下的输出功能”:


“ Semyon Semenych ...”

最初被遗漏的琐事把错误的地方放了。 实际上,如果在同步模式下这恰好是引导加载程序繁忙标志,那么在异步模式下(串行I / O模式2)只是一个指示操作的“闪烁器”。 一般而言,也许是收发器准备就绪的硬件信号,并因此提高了收发器的惊人准确性。

通常,我们将SCLK引脚上的电阻从地焊接到VCC,在那儿焊接导线,将所有导线都连接到SPI并重新开始...

成功!




在同步模式下,几乎所有内容都相同,不需要建立连接的任何初步过程,简化了同步,并且可以更准确地执行时间捕获。 如果我立即选择此模式,则可以节省时间...我不再复杂并从最后一位开始测量时间,而是在开始传输密钥的最后一个字节之前启动了计时器。 我们打开计时器并将其发送到KEY7变送器(在上面的屏幕快照中,从逻辑分析仪中,您可以看到光标之间的距离。这是测量的时间间隔)。

对于成功的识别而言,这绰绰有余。 这是一个字节的枚举:



在x轴上,我们分别在y轴上具有已传输键值的离散计数数。 信噪比使得甚至不需要滤波器,就像在学校的信息学课上一样:我们在数组中找到最大值,然后选择下一个字节。 可以轻松快速地选择前6个字节,而选择后6个字节则更加困难:仅是粗俗的破坏无效,您需要在每次尝试前重置“受害者”。 结果,每次尝试大约需要400毫秒,而搜索是最坏的情况,大约是一分钟半。 但这是最糟糕的。 每次尝试后,我们都会请求状态,并在我们猜测后立即停止。 起初,我通常只是很快用笔检查了标识符,将控制台输出插入excel并绘制了图,这是一项一次性的任务,但更重要的是,但是为了这篇文章,我决定添加自动迭代功能,以创建一个漂亮的控制台...



当然,如果开发人员擦除了引导加载程序(由他自己替换),那么走出来并不容易,但是在汽车电子产品中,MK通常根本不会关闭。 特别是,在另一个加热器的控制单元中,安装了相同的瑞萨电子(Renesas)的V850,一切都由焊接一对导线并使用标准实用程序复制固件来决定。 这是ECU世界中的整个加密货币引擎。 显然,制造商不喜欢芯片调整和其他类型干扰的现象。尽管这就像装甲和外壳的竞赛-压盖更陡峭,更昂贵,但没有赢家...

参考文献:

  1. https://www.dataman.com/media/datasheet/Renesas/M16C6N5Group.pdf
  2. https://hackaday.io/project/723-reverse-engineering-toshiba-r100-bios/log/51302-ec-firmware-dumped
  3. https://q3k.org/slides-recon-2018.pdf

Source: https://habr.com/ru/post/zh-CN469085/


All Articles