[docs]classSimConcretizationStrategyControlledData(SimConcretizationStrategy):""" Concretization strategy that constraints the address to controlled data. Controlled data consists of symbolic data and the addresses given as arguments. memory. """
def_concretize(self,memory,addr,**kwargs):# Get all symbolic variables in memorysymbolic_vars=filter(lambdakey:notkey.startswith("reg_")andnotkey.startswith("mem_"),memory._name_mapping.keys())controlled_addrs=sorted([_addrfors_varinsymbolic_varsfor_addrinmemory.addrs_for_name(s_var)])controlled_addrs.extend(self._fixed_addrs)# Represent controlled addresses in adjacent memory areas as "base+offset"base_length_array=[(controlled_addrs[0],0)]foriinrange(1,len(controlled_addrs)):ifcontrolled_addrs[i-1]+1==controlled_addrs[i]:base=base_length_array[i-1][0]else:base=controlled_addrs[i]base_length_array.append((base,controlled_addrs[i]-base))# create intervals from memory areasintervals=[(t[0],len(list(t[1])))fortingroupby(base_length_array,key=lambdat:t[0])]constraints=[]# create constraints from intervalsforbase,lengthinintervals:constraints.append(memory.state.solver.And(addr>=base,addr<base+length))# try to get solutions for controlled memoryored_constraints=memory.state.solver.Or(*constraints)child_constraints=(ored_constraints,)extra_constraints=kwargs.pop("extra_constraints",None)ifextra_constraintsisnotNone:child_constraints+=tuple(extra_constraints)solutions=self._eval(memory,addr,self._limit,extra_constraints=child_constraints,**kwargs)ifnotsolutions:solutions=Nonereturnsolutions