通过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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码

基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于樽海鞘群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

vColorPicker与vue3-colorPicker——基于 Vue 的颜色选择器插件

文章目录 前言样例特点 一、使用步骤?1. 安装2.引入3.在项目中使用 vcolorpicker 二、选项三、事件四、问题反馈问题所在安装引入例子效果图 前言 vColorPicker——官网 vColorPicker——GitHub 样例 vColorPicker是基于 Vue 的一款颜色选择器插件,仿照…

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况,需要自定义来实现——可以用窗口(window)来表示。为了更方便地实现基于时间的合流操作,Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结(Window Join) 一…

面向对象基础(以python语言为例)

1、定义一个类;实例化类的对象;调用类中的方法 #定义一个类 class Student:#类方法(即函数)def study(self,course_name):print(f学生正在学习{course_name})def play(self):print("xx学生正在玩游戏")#实例化&#xf…

从0到1实现一个前端监控系统(附源码)

目录 一、从0开始 二、上报数据方法 三、上报时机 四、性能数据收集上报 收集上报FP 收集上报FCP 收集上报LCP 收集上报DOMContentLoaded 收集上报onload数据 收集上报资源加载时间 收集上报接口请求时间 五、错误数据收集上报 收集上报资源加载错误 收集上报js错…

Linux下C++调用python脚本实现LDAP协议通过TNLM认证连接到AD服务器

1.前言 首先要实现这个功能,必须先搞懂如何通过C调用python脚本文件最为关键,因为两者的环境不同。本质上是在 c 中启动了一个 python 解释器,由解释器对 python 相关的代码进行执行,执行完毕后释放资源。 2 模块功能 2.1python…

Windows server 2008 R2 IIS搭建ASP网站教程

一、安装应用程序服务器 提示安装成功 二、添加角色服务asp 三、asp网站配置 放入源码 设置网站首页为index.asp: 设置应用程序池 四、设置网站目录属性 五、access数据库连接配置 Cd c:\Windows\System32\inetsrv appcmd list apppool /xml | appcmd set apppool /…

K9203 996920302 面向DNP3的网络安全解决方案

K9203 996920302 面向DNP3的网络安全解决方案 2014年ISA卓越技术创新奖获得者,超电子,3eTI的CyberFence工业防火墙解决方案提供强大加密和应用程序级深度数据包检测(DPI)功能。最近,3eTI为其CyberFence产品线增加了DNP3(分布式网络协议)支持…

SpringBoot Web开发

SpringBoot3-Web开发 SpringBoot的Web开发能力,由SpringMVC提供。 Web开发的三种方式 方式处理过程注意事项实现效果全自动直接编写控制逻辑全部使用自动给配置默认效果手自一体Configuration、 配置WebMvcConfigurer、 配置WebMvcRegistrations不要标注 EnableWeb…

【Linux】:静动态库

静动态库 一.静态库1.设计静态库2.生成静态库3.发布静态库4.使用静态库 二.动态库1.设计动态库2.生成和发布动态库3.使用 一.静态库 程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 静态库链接格式:libxxx.a(前缀是lib,后缀是…

基于安卓android微信小程序的四六级助手系统

项目介绍 随着我国教育需求不断增加,高校教育资源有限,教育经费相对不足的情况下,利用现代信息技术发展高等教育,不仅充分利用了优秀的教育资源,而且为更多的人提供接受高等教育的机会,同时这也是极大促进…

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

网络原理-UDP/TCP详解

一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段&#xff0…

机器视觉目标检测 - opencv 深度学习 计算机竞赛

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

单链表按位序与指定结点 删除

按位序删除(带头结点) #define NULL 0 #include<stdlib.h>typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList;//按位序删除&#xff08;带头结点&#xff09; bool ListInsert(LinkList& L, int i, int& e) {if (i < 1)return false;L…

iPhone或在2024开放第三方应用商店。

iPhone或开放第三方应用商店&#xff0c;可以说这是一个老生常谈的话题。对于像是iOS这样封闭的系统来说&#xff0c;此前传出苹果可能开放侧载消息的时候&#xff0c;又有谁能信&#xff0c;谁会信&#xff1f; 如果是按照苹果自身的意愿&#xff0c;这种事情自然是不可能发生…

Antd React Form.Item内部是自定义组件怎么自定义返回值

在线演示https://stackblitz.com/edit/stackblitz-starters-xwtwyz?filesrc%2FSelfTreeSelect.tsx 需求 当我们点击提交,需要返回用户名和选中树的id信息,但是,我不关要返回树的id信息,还需要返回选中树的名称 //默认返回的 {userName:梦洁,treeInfo:leaf1-value } //但是需…

SpringBoot项目调用openCV报错:nested exception is java.lang.UnsatisfiedLinkError

今天在通过web项目调用openCV的时候提示如下错误&#xff1a; nested exception is java.lang.UnsatisfiedLinkError:org.opencv.imgcodecs.Imgcodecs.imread_0(Ljava/la如下图所示&#xff1a; 但是通过直接启动java main函数确正常&#xff0c;初步诊断和SpringBoot热加载…

55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声

基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲&#xff08;椒盐&#xff09;噪声五组噪声模型&#xff0c;程序已调通&#xff0c;可直接运行。 55高斯噪声、瑞利噪声 (xiaohongshu.com)

链表的实现(文末附完整代码)

链表的概念及结构 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 我们在上一篇文章所学习的顺序表是连续存储的 例如&#xff1a; 顺序表就好比火车上的一排座位&#xff0c;是连续的 而链表就好比是火车…