一、硬件基礎知識linux
1.一、路由器FLASH算法
FLASH也叫閃存,是路由器中經常使用的一種內存類型。它是可讀可寫的存儲器,在系統從新啓動或關機以後仍能保存數據。FLASH中存放着當前正在使用的路由器操做系統等信息。編程
路由器的FLASH就像計算機的硬盤。咱們的硬盤一般會被格式化成多個分區。一樣的原理,FLASH也會被格式化爲多個分區。一般狀況下,FLASH分爲4個區塊,其做用以下:windows
bootloader:主要功能時對硬件環境進行初始化、更新固件及認識操做系統的文件格式並將內核加載到內存中去執行。安全
Kernel:操做系統的內核。網絡
Root Filesystem:操做系統的根文件系統,如squashfs、rootfs等。併發
NVRAM:做用是保存路由器中的配置文件。路由器在啓動以後會從NVRAM中讀取配置文件,對路由器進行設置。用戶修改路由器設置後,系統會將修改後的參數寫回NVRAM中。異步
路由器的FLASH中存儲的數據對於咱們進行路由器安全研究具備十分重要的意義。咱們能夠讀取NVRAM中的配置信息,以瞭解當前路由器中的敏感信息,還能夠從FLASH中提取固件。工具
1.二、硬件提取數據的思路測試
經過接觸硬件進行數據提取的方法不少,一般狀況能夠考慮如下三種方案:
一、經過路由器主板上的JTAG接口提取FLASH、NVRAM等。這種方法的優勢是隻須要一根JTAG線,不須要太多的輔助設備,缺點是須要路由器CPU支持JTAG,主板上要有JTAG接口。
二、從主板上取下的FLASH芯片中提取。這種方法能夠在路由器不支持JTAG方式時使用,但缺點也很明顯------從主板上取出芯片可能會對路由器形成物理損傷。
三、使用測試夾從FLASH芯片中提取。使用測試夾的優勢是不須要從路由器上取下芯片,只須要用測試夾夾住芯片引腳便可,缺點是對不一樣引腳數的FLASH芯片須要使用對應的測試夾。
二、路由器串口
路由器的串口對於開發人員來講,一般能夠用串口實現以下功能:
一、訪問路由器的CFE(Common Firmware Environment 統一固件環境)。
二、觀察boot和調試信息。
三、經過一個Shell與系統進行交互異步串行通訊。
在路由器中,咱們要尋找的串口不是指一般所見的RS232,而是指UART(通用異步收發器),它是路由器設備中比較常見的一種接口。雖然RS-232和UART在協議方面是兼容的,但在電壓上倒是不兼容。UART一般在3.3伏特進行操做,但也可運行在其餘標準電壓(如5伏特、1.8伏特等)下。
2.一、探測串口
咱們使用基本的觀察法和萬用法從複雜的路由器主板中找出UART,並肯定UART的每個引腳的用途。
首先,咱們經過肉眼觀察路由器主板上的引腳。通常來講,UART至少包含如下4個引腳。
一、Vcc(VCC):電源電壓。該引腳電壓較穩定。
二、Ground(GND):接地。該引腳電壓一般爲0.
三、Transmit(TXD):數據發送引腳。
四、Receive(RXD):數據接收引腳。
也就是說,咱們首先要注意在路由器主板上那些單行具備4~6個引腳的位置。但這種方法不必定在任什麼時候候都有效,由於這些引腳的位置是由各個廠商設計的,沒有統一標準。
找到串口之後,咱們須要區分這些引腳的功能。能夠經過目測法和萬用表測試法。
2.1.一、目測法
主板在印刷時都會遵循一些規律,這些規律能夠幫助咱們識別串口的引腳。
(1)VCC引腳特色:
VCC引腳一般被作成方形,從路由器主板上能夠看到較寬的走線,那麼該引腳極有可能也是VCC引腳。
(2)GND引腳特色:
GND引腳一般存在多條走線鏈接到周圍的地線(GND)。
2.1.二、萬用表測量法
(1)測試GND引腳
將萬用表調到電阻測量的最小檔。這裏最小爲200歐姆,所以選擇電阻200歐姆檔位。而後,咱們須要肯定萬用表的兩種表應該放在哪些位置。一般金屬屏蔽是一個方面測試的接地點,所以,將一隻表筆放在金屬屏蔽罩上,用另外一隻表筆分別接觸10個引腳,測試金屬屏蔽罩與串口的10個引腳,電阻爲0的引腳即爲GND引腳。
(2)測試VCC
雖然VCC引腳對於咱們使用路由器的串口是可有可無的,可是肯定VCC引腳能夠排除它做爲RXD引腳和TXD引腳的可能性,所以也是有必要的。將萬用表量程放在直流電壓2-伏特檔位上,給路由器上電(將路由器電源接通),從路由器啓動到系統徹底啓動這段時間內觀察到電壓值基本穩定在3.30伏特。
(3)測試TXD引腳
當串行端口處於激活狀態併發送數據(不然沒法測試出發送引腳)時,發送引腳時至關容易識別的。主板上的發送引腳被拉高到與VCC引腳相同的電壓時,一般爲3.3伏特。在有數據發送時,電壓將降低到0.當讀取的是一個不斷變化的直流電壓時,數字萬用表將顯示最終的平均採樣電壓。所以,若是萬用表顯示引腳電壓降低,表示該引腳有數據發送,由此能夠判斷該引腳是TXD引腳。
雖然這是識別發送引腳的一種有效方法,可是值得注意的是,若是串行端口只發送少許數據,經過鍛壓波動判斷可能就不是那麼準確了,這是咱們須要使用示波器或邏輯分析儀捕獲發送引腳的數據活動。
(4)測試RXD引腳
準確地識別接收引腳時最困難的,由於它沒有十分有效的特徵定義。一般咱們經過測試找出TXD引腳,另外一個引腳就是RXD引腳了。
2.二、鏈接串口
在識別了串口的各個引腳以後,咱們能夠經過一條USB轉UART適配器的線能夠鏈接了。將UART適配器的USB接口端插入計算機的USB接口,將UART適配器鏈接到路由器串行端口中,使用方式以下:
一、將適配器的GND鏈接到串口的GND。
二、將適配器的RXD鏈接到串口的TXD。
三、將適配器的TXD鏈接到串口的RXD。
鏈接上串口後,咱們須要檢查串行端口的協議設置,串行端口有多種設置,可是在這裏咱們只須要完成波特率的設置便可。嘗試錯誤是識別波特率最快和最簡單的方法。由於串行端口一般用於顯示調試信息(即它們發送ASCII數據),而且只有少數可能頻率的波特率,因此咱們能夠逐一測試可能的波特率,直到輸出可理解的數據(如ASCII碼)時,就找到了當前串口的波特率。
baudrate.py有一個功能選項「-a」能夠自動檢測波特率。
2.三、在linux下讀取路由器串口數據
一、經過miniterm.py鏈接路由器串口
二、路由器CFE命令模式
在路由器啓動階段,按「Ctrl+C」組合鍵能夠終止路由器系統的啓動過程,進入CFE命令行模式。(實例WRT54G路由器)
在CFE命令行模式下,使用這些命令能夠完成路由器CFE、FLASH、NVRAM的相關操做。
三、路由器linux系統模式
直接在路由器啓動後,進入系統模式,操做路由器。
2.四、在windows下讀取路由器串口數據
在windows下有不少串口調試工具,例如Putty等。具體也是設置波特率還有Serial類型。
三、JTAG提取數據
爲了解決提取FLASH數據問題,咱們使用JTAG提取數據。
3.一、JTAG鏈接
JTAG主要應用於電路的邊界掃描測試和可編程芯片的在線系統編程。JTAG也是一種國際標準測試協議,主要用於芯片的內部測試。現今大多數的高級器件都支持JTAG協議。標準的JTAG接口是4線,TMS、TCK、TDI、TDO分別爲模式選擇、時鐘、數據輸入、數據輸出。
JTAG引腳的相關定義以下:
TRST引腳是一個可選的、相對待測邏輯低電平有效的復位開關。根據芯片的不一樣,它一般是異步的,但有時也多是同步的。若是該引腳沒有定義,則待測邏輯可由同步時鐘輸入復位指令復位。所以,在一般狀況下,咱們只需鏈接TDI、TDO、TCK、TMS、GND這5根線就夠了。
一個含有JTAG Debug接口模塊的CPU,只要時鐘正常,就能夠經過JTAG接口訪問CPU的內部寄存器和掛在CPU總線上的設備,如FLASH、RAM、SOC(System on Chip)內置模塊的寄存器。
肯定JTAG接口所具有的能力之後,要想使用這些功能,還須要軟件配合,所實現的功能則由具體的軟件決定。
四、brjtag的使用
brjtag工具是一款用於Broadcom CPU路由器JTAG鏈接線的FLASH刷寫工具.
4.一、基本安裝(待續)
4.二、提取FLASH
FLASH芯片中存儲了路由器的固件,其中包含路由器的bootloader信息。由於每一個路由器廠商在對操做系統進行編碼和壓縮的時候可能會使用一些非標準的算法,所以,有些時候,提取和分析bootloader也是頗有必要性的。在沒法經過網絡下載路由器固件時候,能夠經過JTAG方式讀取路由器FLASH中的固件,對文件系統及bootloader進行提取和分析。
使用brjtag對路由器FLASH進行操做的基本命令以下:
4.三、提取CFE
使用brjtag讀路由器NVRAM的基本命令以下:
4.四、提取NVRAM
路由器的配置文件都存放在NVRAM中,所以,經過讀取NVRAM能夠獲得路由器的全部配置信息。使用brjtag讀取路由器NVRAM的基本命令以下。