CTF WP – 工控固件逆向

赛题描述

小乙从某邪恶工厂中窃取出了包含关键信息的一个文件,我们已经获知关键系统中使用的key的hash为cQwwddSRxS,需要结合已有信息解出这个key。附件下载地址

解题思路

下载固件,使用WinHex打开固件,发现固件信息“Quantum Ethernet 140-NOE-771-01 Ver. 6.40”,可以看出是施耐德昆腾140系列的PLC的固件,此固件上存在的ftp后门账户的问题。然后,使用固件分析工具binwalk查看固件信息,发现固件是一个zlib格式的压缩包,如下图所示:

使用命令” binwalk –e bbcc5e6-d4ea-49b1-b8df-bf3751fd05d3.bin” 解压固件,解压后结果如下图所示:

我们重点关注一下文件名为385的文件,查看文件信息发现,此固件是一个基于vxwork的操作系统的固件,编译固件使用的大头序“big endian”,CPU类型为“Powerpc”,而且计算出了代码段地址0x1FF058和符号表地址0x27655C。

对于vxworks固件,一般在编译的时候会设置一个代码段的偏移地址,此地址不固定,可以由厂商随意定制。我们要分析固件必须首先分析此偏移地址。然后通过固件中的函数对应表,对函数名进行修复,这样就可以进行静态分析。

分析偏移地址的方法有几种,如利用@ha的分析方法、利用符号表与函数对应表分析法,这些方法我们后面会给大家介绍。这里就告诉大家一个很常用的值0x10000,很多固件都以这个值为默认偏移地址,此固件也不例外。使用IDA打开固件,处理器类型选择为“PowerPC big-endian”,代码段偏移地址设置为0x10000,如下图所示:

打开后函数表如下图所示,系统随机生成的值,需要进行恢复,不然无法分析,如下图所示。恢复方法其实不是很复杂,在编译vxworks固件时为方便维护和定位,一般会将函数对应表一起编译并打包,因为vxworks有一个调试命令lkup,如果有函数对应表,就可以直接通过此命令查询到函数的地址。在vxworks调试shell中输入“lkup strcat”命令,就会返回此函数内存地址,这一点对于系统调试很方便。当然如果企业安全做得比较好的话,此信息是不能编入固件的,一旦有函数对应表就很容易反编译。

我们再使用winhex打开固件,函数对应表一般在固件的最后,有明显的规律,以16个字节为一组数据,前4个字节是字符串的内存地址,后4个字节是函数的内存位置,然后以另4个特征字节数据与4个字节0x00结尾。如下图所示。

利用上述特性,我们编写一个脚本进行函数名修复,脚本下载地址,运行脚本后,函数名得到修改,结果如下图所示:

下面我们对固件进行分析,赛题很明显需要分析固件中一个加密算法,在vxworks中有一个默认的hash加密函数,此函数存在hash碰撞的问题,漏洞CVE编号为CVE-2010-2967,漏洞涉及到的函数名为loginDefaultEncrypt,所以直接分析此函数即可。操作系统vxworks5.5的源代码其实已经公开了,下载地址,通过查看文件target\src\ostool\loginLib.c,我们可以找到标准的操作系统的hash加密算法,如下图所示。

再看反编译后修复好的的函数loginDefaultEncrypt,如下图所示:

对照算法分析发现几个重点的变量相对于原算法有稍微的改动,如下图所示:

修正后的算法如下图所示,利用此算法进行多次碰撞即可得到密码为cQwwddSRxS的值,此题答案是多解,这里解出一个解qvqkgYtG。

原创作者:W3H,转载请注明来自 工匠安全实验室

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(26条)

  • abc 2018年3月6日 11:20

    为什么我用IDA选择PPC处理器及设置偏移量0x10000后打开385文件,没有函数列表。

    • icsmaster
      icsmaster 2018年3月6日 17:02

      你使用什么版本的IDA,以及什么固件,可以的话发到我们的邮箱 [email protected],我们测试一下

      • asdf 2018年3月8日 22:14

        我用的是 IDA6.1,固件就是赛博地球杯的工控固件。你们前面发的链接里面下载的固件。但是用ida打开后没有函数列表

        • icsmaster
          icsmaster 2018年3月9日 11:10

          我们使用的IDA 6.8,你试试这个版本

          • asdf 2018年3月12日 08:25

            你们ida打开的是.bin文件,还是解压出来的385文件。我ida逆向的是385文件。我没找到6.8的破解版,用的是7.0的破解版

  • asdf 2018年3月6日 11:22

    前面在Ubuntu下面的解压都一样,但是到了用IDA反汇编385二进制文件后,打开后没有函数列表,是不是IDA中间还有其他的设置。

  • asdf 2018年3月12日 10:07

    你们函数名修复的脚本可以提供下载吗?

    • icsmaster
      icsmaster 2018年3月21日 10:46

      可以的,稍后我会放在资源下载里面

  • happyboy 2018年3月12日 10:08

    你们函数名修复的脚本可以提供下载吗?

    • icsmaster
      icsmaster 2018年3月24日 16:42

      下载的地方参见http://icsmaster.org/download/vxworks%E5%87%BD%E6%95%B0%E5%90%8D%E4%BF%AE%E5%A4%8D%E8%84%9A%E6%9C%AC/

  • asdf 2018年3月13日 17:24

    你们逆向出来的385文件里面,大概有多少函数呢。为什么我才100多个,我看你们的列表应该有很多个。是不是我逆向出来的不全呢?

    • icsmaster
      icsmaster 2018年3月21日 10:43

      有8554个函数,你看一下是否有这个函数 loginDefaultEncrypt

  • asdf 2018年3月29日 10:32

    非常感謝,你們是如何確定函數偏移地址的.感覺這是一個難點

    • icsmaster
      icsmaster 2018年4月2日 23:20

      是的,这个地方的确是一个难点,偏移地址是核心,这个实例里面因为编译时固件中包含了符号表,可以推算出偏移地址

  • asdf 2018年3月29日 10:42

    為什麼運行修復腳本以後,沒有什麼反應呢。

  • asdf 2018年3月29日 10:47

    我用ida加载385文件的时候,提示文件不是标准的二进制文件,无法自动识别入口,需要用C来手动开始反彙编

  • asdf 2018年3月29日 11:37

    为什么我识别出来的函数这么少呢。是不是因为ida没办法找到函数入口。请问你们在逆向的时候需要按C来确定入口吗。我是按C以后才出现函数的。

    • icsmaster
      icsmaster 2018年4月2日 23:17

      不需要确定入口函数

  • asdf 2018年3月29日 17:05

    我在ubuntu下运行你的脚本可以还原函数名,在windows下面运行有警告,函数名无法修复,这是什么问题呢。

    • icsmaster
      icsmaster 2018年4月2日 23:18

      有什么告警呢,我都是在windows下运行的,没有问题啊

  • asdf 2018年4月3日 16:35

    我有个交换机的固件,分析不出初始偏移地址和固件函数表,可以发给你们,帮我看看吗。

    • icsmaster
      icsmaster 2018年4月4日 13:18

      可以,你发过来吧

  • asdf 2018年4月4日 09:13

    符号表有没有可能以20字节为一组数据。我看我的固件最后,没有以16字节为单位的,倒是有一些以20字节为单位的。

    • icsmaster
      icsmaster 2018年4月4日 11:51

      8个字节是函数地址,8个字节是函数名字符串的地址,应该不可能出现20个字节的情况

  • HappyLearning 2018年4月9日 11:13

    怎么确定自己找的初始偏移地址是否正确.我在自己的固件上面,分析汇编代码,发现了类似于[email protected]的代码,就把它当成了初始偏移地址,但是我无法验证正确与否.

  • 安安 2018年6月27日 22:42

    解出来似乎不对,qvqkgYtG的值输入,我这里程序跑出来是RSQSbbbwb,而非cQwwddSRxS。

联系我们

18620368203

在线咨询:点击这里给我发消息

邮件:[email protected]

QR code