1. 论文

Mera A, Feng B, Lu L, et al. DICE: Automatic emulation of DMA input channels for dynamic firmware analysis[C]//2021 IEEE Symposium on Security and Privacy (SP). IEEE, 2021: 1938-1954.

DICE: Automatic Emulation of DMA Input Channels for Dynamic Firmware Analysis | IEEE Conference Publication | IEEE Xplorehttps://ieeexplore.ieee.org/abstract/document/9519398

该文章主要是针对P2IM中未处理的DMA请求交互进行处理,提高整体的覆盖率。若是没有看过P2IM,可以跳转到上篇文章:固件动态仿真模糊测试工具——P2IM_固件仿真工具-CSDN博客https://blog.csdn.net/gromatic/article/details/142883440?spm=1001.2014.3001.5501

2. 部署流程

2.1. 源码

https://github.com/RiS3-Lab/DICE-DMA-Emulation

2.2. 环境

VMware workstation

Ubuntu 16.04

2.3. 具体操作

2.3.1. 导入源码并同步

git clone https://github.com/RiS3-Lab/DICE-DMA-Emulation.git
cd DICE-DMA-Emulation
git submodule update --init --recursive

注意:过程需要科学上网,但在实验过程中还是会出现clone失败情况

问题1:fatal: unable to connect to git.qemu-project.org

git.qemu-project.org[0: 140.211.15.4]: errno=Connection refused

0f1246550e228ce1225111c25a1d9625.png

解决方案:

git config --global url.https://gitlab.com/qemu-project.insteadOf git://git.qemu.org
sudo vim ~/.gitconfig

替换原始的insteadof之后的路径为git://git.qemu-project.org

0dbfb68321eb96b673ba2ab71c576f5e.png

问题2:fatal: unable to connect to github.com:

github.com[0: 20.205.243.166]: errno=Connection refused

0c74a275ad1adb3824de35b3f0c2e29e.png

解决方案:

git config --global url.https://github.com/.insteadOf git://github.com/
sudo vim ~/.gitconfig

210771265fe77f5763093179e500792e.png

2.3.2. 编译QEMU

  1. 首先需要下载docker
#换源
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/gpg | apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
sudo apt-get update
###使非 root 用户能够运行 docker 容器
sudo usermod -aG docker $USER
  1. 脚本编译
###安装依赖项
sudo apt-get install curl git automake texinfo unzip
###
cd qemu/ 
WORK_FOLDER_PATH=`pwd`/src ./build_scripts/build-qemu.sh --deb64 --no-strip

需要等待一段时间

6ecdf679d23ad7917a538ee73f7b30ec.png

 

e29c94fe08efd8d75e17c48ac8d0e840.png

补充·:由于docker源失效(10.25更新)

添加源:

vi  /etc/docker/daemon.json
# 重新加载配置文件
sudo systemctl daemon-reload
# 重新启动docker服务
sudo service docker restart

源地址(添加到daemon.json)

{"registry-mirrors": [
"https://docker.fxxk.dedyn.io",
"https://docker.xn--6oq72ry9d5zx.cn",
"https://docker.m.daocloud.io",
"https://a.ussh.net",
]}

docker库存在的问题(作者已经修复)

GitHub - xgandiaga/DRIVERS: scripts so the P2IM build works

将文件下载后,直接复制到./p2im/qemu中,然后重新编译即可

WORK_FOLDER_PATH=`pwd`/src ./build_scripts/build-qemu.sh --deb64 --no-strip

2.3.3. 修补合并,编译形成DICE

DICE根目录执行

git apply ./DICE-Patches/DICE-P2IM.patch --unsafe-paths --directory ./p2im/qemu/src/qemu.git/

2.3.4. 编译AFL

cd p2im
make -C afl/

b21869414dc87c9c191fab29c9fcb242.png

2.3.5. 补充依赖(大坑)

依赖缺失,下一步一直报错

apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv

2.3.6. 编译环境

下载地址:Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

1通过 解压缩下载的文件。tar xjf *.tar.bz2

2添加提取到环境变量中的目录

(pwd查看当前路径)

echo "export PATH=/home/gjj/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH" >> /etc/profile

或是root直接写入到.bashrc

sudo -s
vim .bashrc 
#在最后加上
export PATH=/home/gjj/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH

3测试工具链是否已成功添加到。$PATH which arm-none-eabi-gcc

2.3.7. 将 DICE 补丁(附加组件)应用于 QEMU MIPS 模拟器

git apply ./DICE-Patches/DICE-MIPS-EMULATOR.patch --unsafe-paths --directory ./mips-emulator
cd mips-emulator 
./configure --prefix=/usr/local/qemu-mips --target-list=mipsel-softmmu --disable-werror --disable-xen
make

4811707ea8949537b32d897b25c02e14.png

2.4. 测试——ARM Cortex-M架构

2.4.1. 单元测试

2.4.1.1. 单个测试

对于F103_ADC_SingleConversion_TriggerTimer_DMA数模转换器单独转换模式下的软件触发模式。STM32的ADC在单次转换模式下,只执行一次转换,首先要置为ADC_CR2 寄存器的ADON 位,该模式可以通过软件触发启动,也可以通过外部触发启动(均适用于规则通道和注入通道),这时CONT 位为0。以规则通道为例,转换开始后,SWSTART位(开始规则通道转换位)自动清除,一旦所选择的通道转换完成,转换结果将被存在ADC_DR 寄存器,EOC (转换结束)标志将被置位,如果设置了EOCIE ,则会产生中断。然后ADC将停止,直到下次启动。、

执行以下命令,最后的结果输出到output文件

./run.py f103 ./Firmware/Binaries-DICE/F103_ADC_SingleConversion_TriggerTimer_DMA.elf ./output

输出后的文件包括dma路径(识别)、model建模、和统计数据

ec72205b2d49a6766cd8f0943feee4bb.png

其中第一个是来自于qemu的标准输出,作者提供了dma筛选的脚本,筛选后的结果为dma.txt

cd DICE-Evaluation/ARM/Unit-Test
 ./DMAtrace.py ./output/dma_trace ./dma.txt

DMA是通过识别DMA流,通过分析数据流向,然后根据内存访问进行筛选

733911aadb61fee1c418a2563b892d80.png

2.4.1.2. 批量单元测试

在测试前,需要对runbatch.py进行指向,实际测试中存在问题

0e1cd693b96005b1034c87769bb886d1.png

#执行ARM/Unit-Test下的runbatch.py文件
python3 ./runbatch.py -u > a.log

之后可以在revision2中看到每个模块测试结果

69407bfee25d761e1431b7c91ea845ab.png

2.4.2. 实际设备测试

./DICE-Evaluation/ARM/Fuzzing/CreateBaseDir.py  -B ~/FuzzBase -R 1.0
su -
echo core >/proc/sys/kernel/core_pattern
cd /sys/devices/system/cpu
echo performance | tee cpu*/cpufreq/scaling_governor
exit
#切换回普通用户
cd ./DICE-Evaluation/ARM/Fuzzing
export FUZZDIR=/home/$USER/FuzzBase
./fuzz.py -c ./Configs/Modbus.cfg

2.5. 核验crash

a045693276f5b531c3dd416460749e37.png

./triage_crashes.sh ~/FuzzBase/Modbus/1.0/outputs/ ~/FuzzBase/Modbus/1.0/run_fw.py 2>&1 | grep SIGNAL

636a054086517942397df34f0cc462f7.png

3. 引用

  1. unable to connect to git.qemu.org - 知乎
  2. Git报错fatal unable to connect to github.com: github.com[0: 20.205.243.166]: errno=unknown error的解决方法-CSDN博客
  3. ubuntu安装docker-ce 、docker-ce-cli、containerd.io - Unixcs - 博客园
  4. STM32分别利用软件/定时器TGRO信号触发ADC采样,包括规则组和注入组的配置方法_stm32f4定时器trgo触发adc采样-CSDN博客

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐