ASAN(AddressSanitizer)地址消毒动态代码分析

安全之安全(security²)博客目录导读

目录

一、ASAN简介

二、获取ASAN工具

三、ASAN编译配置

1、gcc编译和链接合并

2、gcc编译和链接分开

3、交叉编译编译和链接合并

4、交叉编译编译和链接分开

四、ASAN运行选项

五、ASAN使用示例(找到溢出&泄露点)

六、ASAN+GCOV覆盖率分析


一、ASAN简介

        AddressSanitizer(又名ASan)是Google专门为C/C++开发的内存错误检测器。它主要发现以下错误:

  • Use after free (dangling pointer dereference)使用已释放内存(悬空指针解引用)
  • Heap buffer overflow (堆溢出)
  • Stack buffer overflow(栈溢出)
  • Global buffer overflow(全局buffer溢出)
  • Use after return(使用返回的栈上内存)
  • Use after scope(使用退出作用域的变量)
  • Initialization order bugs(初始化顺序bugs)
  • Memory leaks(内存泄露)

        ASAN由一个编译器检测模块(LLVM pass)和一个替换malloc函数的运行时库组成,在性能及检测内存错误方面都优于Valgrind。

        该工具适用于x86、ARM、MIPS(所有架构的32和64位版本)、PowerPC64。支持的操作系统有Linux、Darwin (OS X和iOS Simulator)、FreeBSD、Android:

ASAN(AddressSanitizer)地址消毒动态代码分析_第1张图片

二、获取ASAN工具

        AddressSanitizer从LLVM 3.1版开始是LLVM的一部分,从GCC4.8版开始是GCC的一部分。如果你喜欢从源代码构建,请参阅AddressSanitizerHowToBuild。

三、ASAN编译配置

        为了使用AddressSanitizer,你需要编译并链接你的程序,编译选项增加-fsanitize=address。要获得合理的性能,请添加-O1或更高的值。为了在错误消息中获得更好的堆栈跟踪,添加-fno-omit-frame-pointer。要启用continue-after-error(出错之后继续运行),使用-fsanitize-recover=address编译,然后使用ASAN_OPTIONS=halt_on_error=0运行代码(运行选项设置见下节)。

1、gcc编译和链接合并

gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -o vulnerable vulnerable.c

2、gcc编译和链接分开

gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -c -o vulnerable.o vulnerable.c
gcc -lasan -o vulnerable vulnerable.o

3、交叉编译编译和链接合并

aarch64-linux-gnu-gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -o vulnerable vulnerable.c

4、交叉编译编译和链接分开

aarch64-linux-gnu-gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -c -o vulnerable.o vulnerable.c
aarch64-linux-gnu-gcc -lasan -o vulnerable vulnerable.o

四、ASAN运行选项

        ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。

# halt_on_error=0:检测内存错误后继续运行

# detect_leaks=1:使能内存泄露检测

# malloc_context_size=15:内存错误发生时,显示的调用栈层数为15

# log_path=/home/xos/asan.log:内存检查问题日志存放文件路径

# suppressions=$SUPP_FILE:屏蔽打印某些内存错误

在实际运行之前可以通过export设置运行选项,比如:

export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1

五、ASAN使用示例(找到溢出&泄露点)

ASAN(AddressSanitizer)地址消毒动态代码分析_第2张图片

ASAN(AddressSanitizer)地址消毒动态代码分析_第3张图片

gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -g -o vulnerable vulnerable.c

export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1

./vulnerable

ASAN(AddressSanitizer)地址消毒动态代码分析_第4张图片

六、ASAN+GCOV覆盖率分析

gcc -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address -o vulnerable vulnerable.c -fprofile-arcs -ftest-coverage
export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1
./vulnerable

# 生成覆盖率文本报告
lcov -c -d . -o test.info --rc lcov_branch_coverage=1
# 生成覆盖率网页报告
genhtml --branch-coverage -o result test.info

ASAN(AddressSanitizer)地址消毒动态代码分析_第5张图片

ASAN(AddressSanitizer)地址消毒动态代码分析_第6张图片

ASAN(AddressSanitizer)地址消毒动态代码分析_第7张图片

参考:https://github.com/google/sanitizers/wiki/AddressSanitizer

你可能感兴趣的:(动态代码分析,ASAN,Address,Sanitizer,地址消毒,覆盖率分析)