Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __init__(self, addr, size, ident=None, name=None, region=None, category=None):
SimVariable.__init__(self, ident=ident, name=name, region=region, category=category)
self.addr = addr
if isinstance(size, claripy.ast.BV) and not size.symbolic:
# Convert it to a concrete number
size = size._model_concrete.value
self.size = size
self._hash = None
def val_to_bv(self, *args, **kwargs):
if isinstance(self.cleanval, claripy.ast.BV):
return self
out = BiHead(self.cleanval.val_to_bv(*args, **kwargs), self.cleanval.val_to_bv(*args, **kwargs))
out.taints['deps'] = self.taints['deps']
out.taints['concrete'] = self.taints['concrete']
return out
def wrapper(self, *args, **kwargs):
# TODO: don't always get from BV, we'll run into issues...
return self._preserving_unbound(getattr(claripy.ast.BV, op_name), *args, **kwargs)
wrapper.__name__ = op_name
if (options.REVERSE_MEMORY_HASH_MAP not in self.state.options) and \
len(self.state.solver.variables(cnt)) == 0:
return
l.debug("Updating mappings at address 0x%x", actual_addr)
try:
l.debug("... removing old mappings")
# remove this address for the old variables
old_obj = self[actual_addr]
if isinstance(old_obj, SimMemoryObject):
old_obj = old_obj.object
if isinstance(old_obj, claripy.ast.BV):
if options.REVERSE_MEMORY_NAME_MAP in self.state.options:
var_set = self.state.solver.variables(old_obj)
for v in var_set:
self._mark_updated_mapping(self._name_mapping, v)
self._name_mapping[v].discard(actual_addr)
if len(self._name_mapping[v]) == 0:
self._name_mapping.pop(v, None)
if options.REVERSE_MEMORY_HASH_MAP in self.state.options:
h = hash(old_obj)
self._mark_updated_mapping(self._hash_mapping, h)
self._hash_mapping[h].discard(actual_addr)
if len(self._hash_mapping[h]) == 0:
self._hash_mapping.pop(h, None)
except KeyError:
pass
def op_to_type(op):
return claripy.ast.BV
def __init__(self):
self._object_cache = weakref.WeakValueDictionary()
self._uuid_cache = weakref.WeakKeyDictionary()
self.stored = set()
self.storing = set()
self.hash_dedup = {
claripy.ast.Base, claripy.ast.BV, claripy.ast.FP, claripy.ast.Bool, claripy.ast.Int, claripy.ast.Bits,
}
self.module_dedup = set() # {'claripy', 'angr', 'archinfo', 'pyvex' } # cle causes recursion
self.uuid_dedup = { SimState, Project }
self.unsafe_key_baseclasses = {
claripy.ast.Base, SimType
}
if (options.REVERSE_MEMORY_HASH_MAP not in self.state.options) and \
len(self.state.solver.variables(cnt)) == 0:
return
l.debug("Updating mappings at address 0x%x", actual_addr)
try:
l.debug("... removing old mappings")
# remove this address for the old variables
old_obj = self[actual_addr]
if isinstance(old_obj, SimMemoryObject):
old_obj = old_obj.object
if isinstance(old_obj, claripy.ast.BV):
if options.REVERSE_MEMORY_NAME_MAP in self.state.options:
var_set = self.state.solver.variables(old_obj)
for v in var_set:
self._mark_updated_mapping(self._name_mapping, v)
self._name_mapping[v].discard(actual_addr)
if len(self._name_mapping[v]) == 0:
self._name_mapping.pop(v, None)
if options.REVERSE_MEMORY_HASH_MAP in self.state.options:
h = hash(old_obj)
self._mark_updated_mapping(self._hash_mapping, h)
self._hash_mapping[h].discard(actual_addr)
if len(self._hash_mapping[h]) == 0:
self._hash_mapping.pop(h, None)
except KeyError:
pass
elif s < self._from_size:
if self.is_signed:
sized_args.append(claripy.SignExt(self._from_size - s, a))
else:
sized_args.append(claripy.ZeroExt(self._from_size - s, a))
elif s > self._from_size:
raise SimOperationError("operation %s received too large an argument" % self.name)
else:
sized_args = args
if self._generic_name in operation_map: # bitwise/arithmetic/shift operations
o = operation_map[self._generic_name]
else:
raise SimOperationError("op_mapped called with invalid mapping, for %s" % self.name)
return getattr(claripy.ast.BV, o)(*sized_args)
:param startpos: The index of the first argument to be used by the first element of the format string
:param args: A function which, given an argument index, returns the integer argument to the current function at that index
:return: The result formatted string
"""
argpos = startpos
string = None
for component in self.components:
# if this is just concrete data
if isinstance(component, bytes):
string = self._add_to_string(string, self.parser.state.solver.BVV(component))
elif isinstance(component, str):
raise Exception("this branch should be impossible?")
elif isinstance(component, claripy.ast.BV):
string = self._add_to_string(string, component)
else:
# okay now for the interesting stuff
# what type of format specifier is it?
fmt_spec = component
if fmt_spec.spec_type == b's':
if fmt_spec.length_spec == b".*":
str_length = args(argpos)
argpos += 1
else:
str_length = None
str_ptr = args(argpos)
string = self._add_to_string(string, self._get_str_at(str_ptr, max_length=str_length))
# integers, for most of these we'll end up concretizing values..
else:
i_val = args(argpos)