VxWorks固件分析方法總結

VxWorks固件分析方法總結

最近研究基於VxWorks系統的iot設備的固件分析方法,將學習心得記錄於此,以備未來的查詢須要。linux

1.VxWorks是什麼?

VxWorks是美國WindRiverSystem公司(風河公司)推出的一個RTOS(實時操做系統),憑藉良好的持續發展能力、高性能的內核以及友好的用戶開發環境,在嵌入式實時操做系統領域佔據一席之地。自從1987年首次問世以來,VxWorks系統版本經歷了5.x,6.x到現在的7版本。VxWorks系統憑藉其優秀的實時性佔據着不小的市場份額,包括NASA的火星探測器、波音787客機、網絡路由器等,市場範圍跨越各類安全領域。
VxWorks版本更替安全

按照所運行的操做系統區分,嵌入式iot設備能夠大體上分爲基於linux和基於VxWorks的兩類。VxWorks支持幾乎全部現代市場上的嵌入式CPU架構,包括x86系列、MIPS、PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-四、ARM、StrongARM以及xScale CPU。網絡

2.如何定位VxWorks固件的加載地址

使用ida pro、ghidra等反彙編工具進行分析時,須要瞭解固件的加載地址,不然沒法正確的分析固件。下圖所示爲填寫固件加載地址先後的函數識別狀況的對比,能夠看出肯定了固件加載地址以後函數的識別度更高。
before
after架構

2.1經過ELF文件頭讀取

一般固件文件會使用ELF格式進行封裝,所以可使用readelf等工具對頭部文件進行分析,進而獲得固件的加載地址。IDA pro已經集成了這個功能,能夠直接分析出常見的固件的加載地址。
elf函數

2.2經過分析內存中的相鄰位置

mips
如圖所示爲VxWorks固件在mips架構中的內存分佈圖,可知固件加載地址與棧初始化地址相鄰,能夠經過定位棧初始化地址肯定固件的加載地址。工具

initialstack
那麼如何定位棧初始化地址呢?那就是尋找棧指針寄存器sp的位置。根據VxWorks官網給出的Initial Stack的說明,可知Initial Stack是usrInit()函數的初始化棧。性能

usrinit
又由於UsrInit()是VxWorks系統引導後的運行的第一個函數,所以能夠經過在ida中尋找sp寄存器首次出現的位置(此時的ida並無指定固件加載地址),經過sp的值肯定棧初始化的值,從而肯定固件的加載地址。學習

sp
若是所示,sp寄存器中保存0x80000FF0,所以固件的加載地址應該是0x80001000。操作系統

2.3經過定位bss在內存中的地址

usrinit2
這個方法在原理上同2.2的方法同樣,可是須要必定的計算。根據UsrInit()的描述,第一個跳轉的函數就是負責初始化BBS區的函數,所以能夠尋找第一個跳轉的指令的位置;還有另一個方法肯定初始化BBS區的位置,因爲在系統啓動過程當中VxWorks會使用bzero函數對bss區的數據進行清零,因此能夠在固件中用命令grep -r bzero查找bzero字符串出現的位置,此方法能夠做爲驗證。3d

2.4其餘方法

經過焊接UART接口查看系統引導過程的串口輸出;經過查閱開發者手冊等。

3.使用符號表修復函數名

3.1尋找符號表的位置

若是固件自己已經編入了符號表,那麼可使用binwalk肯定符號表的位置。
binwalk-fuhaobiao

VxWorks系統的符號表按照每16個字節一組,前四個字節用0x00進行填充,第二個四字節表示符號名字符串在內存中的位置,第三個四字節表示符號在內存中的位置,最後四個字節表明符號的類型,如0x0500表示函數名。
fuhaobiao

可是若是分析固件沒有獲得符號表,可能存在兩種可能:一種是固件自己就沒有編入符號表,這種狀況使得函數分析變得比較困難;另外一種是符號表被開發者隱藏了起來,防止固件被順利逆向。

如何尋找隱藏了的符號表還在學習中,以後會另開一篇專門介紹。

3.2修復函數名

在ida pro中,函數名的修復須要編寫腳本,用符號表中的函數名替換當前無心義的函數名。在ghidra中,加載完固件以後能夠運行vxhunter腳本,將函數名替換爲符號表中的函數名。

ghidra修復完函數名以後的效果,能夠很明顯的看出施耐德PLC以太網模塊固件NOE77101.bin固件中所存在的後門帳戶漏洞CVE-2011-4859
ghidra

相關文章
相關標籤/搜索