VxWorks固件分析方法總結

#VxWorks固件分析方法總結 最近研究基於VxWorks系統的iot設備的固件分析方法,將學習心得記錄於此,以備未來的查詢須要。 ##1.VxWorks是什麼? VxWorks是美國WindRiverSystem公司(風河公司)推出的一個RTOS(實時操做系統),憑藉良好的持續發展能力、高性能的內核以及友好的用戶開發環境,在嵌入式實時操做系統領域佔據一席之地。自從1987年首次問世以來,VxWorks系統版本經歷了5.x,6.x到現在的7版本。VxWorks系統憑藉其優秀的實時性佔據着不小的市場份額,包括NASA的火星探測器、波音787客機、網絡路由器等,市場範圍跨越各類安全領域。 VxWorks版本更替linux

按照所運行的操做系統區分,嵌入式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字符串出現的位置,此方法能夠做爲驗證。函數

###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-4859ghidra3d

相關文章
相關標籤/搜索