1、符号执行的分类
符号执行根据发展状况可以分为传统的符号执行、动态符号执行和选择性符号执行。
传统的符号执行并不真实的执行,而是通过解析程序通过符号值模拟执行。
动态符号执行结合了真实执行和传统符号执行技术的有点,在真实执行的过程中同时进行符号执行。
选择性符号执行可以对程序员感兴趣的部分进行符号执行,其它的部分使用真实值执行。
2、符号执行的概念
符号执行使用不执行程序使用符号值来代替具体变量,来模拟每个路径来产生每一个执行的可能性,将执行语句的结果整合成若干条数学表达式。
对某结果的数学表达式进行求解,就能获得到达该结果的路径。
将产生漏洞的条件设置为程序执行的结果,降低分析程序的难度。
3、控制流图->符号执行树
int d(int x){
int y = 2*x;
y--;
if(y==2)
x++;
else
x--;
return x;
}
可知有两条路径表达式:
2X-1==2
2X-1!=2
就是程序的全部路径运行结果,可以选择对应的赋值来到达对应的运行结果
4、符号传递丢失
在某些系统调用的输入输出时,可能并不会是简单的赋值,在执行类似文件调用读写之类的函数时,符号数值的会丢失,导致下一步无法获得外部正确赋值,因此,符号执行无法求解上述问题,因为在调用系统函数与外设交互的时候,符号数值的赋值过程被截断了。