通过SD卡给某摄像头植入可控程序

0x01. 摄像头卡刷初体验

最近研究了手上一台摄像头的sd卡刷机功能,该摄像头只支持fat32格式的sd卡,所以需要先把sd卡格式化为fat32,另外微软把fat32限制了最大容量32G,所以也只能用不大于32G的sd卡来刷机。

这里使用32G的sd卡来刷

image-20231024165736603

win10格式化sd卡命令,X是sd卡所在磁盘名。

1

format /FS:FAT32 X:

准备就绪,将固件直FIRMWARE.bin放SD卡根目录下, 长按reset键刷机。但是后面发现并未成功,刷完后成砖了,摄像头未能正常启动,此时刷入的还是正常固件,还未做任何篡改,却直接刷成砖,确实有点出师不利,一时间不知哪个环节出了问题。

0x02. 救“砖”行动

摄像头刷机后没能正常启动,考虑接上串口,看看哪里出了问题。

image-20231024170148048

接上串口后,再次上电启动设备,观察到部分串口日志如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

T

IPL xxx

D-15

HW Reset

SPI 54M

IPL_CUST xxxx

MXP found at 0x0000f000

offset:00010000

XZ decomp_size=0x0004a19c

U-Boot 2015.01

WARNING: Caches not enabled

MMC:   MStar SD/MMC: 0

SF: Detected nor0 with total size 8 MiB

gpio debug MHal_GPIO_Pad_Set:603

gpio debug MHal_GPIO_Pad_Set:603

In:    serial

Out:   serial

Err:   serial

Net:   MAC Address E0:EF:02:88:AD:26

Auto-Negotiation...

Link Status Speed:100 Full-duplex:1

sstar_emac

gpio debug MHal_GPIO_Pad_Set:603

ddrsize 64

mtd_num 5, flash_size 0x00800000(8M)

To run up...

Using sstar_emac device

TFTP from server 192.168.1.99; our IP address is 192.168.1.10

Filename 'update.bin'.

Load address: 0x21000000

Loading: T T T T T T T T T T

Retry count exceeded; starting again

Using sstar_emac device

TFTP from server 192.168.1.99; our IP address is 192.168.1.10

Filename 'update.bin'.

Load address: 0x21000000

Loading: T T T T T T T T T T

从日志信息可以看出,摄像头IP地址为192.168.1.10,tftp服务器地址为192.168.1.99,设备尝试从tftp服务器加载名为update.bin的固件失败。说明之前卡刷没有成功的情况下,现在设备上电后会主动尝试利用uboot中的tftp功能从192.168.1.99地址加载固件,但此时并不存在192.168.1.99服务器,所以摄像头上电后一直卡在这里,无法正常启动。

尝试利用tftp刷机拯救摄像头,由于设备启动时并不能成功打断uboot进入shell,所以我们无法直接通过uboot shell去修改默认的tftp服务器ip和其他操作,只能在PC上搭建一个tftp服务器并修改ip为192.168.1.99,将待刷固件命名为update.bin并放到tftp服务器文件目录。

tftp服务器准备就绪,再次上电启动设备,观察到设备成功从192.168.1.99服务器下载到固件,并写入flash,救“砖”成功。

后面再次按照sd卡刷流程尝试刷入正常固件,终于没有再出现成“砖”的状况。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

T

IPL xxx

D-15

HW Reset

SPI 54M

IPL_CUST xxxx

U-Boot 2015.01

WARNING: Caches not enabled

MMC:   MStar SD/MMC: 0

SF: Detected nor0 with total size 8 MiB

gpio debug MHal_GPIO_Pad_Set:603

In:    serial

Out:   serial

Err:   serial

Auto-Negotiation...

sstar_emac

SF: Detected nor0 with total size 8 MiB

Erasing SPI flash..._spi_flash_erase: addr 0x30000, len 0x10000 100%(cost 248 ms)

Writing to SPI flash..._spi_flash_write to 0x30000, len 0x10000 from 0x23b01870 100%(cost 169 ms)

done

ddrsize 64

mtd_num 5, flash_size 0x00800000(8M)

To run up...

Using sstar_emac device

TFTP from server 192.168.1.99; our IP address is 192.168.1.10

Filename 'update.bin'.

Load address: 0x21000000

Loading: T #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         ##############################

         237.3 KiB/s

done

Bytes transferred = 7114336 (6c8e60 hex)

head_crc32 9ba634e1 crc32 9ba634e1

MXIC REMS: 0xC2,0x16

SF: Detected nor0 with total size 8 MiB

...

...

SF: 1507328 bytes @ 0x40000 Written: OK

head_crc32 4d5121d7 crc32 4d5121d7

...

...

Erasing SPI flash..._spi_flash_erase: addr 0x30000, len 0x10000 100%(cost 255 ms)

Writing to SPI flash..._spi_flash_write to 0x30000, len 0x10000 from 0x23b018d0 100%(cost 175 ms)

done

resetting ...

##  Booting kernel from Legacy Image at 21000000 ...

   Image Name:   MVX4##I6B0xxxxxxxx

   Image Type:   ARM Linux Kernel Image (lzma compressed)

   Data Size:    1494344 Bytes = 1.4 MiB

   Load Address: 20008000

   Entry Point:  20008000

   Verifying Checksum ... OK

   Uncompressing Kernel Image ...

[XZ] !!!reserved 0x21000000 length=0x 1000000 for xz!!

   XZ: uncompressed size=0x2e2000, ret=7

OK

Starting kernel ...

ox03. 分析卡刷固件校验

正常的sd卡刷流程大致如下,首先断电,将存储固件的sd卡插入摄像头,按住reset键,接通电源,此时摄像头就会加载sd卡固件进行刷机.在刷写固件的过程中,按住reset键的作用是强制摄像头进入IPL模式(Initial Program Loader),也称为恢复模式。这个模式允许设备加载存储在SD卡中的新固件并更新原有的固件。在IPL模式下,设备将不会自动运行已有的固件,而是等待从SD卡加载新的固件进行刷写。因此,按住reset键是为了保证设备能够正确地进入IPL模式,从而完成固件的更新。在这个日志中,可以看到 IPL(Initial Program Loader)已经成功地加载,并且检查通过。

IPL_CUST 固件的作用是启动 U-Boot,然后由 U-Boot 来加载并运行设备的操作系统。在这个过程中,U-Boot 会从 SD 卡上读取固件,然后将它加载到摄像头的内存中,并启动 Linux 内核。因此,加载 sd卡固件的程序在U-Boot中,从上面日志可以看到uboot启动固件时首先对固件做了crc校验,所以篡改固件后需要还需要考虑过crc校验才可能刷写成功。

从uboot固件中也确实搜到上面日志中的crc校验相关字符串。

image-20231025093614883

分析uboot中crc校验逻辑,逆向出修改固件后需要计算的相关字段。

image-20231027100003866

image-20231027093401072

0x04.定制文件系统

知道固件组成结构后,接下来就可以向固件文件系统中植入我们自己的程序,固件修改后,计算并调整固件中相应size和crc字段值,通过sd卡重新刷入设备。

使用buildroot编译一个包含telnet、ftp等功能的busybox,将新编译的busybox移植到摄像头原来的文件系统中。

下载Buildroot ,选择编译配置

1

make menuconfig

image-20231025101604650

image-20231025101618084

接着编译BusyBox,将telnetd编译进去

1

make busybox-menuconfig

image-20231025101638772

以上设置完成后执行make进行编译,编译完成后在当前目录生成output文件夹,生成的telnetd是链接到busybox的,所以这里直接将

生成的busybox移植到摄像头文件系统即可。将编译的busybox复制到固件文件系统/bin目录并命名为busybox_hack。这里解包固件时记得要用root权限,因为摄像头是root用户,busybox_hack拷贝到摄像头文件系统中时也要注意修改文件的所属用户和组和其他文件一致。

将busybox_hack添加到启动项中/etc_default/init.d/,并启动telnetd,-l 参数将其链接到/bin/sh,这样直接免密登录。

image-20231027093540652

重新打包文件系统

1

sudo mksquashfs ./squashfs-root/ out.fs -comp xz -b 64K -noappend

其中 ./squashfs-root 是待打包的目录,out.fs 是想要重新打包的文件名。-comp xz 告诉 mksquashfs 使用 xz 压缩算法,-b 64K 告诉 mksquashfs 使用 64K 的块大小。-noappend 告诉 mksquashfs 不要将新文件附加到现有文件中。

将out.fs覆写在原固件文件系统处并调整固件中相应size和crc字段值。

1

dd if=out.fs of=target.bin conv=notrunc bs=1 seek=1494600

1

2

3

4

5

if=out.fs 表示输入文件为 out.fs。

of=target.bin 表示输出文件为 target.bin

conv=notrunc 表示不截断输出文件,即保留输出文件中的原有内容。

bs=1 表示每次读写一个字节。

seek=1494600 表示在输出文件中的偏移 1494600 处开始写入,这就相当于将输入文件拼接到输出文件的偏移 1494600 

最后通过sd卡刷入固件,文件系统成功启动,telnetd也成功启动,通过telnet直接连接到摄像头shell。

image-20231027093655047

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/137101.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

09 # 手写 some 方法

some 使用 some() 方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。 ele:表示数组中的每一个元素index:表示数…

Unity中Shader的雾效

文章目录 前言一、Unity中的雾效在哪开启二、Unity中不同种类雾的区别1、线性雾2、指数雾1(推荐用这个,兼具效果和性能)3、指数雾2(效果更真实,性能消耗多) 三、在我们自己的Shader中实现判断,是…

vue设计原理-带你重走vue诞生路程

我们首先看下面这个小demo demo源码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conten…

RT-DETR 应用 CARAFE:特征内容感知重新组装

特征上采样是现代卷积神经网络架构中的关键操作,例如特征金字塔。其设计对于密集预测任务,如目标检测和语义/实例分割至关重要。在本研究中,我们提出了一种称为内容感知特征重组(CARAFE)的通用、轻量级且高效的操作符,以实现这一目标。CARAFE具有以下几个优点:(1)大的…

算法通关村第七关-青铜挑战二叉树的深度优先遍历(递归)

二叉树的深度优先遍历 今天我们来说二叉树的深度优先遍历 , 这次用简单但有点难理解的方式递归来实现 , 对应LeetCode 144,145 二叉树的前序遍历 描述 : 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 题目 : LeetCode 二叉树的前序遍历 : 144. 二叉…

【FAQ】Gradle开发问题汇总

1. buildSrc依赖Spring Denpendency时报错 来自预编译脚本的插件请求不能包含版本号。请从有问题的请求中删除该版本&#xff0c;并确保包含所请求插件io.spring.dependency-management的模块是一个实现依赖项 解决方案 https://www.5axxw.com/questions/content/uqw0grhttps:/…

K8S知识点(九)

&#xff08;1&#xff09;Pod详解-结构和定义 一级属性有下面这些&#xff1a;前两个属性是字符串&#xff0c;上面有定义 kind&#xff1a;Pod version&#xff1a;v1 下面的属性是object 还可以继续查看子属性&#xff1a;二级属性 还可以继续查看三级属性&#xff1a; 通…

微软近日限制员工访问ChatGPT!

作者 | 撒鸿宇 据CNBC报道&#xff0c;在这周四的短时间内&#xff0c;微软的员工被禁止使用ChatGPT。 微软在其内部网站的更新中表示&#xff1a;“由于安全和数据问题&#xff0c;一些AI工具不再对员工开放。”据CNBC查证&#xff0c;他们看到了一张截图&#xff0c;该截图显…

KubeSphere 社区双周报 | KubeSphere 3.4.1 发布 | 2023.10.27-11.09

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.10.27-2023.…

Nuxt.js——基于 Vue 的服务端渲染应用框架

文章目录 前言一、知识普及什么是服务端渲染什么是客户端渲染&#xff1f;服务端渲染与客户端渲染那个更优秀&#xff1f; 二、Nuxt.js的特点Nuxt.js的适用情况&#xff1f; 三、Vue是如何实现服务端渲染的&#xff1f;安装依赖使用vue安装 Nuxt使用npm install安装依赖包使用n…

UE特效案例 —— 角色刀光

目录 一&#xff0c;环境配置 二&#xff0c;场景及相机设置 三&#xff0c;效果制作 刀光制作 地裂制作 击打地面炸开制作 一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设…

3.如何实现 API 全局异常处理?-web组件篇

文章目录 1. 统一异常处理 1. 统一异常处理 在 Spring MVC 中&#xff0c;通过 ControllerAdvice ExceptionHandler 注解&#xff0c;声明将指定类型的异常&#xff0c;转换成对应的 CommonResult 响应。实现的代码&#xff0c;可见 GlobalExceptionHandler类。

【python】sys-path和模块搜索路径

我们在导入一个模块的时候&#xff0c;比如说&#xff1a; import math它必然是有搜索路径的&#xff0c;那到底是在哪个目录下面找呢&#xff1f;Python解释器去哪里找这个文件呢&#xff1f;只有找到这个文件才能读取、装载运行该模块文件。 它一般按照如下路径寻找模块文件…

Hutool Excel导出 配置宽度自适应 工具类

简介&#xff1a;Hutool是一款十分好用的开发工具集&#xff0c;里面包含了大部分日常开发常用的工具&#xff0c;使用简单方便&#xff0c;可以大大提升日常开发效率&#xff0c;十分推荐大家使用。这里简单总结一下基于Hutool的Excel使用。 一、Hutool依赖 <!-- Excel导出…

springboot苍穹外卖实战:七、店铺营业状态设置与查询+接口文档多端分组优化

店铺营业状态设置与查询 注意&#xff0c;先把测试类最上面的SpringBootTest注解注释掉&#xff0c;否则每次启动项目都会自动帮你测试一遍&#xff0c;导致项目启动变慢。 其次&#xff0c;该项目没有设置相应拦截器对付以下情况&#xff1a;用户使用过程中商家突然暂停营业&…

第一百七十一回 SearchBar组件

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"Material3中的IconButton"相关的内容&#xff0c;本章回中将 介绍SearchBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

【Python大数据笔记_day07_hive中的分区表、分桶表以及一些特殊类型】

分区表 分区表的特点/好处:需要产生分区目录,查询的时候使用分区字段筛选数据,避免全表扫描从而提升查询效率 效率上注意:如果分区表在查询的时候呀没有使用分区字段去筛选数据,效率不变 分区字段名注意:分区字段名不能和原有的字段名重复,因为分区字段名要作为字段拼接到表后…

typora保护机制与注册逆向分析

、起因 一直比较喜欢Typora的简洁与美观&#xff08;尝试过用 vscode 搭配插件编辑 markdown 文件&#xff0c;体验还是要差一些的&#xff09;&#xff0c;突然发现自己windows机器上很久前安装的typora不让用了&#xff0c;提示&#xff1a; 幸好原始安装文件还在&#xf…

C++ 模板保姆级详解——template<class T>(什么是模板?模板分哪几类?模板如何应用?)

目录 一、前言 二、 什么是C模板 &#x1f4a6;泛型编程的思想 &#x1f4a6;C模板的分类 三、函数模板 &#x1f4a6;函数模板概念 &#x1f4a6;函数模板格式 &#x1f4a6;函数模板的原理 &#x1f4a6;函数模板的实例化 &#x1f34e;隐式实例化 &#x1f349;显式实…

Jupyter notebook 无法链接内核、运行代码

问题来源 今天想在 vscode 上使用 Jupyter notebook 跑 Python 代码&#xff0c;但无法使用&#xff0c;提示要升级内核。 Running cells with base requires the ipykernel package to be installed or requires an update. 其实这个问题存在好一段时间了&#xff0c;不过之前…