风之栖息地

萤石某摄像头的安全分析--固件提取

字数统计: 1k阅读时长: 3 min
2019/02/18 Share

由于之前考研一直没有时间搞,现在终于有空来做一些小实验。

固件提取方式

比较主流的提取方式有以下几种:

  1. 官网或者找客服索要固件
  2. 在线升级的时候抓包得到下载地址
  3. 拆flash芯片,用编程器读取芯片内容(也可以使用烧录夹直接获取flash,但是有些时候有保护引脚就只能拆芯片)
  4. 用硬件电路的调试接口和固件的bootloader获取固件
  5. 从串口进入系统之后,打包固件

首先,这个摄像头现在没有升级操作,官网也没有固件。烧录夹现在还用的不熟练,在分析之后决定用硬件调试接口来获取固件。

TTL接口线序

这里推荐一篇仙果大佬写的省钱版测序 https://bbs.pediy.com/thread-246405.htm ,通过万用表就能简单判断vcc和gnd,gnd可以使用蜂鸣档快速判断,vcc可以用直流电压测量,黑表笔接gnd,红表笔探测其他接口,如果是3.3v或者5v,那红表笔所在接口就是vcc,随后txd和rxd需要先连接测试,如果不行再交换引脚。

其中电路板的txd和rxd要和usb-ttl转接器的rxd和txd相连,接地线对接地线,如上图所示。这里推荐使用全隔离型的usb-ttl,可以防烧电脑接口。

这里采用的是外部供电的方式进入设备的uboot系统,所以需要接上电源然后再将usb-ttl接入电脑的接口。

在焊接的时候要特别注意不要将焊点连接在一起了,这样会导致串口连接不正常,要么没有数据显示,要么会无法输入。

导出固件

这里使用secureCRT连接串口,进入摄像头系统。我是windows系统,通过设备管理器可以看到连接的com口,之后配置连接。

115200是比较常用的波特率,其中要注意流控制是不选的,因为没有进入正常的系统,而是uboot,所以不需要这些流控制协议。

连接成功之后一直跳错误……没办法重置一下,在进入系统之前它会确认是否进入系统,这里要按ctrl+u中断自动进系统,这样我们就成功进入uboot系统。

比较重要的几个命令,bdinfoprintenvsfmd

通过bdinfo,可以知道一些基础的硬件设定。

printenv获得环境变量的具体数值。

sf probe 0选择我们的flash芯片。

知道flash芯片大小为8M,然后在系统一开始会显示flash的地址分配

由于内存有很多没有使用的部分,提取思路就是把flash中的固件读在未使用的内存中,然后用md命令读取出来

sf read 0xa1000000 0 0x800000

将flash的固件读出来之后,验证一下,读取linux内核看看有没有相关的东西。

md 0xa1060000 0xa0

验证成功,现在就要把整个固件全部导出来。md 0xa1000000 0x800000。将结果保存在会话日志中,这样就得到了固件的二进制的文本内容。再转换成二进制文件,即得到固件。

1
2
3
4
5
6
7
8
9
10
11
import binascii

hex_file = open('session.log', 'r')
bin_file = open('hex2bin.bin', 'wb')
while True:
line = hex_file.readline().strip()
if not line:
break
strs = line.split(' ')
for string in strs:
bin_file.write(binascii.a2b_hex(string))

但是发现和之前得到的固件结构有矛盾,怎么会只有一个zImage。。。所以切换成小端写入二进制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import binascii

hex_file = open('session.log', 'r')
bin_file = open('hex2bin.bin', 'wb')
while True:
line = hex_file.readline().strip()
if not line:
break
strs = line.split(' ')
for string in strs:
bin_file.write(binascii.a2b_hex(string[-2:]))
bin_file.write(binascii.a2b_hex(string[-4:-2]))
bin_file.write(binascii.a2b_hex(string[-6:-4]))
bin_file.write(binascii.a2b_hex(string[:-6]))

果然是大小端的问题,切换成小端序就能用binwalk分析出正确的结构。这个我们在提取的时候一定要注意大小端顺序问题。

最后感谢马良,在操作过程中的指点和引导,焊接图也是出自马良,学到了很多知识感激不尽。

CATALOG
  1. 1. 固件提取方式
  2. 2. TTL接口线序
  3. 3. 导出固件