漏洞挖掘技术

漏洞挖掘技术简介

  • 漏洞挖掘概述
  • 动态测试技术
    • SPIKE
        • 原理
        • 示例
    • beSTORM
  • 静态代码审计
            • 参考文献

漏洞挖掘概述

工业界主要采用Fuzz测试,Fuzz的主要目的是“crash”、“break”和“destroy”。

学术界则倾向于对源码进行静态分析,比如:数据流分析、类型验证系统、边界检验系统、状态机系统等。

一些通过源码审计检测漏洞的产品:

  • Fortify:在编译阶段扫描若干安全风险
  • R.A.T.S:分析C/C++语言的语法树,寻找存在潜在安全问题的函数调用
  • BEAM:使用数据流分析法
  • SLAM
  • Flaw Finder:Python语言开发
  • Prexis

动态测试技术

SPIKE

原理

数据内部之间的制约关系:如果增加某个数据域的长度,很可能需要同时修改另一个指示这个数据域长度的标志位。

引入了基于数据块的Fuzz理论,将数据的基本单位看作块,块可以是平行关系,也可以是嵌套关系:
漏洞挖掘技术_第1张图片
为了构造Fuzz用例时仍能精确满足数据结构中这些相互制约的因素,实现了一套功能强大的API和数据结构用于定义数据块。

SPIKE运行在Linux下,使用时需要make文件。

示例

示例代码:

#include 
#include 
#include 
#include "spike.h"

void main(){
	struct spike * p_spike = new_spike();     //生成结构体
	setspike(p_spike);                        //指定当前使用的
	s_string("Hello World!");                 //以字符串的形式向SPIKE结构体的缓冲区添加数据
	s_print_buffer();                         //用于以16进制形式输出当前缓冲区的数据
}

SPIKE使用s_block_start()s_block_end()函数来定义一个数据块:

#include 
#include 
#include 
#include "spike.h"

void main(){
	struct spike * p_spike = new_spike();
	setspike(p_spike);
	spike_clear();
	
	s_block_start("main_block");
		s_string("cmd_main");
		s_binary_block_size_intel_word("main_block");
		
		s_block_start("sub_block1");
			s_string("cmd_sub1");
			s_binary_block_size_intel_word("sub_block1");
			s_binary("909090909090909090");
		s_block_end("sub_block1");
		
		s_block_start("sub_block2");
			s_string("cmd_sub2");
			s_binary_block_size_intel_word("sub_block2");   //获取block的大小
			s_binary("44444444");
		s_block_end("sub_block2");
	s_block_end("main_block");
	s_print_buffer();
	spike_free(p_spike);
}

Fuzz示例:

#include 
#include 
#include 
#include "spike.h"

void main(){
	int i,k;
	struct spike * p_spike = new_spike();
	setspike(p_spike);
	spike_clear();
	
	//s_init_fuzzing;               //使用自带畸形数据库
	s_add_fuzzstring("fuzz1111111");      //添加自定义的畸形数据
	s_add_fuzzstring("fuzz2222222");
	s_resetfuzzvariable();
	
	for (k=0;k<2;k++){
		for (i=0; i<s_get_max_fuzzstring(); i++){
			spike_clear();            //清空SPIKE缓存
			s_incrementfuzzstring();     //使用下一个畸形数据
			s_string("aaaaaaaaaa");
			s_string_variable("");
			s_string("bbbbbbbbbb");
			s_string_variable("");
			s_string("cccccccccc");
			s_print_buffer();
		}
		s_increntfuzzvariable();       //移向下一个变量的位置进行Fuzz
	} 
	
	spike_free(p_spike);
}

beSTORM

静态代码审计

  • Coverity
参考文献

《0day安全:软件漏洞分析技术》

你可能感兴趣的:(0day安全:软件漏洞分析技术)