def _analyseArguments(self): if len(self.__argv) == 0: self.__argv.append('--console') elif (len(self.__argv) == 1 and self.__argv[0] == '--nocolor'): self.__argv.append('--console') self.__args = self.__parser.parse_args(self.__argv) self.nocolor = self.__args.nocolor or self.isWindows() if not self.__args.clear_cache and not self.__args.asm and not self.disasm and not self.__args.console and not self.__args.file and not self.__args.version: self.__missingArgument('[-f|--file]') if self.__args.I: if not isHex(self.__args.I): raise ArgumentError('Imagebase should be in hex (0x.....)') else: self.__args.I = int(self.__args.I, 16) ropper_options = {} ropper_options['all'] = self.__args.all ropper_options['color'] = not self.__args.nocolor ropper_options['badbytes'] = self.__args.badbytes ropper_options['detailed'] = self.__args.detailed ropper_options['inst_count'] = self.__args.inst_count ropper_options['type'] = self.__args.type ropper_options['cfg_only'] = self.__args.cfg_only ropper_options['count_of_findings'] = self.__args.count_of_findings self.ropper_options = ropper_options
def _analyseArguments(self): if len(self.__argv) == 0: self.__argv.append('--console') elif (len(self.__argv) == 1 and self.__argv[0] == '--nocolor'): self.__argv.append('--console') self.__args = self.__parser.parse_args(self.__argv) self.nocolor = self.__args.nocolor or self.isWindows() if not self.__args.clear_cache and not self.__args.asm and not self.disasm and not self.__args.console and not self.__args.file and not self.__args.version: self.__missingArgument('[-f|--file]') if self.__args.I: if not isHex(self.__args.I): raise ArgumentError('Imagebase should be in hex (0x.....)') else: self.__args.I = int(self.__args.I, 16) ropper_options = {} ropper_options['all'] = self.__args.all ropper_options['color'] = not self.__args.nocolor ropper_options['badbytes'] = self.__args.badbytes ropper_options['detailed'] = self.__args.detailed ropper_options['inst_count'] = self.__args.inst_count ropper_options['type'] = self.__args.type ropper_options['cfg_only'] = self.__args.cfg_only ropper_options['count_of_findings'] = self.__args.count_of_findings ropper_options['multiprocessing'] = not self.__args.single self.ropper_options = ropper_options
def __checkOptions(self, options): if not isinstance(options, dict): raise TypeError('options has to be an instance of dict') inst_count = options.get('inst_count') if inst_count and not isinstance(inst_count, (int)): raise TypeError('inst_count has to be an instance of int') elif not inst_count: options['inst_count'] = 6 elif inst_count < 1: raise AttributeError('inst_count has to be bigger than 0') color = options.get('color') if color != None and not isinstance(color, bool): raise TypeError('color has to be an instance of bool') elif color == None: options['color'] = False badbytes = options.get('badbytes') if badbytes and not isinstance(badbytes, str): raise TypeError('badbytes has to be an instance of str') elif badbytes and len(badbytes) % 2 == 1: raise AttributeError('length of badbytes has to be even') elif badbytes and not isHex('0x'+badbytes): raise AttributeError('badbytes has to consist of 0-9 a-f A-F') elif not badbytes: options['badbytes'] = '' all = options.get('all') if all != None and not isinstance(all, bool): raise TypeError('all has to be an instance of bool') elif all == None: options['all'] = False gtype = options.get('type') if gtype and not isinstance(gtype, str): raise TypeError('type has to be an instance of str') elif gtype and gtype not in ['rop', 'jop', 'sys', 'all']: raise AttributeError('type has to be a "rop", "jop", "sys" or "all"') elif not gtype: options['type'] = 'all' detailed = options.get('detailed') if detailed != None and not isinstance(detailed, bool): raise TypeError('detailed has to be an instance of bool') elif detailed == None: options['detailed'] = False cfg_only = options.get('cfg_only') if cfg_only != None and not isinstance(cfg_only, bool): raise TypeError('cfg_only has to be an instance of bool') elif cfg_only == None: options['cfg_only'] = False count_of_findings = options.get('count_of_findings') if count_of_findings != None and not isinstance(count_of_findings, int): raise TypeError('cfg_only has to be an instance of bool') elif count_of_findings == None: options['count_of_findings'] = 5
def do_imagebase(self, text): if len(text) == 0: self.binary.imageBase = None self.__printInfo('Imagebase reseted') elif isHex(text): self.binary.imageBase = int(text, 16) self.__printInfo('Imagebase set to %s' % text) else: self.help_imagebase()
def __handleOptions(self, options): if options.sections: self.__printData('sections') elif options.symbols: self.__printData('symbols') elif options.segments: self.__printData('segments') elif options.dllcharacteristics: self.__printData('dll_characteristics') elif options.imagebase: self.__printData('image_base') elif options.e: self.__printData('entry_point') elif options.imports: self.__printData('imports') elif options.set: self.__set(options.set, True) elif options.unset: self.__set(options.unset, False) elif options.info: self.__printData('informations') elif options.ppr: self.__searchPopPopRet() elif options.jmp: self.__searchJmpReg(options.jmp) elif options.stack_pivot: self.__loadGadgets() self.__printGadgets(self.__binary.gadgets, Category.STACK_PIVOT) elif options.opcode: self.__searchOpcode(self.__options.opcode) elif options.string: self.__printStrings(options.string, options.section) elif options.hex and options.section: self.__printSectionInHex(options.section) elif options.disassemble: split = options.disassemble.split(':') length = 1 if not isHex(split[0]): raise RopperError('Number have to be in hex format 0x....') if len(split) > 1: if split[1][1:].isdigit() or (len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: raise RopperError('Length have to be in the following format L + Number e.g. L3') self.__disassemble(int(split[0],16), length) #elif options.checksec: # self.__checksec() elif options.chain: self.__loadGadgets() self.__generateChain(self.__gadgets[self.binary], options.chain) elif options.db: self.__loaddb(options.db) self.__searchAndPrintGadgets() else: self.__loadGadgets() self.__searchAndPrintGadgets()
def do_imagebase(self, text): if len(text) == 0: self.__rs.setImageBaseFor(self.currentFileName, None) self.__printInfo('Imagebase reseted') elif isHex(text): self.__rs.setImageBaseFor(self.currentFileName, int(text, 16)) self.__printInfo('Imagebase set to %s' % text) else: self.help_imagebase()
def do_disassemble(self, text): split = text.split(' ') length = 1 if not isHex(split[0]): self.__cprinter.printError('Number have to be in hex format 0x....') return if len(split) > 1: if split[1][1:].isdigit() or (len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: self.__cprinter.printError('Length have to be in the following format L + Number e.g. L3') return addr = int(split[0], 16) self.__disassemble(addr, length)
def do_disass_address(self, text): split = text.split(' ') length = 1 if not isHex(split[0]): self.__cprinter.printError('Number have to be in hex format 0x....') return if len(split) > 1: if split[1][1:].isdigit() or (len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: self.__cprinter.printError('Length have to be in the following format L + Number e.g. L3') return addr = int(split[0], 16) self.__disassembleAddress(addr, length)
def _analyseArguments(self): if len(self.__argv) == 0 or (len(self.__argv) == 1 and self.__argv[0] == '--nocolor'): self.__argv.append('--console') self.__args = self.__parser.parse_args(self.__argv) self.nocolor = self.__args.nocolor and not self.isWindows() if not self.__args.asm and not self.disasm and not self.__args.console and not self.__args.file and not self.__args.version: self.__missingArgument('[-f|--file]') if self.__args.I: if not isHex(self.__args.I): raise ArgumentError('Imagebase should be in hex (0x.....)') else: self.__args.I = int(self.__args.I, 16)
def _analyseArguments(self): if len(self.__argv) == 0 or (len(self.__argv) == 1 and self.__argv[0] == '--nocolor'): self.__argv.append('--console') self.__args = self.__parser.parse_args(self.__argv) self.nocolor = self.__args.nocolor or self.isWindows() if not self.__args.asm and not self.disasm and not self.__args.console and not self.__args.file and not self.__args.version: self.__missingArgument('[-f|--file]') if self.__args.I: if not isHex(self.__args.I): raise ArgumentError('Imagebase should be in hex (0x.....)') else: self.__args.I = int(self.__args.I, 16)
def extractValues(self, constraints, analysis, arch): if not constraints: return [] to_return = [] for constraintString in constraints: m = re.match(Searcher.CONSTRAINT_REGEX, constraintString) if not m: raise RopperError('Not a valid constraint') reg1 = m.group(1) reg2 = m.group(3) reg1 = reg1.replace('[', '') reg1 = reg1.replace(']', '') reg1 = arch.getRegisterName(reg1) reg2 = reg2.replace('[', '') reg2 = reg2.replace(']', '') if reg2.isdigit() or isHex(reg2): reg2 = None reg2 = arch.getRegisterName(reg2) to_return.append((reg1, reg2)) return to_return
def extractValues(self, constraints, analysis, arch): if not constraints: return [] to_return = [] for constraintString in constraints: m = re.match(Searcher.CONSTRAINT_REGEX, constraintString) if not m: raise RopperError('Not a valid constraint') reg1 = m.group(1) reg2 = m.group(3) reg1 = reg1.replace('[','') reg1 = reg1.replace(']','') reg1 = arch.getRegisterName(reg1) reg2 = reg2.replace('[','') reg2 = reg2.replace(']','') if reg2.isdigit() or isHex(reg2): reg2 = None reg2 = arch.getRegisterName(reg2) to_return.append((reg1,reg2)) return to_return
def __handleOptions(self, options): if options.sections: self.__printData('sections') elif options.analyse: self.__loadGadgets() #self.do_analyse(options.analyse) elif options.semantic: self.__loadGadgets() self.do_semantic(options.semantic) elif options.symbols: self.__printData('symbols') elif options.segments: self.__printData('segments') elif options.dllcharacteristics: self.__printData('dll_characteristics') elif options.imagebase: self.__printData('image_base') elif options.e: self.__printData('entry_point') elif options.imports: self.__printData('imports') elif options.asm is not None: format = 'H' if options.file is not None: with open(options.file[0]) as f: code = f.read() if len(options.asm) > 0: format = options.asm[0] else: code = options.asm[0] if len(options.asm) == 2: code = options.asm[0] format = options.asm[1] arch = 'x86' if options.arch: arch = options.arch self.__asm(code, arch, format) elif options.disasm: code = options.disasm arch = 'x86' if options.arch: arch = options.arch self.__disasm(code, arch) elif options.set: self.__set(options.set, True) elif options.unset: self.__set(options.unset, False) elif options.info: self.__printData('information') elif options.ppr: self.__searchPopPopRet() elif options.jmp: self.__searchJmpReg(options.jmp) elif options.stack_pivot: self.__loadGadgets() self.__printGadgets(self.currentFile.gadgets, Category.STACK_PIVOT) elif options.opcode: self.__searchOpcode(self.__options.opcode) elif options.instructions: self.__searchInstructions(self.__options.instructions) elif options.string: self.__printStrings(options.string, options.section) elif options.hex and options.section: self.__printSectionInHex(options.section) elif options.disassemble_address: split = options.disassemble_address.split(':') length = 1 if not isHex(split[0]): raise RopperError('Number have to be in hex format 0x....') if len(split) > 1: if split[1][1:].isdigit() or (len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: raise RopperError( 'Length have to be in the following format L + Number e.g. L3') self.__disassembleAddress(int(split[0], 16), length) # elif options.checksec: # self.__checksec() elif options.chain: self.__loadGadgetsForAllFiles() self.__generateChain(options.chain) elif self.__options.file: self.__loadGadgets() if options.search: self.__search(options.search, options.quality) else: self.__printGadgetsFromCurrentFile()
def __handleOptions(self, options): if options.sections: self.__printData('sections') elif options.symbols: self.__printData('symbols') elif options.segments: self.__printData('segments') elif options.dllcharacteristics: self.__printData('dll_characteristics') elif options.imagebase: self.__printData('image_base') elif options.e: self.__printData('entry_point') elif options.imports: self.__printData('imports') elif options.asm: code = options.asm[0] format = 'H' if len(options.asm) == 2: code = options.asm[0] format = options.asm[1] arch = getArchitecture('x86') if options.arch: arch = getArchitecture(options.arch) self.__asm(code, arch, format) elif options.disasm: code = options.disasm arch = getArchitecture('x86') if options.arch: arch = getArchitecture(options.arch) self.__disasm(code, arch) elif options.set: self.__set(options.set, True) elif options.unset: self.__set(options.unset, False) elif options.info: self.__printData('informations') elif options.ppr: self.__searchPopPopRet() elif options.jmp: self.__searchJmpReg(options.jmp) elif options.stack_pivot: self.__loadGadgets() self.__printGadgets(self.__binary.gadgets, Category.STACK_PIVOT) elif options.opcode: self.__searchOpcode(self.__options.opcode) elif options.instructions: self.__searchInstructions(self.__options.instructions) elif options.string: self.__printStrings(options.string, options.section) elif options.hex and options.section: self.__printSectionInHex(options.section) elif options.disassemble_address: split = options.disassemble_address.split(':') length = 1 if not isHex(split[0]): raise RopperError('Number have to be in hex format 0x....') if len(split) > 1: if split[1][1:].isdigit() or (len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: raise RopperError('Length have to be in the following format L + Number e.g. L3') self.__disassembleAddress(int(split[0],16), length) #elif options.checksec: # self.__checksec() elif options.chain: self.__loadGadgets() self.__generateChain(self.__gadgets[self.binary], options.chain) elif options.db: self.__loaddb(options.db) self.__searchAndPrintGadgets() else: self.__loadGadgets() self.__searchAndPrintGadgets()
def _setBadbytes(self, value): if len(value) == 0 or isHex('0x'+value): self.badbytes = value return (True,True) return False
def __handleOptions(self, options): if options.sections: self.__printData('sections') elif options.analyse: self.__loadGadgets() #self.do_analyse(options.analyse) elif options.semantic: self.__loadGadgets() self.do_semantic(options.semantic) elif options.symbols: self.__printData('symbols') elif options.segments: self.__printData('segments') elif options.dllcharacteristics: self.__printData('dll_characteristics') elif options.imagebase: self.__printData('image_base') elif options.e: self.__printData('entry_point') elif options.imports: self.__printData('imports') elif options.asm is not None: format = 'H' if options.file is not None: with open(options.file[0]) as f: code = f.read() if len(options.asm) > 0: format = options.asm[0] else: code = options.asm[0] if len(options.asm) == 2: code = options.asm[0] format = options.asm[1] arch = 'x86' if options.arch: arch = options.arch self.__asm(code, arch, format) elif options.disasm: code = options.disasm arch = 'x86' if options.arch: arch = options.arch self.__disasm(code, arch) elif options.set: self.__set(options.set, True) elif options.unset: self.__set(options.unset, False) elif options.info: self.__printData('information') elif options.ppr: self.__searchPopPopRet() elif options.jmp: self.__searchJmpReg(options.jmp) elif options.stack_pivot: self.__loadGadgets() self.__printGadgets(self.currentFile.gadgets, Category.STACK_PIVOT) elif options.opcode: self.__searchOpcode(self.__options.opcode) elif options.instructions: self.__searchInstructions(self.__options.instructions) elif options.string: self.__printStrings(options.string, options.section) elif options.hex and options.section: self.__printSectionInHex(options.section) elif options.disassemble_address: split = options.disassemble_address.split(':') length = 1 if not isHex(split[0]): raise RopperError('Number have to be in hex format 0x....') if len(split) > 1: if split[1][1:].isdigit() or ( len(split[1]) >= 3 and split[1][1] == '-' and split[1][2:].isdigit()): # is L\d or L-\d length = int(split[1][1:]) else: raise RopperError( 'Length have to be in the following format L + Number e.g. L3' ) self.__disassembleAddress(int(split[0], 16), length) # elif options.checksec: # self.__checksec() elif options.chain: self.__loadGadgetsForAllFiles() self.__generateChain(options.chain) elif self.__options.file: self.__loadGadgets() if options.search: self.__search(options.search, options.quality) else: self.__printGadgetsFromCurrentFile()