install python
环境 ubuntu18.04
安装python
sudo apt install python
sudo apt install python-pip
sudo apt install python3
sudo apt install python3-pip
安装python3虚拟环境
sudo pip3 install virtualenv
sudo pip3 install virtualenvwrapper
在普通用户下,进入
gedit ~/.bashrc
在末尾加入内容
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3.6'
source /usr/local/bin/virtualenvwrapper.sh #实际安装的virtualenvwrapper.sh的路径,可以用 which virtualenvwrapper.sh查看
然后使用如下命令
source ~/.bashrc
安装hal_fuzz
官网在这里https://github.com/ucsb-seclab/hal-fuzz
首先从github上clone hal-fuzz下来,然后
mkvirtualenv -p /usr/bin/python3 halfuzz
sudo ./setup.sh
hal-fuzz
论文名称为HALucinator: Firmware Re-hosting ARTIFACT
Through Abstraction Layer Emulation
1. 论文思路
发现各个硬件制造产商提供了一个叫做Hardware Abstraction Layers (HALs)
的东西。
HALs是提供给编程师的软件库,其提供了高级别的硬件操作,同时隐藏固件执行时 各个芯片 或 系统的执行细节。这使得程序员的代码移植变得容易起来
论文作者发现,基于HALs的固件在设计上,更加与硬件脱钩,因此可以方便的实现模拟。
作者想到,结合HALs和可重复使用的替代功能,即HLE(High Level Emulation),可是实行高效率的firmware fuzz
2. 实现方法
首先识别 在firmware中的 那些和硬件交互的 HAL 函数
其次 提供一个简单的,由分析师创建的,高级别的替代函数(可以提供和HAL函数在概念上一致的功能)
值得注意的是,为了找到硬件交互的HAL函数,源码是需要的(至少也要有带符号的firmware)
找到了这些交互函数后,用自己实现的函数进行替代。
3. 前置条件
- 需要事先知道firmware的架构和内存布局(比如Flash和Ram的位置)(可以在手册上找到)
- 已经获得了要模拟的固件所需的底层库,例如 OS library,middleware或者networking stacks,还有固件制造商的工具编译链来编译它们(官网有)
- 一个用于执行模拟指令的程序,例如qemu
总结一下,需要拿到firmware,知道生产商,获得它们的SDK
4. 实现细节
(1) locate the HAL library functions in the firmware (e.g., via library matching)
这一步很重要,因为firmware都是完整的,所以firmware自然包含 HAL library中的function,我们要做的是,firmware和 HAL library中的函数进行比对,找到匹配的函数
但是这一步有很多困难: 一般HAL library的函数在编译时会被优化,可能和HAL library中生成的代码不一致;有一些小型的HAL library函数会被预处理;而且一些 HAL library函数还会调用应用程序函数,可能还是可以重写的,十分麻烦
论文作者使用的方法是:
对HAL library进行编译,后生成的库中的每一个函数收录CFG和IR表示,造一个数据库
第一步: Statistical comparison,通过比对 基本块的数量,CFG边和函数调用,去除不必要的
第二步: Basic Block Comparison,用第一步的输出作为输入,比较两个函数的IR表达是否一致,然而,这个比对并不包括一些指针和相对偏移,以及函数调用等等
第三步: Contextual Matching,用第二步的输出作为输入,因为会有一些错误匹配,因此借助目标函数在firmware中的调用上下文来消除歧义。通过在程序中使用匹配来查找位置来推断其函数可能是什么。使用caller context and callee context
说白了,就是用firmware中这个函数中调用的所有函数名称集合,和匹配到HAL library函数中调用的所有函数名称集合进行比对。再用 firmware中这个函数被调用的所有函数的名称集合,和匹配到的HAL library函数被调用的所有函数名称集合进行比对
第四步: The Final Match,A valid match is identified if a unique
name is assigned to a given function in the target binary
(2) provide high-level replacements for HAL functions
(3) enable external interaction with the emulated firmware