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,转载请注明来自 工匠安全实验室

发表评论

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

评论列表(3,565条)