Exemple #1
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs=['rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 4)
        self.assertEqual(gadget.lines[0][0], 0x19bb)

        regs=['rcx','rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 7)

        self.assertEqual(gadget.imageBase, 0x100000000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x100000000)

        with self.assertRaises(RopperError):
            regs=['invalid']
            ropper.searchJmpReg(self.file, regs)
Exemple #2
0
    def test_badbytes(self):
        r = Ropper()

        badbytes = "adfd"
        gadgets = r.searchGadgets(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0x1ADFD)

        badbytes = "52f8"
        gadgets = r.searchPopPopRet(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        self.assertNotEqual(gadgets[0].lines[0][0], 0x52F8)

        badbytes = "b1c7"
        gadgets = r.searchJmpReg(self.file, ["rsp"])
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0xB1C7)

        with self.assertRaises(RopperError):
            badbytes = "b1c"
            gadgets = ropper.filterBadBytes(gadgets, badbytes)

        with self.assertRaises(RopperError):
            badbytes = "qwer"
            gadgets = ropper.filterBadBytes(gadgets, badbytes)
Exemple #3
0
    def test_badbytes(self):
        r = Ropper()

        badbytes = 'adfd'
        gadgets = r.searchGadgets(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0x1adfd)

        badbytes = '52f8'
        gadgets = r.searchPopPopRet(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        self.assertNotEqual(gadgets[0].lines[0][0], 0x52f8)

        badbytes = 'b1c7'
        gadgets = r.searchJmpReg(self.file, ['rsp'])
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0xb1c7)

        with self.assertRaises(RopperError):
            badbytes = 'b1c'
            gadgets = ropper.filterBadBytes(gadgets, badbytes)

        with self.assertRaises(RopperError):
            badbytes = 'qwer'
            gadgets = ropper.filterBadBytes(gadgets, badbytes)
Exemple #4
0
    def test_badbytes(self):
        r = Ropper()

        badbytes = 'adfd'
        gadgets = r.searchGadgets(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0x1adfd)

        badbytes = '52f8'
        gadgets = r.searchPopPopRet(self.file)
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        self.assertNotEqual(gadgets[0].lines[0][0], 0x52f8)

        badbytes = 'b1c7'
        gadgets = r.searchJmpReg(self.file, ['rsp'])
        gadgets = ropper.filterBadBytes(gadgets, badbytes)
        gadget = gadgets[0]
        self.assertNotEqual(gadget.lines[0][0], 0xb1c7)

        with self.assertRaises(RopperError):
            badbytes = 'b1c'
            gadgets = ropper.filterBadBytes(gadgets, badbytes)

        with self.assertRaises(RopperError):
            badbytes = 'qwer'
            gadgets = ropper.filterBadBytes(gadgets, badbytes)
Exemple #5
0
 def test_ppr(self):
     ropper = Ropper()
     
     gadgets = ropper.searchPopPopRet(self.file)
     
     self.assertEqual(len(gadgets), 109)
     self.assertEqual(gadgets[0].lines[0][0], 0x444a)
Exemple #6
0
    def __searchGadgets(self, binary):
        r = Ropper(self.__cprinter)
        gadgets = r.searchGadgets(binary, depth=self.__options.depth, gtype=GadgetType[self.__options.type.upper()])
        binary.loaded = True
        binary.gadgets = gadgets
        self.__gadgets[binary] = ropper.filterBadBytes(gadgets, self.__options.badbytes)
        if not self.__options.all:
            self.__gadgets[binary] = ropper.deleteDuplicates(self.__gadgets[binary])

        return self.__gadgets[binary]
Exemple #7
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for section in self._binaries[0].executableSections:
            vaddr = section.virtualAddress
            gadgets.extend(r.searchOpcode(self._binaries[0],opcode=opcode,disass=True))

        if len(gadgets) > 0:
            return gadgets[0]
        else:
            raise RopChainError('Cannot create gadget for opcode: %s' % opcode)
Exemple #8
0
    def __searchGadgets(self, binary):
        r = Ropper(self.__searchGadgetCallback)
        gadgets = r.searchGadgets(binary, instructionCount=self.__options.inst_count, gtype=GadgetType[self.__options.type.upper()])
        binary.loaded = True
        binary.gadgets = gadgets
        self.__gadgets[binary] = ropper.filterBadBytes(gadgets, self.__options.badbytes)
        if not self.__options.all:
            self.__cprinter.printInfo('deleting double gadgets...')
            self.__gadgets[binary] = ropper.deleteDuplicates(self.__gadgets[binary], self.__printProgress)

        return self.__gadgets[binary]
Exemple #9
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for section in self._binaries[0].executableSections:
            vaddr = section.virtualAddress
            gadgets.extend(r.searchOpcode(self._binaries[0],opcode=opcode,disass=True))

        if len(gadgets) > 0:
            return gadgets[0]
        else:
            raise RopChainError('Cannot create gadget for opcode: %x' % opcode)
Exemple #10
0
    def __searchGadgets(self, binary):
        r = Ropper(self.__cprinter)
        gadgets = r.searchGadgets(binary, instructionCount=self.__options.inst_count, gtype=GadgetType[self.__options.type.upper()])
        binary.loaded = True
        binary.gadgets = gadgets
        self.__gadgets[binary] = ropper.filterBadBytes(gadgets, self.__options.badbytes)
        if not self.__options.all:
            self.__cprinter.printInfo('deleting double gadgets...')
            self.__gadgets[binary] = ropper.deleteDuplicates(self.__gadgets[binary], self.__printProgress)

        return self.__gadgets[binary]
Exemple #11
0
 def __init__(self, options={}, callbacks=None):
     super(RopperService, self).__init__()
     self.__options = Options(options, self.__optionChanged)
     if callbacks and hasattr(callbacks, '__gadgetSearchProgress__'):
         self.__ropper = Ropper(callback=callbacks.__gadgetSearchProgress__)
     else:
         self.__ropper = Ropper()
     self.__files = []
     self.__callbacks = callbacks
     if self.__options.color:
         cstr.COLOR = self.__options.color
     Gadget.DETAILED = self.__options.detailed
Exemple #12
0
 def __init__(self, options={}, callbacks=None):
     super(RopperService, self).__init__()
     self.__options = Options(options, self.__optionChanged)
     if callbacks and hasattr(callbacks, '__gadgetSearchProgress__'):
         self.__ropper = Ropper(callback=callbacks.__gadgetSearchProgress__)
     else:
         self.__ropper = Ropper()
     self.__files = []
     self.__callbacks = callbacks
     if self.__options.color:
         cstr.COLOR = self.__options.color
     Gadget.DETAILED = self.__options.detailed
Exemple #13
0
    def test_gadgets_pe(self):
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 4800)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase, gadget.address)
        self.assertEqual(gadget.imageBase, 0x4ad00000)
        self.file.imageBase = 0x0
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        self.assertEqual(gadget.imageBase, 0x4ad00000)
Exemple #14
0
 def test_jmpreg(self):
     ropper = Ropper()
     regs=['esp']
     gadgets = ropper.searchJmpReg(self.file, regs)
     gadget = gadgets[0]
     self.assertEqual(len(gadgets), 10)
     self.assertEqual(gadget.lines[0][0], 0xc63)
     self.assertEqual(gadget.imageBase, 0x8048000)
     self.file.imageBase = 0x0
     self.assertEqual(gadget.imageBase, 0x0)
     self.file.imageBase = None
     self.assertEqual(gadget.imageBase, 0x8048000)
Exemple #15
0
    def __asm(self, code, arch, format):
        r = Ropper()
        if format == 'R':
            f = FORMAT.RAW
        elif format == 'H':
            f = FORMAT.HEX
        elif format == 'S':
            f = FORMAT.STRING
        else:
            raise RopperError('wrong format: %s' % f)

        self.__cprinter.println(r.assemble(code, arch, f))
Exemple #16
0
    def test_search(self):
        r = Ropper()

        gadgets = r.searchGadgets(self.file)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [rax]')
        self.assertGreater(len(found_gadgets), 5)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x]')
        self.assertGreater(len(found_gadgets), 25)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x%]')
        self.assertGreater(len(found_gadgets), 70)
Exemple #17
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(r.searchJmpReg(binary, reg))

        if len(gadgets) > 0:
            self._updateUsedBinaries(gadget[0])
            return self._printRopInstruction(gadgets[0])
        else:
            return None
Exemple #18
0
    def test_search(self):
        r = Ropper()

        gadgets = r.searchGadgets(self.file)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [rax]')
        self.assertEqual(len(found_gadgets), 8)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x]')
        self.assertEqual(len(found_gadgets), 31)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x%]')
        self.assertEqual(len(found_gadgets), 83)
Exemple #19
0
    def test_search(self):
        r = Ropper()

        gadgets = r.searchGadgets(self.file)

        found_gadgets = self.file.arch.searcher.search(gadgets, "mov [rax]")
        self.assertEqual(len(found_gadgets), 1)

        found_gadgets = self.file.arch.searcher.search(gadgets, "mov [r?x]")
        self.assertEqual(len(found_gadgets), 5)

        found_gadgets = self.file.arch.searcher.search(gadgets, "mov [r?x%]")
        self.assertEqual(len(found_gadgets), 7)
Exemple #20
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(r.searchOpcode(binary,opcode=opcode,disass=True))

        if len(gadgets) > 0:
            self._usedBinaries.append((gadgets[0].fileName, gadgets[0]._section))
            return gadgets[0]
        else:
            raise RopChainError('Cannot create gadget for opcode: %s' % opcode)
Exemple #21
0
    def test_search(self):
        r = Ropper()

        gadgets = r.searchGadgets(self.file)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [rax]')
        self.assertEqual(len(found_gadgets), 8)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x]')
        self.assertEqual(len(found_gadgets), 31)

        found_gadgets = self.file.arch.searcher.search(gadgets, 'mov [r?x%]')
        self.assertEqual(len(found_gadgets), 83)
Exemple #22
0
    def test_gadgets_pe(self):
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 1300)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase, gadget.address)
        self.assertEqual(gadget.imageBase, 0x00008000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES['test-binaries/ls-arm'] = self.file.imageBase
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase
        self.assertEqual(gadget.imageBase, 0x00008000)
Exemple #23
0
    def _createJmp(self, reg=['rsp']):
        r = Ropper()
        gadgets = []
        for section in self._binaries[0].executableSections:
            vaddr = section.virtualAddress
            gadgets.extend(r.searchJmpReg(self._binaries[0],reg))



        if len(gadgets) > 0:
            if (gadgets[0]._binary, gadgets[0]._section) not in self._usedBinaries:
                self._usedBinaries.append((gadgets[0]._binary, gadgets[0]._section))
            return self._printRopInstruction(gadgets[0])
        else:
            return None
Exemple #24
0
    def test_gadgets_pe(self):
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 1300)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase,
                         gadget.address)
        self.assertEqual(gadget.imageBase, 0x00008000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase
        self.assertEqual(gadget.imageBase, 0x00008000)
Exemple #25
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(
                    r.searchOpcode(binary, opcode=opcode, disass=True))

        if len(gadgets) > 0:
            self._usedBinaries.append(
                (gadgets[0].fileName, gadgets[0]._section))
            return gadgets[0]
        else:
            raise RopChainError('Cannot create gadget for opcode: %s' % opcode)
Exemple #26
0
    def __searchGadgets(self, binary):
        r = Ropper(self.__cprinter)
        gadgets = r.searchGadgets(
            binary,
            depth=self.__options.depth,
            gtype=GadgetType[self.__options.type.upper()])
        binary.loaded = True
        binary.gadgets = gadgets
        self.__gadgets[binary] = ropper.filterBadBytes(gadgets,
                                                       self.__options.badbytes)
        if not self.__options.all:
            self.__gadgets[binary] = ropper.deleteDuplicates(
                self.__gadgets[binary])

        return self.__gadgets[binary]
Exemple #27
0
    def test_gadgets_pe(self):
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 1900)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase, gadget.address)
        self.assertEqual(gadget.imageBase, 0x00400000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase
        self.assertEqual(gadget.imageBase, 0x00400000)
Exemple #28
0
    def _createJmp(self, reg=['rsp']):
        r = Ropper()
        gadgets = []
        for section in self._binaries[0].executableSections:
            vaddr = section.virtualAddress
            gadgets.extend(r.searchJmpReg(self._binaries[0], reg))

        if len(gadgets) > 0:
            if (gadgets[0].fileName,
                    gadgets[0].section) not in self._usedBinaries:
                self._usedBinaries.append(
                    (gadgets[0].fileName, gadgets[0].section))
            return self._printRopInstruction(gadgets[0])
        else:
            return None
Exemple #29
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs = ['rsp']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 3)
        self.assertEqual(gadget.lines[0][0], 0x37dd)

        regs = ['rsp', 'rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 15)
        self.assertEqual(gadget.imageBase, 0x4ad00000)
        self.file.imageBase = 0x0
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        self.assertEqual(gadget.imageBase, 0x4ad00000)
Exemple #30
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.offset
                gadgets.extend(
                    r.searchJmpReg(binary,reg))



        if len(gadgets) > 0:
            self._updateUsedBinaries(gadgets[0])
            return gadgets[0]
        else:
            return None
Exemple #31
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for section in self._binaries[0].executableSections:
            vaddr = section.offset
            gadgets.extend(
                r.searchJmpReg(self._binaries[0],reg))



        if len(gadgets) > 0:
            if (gadgets[0]._binary, gadgets[0]._section) not in self._usedBinaries:
                self._usedBinaries.append((gadgets[0]._binary, gadgets[0]._section))
            return gadgets[0]
        else:
            return ''
Exemple #32
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.offset
                gadgets.extend(
                    r.searchJmpReg(binary,reg))



        if len(gadgets) > 0:
            self._updateUsedBinaries(gadget[0])
            return gadgets[0]
        else:
            return None
Exemple #33
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.offset
                gadgets.extend(r.searchJmpReg(self._binaries[0], reg))

        if len(gadgets) > 0:
            if (gadgets[0]._binary,
                    gadgets[0]._section) not in self._usedBinaries:
                self._usedBinaries.append(
                    (gadgets[0]._binary, gadgets[0]._section))
            return gadgets[0]
        else:
            return None
Exemple #34
0
    def _createJmp(self, reg=['esp']):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(
                    r.searchJmpReg(binary,reg))



        if len(gadgets) > 0:
            self._updateUsedBinaries(gadgets[0])
            return self._printRopInstruction(gadgets[0])
        else:
            return None
Exemple #35
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs = ["rsp"]
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 3)
        self.assertEqual(gadget.lines[0][0], 0x37DD)

        regs = ["rsp", "rax"]
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 15)
        self.assertEqual(gadget.imageBase, 0x4AD00000)
        self.file.imageBase = 0x0
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        self.assertEqual(gadget.imageBase, 0x4AD00000)
Exemple #36
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(r.searchOpcode(binary,opcode=opcode,disass=True))

        if len(gadgets) > 0:
            for gadget in gadgets:
                if not gadget:
                    continue
                if not self.containsBadbytes(gadget.IMAGE_BASES.get(gadget.fileName,0) + gadget.lines[0][0]):
                    self._updateUsedBinaries(gadget)
                    return gadget
        else:
            raise RopChainError('Cannot create gadget for opcode: %s' % opcode)
Exemple #37
0
    def test_jmpreg_pe(self):
        ropper = Ropper()
        regs=['esp']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 1)
        self.assertEqual(gadget.lines[0][0], 0xc797)

        regs=['esp','eax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 13)

        self.assertEqual(gadget.imageBase, 0x4ad00000)
        self.file.imageBase = 0x0
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        self.assertEqual(gadget.imageBase, 0x4ad00000)
Exemple #38
0
    def _searchOpcode(self, opcode):
        r = Ropper()
        gadgets = []
        for binary in self._binaries:
            for section in binary.executableSections:
                vaddr = section.virtualAddress
                gadgets.extend(r.searchOpcode(binary,opcode=opcode,disass=True))

        if len(gadgets) > 0:
            for gadget in gadgets:
                if not gadget:
                    continue
                if not self.containsBadbytes(gadget.IMAGE_BASES.get(gadget.fileName,0) + gadget.lines[0][0]):
                    self._updateUsedBinaries(gadget)
                    return gadget
        else:
            raise RopChainError('Cannot create gadget for opcode: %s' % opcode)
Exemple #39
0
    def test_gadgets(self):
        self.assertEqual(self.file.arch, PPC)
        self.assertEqual(self.file.type, Type.ELF)
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 1400)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase, gadget.address)
        self.assertEqual(gadget.imageBase, 0x10000000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x10000000)
Exemple #40
0
    def test_gadgets(self):
        self.assertEqual(self.file.arch, PPC)
        self.assertEqual(self.file.type, Type.ELF)
        ropper = Ropper()
        gadgets = ropper.searchGadgets(self.file)

        gadget = gadgets[0]
        self.assertGreater(len(gadgets), 1400)
        self.assertEqual(gadget.lines[0][0] + self.file.imageBase, gadget.address)
        self.assertEqual(gadget.imageBase, 0x10000000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x10000000)
Exemple #41
0
    def disassAddress(self, name, address, length):
        fc = self.getFileFor(name)
        if not fc:
            raise RopperError('No such file opened: %s' % name)
        eSections = fc.loader.executableSections

        for section in  eSections:
            if section.virtualAddress <= address and section.virtualAddress + section.size > address:
                ropper = Ropper()


                g = ropper.disassembleAddress(section, fc.loader, address, address - (fc.loader.imageBase+section.offset), length)
                if not g:
                    raise RopperError('Cannot disassemble address: %s' % toHex(address))
                    
                if length < 0:
                    length = length * -1
                return g.disassemblyString()
        return ''
Exemple #42
0
    def test_database(self):
        r = Ropper()

        db = "./testdb.db"
        if os.path.exists(db):
            os.remove(db)

        dao = GadgetDAO(db)

        gadgets = r.searchGadgets(self.file)

        dao.save(gadgets)
        self.assertTrue(os.path.exists(db))

        loaded_gadgets = dao.load(self.file)
        self.assertEqual(len(gadgets), len(loaded_gadgets))
        self.assertEqual(gadgets[0].lines[0][0], loaded_gadgets[0].lines[0][0])

        os.remove(db)
Exemple #43
0
    def disassAddress(self, name, address, length):
        fc = self.getFileFor(name)
        if not fc:
            raise RopperError('No such file opened: %s' % name)
        eSections = fc.loader.executableSections

        for section in  eSections:
            if section.virtualAddress <= address and section.virtualAddress + section.size > address:
                ropper = Ropper()


                g = ropper.disassembleAddress(section, fc.loader, address, address - (fc.loader.imageBase+section.offset), length)
                if not g:
                    raise RopperError('Cannot disassemble address: %s' % toHex(address))

                if length < 0:
                    length = length * -1
                return g.disassemblyString()
        return ''
Exemple #44
0
    def test_database(self):
        r = Ropper()

        db = './testdb.db'
        if os.path.exists(db):
            os.remove(db)

        dao = GadgetDAO(db)

        gadgets = r.searchGadgets(self.file)

        dao.save(gadgets)
        self.assertTrue(os.path.exists(db))

        loaded_gadgets = dao.load(self.file)
        self.assertEqual(len(gadgets), len(loaded_gadgets))
        self.assertEqual(gadgets[0].lines[0][0], loaded_gadgets[0].lines[0][0])

        os.remove(db)
Exemple #45
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs=['rsp']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 3)
        self.assertEqual(gadget.lines[0][0], 0x37dd)

        regs=['rsp','rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 15)
        self.assertEqual(gadget.imageBase, 0x4ad00000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x4ad00000)
Exemple #46
0
    def test_jmpreg_pe(self):
        ropper = Ropper()
        regs = ['esp']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 1)
        self.assertEqual(gadget.lines[0][0], 0xc797)

        regs = ['esp', 'eax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 13)

        self.assertEqual(gadget.imageBase, 0x4ad00000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x4ad00000)
Exemple #47
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs = ["rsp"]
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 18)
        self.assertEqual(gadget.lines[0][0], 0xB1C7)

        regs = ["rsp", "rax"]
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 25)

        self.assertEqual(gadget.imageBase, 0x400000)
        self.file.imageBase = 0x0
        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        self.assertEqual(gadget.imageBase, 0x400000)

        with self.assertRaises(RopperError):
            regs = ["invalid"]
            ropper.searchJmpReg(self.file, regs)
Exemple #48
0
    def __asm(self, code, arch, format):
        r = Ropper()
        if format == 'R':
            f = 'raw'
        elif format == 'H':
            f = 'hex'
        elif format == 'S':
            f = 'string'
        else:
            raise RopperError('wrong format: %s' % f)

        self.__cprinter.println(self.__rs.asm(code, arch, f))
Exemple #49
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs=['rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 4)
        self.assertEqual(gadget.lines[0][0], 0x19bb)

        regs=['rcx','rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 7)

        self.assertEqual(gadget.imageBase, 0x100000000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.checksum] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x100000000)

        with self.assertRaises(RopperError):
            regs=['invalid']
            ropper.searchJmpReg(self.file, regs)
Exemple #50
0
    def test_jmpreg(self):
        ropper = Ropper()
        regs=['rsp']
        gadgets = ropper.searchJmpReg(self.file, regs)
        gadget = gadgets[0]
        self.assertEqual(len(gadgets), 18)
        self.assertEqual(gadget.lines[0][0], 0xb1c7)

        regs=['rsp','rax']
        gadgets = ropper.searchJmpReg(self.file, regs)
        self.assertEqual(len(gadgets), 25)

        self.assertEqual(gadget.imageBase, 0x400000)
        self.file.imageBase = 0x0
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x0)
        self.file.imageBase = None
        Gadget.IMAGE_BASES[self.file.fileName] = self.file.imageBase

        self.assertEqual(gadget.imageBase, 0x400000)

        with self.assertRaises(RopperError):
            regs=['invalid']
            ropper.searchJmpReg(self.file, regs)
Exemple #51
0
    def __disassembleAddress(self, addr, length):
        eSections = self.binary.executableSections

        for section in  eSections:
            if section.virtualAddress <= addr and section.virtualAddress + section.size > addr:
                ropper = Ropper()


                g = ropper.disassembleAddress(section, self.binary, addr, addr - (self.binary.imageBase+section.offset), length)
                if not g:
                    self.__cprinter.printError('Cannot disassemble address: %s' % toHex(addr))
                    return
                if length < 0:
                    length = length * -1
                if len(g) < length:
                    self.__cprinter.printInfo('Cannot disassemble specified count of instructions')
                self.binary.printer.printTableHeader('Instructions')
                self.__cprinter.println(g.disassemblyString())
                return
Exemple #52
0
    def test_opcode_failures(self):
        r = Ropper()

        if version_info.major == 3 and version_info.minor >= 2:
            # Wrong question mark position
            with self.assertRaisesRegex(
                    RopperError,
                    'A \? for the highest 4 bit of a byte is not supported.*'):
                r.searchOpcode(self.file, 'ff?4')
            # Wrong lengh
            with self.assertRaisesRegex(
                    RopperError,
                    'The length of the opcode has to be a multiple of two'):
                r.searchOpcode(self.file, 'ff4')
            # Unallowed character
            with self.assertRaisesRegex(RopperError,
                                        'Invalid characters in opcode string'):
                r.searchOpcode(self.file, 'ff4r')
        else:
            # Wrong question mark position
            with self.assertRaisesRegexp(
                    RopperError,
                    'A \? for the highest 4 bit of a byte is not supported.*'):
                r.searchOpcode(self.file, 'ff?4')
            # Wrong lengh
            with self.assertRaisesRegexp(
                    RopperError,
                    'The length of the opcode has to be a multiple of two'):
                r.searchOpcode(self.file, 'ff4')
            # Unallowed character
            with self.assertRaisesRegexp(
                    RopperError, 'Invalid characters in opcode string'):
                r.searchOpcode(self.file, 'ff4r')
Exemple #53
0
    def test_ppr(self):
        ropper = Ropper()

        with self.assertRaises(NotSupportedError):
            gadgets = ropper.searchPopPopRet(self.file)
Exemple #54
0
 def test_jmpreg(self):
     ropper = Ropper()
     regs = ['esp']
     with self.assertRaises(NotSupportedError):
         gadgets = ropper.searchJmpReg(self.file, regs)
Exemple #55
0
 def __searchPopPopRet(self):
     r = Ropper(self.__searchGadgetCallback)
     pprs = r.searchPopPopRet(self.binary)
     pprs = ropper.filterBadBytes(pprs, self.__options.badbytes)
     self.__printGadgets(pprs, header='POP;POP;RET Instructions')