Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
File: field.py Progetto: ufwt/dizzy
    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