FirmAE 模拟固件

一、介绍

FirmAE目标是创造一个可以供用户动态调试分析的环境,而不是复现和硬件一模一样的环境,,其卖点是大规模(Large-Scale)。
论文开头就直指“友商”Firmadyne,提出其模拟成功率低等问题, 其将原本Firmadyne的成功率16.28%提高到79.36%,其底层还是使用了QEMU。FirmAE 从固件的启动、网络、NVRAM、内核和其它五个方面 ,总结了导致固件仿真失败的原因及通用解决方法。
  
FirmAE中主要集成了四种模式, check模式、run模式、analyze 模式、debug 模式。在固件仿真当中我们通常利用的是前两种模式check模式和run模式。check 模式会对固件进行 仲裁仿真( arbitrated emulation 的各项操作,将设备运行后,检查网络连通性和服务可用性,最后仿真退出,保存相关的日志信息记录在缓存文件中。run模式是根据 check模式构建的各种处理信息,进行仿真,在仿真程序时不会退出。
   
在漏洞检测方面,FirmAE根据固件的文件系统和内核日志来推断Web服务状态,其发现了23个设备的12个0DAY。
    
基于Firmadyne实现了原型系统FirmAE。其总框架如下图:
FirmAE的整体架构为如上图所示。 FirmAE用和Firmadyne相似的方法(使用预构建的自定义Linux内核和库)来仿真固件映像它依然需要模拟目标镜像两次,以收集各种系统日志,并利用这些信息进行进一步的仿真,前一个仿真步骤称为 预仿真 ,后一个称为 最终仿真
Automation: 为了进行大规模分析,FirmAE致力于完全自动化。实际上Firmadyne的许多步骤已经自动化了,但是仍然需要一些用户交互。例如,用户必须首先使用特定选项提取目标固件的文件系统。然后,他们评估是否成功提取文件系统并检索架构信息。随后,他们为QEMU制作固件镜像并在预仿真中收集信息。最后,他们运行最终仿真的脚本并执行动态分析。FirmAE自动化了所有这些交互,并 添加了一个用于网络可达性和Web服务可用性的自动评估过程 为此,我们在FirmAE中构建了一个模块,定期运行ping和curl命令
Parallelizaton: FirmAE还 使用Docker 将仿真 并行化 ,以有效评估大量固件镜像 。每个固件镜像在每个容器中独立仿真,该容器配备所有所需的软件包和依赖项。这使得能够快速可靠地仿真目标镜像。FirmAE通过运行多个容器实例来并行仿真固件。 更多详细细节可参考 FirmAE论文

二、安装

1、克隆FirmAE
$ git clone --recursive https://github.com/pr0v3rbs/FirmAE
  
2、运行脚本 download.sh
$ ./download.sh  # 需要外网
  
3、运行脚本 install.sh
$ ./install.sh

三、用法

1、运行脚本 init.sh
$ ./init.sh
  
2、准备固件
   
3、检测仿真
# 检查固件是否可以仿真,会给出仿真成功后可以访问web页面的ip,或是仿真失败给出仿真失败的原因比如固件提取失败、网络构建失败、服务启动失败等
sudo ./ run . sh - c < brand > < firmware >
相关的日志在FirmAE/scratch/3/目录下,其中3是IID的值。
   
4、分析目标固件
  • 分析模式,使用FirmAE分析器
    $  sudo ./ run . sh - a < brand > < firmware >

执行fuzzer分析调用的是文件FirmAE/analyses/analyses_all.sh

根据代码(FirmAE/analyses/initializer.py)推断目前只支持netgear、asus、dlink厂商固件的fuzzer分析

  • 运行模式,有助于测试网络服务或执行自定义分析器( 在已经执行过check模式下再进行仿真时,仿真的速度会变得很快
    $  sudo ./ run . sh - r  < brand > < firmware >
出现俩个“true”表明已成功模拟固件
在node1这台机器上用浏览器打开192.168.0.1,如下:无需输入密码即可进入

四、Debug

完成run.sh -c后,可debug固件:
1. 用户级基本调试实用程序。(当模拟固件可通过网络访问时很有用)
sudo ./ run . sh - d < brand > < firmware >
   
2. 内核级引导调试。
sudo ./ run . sh - < brand > < firmware >

五、Turn on/off arbitration

检查firmae.config:

六、Docker

首先,准备一个docker镜像:
$ . /docker -init .sh
注:为了更快更顺畅的下载包与github项目,修改FirmAE/core/Dockerfile:
    
并行模式
然后,运行以下命令之一 -ec只检查仿真, -ea检查仿真并分析漏洞。
$ . / docker - helper . py  - ec brand >< firmware or  firmware_path  >   # 默认等待时间2400s
日志:FirmAE/scratch/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip.log
$ . / docker - helper . py  - ea brand >< firmware  or  firmware_path  >    # 默认等待时间3600s
日志:FirmAE/scratch/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip.log, 卡死在:
  

经分析,analyses/analyses_all.sh中执行ci、bof这两步比较慢:

可以切片缩短info减少循环次数,验证通过:analyses/fuzzer.py

或者增加超时时间:docker-helper.py

验证通过:./docker-helper.py -ea dlink firmwares/DIR850LA1_FW115WWb04.bin

调试模式
在成功模拟固件映像之后:
$ . / docker - helper . py  - ed  firmware
   
Emulation result
Google spreadsheet -  view
    
Dataset
Google drive -  download

七、参考

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
STM32F407模拟U盘固件升级是通过将STM32F407单片机作为一个虚拟的U盘设备,在电脑上进行固件升级操作的过程。 首先,我们需要连接STM32F407开发板和电脑,通过USB接口将STM32F407连接到电脑上。 然后,在STM32F407的固件中,需要实现USB设备功能,并设置为虚拟U盘设备。这需要使用STM32CubeMX软件进行配置,选择USB Device模块,并配置为Mass Storage设备模式。 接着,需要在固件中编写相应的应用程序,实现固件升级的功能。这包括接收来自电脑的固件升级文件,将文件数据保存在STM32F407的存储器中。 在固件中,还需要实现固件校验的功能,确保升级文件的完整性和正确性。可以通过计算文件的CRC校验码,并将其与预先计算好的校验码进行比较。 在固件升级的过程中,首先用户需要将电脑上的固件升级工具运行起来,并选择固件升级的选项。然后,电脑会识别STM32F407模拟的U盘设备,并将升级文件传输到STM32F407上。 在固件传输完成后,STM32F407会进行固件校验,确认升级文件的完整性和正确性。如果校验通过,STM32F407会将升级文件写入Flash存储器中,完成固件升级。 最后,在固件升级完成后,STM32F407会重新启动,加载新的固件程序,并开始运行。 总的来说,STM32F407模拟U盘固件升级是通过将STM32F407作为虚拟U盘设备,在电脑上进行固件升级的过程,需要实现USB设备功能和固件校验功能,确保升级文件的完整性和正确性。这种方案可以方便快捷地进行固件升级,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值