符号执行Symcc与模糊测试AFL结合实践
本文为看雪论坛优秀文章
看雪论坛作者ID:FSTARK
背景介绍
1. 模糊测试 AFL
模糊测试(fuzz testing, fuzzing)是一种软件测试技术。其核心思想是将自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃、断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。
The goal of this project is to evaluate the robustness of various UNIX utility programs, given an unpredictable input stream. [...] First, you will build a fuzz generator. This is a program that will output a random character stream. Second, you will take the fuzz generator and use it to attack as many UNIX utilities as possible, with the goal of trying to break them.
AFL(american fuzzy lop)最初由Michał Zalewski开发,和libFuzzer等一样是基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。其工作流程大致如下:
(1) 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage)
2. 符号执行 Symcc
作者提出的SymCC不同点在于,直接在编译期就开始在生成的IR上植入符号执行相关代码,进一步提升性能;其流程大致如下:
开始结合
1. 安装各种环境
sudo apt-get install -y cargo \
clang-10 \
cmake \
g++ \
git \
libz3-dev \
llvm-10-dev \
llvm-10-tools \
ninja-build \
python3-pip \
zlib1g-dev
pip3 install lit
git clone https://github.com/Z3Prover/z3
cd z3
python scripts/mk_make.py
cd build
make
sudo make install
git clone -b v2.56b https://github.com/google/AFL.git afl
cd afl && make
git clone https://github.com/eurecom-s3/symcc symcc_source
cd symcc_source
git submodule init
git submodule update
2. 编译backend
首先编译简单的后端,这里的LLVM_DIR指向你所用版本llvm位置 。
mkdir symcc_build_simple
cd symcc_build_simple
CC=clang-10 CXX=clang++-10 cmake -G Ninja \
-DQSYM_BACKEND=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DZ3_TRUST_SYSTEM_VERSION=on \
-DLLVM_DIR=/usr/lib/llvm-10/cmake \
../symcc_source \
&& ninja check
mkdir symcc_build_qsym
cd symcc_build_qsym
cmake -G Ninja \
-DQSYM_BACKEND=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DZ3_TRUST_SYSTEM_VERSION=on \
-DLLVM_DIR=/usr/lib/llvm-10/cmake \
-DZ3_DIR=/home/fstark/symcc_afl/z3/build \
../symcc_source \
&& ninja check \
&& cargo install --path ../symcc_source/util/symcc_fuzzing_helper
3. 用symcc编译llvm的libcxx
编译过程如下:
git clone -b llvmorg-10.0.1 --depth 1 https://github.com/llvm/llvm-project.git llvm_source
mkdir libcxx_symcc_install
mkdir libcxx_symcc_build
cd libcxx_symcc_build
export SYMCC_REGULAR_LIBCXX=yes SYMCC_NO_SYMBOLIC_INPUT=yes \
&& cmake -G Ninja ../llvm_source/llvm \
-DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi" \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DLLVM_DISTRIBUTION_COMPONENTS="cxx;cxxabi;cxx-headers" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$BASE/libcxx_symcc_install \
-DCMAKE_C_COMPILER=$BASE/symcc_build_simple/symcc \
-DCMAKE_CXX_COMPILER=$BASE/symcc_build_simple/sym++ \
&& ninja distribution && ninja install-distribution
4. 开始尝试Fuzz!
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int foo(char *arr, int t1){
int i = 0;
if (arr[i++] == 'c') return 0;
if (arr[i++] == 'd') return 1;
if (arr[i++] == 'c') return 2;
if (arr[i++] == 'c') return 3;
if (arr[i++] == 's') return 4;
if (arr[i++] == 'b') return 5;
if (arr[i++] == 's') return 6;
if (arr[i++] == 'g') return 7;
if (*(int*)arr != 0xdeadbeef )return 0;
//Can we trigger this code?
return (int)(20 / t1);
}
int main(int argc, char* argv[]){
//open file
FILE *f = fopen(argv[1],"rb");
// get file size
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
// read file contents
fseek(f, 0, SEEK_SET);
char *string = malloc(fsize + 1);
fread(string, 1, fsize, f);
fclose(f);
// pass string to foo
int retval = foo(string, argc-2);
free(string);
return retval;
}
afl-clang -O0 int_check.c -o afl_int_check
../symcc_build_qsym/symcc -O0 int_check.c -o symcc_int_check
mkdir corpus
echo "AAAAAAAAAAAAAAAAAAAAAAAA" > corpus/seed
afl-fuzz -M fuzz1 -i corpus/ -o out -m none -- ./afl_int_check @@
afl-fuzz -S fuzz2 -i corpus/ -o out -m none -- ./afl_int_check @@
~/.cargo/bin/symcc_fuzzing_helper -o out -a fuzz2 -n symcc -- ./symcc_int_check @@
总结
参考资料
https://github.com/eurecom-s3/symcc/
看雪ID:FSTARK
https://bbs.pediy.com/user-home-832012.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
[广告]赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 微信语音通话频繁中断你遇到没!苹果回应:可能与程序崩溃有关
- gStore面向RDF知识图谱的原生图数据库系统
- BlueHost和Hostwinds主机哪个好?
- 人物 | 悬镜安全random:解密供应链安全情报的头号黑客
- 创新“零事故”之路:2022年北京网络安全大会开幕
- 学习通否认 QQ 号被盗与其有关:已报案;iPhone 14 量产工作就绪:四款齐发;简洁优雅的软件早已是明日黄花|极客头条
- 当程序员把手伸向同事时……
- 议题征集中!2021 SDC不见不散!
- 2021版Java知识体系详解!(赠视频)
- 大年初三:八方六路,一骑绝尘
- Brave 浏览器宣布集成 IPFS 协议,它会取代 HTTP 吗?
- 亚洲诚信 CertCloud全球首发,硬核解决SSL/TLS证书管理困局