污染信息越多,传播就越广,我们就需要花费更多的资源来追踪它。在fuzzing环境下, 使用污染数据来反馈程序行为,甚至服务端配置也可标记为污点(为了避免采用各种配置方 式来测试服务端软件【22】)。当从非污染源或者污染源接收到任务后,污染信息仅仅会被删 除,同时生成一攻击者不可控制的常数值。很多程序指令将会污染到数据,因此在进行程序 分析时,污染数据会增多。 上例是一个很清晰的程序执行流,因为定义值在一些独立条件下将接收到程序所使用的 污染值。当条件确定后,程序调用的执行流就很明确了,例如下面: if (x == 1) y=0; 这个在后面笔者会有所分析,对于条件语句就需要一种特殊的分析方式,分析它时一些工具 确实很有用,比如町沾8&插件。 在追踪数据时存在两种特殊情况,一种是部分污染(当非污染源并不能完全控制污染数 据时),另一种是混合污染(当来自某数据的两种不同非污染源被使用时)。总的来说,结果 还是被污染了。当一个数据域被某操作数引用时,它就“被使用” 了;而当数据被修改时, 它被“定义” 了。纯粹完成某些任务的指令是很容易追踪的,如果污染地址被用来定义其它 地址,那么这一新地址也将被污染。字符串操作在以下情况会被污染到: 參使用污染地址去计算字符串大小,例如: E. g: a = strlen(tainted(string)); 当字符串被污染后,我们就可以认定攻击者也控制了&值。 參使用污染地址去搜索特定字符,并通过设置打明标志来定义是否找到,例如: pointer = strchr(tainted(string), some_char); if (pointer) flag=l; 当字符串被污染后,我们就可以认定攻击者也部分控制了 Hag,如果攻击者控制 了其它8(»^_0^^:值也有类似效果。 当执行的指令已经使用了至少一个污染数据,那么通常都会得到一个被污染的结果,因为攻 击者起码已经部分控制了结果。这些指令可简单地使用中间语言来映射成布尔操作,并遵循以下规则: 0r truth table: X Y X or Y 0 0 0 0 1 1 1 0 1 1 1 1 And truth table X Y X and Y 0 0 0 0 1 0 1 0 0 1 1 1 Xor truth table X Y X xor Y 0 0 0 0 1 1 1 0 1 1 1 0
假设使用了一处污染数据: |