1. 论文参考(先敬大佬)
Zhou W, Guan L, Liu P, et al. Automatic firmware emulation through invalidity-guided knowledge inference[C]//30th USENIX Security Symposium (USENIX Security 21). 2021: 2007-2024.
Automatic Firmware Emulation through Invalidity-guided Knowledge Inference | USENIXhttps://www.usenix.org/conference/usenixsecurity21/presentation/zhou
2. 结合的技术
- 符合执行
- 动态模糊测试
- 固件仿真
- 固件知识提取
3. 项目部署
3.1. 部署环境
VMware Staion 17
Ubuntu 18.04
3.2. 源码位置
uEmu: 基于符号执行等程序方法自动化构建物联网设备固件仿真分析环境
3.3. Vagrant 安装——方法1
3.3.1. Git获取文件
sudo apt install git
git clone https://github.com/MCUSec/uEmu.git
cd uEmu
当前的文件目录如下:
3.3.2. 启动并连接Vagrant
前提是本系统存在vagrant(sudo apt install vagrant virtualbox)
vagrant up
vagrant ssh
启动需要大概需要10分钟左右,结束后即可ssh连接
常用命令vagrant如下:
vagrant up 启动虚拟机
vagrant ssh 登录虚拟机 在内部通过 exit 退出
vagrant status 查看虚拟机状态
vagrant halt 关机
vagrant destroy 删除虚拟机
3.4. 源码安装——方法2
3.4.1. Kvm文件修改
由于 arm kvm 模式下的 qemu 将使用来自主机 arm linux 内核的 ptrace.h,但是真正的主机 μEmu 是 X86,因此您必须将linux 源代码中的 ptracearm.h添加到您的本地路径中: /usr/include/x86_64-linux-gnu/asm
3.4.2. 软件包导入
您必须安装一些软件包才能手动构建μEmu。 μEmu所需的封装与目前的S2E 2.0相同。导入指令为:
sudo apt-get -y install build-essential cmake wget texinfo flex bison python-dev python3-dev python3-venv python3-distro mingw-w64 lsb-release
sudo apt-get update
sudo apt-get -y install libdwarf-dev libelf-dev libelf-dev:i386 libboost-dev zlib1g-dev libjemalloc-dev nasm pkg-config libmemcached-dev libpq-dev libc6-dev-i386 binutils-dev
#单独安装GCC-9,不然会出bug
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-9 g++-9
#导入依赖文件
sudo apt-get -y install libboost-system-dev libboost-serialization-dev libboost-regex-dev libbsd-dev libpixman-1-dev libncurses5 libglib2.0-dev libglib2.0-dev:i386 python3-docutils libpng-dev gcc-multilib g++-multilib gcc-9 g++-9
执行完成后,结果如下:
3.4.3. 存储库获取
mkdir uEmu
export uEmuDIR=/home/gjj/uEmu
sudo apt-get install repo
cd $uEmuDIR
repo init -u https://github.com/MCUSec/manifest.git -b uEmu(拉取失败,24.3.2)
repo sync
注:当install无法执行时,即出现进程锁定问题,输入以下指令:
已解决——需要将python版本改成3.6以上,具体步骤如下(24.12.31)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
sudo update-alternatives --config python
在遇到who you are 时
输入邮箱和名字
git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"
3.4.4. 构建μEmu
μEmu Makefile 可以按如下方式运行:
sudo mkdir $uEmuDIR/build
cd $uEmuDIR/build
make -f $uEmuDIR/Makefile && make -f $uEmuDIR/Makefile install(需要root权限,或者直接给chmod 777 权限)
需要等等很久(90min左右,看个人配置):
注意:默认情况下,该命令在发布模式下编译并安装μEmu。要更改此设置,请执行以下操作位置,运行时设置环境变量
注意:需要将作者给的文件(ptracearm.h)放入到如下目录中,并且整个过程需要用到科学上网(该文件作者也提供的了,找不到的可以私信)
3.4.5. 1.2.5 构建和准备 AFL
cd $uEmuDIR/AFL
make
sudo make install
此时就已经构建完成了测试
4. 固件测试
4.1. 测试对象
单元测试固件链接:MCUSec/uEmu-unit_tests: Unit test samples evaluated by uEmu
真实测试固件链接:MCUSec/uEmu-real_world_firmware: Real firmware fuzz-tested with uEmu
下载后,导入到项目目录中$uemu
4.2. 测试流程
4.2.1. 知识提取
以ARDUINO-F103-ADC.elf为例
python3 <repo_path>/uEmu-helper.py <firmware_name> <config_file_name> [-h] [--debug]
示例:python3 uEmu-helper.py ARDUINO-F103-ADC.elf F103.cfg
最后会显示消耗的时间,10min左右(和主机配置、固件类型、固件大小等有关)
学习完成后的KB知识库存放在/s2e-last目录中
(ARDUINO-F103-ADC.elf-round1-state33-tbnum545_KB.dat)
4.2.2. 动态模糊测试
Usage: python3 <repo_path>/uEmu-helper.py <firmware_name> <config_file_name> -kb KBFILENAME [-s SEEDFILENAME]
示例: python3 uEmu-helper.py ARDUINO-F103-ADC.elf F103.cfg -kb ./s2e-out-0/ARDUINO-F103-ADC.elf-round1-state33-tbnum545_KB.dat
执行完成后,在将文件分析形成指定的db关系数据库后,再将形成的动态分析种子和分析关系数据库作用于固件的动态测试过程。
然后在两个shell中分别执行./launch-AFL.sh 和./launch-uEmu.sh