1、符号执行的分类

符号执行根据发展状况可以分为传统的符号执行、动态符号执行和选择性符号执行。 传统的符号执行并不真实的执行,而是通过解析程序通过符号值模拟执行。 动态符号执行结合了真实执行和传统符号执行技术的有点,在真实执行的过程中同时进行符号执行。 选择性符号执行可以对程序员感兴趣的部分进行符号执行,其它的部分使用真实值执行。

2、符号执行的概念

符号执行使用不执行程序使用符号值来代替具体变量,来模拟每个路径来产生每一个执行的可能性,将执行语句的结果整合成若干条数学表达式。 对某结果的数学表达式进行求解,就能获得到达该结果的路径。 将产生漏洞的条件设置为程序执行的结果,降低分析程序的难度。

3、控制流图->符号执行树

int d(int x){
  int y = 2*x;
  y--;
  if(y==2)
    x++;
  else
    x--;
  return x;
}

控制流图

1

符号执行树

2

可知有两条路径表达式: 2X-1==2 2X-1!=2 就是程序的全部路径运行结果,可以选择对应的赋值来到达对应的运行结果

4、符号传递丢失

在某些系统调用的输入输出时,可能并不会是简单的赋值,在执行类似文件调用读写之类的函数时,符号数值的会丢失,导致下一步无法获得外部正确赋值,因此,符号执行无法求解上述问题,因为在调用系统函数与外设交互的时候,符号数值的赋值过程被截断了。

参考链接1 参考链接2 参考链接3 参考链接4