小白固件提取的踩坑之旅

1.固件概述

​ 固件就是写入EROM(Eraseable Read-only Memory,可擦只读存储器)或者EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)中的程序。 固件承担系统最基础和底层的工作,是硬件设备的灵魂,决定着硬件设备的功能及性能。

​ 通常情况下,硬件中保存的固件程序是无法被用户读出的。之前的固件因为采用ROM设计,固件代码在生产过程中固话写死,所以固件升级,bug修复只能拆换芯片固件。随着技术的发展,可以重复写入的EPROM、EEPROM、和flash出现了。这些芯片可以重复擦写,固件得以修改和升级。

​ 固件可以理解为操作系统,包括很多模块,如驱动,控制,解码,传送,检测……..只有在他的控制下,硬件才可以正常工作。

​ 任何数码设备都有固件,只是平常感觉不到。如手机、数码相机、MP3、MP4、路由器、PS游戏机、XBOX、U盘、主板、显卡的BIOS。更比如一些小型设备的固件如鼠标、键盘、显示器、光驱、硬盘、GPS终端、以及其他精密的电子仪器等。

​ 固件也是软件,大小不一。大的可以几百兆,小的可能只有几字节。

​ 对于独立可操作性的电子产品。固件一般指操作系统。比如PSP(掌上游戏机)的固件,就是PSP的操作系统。iphone手机的固件也是其操作系统,路由器的固件也是路由器的操作系统,MP4的固件也是MP4的操作系统。

​ 对于非独立的电子产品,比如硬盘,鼠标,BIOS、光驱、U盘等设备。固件指的是最底层让设备得以运行的程序代码。

​ 在大部分IOT产品中多采用 flash 芯片作为存储器,提取固件主要也是通过读取 flash 芯片

2.固件获取方式

​ 常见的固件获取方式有4种。

  • 官网提供固件包,网络下载。
  • 设备升级,抓包获取固件url
  • 调试串口获取
  • 通过硬件,暴力读取固件存储芯片数据。

2.1 公开资源下载

TP-Link路由器固件 Link

小米路由器固件(ROM) Link

华硕ASUS路由器固件 Link

腾达路由器 Link

2.2 网络升级获取

​ 官网提供固件下载的获取方式多用于手机,路由器,相机等设备固件获取,而大多数IOT设备的官网,没有直接提供下载链接。这时可以通过分析手机,APP端是否有固件更新功能或者直接抓取终端设备的网络数据包,提取固件更新URL。

​ 当设备进入升级流程时,可以通过抓取升级过程的流量信息,进而得到物联网设备通过网络升级固件的具体途径。

82a880ffbcba25f057664bbd675b6966.jpeg

如上图:白色的为家庭正常使用的华为AX3路由器,蓝色的为tp-link老款路由器。

  • 将蓝色路由器使用网线连接到电脑,配置好无线ID,密码以及自动获取ip的上网方式。
  • 网线一端连接白色路由器的任一网口,一端连接蓝色路由器的wlan口。
  • 电脑连接蓝色路由器的WiFi,登录tplogin.cn后台控制页面。
  • 查找软件升级的点击按钮,如下
  • 查找本机无线局域网ip

4d77cabe4aa1ce853bbc8c0d83255d03.png

  • 使用burpsuite设置本地代理

aa8529975efa2174a48a2031ea0f2faf.png

  • 浏览器设置本地代理

49911a14766ee17a44520645dfe02cbb.png

  • 点击页面上的升级按钮

4fda2187fe93f9216038526c08db5d55.png

  • burpsuite 查看数据包中是否返回了固件信息

e229b7c7919c9deb8798db5a06c35b14.png

2.3 调试接口获取

2.3.1 如何定位UART串口

UART (Universal Asynchronous Receiver Transmitters )通用异步收发器。它将要传输的资料在

从串口(UART)通信和并行通信之间相互转换。对于物联网的串口调试,多数指的是通过uart口进行数据通信。UARt包含有以下4个引脚

  • GND:接地,该引脚电压通常为0。
  • VCC:电源电压。
  • TXD:数据发送引脚
  • RXD:数据接收引脚

TXD和RXD常与一般直接与处理器芯片的引脚相连。

vcc电压几乎不是3.3V就是5V。

2aa46a8e121cf867039bf0f2841745e1.png

正好有4个孔,怀疑是UART串口。

目测法

(1)VCC引脚特点

​ VCC引脚通常被做成方形,从路由器主板上可以看到较宽的走线。

(2)GND引脚

​ GND引脚通常存在多条走线连接到周围的地线(GND)

万用表测量法

(1)测试GND引脚

GND至少和一根外接天线是连接相通的,将万用表的档位调至蜂鸣档,一直表置于天线的锡焊点,一只表去试探串口,发出蜂鸣声的,则是GND。

方法1:pbc板不上电,万用表调至蜂鸣档位。一个表笔接(电容器负极,pbc板输入电源负极,或者pbc上的锡点),另一个表笔来探测GND引脚。如果是GND引脚,万用表会发生声音,指示灯会变红。

4485c3d8cb1c41dbd7780c7d526a6221.png

f0cee993328f4460f39509487692468c.png

bdb47a6244c80b9c4df2afddff481556.png

​ 方法2:将万用表调到电阻测量的最小档。这里最小为200欧姆,因此选择电阻为200欧姆的档位。然后确定两个表笔位置。金属屏蔽是一个很好的接地点,因此将一只表笔放在金属屏蔽罩上,另一表笔分别接触各个引脚,电阻为0的引脚是GND引脚。

1e83efb3c38875c60b75084ee18c5700.png

在测试其他孔位时,仪表没有任何数据变化,只有探测第三个孔的时候,仪表有数据变化。

可知pbc板上的第二个孔为GND(cong)

(2)测试VCC

给路由器上电,然后万用表量程放在直流电压20V的档位上,从路由器启动到系统完全启动观察电压值基本稳定在3.3V。一只表放在GND上,测试其他哪只引脚为3.3V,该引脚则为VCC。

或者等启动稳定后,黑色表笔探头接到GND,红色探头取检测UART的各个针脚。如果哪个针脚能够出现恒定3.3V或者5V。则说明这个针脚是VCC。

下图为启动稳定后的探测结果。

5e2f06b943e2431b7d30178dcf9ff84a.png

60ce64a60eb125d1b3d1099e0c2b0ab2.png

可以发现第一个孔是VCC(从左向右)

(3)测试TXD引脚

​ 方法1:当串行端口处于激活状态并发送数据(否则无法测试出发送引脚)时,发送引脚很容易识别。主板上的发送引脚被拉高到与VCC引脚相同的电压时,通常为3.3V。在有数据发送时,电压将下降到0。当读取的是一个不断变化的直流电压时,数字万用表将显示最终的平均采样电压

0854dcfae8fb4b3cde7e536eafcd92cc.png

方法2:如果万用表显示引脚电压下降,表示引脚有数据发送,由此可判断是TXD引脚。所以在启动过程中的10-15秒内,TX针脚会引起比较大的电压波动。因为启动的过程中有很多数据需要传输,方法和寻找VCC针脚的相同。

从电源上电到稳定,数据是一个波动的状态,很明显第4个孔是TXD(从左向右)

(4)测试RXD引脚

该引脚没有什么固定特征。通常都是找到其他三个引脚,剩下的那个就是RXD引脚。

综上:可以分析得出四个孔位从左到右分别是:VCC GND RXD TXD

2.3.2 USB_TO_TTL

找到了UARt口,也有了USB转TTL工具。但是PBC板上UART是四个孔,需要焊接排针。但由于排针数量较少,而且焊接也不是很方便。就直接将排针插到4个孔里面,然后使用USB to TTL (电平信号转换)。要注意以下引脚对应关系。

1、GND引脚对应TTL的GND

2、RXD引脚对应TTL的TXD

3、TXD引脚对应TTL的RXD

不然usb_to_ttl上的rxd指示灯会显示红色。然后使用putty、xshell等串口工具链接

(1)将usb_to_ttl插入电脑usb口,打开设备管理器,查看COM口。

b9b07220b8f1780fb19b173226cf0c70.png

(2) 打开串口连接工具,填入常见使用的数据传输波特率。9600、115200连接。

​ 现象就是有乱码,起初怀疑是引脚与杜邦线的接触不良,毕竟没有焊接。但是顺手去查了这个型号路由器的波特率,发现波特率可能是128000或者57600。填入12800。

b7d2c28524d9e38bd7503e4faaa644e3.png

5adbd29657befef89126945dfa8d1a4c.jpeg

167af25c04746c3ae8513f855c138b0f.png

泪目,真的研究了好久。终于进入shell了。但经过研究后,发现没有什么好dump内存的方式。flash可以看到内存布局。但是不知道内存加载的起始地址。等后续在研究。

2.4 编程器获取

这里利用编程器直接读取芯片固件,常用两种方法:

  • 飞线或者使用芯片夹,连接编程器,进行在线数据读取。
  • 把芯片拆焊下来,通过烧录座编程器,离线读取固件。

所用到的工具有:

  • 编程器,常见的RT809H(900元左右),入门略贵,这里用的是VS4000P(2百多)

997138b532833a1abcf3ad449c8a957c.png

  • 芯片夹。一端卡住单板上的芯片,一端的针插入编程器上。

0e85cc2e04b4a169d8f80e66417c03e1.jpeg

  • 烧录座 (卡住芯片,固定在编程器上)

eb6eba9b6e836a36d60a20ed58702589.jpeg

  • 飞线,杜邦线
  • 热风枪(推荐深圳白光,胜利仪器)

031256976913292bd726faeeaa6a2594.jpeg

  • 镊子

2.4.1 免拆芯片提取固件

  • 查看芯片上的丝印,查看型号。以便在编程器支持的芯片列表中查询。

d991bffe77d31f0d7c9bbed30465b5d2.jpeg

型号为25Q16CS1G

  • 打开编程器对应的应用程序,查看芯片支持列表

6d526cd6ecb771b898dd10f96bab76f6.png

有很多个25Q16,但具体是什么开头的还不清楚。网上百度下

型号确定:GD25Q16

eb3d97a54e46d195609520eef758fa4c.png

有三个不知道咋选,SOP8知道意思,但后面的150和200,不知道啥意思,干脆一个一个挨着试。

  • 芯片夹卡住芯片,并连接编程器。

6959b42424173ed2142bd2a9e54cd3a1.jpeg

  • 实验一

28091bbfc450388a28afb14936e2809b.png

  • 实验二

0498e73f27510298578dcb1278e86501.png

  • 实验三

ea6bcc2eac7525b7c4efa44085336c80.png

麻了,麻了!!!

2.4.2 使用飞线法读取

​ 通过夹具夹住芯片引脚,然后连接编程器读取芯片内容,通过编程器连接芯片需要注意引脚的顺序,在 IC 芯片上都会有一个小点,大多数情况下,小点对应的引脚即为芯片的第一脚,而连接编程器的导线也需要插入编程器上相应的引脚。

801c8f1b19451ea3973b2af3b322a78f.png

77d2e89e2e67c6bdf1041185d294b907.png

目前手里只有这种小夹子,只能暂时先用。连接后如下

8ad024f06981bbfa6c9ba3b069a29be4.jpeg

使用编程器读取数据

385f7868109f20cd448d69bf0f60c180.png

啊这。。。。。

2.4.2 拆焊芯片读取固件

这下只有把芯片从pbc板上拆下来,然后使用烧录座读取数据。

  • 热风枪设置到合适的温度,吹下芯片,要注意不要灼烧到周围的元器件。

2c8d1c0ebaf04d68a7bb466d2469f5cf.jpeg

0a6d328398363432a7efa7ff9210539c.jpeg

25ad12dac824ef0b90f9a6cb82cfa9b7.png

热风枪的使用就要经验,最开始吹了半个小时没有动,各种查资料。后来干脆温度,风速调到最大,去吹另一块板子上的芯片,两下就掉了。

原因是:热风枪温度还没有上来就去吹芯片,导致融锡的温度和热风枪的温度同步上升。后来温度风速稳定,去吹冷板子上的芯片一下就掉了。

  • 拆下的闪存芯片放在烧录座上,在连接编程器进行读写,芯片放置的引脚方向要注意对齐编程器和烧录座的第一脚。

f73e3468e77741b140013aa7e994464a.jpeg

9d1cada9b5554380c4f073d3ace77211.jpeg

  • 读取数据

95c39926c9ee4551aa7e2617818c6247.png

249644f098a15dafdc1445246fa76444.png

有数据了。再次泪目!!!

fce6ff079f537a42f56088c77f19ab7b.png

参考链接

http://blog.nsfocus.net/security-analysis-of-the-firmware-of-iot/

树莓派读取

获取root