FirmAFL

FirmAFL使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing。

一、项目简介

FIRM-AFL 是 第一个针对物联网固件的高吞吐量灰盒模糊测试器支持mipsel、mipseb和armel三种CPU架构 ,涵盖Firmadyne数据库中90.2%的固件。
FIRM-AFL 解决了物联网固件模糊测试的两个基本问题:
  • 解决了兼容性问题:它通过启用 posix 兼容固件的模糊处理来解决兼容性问题,这些固件可以在系统仿真器中仿真;
  • 解决了性能瓶颈:采用“ 增强进程仿真”技术解决了系统模式仿真造成的性能瓶颈。通过将 系统模式仿真 (高通用性、低效率)用户模式仿真 (低通用性、高效率)相结合,增强的进程仿真作为系统模式仿真提供了高兼容性,作为用户模式仿真提供了高吞吐量。
要模糊测试的程序主要运行在用户模式仿真,以实现高效率。只有在必要时切换到全系统仿真,以确保程序的正确执行,从而实现通用性。
FIRM-AFL基于AFL和Firmadyne实现,其中AFL负责对物联网固件中用户指定的程序进行覆盖引导模糊测试,就像使用AFL对普通用户级程序进行模糊测试一样,Firmadyne负责用户模式仿真和全系统仿真之间的切换,以确保给定的程序能够被正确地仿真。
我们设计并实现了FIRM-AFL,这是AFL的增强功能,用于模糊化物联网固件。我们 保持 AFL 的工作流程不变,并将用户模式 QEMU 替换为增强的流程仿真,其余组件保持不变。新的工作流如图 所示:

二、用法

先安装依赖:
sudo apt -get install git
sudo apt -get install binutils -dev
sudo apt -get install -y libsdl1 .2 -dev zlib1g -dev libglib2 .0 -dev libbfd -dev build -essential binutils qemu libboost -dev git libtool autoconf xorg -dev
1 、获取项目
cd /home/zhang/Desktop/
git clone https :// github . com / zyw - 200 / FirmAFL . git
2 、编辑用户模式
cd ./FirmAFL /user_mode /
./configure --target -list =mipsel -linux -user ,mips -linux -user ,arm -linux -user --static --disable -werror
make
3 、编译系统模式
cd ../qemu_mode /DECAF_qemu_2.10 /
./configure --target -list =mipsel -softmmu ,mips -softmmu ,arm -softmmu --disable -werror
make
4、安装Firmadyne
cd ../../    # 即在 FirmAFL/目录下
sudo apt -get install busybox -static fakeroot git dmsetup kpartx netcat -openbsd nmap python -psycopg2 python3 -psycopg2 snmp uml -utilities util -linux vlan
git clone --recursive https ://github .com /firmadyne /firmadyne .git
5、安装binwalk
git clone https ://github .com /devttys0 /binwalk .git   #  FirmAFL/目录下
cd binwalk
sudo ./deps .sh
sudo python ./setup .py install
6、 编译Firmadyne数据库(自行设置数据库密码)
cd ../firmadyne
sudo apt -get install -y postgresql
sudo service postgresql start
sudo service postgresql status
# 用户的密码设置为: firmadyne
sudo -u postgres createuser -P firmadyne 安装postgres后状态不对    等价于 sudo -u postgres psql -c "create role firmadyne with login password 'firmadyne';"
sudo -u postgres createdb -O firmadyne firmware # 创建数据库firmware
准备好 data.xz数据:
  data.xz_免费高速下载|百度网盘-分享无限制 (baidu.com)
cd database
cp /home /zhang /Downloads /data .xz ./    # 此处data.xz的路径请自行更改
xz -d data .xz
mv data schema
chmod +x schema
sudo -u postgres psql -d firmware < ./schema
7、 使用Firmadyne仿真固件
7.1、进入Firmadyne目录,然后打开firmadyne .config, 修改 FIRMWARE_DIR 的路径为当前 Firmadyne 目录的绝对路径
vi ../firmadyne/ firmadyne . config
# 以下为 firmadyne.config 中的内容
# uncomment and specify full path to FIRMADYNE repository
FIRMWARE_DIR = /home/zhang/Desktop/FirmAFL/firmadyne/
# specify full paths to other directories
BINARY_DIR = ${FIRMWARE_DIR} /binaries /
TARBALL_DIR = ${FIRMWARE_DIR} /images /
SCRATCH_DIR = ${FIRMWARE_DIR} /scratch /
SCRIPT_DIR = ${FIRMWARE_DIR} /scripts /
# functions to safely compute other paths
... ...
7.2、要为所有组件下载我们预先构建的二进制文件
sh ./download .sh    # 开启外网或者手工下载放到 firmadyne/binaries/目录下
7.3、 将 scripts/makeImage.sh 替换为 FirmAFL/firmadyne_modify/下的 makeImage . sh
cp ../firmadyne_modify /makeImage .sh ./scripts /
7.5、使用extractor提取filesystem
  • - nk:no kernel,不提取内核;
  • - np:no parallel operation,没有并行操作;
  • - sql: SQL服务器的主机名 
  • - b: 固件镜像的品牌
  • Images:存储压缩文件在images .
# extractor . py中的头部修改为 python3
sudo ./sources /extractor /extractor .py -b dlink -sql 127.0.0.1 -np -nk "../firmware/DIR-815_FIRMWARE_1.01.ZIP" images
提取后的文件如下:
此时数据库: psql -U firmadyne -h127.0.0.1 -p5432 -dfirmware
7.6、识别固件的架构并将结果存储在数据库的表中
sudo ./scripts /getArch .sh ./images /9050.tar.gz
此时数据库:
7.7、创建编号为9050的固件的qemu镜像
sudo ./scripts /makeImage .sh 9050
生成镜像:
/home/zhang/Desktop/FirmAFL/firmadyne//scratch//9050//image/:
/home/zhang/Desktop/FirmAFL/firmadyne//../image_9050:
7.8、指定固件的网络配置并将信息记录到 ./scratch/1/qemu.initial.serial.log
sudo ./scripts /inferNetwork .sh  9050
7.9、FirmAFL准备工作
cd ../
python3 FirmAFL_setup.py 9050 mipsel # 会在 FirmAFL/image_9050/目录下生成一些文件
8、替换run.sh
>>> 因为这个固件是项目示例,可以按照如下方法操作替换run.sh:
cp ./FirmAFL_config / 9050 /run .sh ./image_9050 /  # 即用FirmAFL_config中的run.sh替换image_9050中的run.sh
两者的区别在于:
>>> 若固件不是项目示例,则直接在FirmAFL /image_id /run .sh修改,以便使用我们修改后的 QEMU 和内核来模拟固件,并在 RAM 文件上运行。
For mipsel ,
ARCH=mipsel
QEMU="./qemu-system-${ARCH}"
KERNEL="./vmlinux.${ARCH}_3.2.1"
IMAGE="./image.raw"
MEM_FILE="./mem_file"
${QEMU} -m 256 -mem-prealloc -mem-path ${MEM_FILE} -M ${QEMU_MACHINE} -kernel ${KERNEL} \
For mipseb ,
ARCH=mips
QEMU="./qemu-system-${ARCH}"
KERNEL="./vmlinux.${ARCH}_3.2.1"
IMAGE="./image.raw"
MEM_FILE="./mem_file"
${QEMU} -m 256 -mem-prealloc -mem-path ${MEM_FILE} -M ${QEMU_MACHINE} -kernel ${KERNEL} \
9、运行模糊测试过程
运行 start.py 脚本后,FirmAFL将启动固件仿真,系统初始化(120s)后,将开始模糊测试过程。(也许你应该使用 root 权限来运行它。
cd image_9050
python3 start .py 9050
执行遇到错误:
参考: QEMU Segmentation fault when I run the example · Issue #47 · zyw-200/FirmAFL (github.com)
意思是对/home/zhang/Desktop/FirmAFL/qemu_mode/DECAF_qemu_2.10/shared/vmi.cpp中的391行注释掉,再重新 编译系统模式
最终结果:

三、参考

https://github.com/zyw-200/FirmAFL

IoT固件Rehosting综述 - FreeBuf网络安全行业门户

[翻译]Firm-AFL:高效的IOT固件灰盒fuzz-智能设备-看雪-安全社区|安全招聘|kanxue.com

FIRM-AFL: 通过增强进程仿真实现物联网固件的高吞吐量灰盒模糊测试_固件模糊测试_寂寞烟火~的博客-CSDN博客

论文FirmAFL固件模糊测试工具——复现之路_h0_yang的博客-CSDN博客

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

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

相关文章

自造简易版音频进度条

最近在做音乐播放器页面, 积累了很多有趣的经验, 今天先分享播放进度条的开发过程. 效果 话不多说&#xff0c;先看效果 支持点击修改进度&#xff0c;拖拽修改进度&#xff0c;当然大家肯定都知道ui库里面有现成的&#xff0c;为何要自己造一个 首先著名的ui库中确实都要这…

C#学习 - 方法的定义、调用、调试

方法 方法&#xff08;Method&#xff09;是由C/C中的函数&#xff08;Function&#xff09;发展而来的 //C语言 #include <stdio.h> int Add(int x, int y) {return x y; }//函数 int main(void) {int a 4;int b 2;int c Add(a, b);printf("%d %d %d\n&quo…

初识MyBatis(一)基于配置文件下的一些增删改查

MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJO&#xff08;Plain Old Java Objects&#xff0c;普通的Java对象&#xff09;映射成数据库中的记录 MyBatis 是一个 半自动的ORM&#xff08;Object Relation Mapping&#xff09;框架 创建好m…

《计算机网络安全》DNS与它的具体作用解析

初步了解DNS 个人介绍DNS定义DNS作用DNS的生活加速作用科普 个人介绍 &#x1f338;一名大四备考考研学子&#xff0c;喜欢前端&#xff0c;还有Android和JAVA开发 &#x1f332;爱看书和打游戏还有唱歌 &#x1f352;热爱编程和读古今中外名著 &#x1f33a;座右铭&#xff1…

el-form表单中不同数据类型对应的时间格式化和校验规则

1. 在表单中, 当选择不同的数据类型时, 需要在下面选择时间时和数据类型对应上, 通过监听数据类型的变化, 给时间做格式化, 2. 但是当不按顺序选择数据类型后, 再选时间可能会报错, 所以需要在dom更新后, 再清空表单. 3. 校验规则, 结束时间需要大于开始时间, 但是不能选当前的…

Jmeter引入外部jar包以满足加密数据的Post请求

目录 一、把项目打成jar包 1、创建一个Maven项目&#xff0c;并保证可以正常运行。 2、把工具类放置项目中&#xff0c;确保无报错且能够正常使用。 3、打包 4、验证 jar包是否有效 5、你想打多个工具类的包 二、在jmeter中使用 1、把jar包放到jmeter仓库下&#xff0c;…

Mixin从理论到实践

mixin从理论到实践 mixin从理论到实践一、什么是mixin二、使用mixin三、mixin的合并策略四、mixin辨析五、个人实践 mixin从理论到实践 一、什么是mixin mixin混入 — Vue.js (vuejs.org) 官方解释&#xff1a; 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue …

安全生产:CVE-2020-11022/CVE-2020-11023漏洞解析

文章目录 一、前言二、漏洞原理三、修复方案3.1 升级jQuery3.2 1.x 升级至 3.x 需要考虑的问题3.2.1 table表格元素自动添加tbody3.2.2 方法变更 3.3 jquery migrate是什么 四、拓展阅读 一、前言 代码安全扫描阶段&#xff0c;前端资源审计发现jQuery版本过低导致生产系统存在…

96. 不同的二叉搜索树

class Solution { public:int numTrees(int n) {if (n0) {return 1;}vector<int> dp(n1, 0);dp[0] 1;dp[1] 0;for (int i 1; i < n; i) {for (int j 0; j < i; j) {dp[i] dp[j] * dp[i - 1 - j];}}return dp[n];} };

grpc多语言通信之GO和DART

都是一个吗生的,找下例子 上一篇文章说到go实现的grpc方法已经实现了一个grpc的server端, 注意: 这两个项目的.proto文件应当是完全一致的,只是方法用各自的语言实现罢了 报错了: Caught error: gRPC Error (code: 12, codeName: UNIMPLEMENTED, message: grpc: Decompresso…

网络传输方式

1. 单播 1.1. 定义 单播是指一种向单个目标地址传送数据的方式&#xff0c;即单独的一对一通讯方式。 1.2. 可使用协议 UDP、TCP等协议 1.3. 常见的场景 发送电子邮件传输文件 2. 广播 2.1. 定义 一种向本地网络中所有设备发送数据的方式。 2.2. 常见的场景 电视和电…

SpringBoot+Vue 整合websocket实现简单聊天窗口

效果图 1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 &#xff08;复制一个页面&#xff0c;输入其他名字&#xff0c;方便展示效果&#xff09; 4 其他窗口效果 代码实现 后端SpringBoot项目&#xff0c;自行创建 pom依赖 <dependency><groupId…

有效回文字符串(Valid palindrome)

题目描述 思路分析 代码实践 java: public class Solutation1 {//定义一个方法&#xff0c;判断是否是有效数字或者字母private static boolean isValid(char c) {//如果不是字母或者数字&#xff0c;那就返回一个flase//这里调用了Character类里面的方法return Character.i…

Python - PyQt6、QDesigner、pyuic5-tool 安装使用

Python 开发可视化界面可以使用原生的 tkinter&#xff0c;但是原生框架使用起来颇为不方便&#xff0c;所以最流行的还是QT UI框架&#xff0c;QT是使用C语言开发&#xff0c;Python 想使用需要对其进行封装&#xff0c;所以就出现了PyQt框架&#xff0c;这个框架使用极其方便…

element的el-select给下拉框添加背景

第一步 :popper-append-to-body"false" <el-selectv-model"value"placeholder"请选择":popper-append-to-body"false"><el-optionv-for"item in options":key"item.value":label"item.label&quo…

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;Leetcode&#xff09; 这道题不难理解&#xff0c;其实就是求出最长的连续是1的子数组&#xff0c; 但是&#xff0c;他支…

Spring Reactive:响应式编程与WebFlux的深度探索

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2023-简单点-什么是protobuf?

protobuf mother: 谷歌 作用 序列化 人话&#xff1a; 存储数据的一种结构 优势在&#xff1f; 类型安全 易用性好 序列化/反序列性能好 兼容性好 不仅可以定义结构体&#xff0c;还可以定义rpc服务接口 劣势在&#xff1f; 可读性较差&#xff1a;没有schema的情况下&a…

Linux--进程--进程-父进程退出

1.进程退出函数 进程退出分为正常退出&异常退出 正常退出&#xff1a; 1、main函数调用return 2、进程调用exit(),标准c库 3、进程调用_exit()或者_Exit(),属于系统调用 补充 1、进程最后一个线程返回 2、最后一个线程调用pthread_exit 异常退出&#xff1a; 1、调用abo…

【开箱即用】开发了一个基于环信IM聊天室的Vue3插件,从而快速实现仿直播间聊天窗功能

前言 由于看到有部分的需求为在页面层&#xff0c;快速的引入一个包&#xff0c;并且以简单的配置&#xff0c;就可以快速实现一个聊天窗口&#xff0c;因此尝试以 Vue3 插件的形式开发一个轻量的聊天窗口。 这次简单分享一下此插件的实现思路&#xff0c;以及实现过程&#xf…