def __init__ (self, block_name, request, offset=0, length=4, endian="<", format="binary", synchsafe=False, inclusive=False, signed=False, math=None, fuzzable=False, name=None): ''' Create a sizer block bound to the block with the specified name. You *can not* create a sizer for any currently open blocks. @type block_name: String @param block_name: Name of block to apply sizer to @type request: s_request @param request: Request this block belongs to @type offset: Integer @param offset: (Optional, def=0) Offset for calculated size value @type length: Integer @param length: (Optional, def=4) Length of sizer @type endian: Character @param endian: (Optional, def=LITTLE_ENDIAN) Endianess of the bit field (LITTLE_ENDIAN: <, BIG_ENDIAN: >) @type format: String @param format: (Optional, def=binary) Output format, "binary" or "ascii" @type inclusive: Boolean @param inclusive: (Optional, def=False) Should the sizer count its own length? @type signed: Boolean @param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii") @type math: Function @param math: (Optional, def=None) Apply the mathematical operations defined in this function to the size @type fuzzable: Boolean @param fuzzable: (Optional, def=False) Enable/disable fuzzing of this sizer @type name: String @param name: Name of this sizer field @type synchsafe: Boolean @param synchsafe: (Optional, def=False) Synchsafe (https://en.wikipedia.org/wiki/Synchsafe) ''' self.block_name = block_name self.request = request self.offset = offset self.length = length self.endian = endian self.format = format self.inclusive = inclusive self.signed = signed self.math = math self.fuzzable = fuzzable self.name = name self.synchsafe = synchsafe self.original_value = "N/A" # for get_primitive self.s_type = "size" # for ease of object identification self.bit_field = primitives.bit_field(0, self.length*8, endian=self.endian, format=self.format, signed=self.signed, synchsafe=self.synchsafe) self.rendered = "" self.fuzz_complete = self.bit_field.fuzz_complete self.fuzz_library = self.bit_field.fuzz_library self.mutant_index = self.bit_field.mutant_index self.value = self.bit_field.value if self.math == None: self.math = lambda (x): x
def __init__ (self, block_name, request, offset=0, length=4, endian="<", format="binary", inclusive=False, signed=False, math=None, fuzzable=False, name=None): ''' Create a sizer block bound to the block with the specified name. You *can not* create a sizer for any currently open blocks. @type block_name: String @param block_name: Name of block to apply sizer to @type request: s_request @param request: Request this block belongs to @type length: Integer @param length: (Optional, def=4) Length of sizer @type offset: Integer @param offset: (Optional, def=0) Offset for calculated size value @type endian: Character @param endian: (Optional, def=LITTLE_ENDIAN) Endianess of the bit field (LITTLE_ENDIAN: <, BIG_ENDIAN: >) @type format: String @param format: (Optional, def=binary) Output format, "binary" or "ascii" @type inclusive: Boolean @param inclusive: (Optional, def=False) Should the sizer count its own length? @type signed: Boolean @param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii") @type math: Function @param math: (Optional, def=None) Apply the mathematical operations defined in this function to the size @type fuzzable: Boolean @param fuzzable: (Optional, def=False) Enable/disable fuzzing of this sizer @type name: String @param name: Name of this sizer field ''' self.block_name = block_name self.request = request self.offset = offset self.length = length self.endian = endian self.format = format self.inclusive = inclusive self.signed = signed self.math = math self.fuzzable = fuzzable self.name = name self.original_value = "N/A" # for get_primitive self.s_type = "size" # for ease of object identification self.bit_field = primitives.bit_field(0, self.length*8, endian=self.endian, format=self.format, signed=self.signed) self.rendered = "" self.fuzz_complete = self.bit_field.fuzz_complete self.fuzz_library = self.bit_field.fuzz_library self.mutant_index = self.bit_field.mutant_index self.value = self.bit_field.value if self.math == None: self.math = lambda (x): x
def __init__ (self, block_name, request, offset=0, length=4, endian="<", format="binary", synchsafe=False, inclusive=False, signed=False, math=None, fuzzable=False, name=None): ''' Create a sizer block bound to the block with the specified name. You *can not* create a sizer for any currently open blocks. @type block_name: String @param block_name: Name of block to apply sizer to @type request: s_request @param request: Request this block belongs to @type offset: Integer @param offset: (Optional, def=0) Offset for calculated size value @type length: Integer @param length: (Optional, def=4) Length of sizer @type endian: Character @param endian: (Optional, def=LITTLE_ENDIAN) Endianess of the bit field (LITTLE_ENDIAN: <, BIG_ENDIAN: >) @type format: String @param format: (Optional, def=binary) Output format, "binary" or "ascii" @type inclusive: Boolean @param inclusive: (Optional, def=False) Should the sizer count its own length? @type signed: Boolean @param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii") @type math: Function @param math: (Optional, def=None) Apply the mathematical operations defined in this function to the size @type fuzzable: Boolean @param fuzzable: (Optional, def=False) Enable/disable fuzzing of this sizer @type name: String @param name: Name of this sizer field @type synchsafe: Boolean @param synchsafe: (Optional, def=False) Synchsafe (https://en.wikipedia.org/wiki/Synchsafe) ''' self.block_name = block_name self.request = request self.offset = offset self.length = length self.endian = endian self.format = format self.inclusive = inclusive self.signed = signed self.math = math self.fuzzable = fuzzable self.name = name self.synchsafe = synchsafe self.s_type = "size" if not block_name: raise sex.SullyRuntimeError("'%s' requires a block_name" % self.s_type) if block_name and not type(block_name) is str: raise sex.SullyRuntimeError("'%s' requires block_name to be of type str" % self.s_type) if name and not type(name) is str: raise sex.SullyRuntimeError("'%s' requires name to be of type str" % self.s_type) if fuzzable != True and fuzzable != False: raise sex.SullyRuntimeError("'%s' requires fuzzable to be of type boolean" % self.s_type) if not type(offset) is int: raise sex.SullyRuntimeError("'%s' requires offset to be of type int" % self.s_type) if not type(length) is int: raise sex.SullyRuntimeError("'%s' requires length to be of type int" % self.s_type) if endian != ">" and endian != "<": raise sex.SullyRuntimeError("'%s' requires endian to be '>' or '<'" % self.s_type) if not type(format) is str: raise sex.SullyRuntimeError("'%s' requires format to be of type str" % self.s_type) if synchsafe != True and synchsafe != False: raise sex.SullyRuntimeError("'%s' requires synchsafe to be of type boolean" % self.s_type) if inclusive != True and inclusive != False: raise sex.SullyRuntimeError("'%s' requires inclusive to be of type boolean" % self.s_type) if signed != True and signed != False: raise sex.SullyRuntimeError("'%s' requires signed to be of type boolean" % self.s_type) self.original_value = "N/A" # for get_primitive self.s_type = "size" # for ease of object identification self.bit_field = primitives.bit_field(0, self.length*8, endian=self.endian, format=self.format, signed=self.signed, synchsafe=self.synchsafe) self.rendered = "" self.fuzz_complete = self.bit_field.fuzz_complete self.fuzz_library = self.bit_field.fuzz_library self.mutant_index = self.bit_field.mutant_index self.value = self.bit_field.value if self.math == None: self.math = lambda (x): x