固件分析
通过Binwalk进行自动分析可以发现,NOE 771模块的升级包NOE77101.bin中内嵌了一个使用zlib压缩的文件。
通过调用Binwalk的-e参数进行自动提取后,Binwalk会把自动提取后的文件以偏移地址命名并存储在特定的目录中。
继续使用Binwalk对提取的385文件进行分析可以确认,该文件的确是我们所需要分析的VxWorks固件,因此提取的385文件也就是我们需要分析的固件文件了。
分析固件内存加载地址
为了对VxWorks系统固件进行逆向分析,我们首先必须要知道固件在内存中的加载地址。加载地址的偏差会影响到一些绝对地址的引用例如跳转函数表、字符串表的引用等。
下图是VxWorks系统在PowerPC架构下的内存分布图,如图所示VxWorks的系统固件将会被加载到一个由BSP (Board Support Package)定义的内存地址中。
分析固件头部的初始化代码,寻找加载地址的特征
在很多情况下我们拿到的固件是没有采用ELF格式封装的,这时就需要我们通过对固件的某些特征进行分析来判断具体的加载地址。还是以施耐德的NOE 711固件为例, 在具体分析某个固件时首先我们需要知道目标设备的CPU架构,具体可以如下图所示通过binwalk -A指令来对固件的CPU架构进行分析,此外也可以用binwalk -Y指令来调用capstone反汇编引擎来进行辅助判断,不过我实际测试下来存在一些误报的情况会把NOE 711的固件识别成arm架构的。
在得知目标CPU架构后就可以使用IDA加载固件并对其代码进行初步分析。
下图是默认加载后的IDA界面,仅仅分析出了极少数的函数。接下来就需要根据固件头部的这段代码来寻找加载地址的特征。
在固件头部有如下图所示的一段有趣的代码,在对r1和r3寄存器进行赋值后进行了跳转。