ASAN简介
ASAN(Address Sanitizer)是linux下的内存检测工具,早先是LLVM中的特性,后来被加入GCC 4.9,现被clang和gcc支持,用于运行的时候对内存进行检测,以达到发现内存漏洞的效果。
在开启ASAN后。afl插桩则会在目标代码的关键位置添加检查代码,例如:malloc(),free()等,一旦发现了内存访问错误,便可以SIGABRT中止程序。
注意:
例如越界读等内存访问错误不一定会造成程序的崩溃,所以在没有开启ASAN的情况下,许多内存漏洞都无法被AFL给发现。所以在编译二进制代码的时候,强烈建议开启ASAN。
ASAN开启后的fuzzing会消耗更多的内存,这是需要注意的因素,对于32位的程序,基本上800MB即可;但64为程序大概需要20TB,所以,使用ASAN的话,建议添加CFLAGS=-m32来限制编译目标为32位,
否则,可能应为64位消耗内存过多而造成程序崩溃。
在使用了ASAN之后,可以再alf-fuzz的时候通过选项-m来指定使用的内存上限。启用了ASAN的32位程序,一般设置-m 1024即可。
ASAN的使用
ASAN是GCC支持的一个性能,所以,在使用ALF对软件进行编译之前,只需要设置环境变量即可,指令如下:
cd packet
export AFL_USE_ASAN=1
env
ASAN的开启,如果是针对小程序的话,只需要在编译的同时,加上选项--fsanitizer=address即可。
编译结束之后,为了保证我们的软件成功的开启了ASAN并且在目标代码的关键位置插入了检查代码,我们还需要用命令进行检测,命令如下:
strings ffmpeg | grep 'asan'
若已经成功的开启ASAN编译了目标软件,则会看到如图结果: