叢培欣
(黑龍江省牡丹江市第一中學(xué),157021)
基于VxWorks系統(tǒng)的路由器固件研究
叢培欣
(黑龍江省牡丹江市第一中學(xué),157021)
本文通過(guò)kali linux系統(tǒng)的binwalk軟件工具及自行編寫(xiě)程序,識(shí)別并分析了基于VxWorks的MemFS文件系統(tǒng)的路由器固件的文件特征,同時(shí)提取了相應(yīng)路由器的固件文件。為后續(xù)路由器固件重寫(xiě)提供思路及技術(shù)支持。
路由器固件,VxWorks,MemFS,kali linux 2.0
圖1 binwalk的識(shí)別結(jié)果截圖
路由器(Router)是互聯(lián)網(wǎng)的主要結(jié)點(diǎn)設(shè)備,起到網(wǎng)絡(luò)互聯(lián)、路由選擇和擁塞控制等的作用。同時(shí),在辦公、家庭等環(huán)境中得到廣泛的應(yīng)用,是連接互聯(lián)網(wǎng)的必不可少的設(shè)備之一。隨著網(wǎng)絡(luò)應(yīng)用的日益豐富,數(shù)據(jù)轉(zhuǎn)發(fā)量越來(lái)越大,對(duì)路由器的功能和性能要求也越來(lái)越高。路由器的功能和性能在硬件參數(shù)一致情況下,主要取決于路由器的固件,即路由器的操作系統(tǒng)。Wind River System公司的VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)由于具有微內(nèi)核、可裁剪、支持協(xié)議廣泛等特性,通常被路由器廠商作為路由器的操作系統(tǒng),而VxWorks的文件系統(tǒng)MemFS以其獨(dú)特的文件壓縮與索引方式在路由器文件系統(tǒng)中占領(lǐng)了一席之地。
VxWorks是美國(guó)Wind River System公司開(kāi)發(fā)的具有工業(yè)領(lǐng)導(dǎo)地位的高性能嵌入式實(shí)時(shí)操作系統(tǒng)。VxWorks具有專門為實(shí)時(shí)嵌入式系統(tǒng)設(shè)計(jì)開(kāi)發(fā)的操作系統(tǒng)內(nèi)核,其基于操作系統(tǒng)的應(yīng)用程序具有跨平臺(tái)的可移植性。系統(tǒng)只占用很小的存儲(chǔ)空間、可高度裁減,保證了系統(tǒng)的高效率運(yùn)行。VxWorks以其微內(nèi)核、強(qiáng)實(shí)時(shí)性、可裁剪性和高效等特性,使其在工業(yè)控制、通信、航空、航天等領(lǐng)域得到了廣泛應(yīng)用。VxWorks由進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個(gè)部分構(gòu)成。
在MemFS中,開(kāi)發(fā)者不需要考慮相關(guān)的目錄結(jié)構(gòu),在此目錄結(jié)構(gòu)下的固件只需要將文件打包做成一個(gè)集合,并將集合投放到c代碼中進(jìn)行編譯,同時(shí)又因?yàn)闆](méi)有目錄結(jié)構(gòu)以及文件索引,搭載著該文件系統(tǒng)的硬件相比之下會(huì)更大的發(fā)揮自身的硬件優(yōu)勢(shì)并最大化的節(jié)約時(shí)間成本與空間成本。與SquashFS文件系統(tǒng)相比具有文件體積小,安全性高的特點(diǎn),因而得到廣泛的應(yīng)用。
Kali Linux是一個(gè)基于Debian的高級(jí)滲透測(cè)試和安全審計(jì)Linux發(fā)行版。它集成了精心挑選的滲透測(cè)試和安全審計(jì)的工具,供滲透測(cè)試和安全審計(jì)人員使用。其預(yù)裝了許多滲透測(cè)試軟件,包括如Nmap(端口掃描器)、Wireshark(數(shù)據(jù)包分析器)、John theRipper (密碼破解器),以及Aircrack-ng(一套用于對(duì)無(wú)線局域網(wǎng)進(jìn)行滲透測(cè)試的軟件)和binwalk等工具。
本文在kali linux 2.0系統(tǒng)環(huán)境下進(jìn)行MemFS文件系統(tǒng)的分析工作,使用該系統(tǒng)下binwalk工具以及l(fā)inux工具集,分析路由器固件的文件結(jié)構(gòu)。通過(guò)對(duì)binwalk識(shí)別結(jié)果分析可以獲取出固件內(nèi)文件的相關(guān)信息,并進(jìn)行文件提取。
圖2 文件頭相關(guān)信息截圖
圖3 各文件相關(guān)信息截圖
4.1整體思路
本文以一個(gè)搭載MemFS文件系統(tǒng)的tplink路由器固件為例,利用kali linux系統(tǒng)的binwalk工具進(jìn)行固件文件系統(tǒng)的識(shí)別,通過(guò)對(duì)識(shí)別結(jié)果的觀察、分析確定文件系統(tǒng)的結(jié)構(gòu)及特征,識(shí)別出各文件的名稱、位置及大小。然后,通過(guò)C語(yǔ)言自行編寫(xiě)程序,按上述相關(guān)特征、規(guī)律進(jìn)行文件提取,解壓縮。為后續(xù)根據(jù)個(gè)性需要,為路由器固件重寫(xiě)提供支持。
4.2binwalk對(duì)固件文件識(shí)別與分析
首先,使用binwalk識(shí)別固件文件系統(tǒng)版本情況并分析文件的存在情況。binwalk的識(shí)別結(jié)果如圖1。
眾所周知,被某種算法壓縮的文件都有其特定的文件頭,通過(guò)識(shí)別文件頭即可識(shí)別出對(duì)應(yīng)的壓縮算法。由圖1可知,MemFS存儲(chǔ)的文件均被lzma算法所壓縮,同時(shí)可知相關(guān)字節(jié)大小等信息。通過(guò)對(duì)lzma分析與字符串出現(xiàn)頻率分析可得被壓縮文件的文件頭為5A000080,如圖2中紅色標(biāo)注。
繼續(xù)對(duì)binwalk識(shí)別結(jié)果進(jìn)行分析,可得固件內(nèi)各文件的文件名及文件的相關(guān)信息。結(jié)果如圖3所示。
由圖3 數(shù)據(jù)特征可知,各文件名及相關(guān)文件信息共占48個(gè)字節(jié)的數(shù)據(jù)塊,同時(shí)推測(cè)數(shù)據(jù)塊中前40個(gè)字節(jié)為文件名和“00”占位符,后8個(gè)字節(jié)為該文件大小與位置信息。通過(guò)上述識(shí)別出來(lái)的文件名、文件位置、文件大小、文件格式等信息,可通過(guò)自行編程對(duì)固件文件進(jìn)行讀取。
最后,通過(guò)程序提取出的文件并沒(méi)有被解壓,這里可以通過(guò)P7zip軟件對(duì)這些文件進(jìn)行批量解壓。文件提取并解壓縮后,發(fā)現(xiàn)8個(gè)字節(jié)中前4個(gè)字節(jié)是文件大小,后4個(gè)字節(jié)是文件位置,都是以十六進(jìn)制的形態(tài)出現(xiàn)的,對(duì)前面所述推測(cè)加以驗(yàn)證。但是,解壓后并沒(méi)有發(fā)現(xiàn)固件的內(nèi)核文件,因此又重新觀察binwalk識(shí)別結(jié)果,發(fā)現(xiàn)還有一個(gè)文件沒(méi)有提取出,于是定位該文件,確定該文件大小并將其提取并解壓,發(fā)現(xiàn)這個(gè)文件并不是可執(zhí)行文件,該問(wèn)題有待進(jìn)一步研究。
4.3固件文件提取
本文使用C語(yǔ)言自行編寫(xiě)了提取固件文件的程序,包括主函數(shù)int main(int argc, char *argv[]),讀文件函數(shù)char *file_read(char *file, size_t *fsize), 寫(xiě)文件函數(shù)int file_write(char *file, char *data, size_t size),固件提取函數(shù)int unowfs(char *data, size_t size)。通過(guò)主函數(shù)調(diào)用相關(guān)函數(shù)實(shí)現(xiàn)循環(huán)讀取固件文件。
4.3.1文件提取函數(shù)unowfs(char *data, size_t size)流程圖
4.3.2文件提取函數(shù)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 };
/* 檢驗(yàn)文件是否有效 */
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,F(xiàn)ILE_PREFIX_SIZE);
strncat((char *) &file_name, entry->name,(FILE_PATH_SIZE - FILE_PREFIX_SIZE));
fprintf(stderr, "%s [%d] ", entry->name,entry->size);
/* 將數(shù)據(jù)寫(xiě)入磁盤(pán) */
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;
}
本文主要通過(guò)使用kali linux系統(tǒng)binwalk工具,識(shí)別了MemFS文件系統(tǒng)的結(jié)構(gòu),通過(guò)編寫(xiě)程序使得固件文件得以提取。為路由器固件定制、重寫(xiě)提供的思路?;诠碳膬?nèi)核如何提取并復(fù)現(xiàn)是未來(lái)的研究工作。
[1]王金輝.VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)的原理和實(shí)現(xiàn)[J]. Radio Engineering,2007,(37):62-64.
[2]張軍.基于Vxworks實(shí)時(shí)操作系統(tǒng)的串口通信程序設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2006,(22),2-2:98-99.
[3]翁羽翔.基于VxWorks嵌入式系統(tǒng)的應(yīng)用研究[D].同濟(jì)大學(xué).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