固件的提取

固件提取的三类方法:

  1. 直接从官网上找到目标型号的设备固件下载
  2. 使用Telnet或者ssh从目标设备中获取固件
  3. 从开发板中的flash芯片中或者通过uart和jtag调试接口将固件提取下来

JTAG(Joint Test Action Group),是一种用于测试和调试电子设备的技术标准。它使用4线或5线接口,其中有一条信号线用于提供时钟信号,其余几条信号线用于传输数据,另外还有一条地线。JTAG接口主要用于控制和调试外围设备,也可以用于检测外围设备的故障,以及更新外围设备的固件。

UART(Universal Asynchronous Receiver/Transmitter)是一种用于连接外围设备与计算机的接口,其主要功能是接收和发送数据。UART接口主要用于串行通信,可以将外围设备的数据传输到计算机,也可以将计算机的指令传输到外围设备。UART接口一般使用2线接口,一条信号线用于传输数据,另一条信号线用于提供时钟信号,还有一条地线。

USART,全称Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步异步收发传输器

第一种方法是简单的,找到相应官方的设备固件就可以下载了,我们这里来介绍一下ssh连接,来提取固件

远程提取

我们通过putty来提取固件的信息到tmp目录来

首先是配置我们的putty,IP地址的输入,连接输入password之后就会有shell,于是就直接去查看固件信息

 cat /proc/mtd

可以获取到mtd中的所有固件信息

mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "Factory"
mtd3: 01000000 00010000 "fullflash"
mtd4: 00fb0000 00010000 "firmware"
mtd5: 00100000 00010000 "kernel"
mtd6: 00eb0000 00010000 "rootfs"
mtd7: 003d0000 00010000 "rootfs_data"

同时就可以备份到tmp文件夹了

dd if=/dev/mtd0 of=/tmp/u-boot.bin 
//将/dev/mtd0的文件以u-boot.bin的名称复制到/tmp/目录
dd if=/dev/mtd1 of=/tmp/u-boot-env.bin
dd if=/dev/mtd2 of=/tmp/Factory.bin
dd if=/dev/mtd3 of=/tmp/fullflash.bin
dd if=/dev/mtd4 of=/tmp/firmware.bin
dd if=/dev/mtd5 of=/tmp/kernel.bin
dd if=/dev/mtd6 of=/tmp/rootfs.bin
dd if=/dev/mtd7 of=/tmp/rootfs_data.bin

然后我们通过WinSCP按照SCP协议进行连接(输入)相应的IP,password

然后直接把刚才备份的tmp文件进行拖拽到硬盘就可以了

硬件提取

编程器提取固件

用测试夹直接夹取flash芯片,通过相应的编程器软件直接进行提取

uart串口提取固件

先是去分辨引脚,通过万用表去测量引脚,然后通过USB设备转TTL设备

分辨完引脚,需要链接usb转ttl设备和uart接口,可以焊一排引脚或使用测试夹,测试夹更方便,这里使用测试夹。

连接时按照文章中的对应关系,GND接TTL设备GND,TXD接TTL设备RXD,RXD接TTL设备TXD,Vcc不用接。

本文设备的对应关系:灰-1-Vcc、紫-2-GND、蓝-3-RXD、绿-4-TXD

正确连接后应如下图所示,POW灯亮,TXD和RXD灯灭。

img

img

img

完成接线后就是使用终端软件来接收终端,终端软件有很多,这里使用SecureCRT,使用PuTTY或者在linux上使用Picocom也可以。然后使用SecureCRT去连接img

然后就会获得getshell

可使用的命令如下,能dump内存、读写闪存、通过tftp协议上传和下载文件、查看文件系统信息、连接云服务端等。

QQ截图20240220211242

flash命令

QQ截图20240221130511

flash -layout查看flash布局,FIRMWARE就是固件,偏移是0x32000,大小为1848k

QQ截图20240220224905

使用flash -read时,系统奔溃了,询问gpt可以了解每条报错的含义,这里大概是因为虚拟内存中0x00000000地址不可写。用flash命令提取固件不太方便。

img

fs -stat发现内存中rom的基址是BF000000,mem命令可以dump内存,那么或许可以从内存中dump闪存

img

使用mem -dump查看BF000000-BF200000的内存的16进制,和编程器提取的flash比较,发现是一致的,那么通过该命令即可转储闪存。

但是一次最多dump 16k的数据也就是0x1000,那么需要dump两百次,写脚本进行dump。

img

import serial
import serial.tools.list_ports
import osdef ser_readall():                   #读取并打印所有数据,去除回车并转义输出c = ser.read().decode('utf-8')while (c):if (c == '\r'):c = ''print(c, end='')c = ser.read(1).decode('utf-8')port_list = list(serial.tools.list_ports.comports())  #搜索可用串口
print(port_list)
if len(port_list) == 0:print('无可用串口')
else:for i in range(0,len(port_list)):print(port_list[i])ser = serial.Serial()
ser.port = 'COM9'
ser.baudrate = 117500
ser.timeout = 0.5
ser.open()
print('Port ' + ser.port + ' open state: ' + str(ser.isOpen()))
start = 0xbf000000
len = 0x1000
f = open('TL-WR886N.bin','wb')
for i in range(0x200):ser.write(b'mem -dump '  + hex(start).encode('utf-8') + b' ' + hex(len).encode('utf-8') + b'\r')start += lenline = ser.readline().decode('utf-8').replace('\r','').replace('\n','')while(line):if (line[0:2] == 'BF'):#print(line)data = line.split('  ')[1].replace(' -','')#print(data)byte = data.split(' ')#print(byte)for c in byte:word = bytes.fromhex(c)f.write(word)line = ser.readline().decode('utf-8').replace('\r','').replace('\n','')print(str(i) + '/512')

binwalk

binwalk -Me code/firmware.bin”,“-Me”表示根据magic签名的扫描结果对固件进行递归提取

终端输入“binwalk -I code/firmware.bin”。选项“-I”用于显示所有的扫描结果,包括扫描过程中被定义为“invalid”的项:

终端输入“binwalk -W code/firmware.bin code/firmware2.bin”。选项“-W”对给定的文件进行字节比较,可以指定多个文件

用法: binwalk [选项] [文件1] [文件2] [文件3] ...
文件签名扫描选项:-B, --signature              使用常见的文件签名扫描目标文件-R, --raw=<str>              使用指定字节序列扫描目标文件-A, --opcodes                使用普通可执行操作码签名扫描目标文件-m, --magic=<file>          使用指定的特殊格式文件-b, --dumb                   禁用智能签名关键字-I, --invalid                显示标记为无效的结果-x, --exclude=<str>          排除与str相匹配的结果-y, --include=<str>          只显示与str相匹配的结果提取选项:-e, --extract                自动提取已知的文件类型-D, --dd=<type:ext:cmd>      提取类型的签名<type>, 文件扩展名为 <ext>, 执行的命令 <cmd>-M, --matryoshka             递归扫描提取文件-d, --depth=<int>            限制-M递归的范围 (默认值: 8次)-C, --directory=<str>       提取文件或文件夹至指定文件夹 (默认值: 当前工作文件夹)-j, --size=<int>            限制每个提取文件的大小-n, --count=<int>            限制提取文件的数量-r, --rm                     清除在提取过程中提取工具无法处理的零大小文件。-z, --carve                  从文件中切割数据,但是不执行提取程序熵分析选项:-E, --entropy                计算文件熵-F, --fast                   使用快速但是不详细的熵分析-J, --save                   自动将由-E生成的的熵图保存为PNG文件而不是直接显示。-Q, --nlegend                将熵图的说明省略-N, --nplot                  不生成熵图-H, --high=<float>           设置上升边缘熵触发阈值 (默认值: 0.95)-L, --low=<float>           设置下降边缘熵触发阈值 (默认值: 0.85)二进制比较选项:-W, --hexdump                执行输入文件的十六进制转储(s)和颜色编码区分:绿色—这些字节在所有文件中都是相同的。红色-这些字节在所有文件中都是不同的。蓝色—这些字节在某些文件中是不同的。-G, --green                  只显示在所有文件中都相同的字节所在的行-i, --red                    只显示在所有文件中都不相同的字节所在的行-U, --blue                  只显示在某些文件中都不相同的字节所在的行-w, --terse                  比较所有文件,但是只显示第一个文件的16进制转储原始压缩选项:-X, --deflate                用蛮力识别可能的原始压缩数据流-Z, --lzma                   扫描原始LZMA压缩流-P, --partial                只使用常用的压缩选项搜索压缩流,速度快。-S, --stop                   在获得第一个结果后停止通用选项:-l, --length=<int>           需扫描的字节数-o, --offset=<int>          跳过文件偏移量开始扫描-O, --base=<int>             为所有的打印结果偏移量增加一个基址-K, --block=<int>            设置文件块大小-g, --swap=<int>             在扫描前每n字节反转一次-f, --log=<file>             把结果记录到文件-c, --csv                    把结果记录到CSV文件中-t, --term                   格式化输出,已使用终端窗口-q, --quiet                  禁用输出到标准输出-v, --verbose                启用详细输出,包括目标文件MD5和扫描时间戳。-h, --help                   显示帮助信息-a, --finclude=<str>         只扫描文件名匹配正则表达式的文件-p, --fexclude=<str>         不扫描文件名匹配正则表达式的文件-s, --status=<int>           在指定端口启动状态服务器

文件系统:
当我们要去了解一个固件时,需要去了解那些文件

  1. 根目录 (/:

    • 查看整体目录结构,了解固件的组织方式。
  2. /etc

    • 包含系统配置文件,如 fstab(文件系统表)、network/interfaces(网络配置)、passwd(用户信息)等。
    • init.d/rc?.d/ 目录中的启动脚本,特别是 rcSS* 脚本,它们定义了系统启动时的初始化流程。
  3. /bin/和/usr/bin/:

    • 包含系统命令和程序,这些命令和程序在固件运行时会被使用。
  4. /lib/和/usr/lib/:

    • 包含系统库文件,这些库文件为系统命令和程序提供必要的函数和接口。
  5. /var/:

    • 包含系统运行时产生的数据,如日志文件(/var/log/)、数据库文件等。这些文件可以提供关于系统运行的详细信息。
  6. /proc/和/sys/:

    • 这两个目录提供了内核和硬件的实时信息。/proc 是虚拟文件系统,用于访问内核空间的信息;/sys 是用于访问内核设备模型中的设备的文件系统。
  7. /boot/:

    • 包含启动加载器(如U-Boot、GRUB等)和内核映像(如 vmlinuz)以及相关的初始化RAM磁盘(initrd或initramfs)。这些文件对于系统启动至关重要。
  8. /dev/:

    • 设备文件目录,包含代表系统中物理和逻辑设备的特殊文件。这些文件允许用户空间程序与硬件设备进行交互。
  9. /sbin/:

    • 包含系统管理员使用的命令和程序,这些命令和程序通常用于维护系统或管理硬件。
  10. /usr/sbin/:

    • /sbin/ 类似,但通常包含更通用的系统管理员命令和程序。
  11. /usr/share/:

    • 包含系统文档、示例配置文件、本地化文件等。
  12. /mnt/和/media/:

    • 通常用于挂载外部文件系统和设备。虽然这些目录在固件中可能不包含任何内容,但它们的位置和用途是了解文件系统结构的重要部分。
  13. 内核模块和驱动程序(

    /lib/modules/
    
    /usr/lib/modules/
    

    ):

    • 这些目录包含内核模块(.ko 文件),这些模块允许内核在运行时加载额外的硬件支持或功能。
  14. 固件更新和恢复机制(如

    /usr/lib/firmware/
    
    /lib/firmware/
    

    ,具体取决于固件设计):

    • 这些目录可能包含用于更新或恢复固件的程序、脚本和二进制文件。
  15. 日志文件(通常位于

    /var/log/
    
    /tmp/
    

    ):

    • 日志文件可以提供有关固件运行状况、错误和警告的宝贵信息。
  16. 版本信息和构建脚本(可能位于

    /etc/
    
    /usr/share/doc/
    

    或其他位置):

    • 这些文件可以提供有关固件版本、构建日期、构建者和构建选项的信息。

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

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

相关文章

转:在Linux上运行WinForm

C#winform软件实现一次编译,跨平台windows和linux、mac兼容运行,兼容Visual Studio原生界面Form表单开发 - 亲善美 - 博客园 (cnblogs.com)一、背景: 微软的.net core开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系…

固件的烧录以及部分PCB基础

固件 固件的基础定义: 固件(firmware)一般存储于设备中的电可擦除只读存储器(允许用户通过特定的电子方式复写存储内容,在【工作情况下是只读的,并且关闭电源仍存储数据)EEPROM(Electrically Erasable Programmable ROM)或FLASH芯片中,一般可由用户通过特定的刷新程序进…

Golang:go-querystring将struct编码为URL查询参数的库

Golang:go-querystring将struct编码为URL查询参数的库 原创 吃个大西瓜 Coding Big Tree 2024-05-09 08:30 北京go-querystring is a Go library for encoding structs into URL query parameters.译文:go-querystring 将struct编码为URL查询参数的Golang库文档https://pkg.g…

C#之缓存

原文链接:https://zhuanlan.zhihu.com/p/657458522 缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快。 从概念上讲,缓存是一种性能优化策略和设计考虑因素。 缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性 既然缓存是是一种性能…

有关paddleocr在pyinstall中打包问题的解决方案

借鉴网址python解决paddleocr打包问题_pyinstaller怎么解决paddleocr中的动态导入-CSDN博客 在打包时我使用的spec文件如下:(需要将pathe和binaries换为自己的paddleocr路径) block_cipher = Nonea = Analysis([main.py], pathex=[E:\\PyEnviroment\\Lib\\site-packages…

初始docker

前置知识 通过面向对象的知识来了解docker中的镜像和容器就很好理解了,docker是C/S架构镜像:是一个只读的模板,可以用来创建容器。类容器:是docker的运行实例,提供了一个独立的可移植的环境,可以在这个环境中运行应用程序。实例,1个或多个docker仓库:用来存储docker镜像…

【日记】度过了一个堕落的周末……(184 字)

正文昨天睡了一天觉,今天看了一天《三体》电视剧。真是堕落到没边了呢(笑。本来想写代码完成年度计划,或者多写几篇文章,但实在不想写,也不想动笔。感觉这个周末什么都没做呢,休息倒是休息好了。今天 30 号,也不知道灵平安到学校没有。本有一些想写的东西,但懒得动笔了…

BigCodeBench: 继 HumanEval 之后的新一代代码生成测试基准

HumanEval 是一个用于评估大型语言模型 (LLM) 在代码生成任务中的参考基准,因为它使得对紧凑的函数级代码片段的评估变得容易。然而,关于其在评估 LLM 编程能力方面的有效性越来越多的担忧,主要问题是HumanEval 中的任务太简单,可能不能代表真实世界的编程任务。相比于 Hum…

window 下 pyenv 安装与使用

安装 GitHub上下载这个文件 https://github.com/pyenv-win/pyenv-win 点击这个 下载到本地解压文件并且重命名为> pyenv 并放置到合理位置添加环境变量 ...\pyenv-win\bin ...\pyenv-win\shims添加完成之后执行如下命令验证 pyenv --versionpyenv的基本命令 查看支持的pytho…

RabbitMQ如何备份与恢复数据

阅读目录一、场景 二、元数据备份和还原1、操作 2、导出数据3、导入数据 4、验证数据 三、消息数据备份和还原1、确定数据目录 2、为避免数据的一致性,需先停掉服务 3、备份数据目录4、还原数据 5、修改数据目录权限 6、启动B服务器上rabbitmq服务 7、验证消息数据是否还原成功…

Codeforces Round 918 G. Bicycles (二维最短路)

G. Bicycles题意:在一个无向图里你要从1点到达n点,每条路的路径长度是该路的权值乘于你当前的慢度因子。而在每个点上我们都有一个慢度因子可以进行更换,问你到达n点所需要的最短时间。 思路:我们很容易想到每次遇到更小的慢度因子我们就要更换,但因为存在你先去绕远路拿更…

中电金信:银行业私有云何去何从

​2009年,云计算开始从概念走向实践。在这一年,Gartner在预测2010十大发展趋势中,将云计算列在榜首。在这之后,谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代,这一年也被定为“云元年”。2013年4月,2013中国国际云计算技术和应用展览…

使用GCOV和LCOV测试C++代码覆盖率

使用GCOV和LCOV测试C++代码覆盖率 目录使用GCOV和LCOV测试C++代码覆盖率1. GCOV和LCOV简介2. GCOV和LCOV安装3. GCOV+LCOV测试代码覆盖率 1. GCOV和LCOV简介 GCOV是一个测试代码覆盖率的工具,可以与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测…

springboot异常解决

Circular view path [test]: would dispatch back to the current handler URL [/interceptor/test] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause问题解决 问题解释…

uniapp+thinkphp5实现微信登录

之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixi…

用免费可视化工具做智慧城市,一屏实现城市统筹管理

在智慧城市的建设中,实现高效的统筹管理是至关重要的。通过免费可视化工具“山海鲸可视化”,这一目标可以轻松达成。山海鲸可视化是一款免费可视化工具,具备二三维融合、易用性、安全性以及高质量画面渲染等特色,是制作智慧城市可视化大屏的理想选择。山海鲸可视化的二三维…

【论文阅读】Position: What Can Large Language Models Tell Us about Time Series Analysis

原始题目:Position: What Can Large Language Models Tell Us about Time Series Analysis 中文翻译:立场:关于时间序列分析,大型语言模型能告诉我们什么 发表时间:2024-06-01 平台:ICML 文章链接:http://arxiv.org/abs/2402.02713 开源代码:NA摘要 时间序列分析对于理…

TDA4与Openvx技术开发示例

TDA4与Openvx技术开发示例 [TI TDA4 J721E]基于TDA4平台 FFmpeg / X264 的ARM平台移植 https://blog.csdn.net/AIRKernel/article/details/121483611 创建了开源的Demo演示案例库,后续会把Demo代码放到这个Gitee库里:TDA4/TI TDA4 https://gitee.com/tda4/ti-tda4欢迎大家加入…

遇到的线上问题之“动态数据源报错-recyle error java.lang.InterruptedException”

Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决 一、线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。[][ERROR][2024-07-01 …

遇到的线上问题之“recyle error java.lang.InterruptedException”

Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决 一、线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。[][ERROR][2024-07-01 …