def func(dizzy_iterator): if target not in dizzy_iterator.current_mutated_objects: size = dizzy_iterator[target].size value = Value( pack_with_length(dizzy_iterator[start:stop].size, size, endian), size) print_dizzy("length/%s: seting to %s." % (target, value), DEBUG) dizzy_iterator[target] = value else: print_dizzy("length/%s: is not updated." % (target, ), DEBUG)
def gen_entries(self, length): bytelen = length // 8 if length % 8 > 0: bytelen += 1 if length >= 4: entr = [] entr += [tools.pack_with_length(0, length)] entr += [tools.pack_with_length(1, length)] entr += [tools.pack_with_length(2, length)] entr += [tools.pack_with_length(3, length)] entr += [tools.pack_with_length(4, length)] if length > 8: entr += [tools.pack_with_length(1, length, endian="<")] entr += [tools.pack_with_length(2, length, endian="<")] entr += [tools.pack_with_length(3, length, endian="<")] entr += [tools.pack_with_length(4, length, endian="<")] max = int(math.pow(2, length)) - 1 if length > 8: entr += [tools.pack_with_length(max - 4, length, endian="<")] entr += [tools.pack_with_length(max - 3, length, endian="<")] entr += [tools.pack_with_length(max - 2, length, endian="<")] entr += [tools.pack_with_length(max - 1, length, endian="<")] entr += [tools.pack_with_length((max / 2), length, endian="<")] entr += [tools.pack_with_length((max / 2) + 1, length, endian="<")] entr += [tools.pack_with_length(((max / 2) + 1) / 2, length, endian="<")] entr += [tools.pack_with_length(max - 4, length)] entr += [tools.pack_with_length(max - 3, length)] entr += [tools.pack_with_length(max - 2, length)] entr += [tools.pack_with_length(max - 1, length)] entr += [tools.pack_with_length(max, length)] entr += [tools.pack_with_length((max / 2), length)] entr += [tools.pack_with_length((max / 2) + 1, length)] entr += [tools.pack_with_length(((max / 2) + 1) / 2, length)] entr += [None] elif length == 3: entr = [b"\x00", b"\x01", b"\x02", b"\x03", b"\x04", b"\x05", b"\x06", b"\x07", None] elif length == 2: entr = [b"\x00", b"\x01", b"\x02", b"\x03", None] elif length == 1: entr = [b"\x00", b"\x01", None] self.lib[length] = tools.unique(entr)
def __init__(self, name, default=b'', size=None, fuzz='none', endian="!", encoding=CONFIG["GLOBALS"]["CODEC"], extra_encoding=None, extra_encoding_data=None): if isinstance(name, str) and name: self.name = name else: raise DizzyParseException("Name must be str and not empty.") self.encoding = encoding self.extra_encoding = extra_encoding self.extra_encoding_data = extra_encoding_data if isinstance(default, str): self.default = bytes(default, self.encoding) elif isinstance(default, bytes): self.default = default elif isinstance(default, int): # TODO: check size type self.default = pack_with_length(default, size, endian) else: raise DizzyParseException('Default must be str, bytes or int: %s' % name) if isinstance(size, int): self.size = slice(size, size + 1, 1) elif size is None: self.size = len(self.default) * 8 self.size = slice(self.size, self.size + 1, 1) elif isinstance(size, slice): self.size = size else: raise DizzyParseException("Unknown fuzzing mode: %s" % name) if self.size.start < 0: raise DizzyParseException( 'Length less than 0 are not allowed: %s' % name) elif self.size.stop <= self.size.start: raise DizzyParseException( 'Length less than 0 are not allowed: %s' % name) elif self.size.step is None: self.size = slice(self.size.start, self.size.stop, 1) elif self.size.step <= 0: raise DizzyParseException('Step must not be 0: %s' % name) self.fuzz = fuzz if self.fuzz == "full": if self.size.start > maxsize or self.size.stop > maxsize: raise DizzyParseException( "Cannot make dizzy with length '%d' full fuzzable, " "this would take ages: %s" % (size, name)) else: self.iter = self.iter_full self.len = 1 for r in range(self.size.start, self.size.stop, self.size.step): self.len += 2**r elif self.fuzz == 'std': self.iter = self.iter_std self.len = 1 for r in range(self.size.start, self.size.stop, self.size.step): if r > 2: self.len += 5 if r > 4: self.len += 5 if r > 7: self.len += 4 if r > 8: self.len += 4 elif self.fuzz is 'none': self.iter = self.iter_none self.len = 1 else: raise DizzyParseException("Unknown fuzzing mode: %s" % name) self.default = Value(self.default, self.size.start) self.endian = endian