基于VxWorks系统的路由器固件研究

2016-11-10 10:39丛培欣
电子测试 2016年19期
关键词:文件名固件字节

丛培欣

(黑龙江省牡丹江市第一中学,157021)

基于VxWorks系统的路由器固件研究

丛培欣

(黑龙江省牡丹江市第一中学,157021)

本文通过kali linux系统的binwalk软件工具及自行编写程序,识别并分析了基于VxWorks的MemFS文件系统的路由器固件的文件特征,同时提取了相应路由器的固件文件。为后续路由器固件重写提供思路及技术支持。

路由器固件,VxWorks,MemFS,kali linux 2.0

图1 binwalk的识别结果截图

0 引言

路由器(Router)是互联网的主要结点设备,起到网络互联、路由选择和拥塞控制等的作用。同时,在办公、家庭等环境中得到广泛的应用,是连接互联网的必不可少的设备之一。随着网络应用的日益丰富,数据转发量越来越大,对路由器的功能和性能要求也越来越高。路由器的功能和性能在硬件参数一致情况下,主要取决于路由器的固件,即路由器的操作系统。Wind River System公司的VxWorks嵌入式实时操作系统由于具有微内核、可裁剪、支持协议广泛等特性,通常被路由器厂商作为路由器的操作系统,而VxWorks的文件系统MemFS以其独特的文件压缩与索引方式在路由器文件系统中占领了一席之地。

1 VxWorks操作系统简介

VxWorks是美国Wind River System公司开发的具有工业领导地位的高性能嵌入式实时操作系统。VxWorks具有专门为实时嵌入式系统设计开发的操作系统内核,其基于操作系统的应用程序具有跨平台的可移植性。系统只占用很小的存储空间、可高度裁减,保证了系统的高效率运行。VxWorks以其微内核、强实时性、可裁剪性和高效等特性,使其在工业控制、通信、航空、航天等领域得到了广泛应用。VxWorks由进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分构成。

2 VxWorks的文件系统MemFS简介

在MemFS中,开发者不需要考虑相关的目录结构,在此目录结构下的固件只需要将文件打包做成一个集合,并将集合投放到c代码中进行编译,同时又因为没有目录结构以及文件索引,搭载着该文件系统的硬件相比之下会更大的发挥自身的硬件优势并最大化的节约时间成本与空间成本。与SquashFS文件系统相比具有文件体积小,安全性高的特点,因而得到广泛的应用。

3 Kali Linux简介

Kali Linux是一个基于Debian的高级渗透测试和安全审计Linux发行版。它集成了精心挑选的渗透测试和安全审计的工具,供渗透测试和安全审计人员使用。其预装了许多渗透测试软件,包括如Nmap(端口扫描器)、Wireshark(数据包分析器)、John theRipper (密码破解器),以及Aircrack-ng(一套用于对无线局域网进行渗透测试的软件)和binwalk等工具。

本文在kali linux 2.0系统环境下进行MemFS文件系统的分析工作,使用该系统下binwalk工具以及linux工具集,分析路由器固件的文件结构。通过对binwalk识别结果分析可以获取出固件内文件的相关信息,并进行文件提取。

图2 文件头相关信息截图

图3 各文件相关信息截图

4 MemFS文件系统分析及文件提取

4.1整体思路

本文以一个搭载MemFS文件系统的tplink路由器固件为例,利用kali linux系统的binwalk工具进行固件文件系统的识别,通过对识别结果的观察、分析确定文件系统的结构及特征,识别出各文件的名称、位置及大小。然后,通过C语言自行编写程序,按上述相关特征、规律进行文件提取,解压缩。为后续根据个性需要,为路由器固件重写提供支持。

4.2binwalk对固件文件识别与分析

首先,使用binwalk识别固件文件系统版本情况并分析文件的存在情况。binwalk的识别结果如图1。

众所周知,被某种算法压缩的文件都有其特定的文件头,通过识别文件头即可识别出对应的压缩算法。由图1可知,MemFS存储的文件均被lzma算法所压缩,同时可知相关字节大小等信息。通过对lzma分析与字符串出现频率分析可得被压缩文件的文件头为5A000080,如图2中红色标注。

继续对binwalk识别结果进行分析,可得固件内各文件的文件名及文件的相关信息。结果如图3所示。

由图3 数据特征可知,各文件名及相关文件信息共占48个字节的数据块,同时推测数据块中前40个字节为文件名和“00”占位符,后8个字节为该文件大小与位置信息。通过上述识别出来的文件名、文件位置、文件大小、文件格式等信息,可通过自行编程对固件文件进行读取。

最后,通过程序提取出的文件并没有被解压,这里可以通过P7zip软件对这些文件进行批量解压。文件提取并解压缩后,发现8个字节中前4个字节是文件大小,后4个字节是文件位置,都是以十六进制的形态出现的,对前面所述推测加以验证。但是,解压后并没有发现固件的内核文件,因此又重新观察binwalk识别结果,发现还有一个文件没有提取出,于是定位该文件,确定该文件大小并将其提取并解压,发现这个文件并不是可执行文件,该问题有待进一步研究。

4.3固件文件提取

本文使用C语言自行编写了提取固件文件的程序,包括主函数int main(int argc, char *argv[]),读文件函数char *file_read(char *file, size_t *fsize), 写文件函数int file_write(char *file, char *data, size_t size),固件提取函数int unowfs(char *data, size_t size)。通过主函数调用相关函数实现循环读取固件文件。

4.3.1文件提取函数unowfs(char *data, size_t size)流程图

4.3.2文件提取函数unowfs(char *data, size_t size)源码

int unowfs(char *data, size_t size)

/* 变量定义及初始化*/

int count = 0, i = 0, offset = 0;

struct owfs_header *header = NULL;

struct owfs_entry * entry = NULL;

char file_name[FILE_PATH_SIZE] = { 0 };

/* 检验文件是否有效 */

if(size < sizeof(struct owfs_header))

fprintf(stderr, "Invalid image: size too small ");

goto end;

header = (struct owfs_header *) data;

if(memcmp(header->magic, MAGIC, MAGIC_SIZE) != 0)

fprintf(stderr, "Invalid image: bad magic signature ");

goto end;

/* Values are in big endian format */

header->version = htonl(header->version);

header->num_entries = htonl(header->num_ entries);

fprintf(stderr, "Extracting %d files from OWFS version %d image... ", header->num_entries, header->version);

/* 遍历所有文件*/

for(i=0,offset=sizeof(struct owfs_header);(i < header->num_entries && offset < size);i++,offset+=sizeof(struct owfs_entry))

entry = (struct owfs_entry *) (data + offset);

entry->size = htonl(entry->size);

entry->offset = htonl(entry->offset);

/* Make sure specially crafted file names don't write outside of the destination directory */

if(strstr(entry->name, DIRECTORY_ TRAVERSAL))

fprintf(stderr, "Refusing to extract potentially malicious file: %s ", entry->name);

continue;

memset((char *) &file_name, 0, FILE_PATH_ SIZE);

strncpy((char *) &file_name, FILE_PREFIX,FILE_PREFIX_SIZE);

strncat((char *) &file_name, entry->name,(FILE_PATH_SIZE - FILE_PREFIX_SIZE));

fprintf(stderr, "%s [%d] ", entry->name,entry->size);

/* 将数据写入磁盘 */

if(file_write((char *) &file_name, (data + entry->offset), entry->size))

count++;

else

fprintf(stderr, "Failed to write data to disk for file %s ", entry->name);

end:

return count;

5 总结

本文主要通过使用kali linux系统binwalk工具,识别了MemFS文件系统的结构,通过编写程序使得固件文件得以提取。为路由器固件定制、重写提供的思路。基于固件的内核如何提取并复现是未来的研究工作。

[1]王金辉.VxWorks嵌入式实时操作系统的原理和实现[J]. Radio Engineering,2007,(37):62-64.

[2]张军.基于Vxworks实时操作系统的串口通信程序设计与实现[J].微计算机信息,2006,(22),2-2:98-99.

[3]翁羽翔.基于VxWorks嵌入式系统的应用研究[D].同济大学.2007.

Study of router firmware based on VxWorks system

Cong Peixin
(The first high school of Mudanjiang, Heilongjiang Province,157021)

This paper analyzed the characteristics of MemFS file system based on VxWorks system of router firmware,by using binwalk software tools of Kali Linux system and procedures written by myself,and the corresponding router firmware files are extracted.Provide ideas and technical support for the subsequent router firmware rewriting.

router firmware;VxWorks;MemFS;kali linux 2.0

猜你喜欢
文件名固件字节
No.8 字节跳动将推出独立出口电商APP
右键调用多重更名更方便
Excel轻松提取文件名
No.10 “字节跳动手机”要来了?
把我的秘密藏起来
简谈MC7字节码
基于SHA1的SCADA系统PLC固件完整性验证方法
基于UEFI固件的攻击验证技术研究*
基于固件的远程身份认证
提取ROM固件中的APP