一、硬件基础知识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的基本命令以下。