漏洞挖掘概述
工业界主要采用Fuzz测试,Fuzz的主要目的是“crash”、“break”和“destroy”。
学术界则倾向于对源码进行静态分析,比如:数据流分析、类型验证系统、边界检验系统、状态机系统等。
一些通过源码审计检测漏洞的产品:
- Fortify:在编译阶段扫描若干安全风险
- R.A.T.S:分析C/C++语言的语法树,寻找存在潜在安全问题的函数调用
- BEAM:使用数据流分析法
- SLAM
- Flaw Finder:Python语言开发
- Prexis
动态测试技术
SPIKE
原理
数据内部之间的制约关系:如果增加某个数据域的长度,很可能需要同时修改另一个指示这个数据域长度的标志位。
引入了基于数据块的Fuzz理论,将数据的基本单位看作块,块可以是平行关系,也可以是嵌套关系:
为了构造Fuzz用例时仍能精确满足数据结构中这些相互制约的因素,实现了一套功能强大的API和数据结构用于定义数据块。
SPIKE运行在Linux下,使用时需要make文件。
示例
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include "spike.h"
void main(){
struct spike * p_spike = new_spike(); //生成结构体
setspike(p_spike); //指定当前使用的
s_string("Hello World!"); //以字符串的形式向SPIKE结构体的缓冲区添加数据
s_print_buffer(); //用于以16进制形