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

news2024/11/17 5:44:07

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.coloradmin.cn/o/1200727.html

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

相关文章

flutter逆向 ACTF native app

前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…

RGMII回环:IDDR+ODDR+差分接口

目录 一、实验内容二、原理解释三、程序1、顶层文件:2、子模块2.1 oddr模块2.2、iddr顶层模块2.3、iddr子模块 3、仿真4、注意5、下载工程及仿真 一、实验内容 1、通过IDDR和ODDR的方式完成RGMII协议; 2、外部接口使用OBUFDS、IBUFDS转换成差分接口&…

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言,具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现,C在…

如何确定线程栈的基址?

起 很早之前,我遇到过几个与栈相关的问题,当时总结过几篇关于线程栈的文章,分别是 《栈大小可以怎么改?》、《栈局部变量优化探究,意外发现了 vs 的一个 bug ?》、《栈又溢出了》、《有趣的异常》。在这几…

【fast2021论文导读】 Learning Cache Replacement with Cacheus

文章:Learning Cache Replacement with Cacheus 导读摘要: 机器学习的最新进展为解决计算系统中的经典问题开辟了新的、有吸引力的方法。对于存储系统,缓存替换是一个这样的问题,因为它对性能有巨大的影响。 本文第一个贡献,确定了与缓存相关的特征,特别是,四种工作负载…

C++基础(2)——类和对象

目录 1. 类的引入: 2. 类的定义: 2.1类的定义以及基本结构: 2.2 类的访问限定符: 3. 类的声明与定义的分离: 4. 类的实例化: 5. 类的大小计算: 1. 类的引入: 在数据结构系列的…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件(电阻、电容、电感)组成,则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传

一. 先看效果演示 二. 图片上传 用的el-upload加el-image组件 html部分 <el-dialog> ...//无关代码已省略<div v-for"item in imgArr" :key"item.index"><span>{{ item.name }}</span><el-upload action"#" list-t…

【408】计算机学科专业基础 - 数据结构

数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据&#xff1a; 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…

K8S知识点(十)

&#xff08;1&#xff09;Pod详解-启动命令 创建Pod&#xff0c;里面的两个容器都正常运行 &#xff08;2&#xff09;Pod详解-环境变量 &#xff08;3&#xff09;Pod详解-端口设置 &#xff08;4&#xff09;Pod详解-资源配额 修改&#xff1a;memory 不满足条件是不能正常…

揭秘:车企如何利用5R模式在数位行销领域取得突破

01 车企进入“大逃杀”时间 汽车行业一边是出口“捷报频传”&#xff0c;一边是内销“压力山大”。 内销的难&#xff0c;在之前中部某省的政府“骨折价”补贴掀起的“价格战”中已经可见一斑。这一颇具标志性的事件反映了汽车行业&#xff0c;尤其是燃油车行业正处在巨大的转…

曾被揭露造假的越南,再次宣称研发成功5G芯片,这是真的么?

日前在2023 年越南国际创新展 (VIIE 2023) 上&#xff0c;越南的Viettel宣布成功研发5G芯片&#xff0c;可以应用于5G基站&#xff0c;并表示该公司已成为全球第六大芯片设备供应商。 越南是近10年来制造业发展强劲的国家之一&#xff0c;甚至还在2022年成为全球经济增长最快的…

C#多线程入门概念及技巧

C#多线程入门概念及技巧 一、什么是线程1.1线程的概念1.2为什么要多线程1.3线程池1.4线程安全1.4.1同步机制1.4.2原子操作 1.5线程安全示例1.5.1示例一1.5.2示例二 1.6C#一些自带的方法实现并行1.6.1 Parallel——For、ForEach、Invoke1.6.1 PLINQ——AsParallel、AsSequential…

TSINGSEE视频智能分析人员入侵AI检测算法如何让城市管理更加高效、智慧?

在城市管理场景中&#xff0c;经常面临着禁区垂钓、非法捕捞、行人闯红灯、小区盗窃、车辆乱停乱放等一系列管理难题&#xff0c;这给城市发展带来了不小的阻力&#xff0c;同时也极易增加管理的人力、物力和财力。传统的人员巡逻监管效率低并且存在时间差&#xff0c;很难及时…

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!

Yo开发达人们&#xff0c;我们有重磅新功能要给你们放送啦&#xff01; Check it out 数据汇总不再单调&#xff0c;新的聚合函数登场&#xff01; compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…

内存映射:PS和PL DDR3的一些区别

之前写的一些资料&#xff1a; PS与PL互联与SCU以及PG082-CSDN博客 参考别人的资料&#xff1a; PL读写PS端DDR的设计_pl读写ps端ddr数据-CSDN博客 xilinx sdk、vitis查看地址_vitis如何查看microblazed地址_yang_wei_bk的博客-CSDN博客 可见&#xff0c;PS端的DDR3需要从…

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

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

msvcp120.dll丢失的6种解决方法,教你如何修复dll文件丢失

“找不到msvcp120dll,无法继续执行代码的6个修复方案”。我相信很多朋友在运行某些程序时&#xff0c;可能会遇到这样的错误提示&#xff1a;“找不到msvcp120dll&#xff0c;无法继续执行代码”。那么&#xff0c;msvcp120dll究竟是什么&#xff1f;为什么会丢失呢&#xff1f…

Java基础知识第四讲:Java 基础 - 深入理解泛型机制

Java 基础 - 深入理解泛型机制 背景&#xff1a;Java泛型这个特性是从JDK 1.5才开始加入的&#xff0c;为了兼容之前的版本&#xff0c;Java泛型的实现采取了“伪泛型”的策略&#xff0c;即Java在语法上支持泛型&#xff0c;但是在编译阶段会进行所谓的“类型擦除”&#xff0…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS&#xff1f; 一、NestJS特性&#xff1f;二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS&#xff1f; Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…