快捷搜索:  网络  CVE  渗透  后门  扫描  木马  黑客  as

老题新招 | 再解Vxworks加密漏洞

媒介

工控固件逆向题,无意会在vxworks上做文章。笔者在啃工匠安全实验室第二道CTF题时(见传送门),在原文的基础上,通过编写程序,计算出了hash为固定值cQwwddSRxS所使用key的解。

正文

对工控固件(通常是vxworks)的阐发有固定的步骤,总结以下:

1.用binwalk查看固件基本信息并解压固件;

2.确认解压固件的信息如CPU类型,编译固件使用的大头序;

3.确定固件的加载地址,通常是0×10000(原文中未对怎么样找加载地址进行解读);

4.用IDA pro反汇编程序,并修复固件中的函数名;

5.找到对应的漏洞函数进行阐发。

由于原文中未对怎么样找出固件加载地址进行说明,也未对最后碰撞hash值的过程进行说明。在如许的疑惑下,自己对这两个问题进行了进一步的解析:

一是找出了靠谱的计算固件加载地址的要领(这里要谢谢”工匠安全实验室”的年老给出的思路);

二是通过编写程序,碰撞出多个同一hash值的多个key解。

1、计算固件加载地址

固件加载地址的计算是通过vxworks固件中的函数符号表计算得出的。在固件中,与函数字符串相干的有两个地址,一个是在固件中字符串的存储地址;另一个是固件中保存的函数字符串的内存地址。这两个地址相减,就能得出固件的加载地址。因此,我们只要要定位到一个固定的字符串,找到它在固件中的地位和在内存中加载它的地址,就能算出固件的加载地址了。在winhex中搜索APP_STATION这个字符串(该字符串有它的特殊性,它是函数字符表中的最后一个字符串,见下图,要是搜不到该字符串,按照这类方式找到字符表的最后一个字符串也是可以的),记下它在固件中的地址为0x26656c。

image.png

下一步还需要找到该字符串在内存中的加载地址,根据函数符号表的特点,它的内存加载地址为符号表的肇始地位。在binwalk中可以查看vxworks的字符表的大致肇始地位,以下图所示,binwalk计算的符号表的肇始地位为0x301E74。

image.png

需要说明的是,这个值不一定准确,还需在winhex中进一步确认。在winhex中跳转到0x301E74,以下图所示。图的右侧出现了很规律的”…..’e…”的列。这类规律复合函数符号表的排列方式,因此,根据排列规律,符号表的肇始地位应该为0x301E64。

image.png

在这个地址存储的是字符串的内存地址为0x27656C,而且可以看到,字符串的地址是倒序排列,所以这个地址就是前面的最后一个字符串的内存地址。

那么,加载地址为字符串的内存地址减去字符串地址有:0x27656C - 0x26656C =0×10000

算出了固件的加载地址,当我们加载固件后,需要修复函数名该怎么办呢?可以行使函数名修复脚本实现这一操作,使用的脚本以下图所示:

image.png

在对详细的工控固件进行函数名修复时,脚本中有三个值需要注意下。loadaddres即是刚刚算出的加载地址,eaStart即是函数符号表的肇始地址为0x301E64,eaEnd是函数符号表的结束地址,这个地址怎么找,照样只有根据符号表的规律来找。以下图所示,符号表会规律的排列,这类规律排列在0x3293a4结束,因此,这个地址即为符号表的结束地址。

image.png

如许,才可以顺利地加载并运行该脚本。

二、暴力碰撞hash值

先通过固件逆向阐发loginDefaultEncrypt函数,在IDA Pro中可以看到loginDefaultEncrypt函数的反汇编情形,结合vxworks给出的源码,可重写该函数为:

image.png

在函数里可以看到,输入的暗码key长度有制约,长度得大于8,小于40。而hash值cQwwddSRxS的长度为10。经阐发发现,长度为9以及10的key都可能会产发展度为10的hash值。因此,自己先通过编写程序随机天发展度为10的暗码本,代码以下,为shell脚本。

image.png

在大for轮回中,共生成了100万个长度为10的暗码。在shell中运行该程序:

./10pass.sh > 1.txt  #将随机暗码输出到1.txt文件中。

再编写程序轮回读入暗码本中随机生成的暗码,采用已经写好的loginDefaultEncrypt函数算出暗码对应的hash值;最后,与标题问题给出的hash值进行比较,如算出的hash与标题问题hash的值相称,则视为碰撞出了key值。下面是给出程序的main函数,在函数中可以清楚地看到每步的操作。

image.png

用gcc编译:gcc -o guesshash ./guesshash.c,运行,碰撞出的效果以下图所示。

image.png

可以看到,这确凿是一个很弱的加密算法,100万个随机暗码就碰撞出11个hash值相同的效果。

最后,本次实验的所有实验代码见github:https://github.com/scu-igroup/ctf_vxworks

总结

vxworks固件已曝出多个漏洞,要想定位这些漏洞,还需一些固件逆向的知识。自己即是在学习的过程中,发现计算固件加载地址以及hash碰撞在现有的资料中,触及的并不久不多,黑客工具,因此本人总结出了一套要领,在此分享出来,供人人参考。若有其他思路以及建议,欢迎一块儿讨论。

*

您可能还会对下面的文章感兴趣: