Merge pull request #48 from 84a0deba7af552d68c80a16b20cdef32/multibr

Added support for --multibr
This commit is contained in:
Jonathan Salwan
2014-07-12 08:57:39 +02:00
3 changed files with 7 additions and 6 deletions
+1
View File
@@ -85,6 +85,7 @@ architectures supported:
parser.add_argument("--norop", action="store_true", help="Disable ROP search engine")
parser.add_argument("--nojop", action="store_true", help="Disable JOP search engine")
parser.add_argument("--nosys", action="store_true", help="Disable SYS search engine")
parser.add_argument("--multibr", action="store_true", help="Enable multiple branch gadgets")
self.__args = parser.parse_args()
if self.__args.version:
+2 -2
View File
@@ -54,7 +54,7 @@ class Core(cmd.Cmd):
if not self.__options.nosys: self.__gadgets += G.addSYSGadgets(section)
# Pass clean single instruction and unknown instructions
self.__gadgets = G.passClean(self.__gadgets)
self.__gadgets = G.passClean(self.__gadgets, self.__options.multibr)
# Delete duplicate gadgets
self.__gadgets = rgutils.deleteDuplicateGadgets(self.__gadgets)
@@ -393,7 +393,7 @@ class Core(cmd.Cmd):
print "ROPchain: %s" %(self.__options.ropchain)
print "String: %s" %(self.__options.string)
print "Thumb: %s" %(self.__options.thumb)
print "MultiBr: %s" %(self.__options.multibr)
def help_settings(self):
print "Display setting's environment"
+4 -4
View File
@@ -34,7 +34,7 @@ class Gadgets:
count += 1
return count
def __passCleanX86(self, gadgets):
def __passCleanX86(self, gadgets, multibr=False):
new = []
br = ["ret", "int", "sysenter", "jmp", "call"]
for gadget in gadgets:
@@ -45,7 +45,7 @@ class Gadgets:
continue
if self.__checkInstructionBlackListedX86(insts):
continue
if self.__checkMultiBr(insts, br) > 1:
if not multibr and self.__checkMultiBr(insts, br) > 1:
continue
if len([m.start() for m in re.finditer("ret", gadget["gadget"])]) > 1:
continue
@@ -189,8 +189,8 @@ class Gadgets:
return self.__gadgetsFinding(section, gadgets)
def passClean(self, gadgets):
if self.__binary.getArch() == CS_ARCH_X86: return self.__passCleanX86(gadgets)
def passClean(self, gadgets, multibr):
if self.__binary.getArch() == CS_ARCH_X86: return self.__passCleanX86(gadgets, multibr)
elif self.__binary.getArch() == CS_ARCH_MIPS: return gadgets
elif self.__binary.getArch() == CS_ARCH_PPC: return gadgets
elif self.__binary.getArch() == CS_ARCH_SPARC: return gadgets