9

我最近读了一篇题为"All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask)"的文章Dr. EJ Schwartz。在论文中,他主要讨论了它们在二进制安全环境中的应用。符号执行和污点分析之间有什么差距?

我很好奇动态污点分析正向符号执行之间的确切区别。

从我所看到的,污点分析跟踪从对象x()信息流到对象Y(水槽),每当存放在X的信息传送到对象收率所以主要关心的是什么对象可以被传染性影响。虽然符号执行将一些输入视为符号值,并且尝试以用符号值表示其他变量;从而它回答什么条件符号输入会影响后续的程序。

我可以看到,在二进制级别,秽语分析经常被提到带有的返回地址覆盖的;而符号执行能够处理多种类型的脆弱的问题,如整数溢出运行时断言错误资源泄漏(例如,内存泄漏,文件打开/关闭),缓冲区溢出

但是似乎现代污点分析并不仅仅涉及数据流分析,大多会跟踪控制流条件;并且在多个漏洞检测场景中,受污染的输入也被表示为符号值,并按照符号执行的方式进行传播。另一方面,由于底层约束求解器和运行时的执行/解释的限制,符号执行引擎不能完全使用由不同路径条件分隔的符号值;从而无法实现预期的覆盖率高的分支路径覆盖。

所以在一般情况下,我们可以说是污点分析一种粗糙的符号执行,或象征性的执行一种精确的污点分析的?

+0

在StackExchange Computer Science或StackExchange逆向工程中发布此问题值得一试。 – stackoverflowwww 2016-02-26 18:00:20

回答

2

有趣的问题!这是我的2美分:符号执行使用一种污点分析来构造路径约束。符号执行还使用SMT/SAT解算器为变量和/或输入生成具体值,从而满足特定的路径约束条件。

由于污点分析不采用SMT/SAT解算器,我会说这不是一种符号执行。 也许人们可以说污点分析是符号执行的一部分

这只是一个意见。请随时挑战它。

0

我@Benny同意,这是一个非常有趣的问题。当你尝试回答这些问题时,你可能会学到很多东西,甚至更多。

我想添加到Benny的答案:

为了实现污点跟踪和符号执行,一个具有(在二进制文件的情况下,例如x86汇编)来定义语言的语义。例如,人们必须描述什么是“手段”,即对状态做了什么。污点跟踪语义的定义,也许可以看作是一种象征性的执行语义的的。污点跟踪语义以符号执行语义进行编码。公共部分是

  • 如果ebx被污染,则eax被污染。
  • 如果ebx是象征性的(IOW包含含有一个或多个符号VARS的SMT式)然后eax是象征

然而,对于符号执行语义必须包含进一步信息(例如精确的算术运算): - eax是“无论是eax前的” +“无论是ebx之前”

请评论或指正!

0

在我看来,要回答你的问题,我们必须回答下面的一个:1)没有符号执行必须找到污点分析就可以了,更多的所有执行路径的可能; ii)污点分析是否有可能找到符号执行可以执行的所有执行路径等等; iii)它们是否都具有找到相同执行路径的相同潜力;四)他们都可以计算其他人不能执行的路径。

在我看来,IV)是正确的,这意味着一个不是一个子集。但是,我确实同意这确实有重叠。

我们可以排除选项i)和III),因为符号执行只找到可行的执行路径,而污点分析会发现不可行的人在不诉诸约束求解。

为了消除方案二),我认为(纠正我,如果我错了),有是象征性的执行可以揭露和污点分析不能执行路径。例如:

for(int i=0;i<3;i++) { 
    if(someString.charAt(i)=='4') 
     //do something 
    else 
     //do something else 
} 

在这种情况下符号执行暴露所有八个可能的执行路径,而污点分析(如果我没有记错)没有。

+1

如果我们将执行路径限制为只有*可行*的路径,那么由污点发现的路径始终是通过符号执行找到的那些路径的子集,对吧? – 2016-11-25 06:35:26

+0

我相信如此,但我们需要一个smt求解器 – 2016-11-25 07:37:11

0

我认为关键的区别是执行是否是混凝土或符号 ---是否有兴趣在污点传播(用于检查信息泄漏或控制流劫持)上的单个具体执行,或如果你想通过利用解算器的力量探索这种传播的其他可能性动态污点分析的优点是在其低开销和因此适合运行时监测。另一方面,(纯/动态)符号执行能够探索具体路径以外的路径,因此适合对您感兴趣的安全属性进行离线分析。

相关问题