By reading http://www.vnsecurity.net/2011/01/padocon-2011-ctf-karma-400-exploit-the-data-re-use-way/, I found longld use the pattern_create and pattern_offset metasploit tools directly into gdb. Because I am an eternal jealous I've imported it into .gdbinit with the following :
# pattern_create define pattern_create if $argc != 1 help pattern_create else shell ruby /opt/metasploit/tools/pattern_create.rb $arg0 end end document pattern_create Usage: pattern_create length end # pattern_offset define pattern_offset if $argc != 2 help pattern_offset else shell ruby /opt/metasploit/tools/pattern_offset.rb $arg0 $arg1 end end document pattern_offset Usage: pattern_offset <search item> <length of buffer> Default length of buffer if none is inserted: 8192 This buffer is generated by pattern_create() in the Rex library automatically end
This is a first shot coded with feet, but that fit really well with the perfect http://reverse.put.as/wp-content/uploads/2010/04/gdbinit73. As I don't use [set a/b/c] they are not present here, but maybe in an updated version :) The <search item> and <length of buffer> switch of longld remains an opaque mystery!
Code available here :
http://paste.pocoo.org/show/340161/
EDIT: sh4ka enlighted me with the pvefindaddr implementation (http://redmine.corelan.be:8800/projects/pvefindaddr/repository/entry/release/v1.8/pvefindaddr.py) of metasploit pattern functions. It requires python, but it is far lighter than metasploit :). Just add the following to your .gdbinit :
python import gdb import binascii class Pattern_create(gdb.Command): '''pattern_create <size>''' def __init__(self): super(Pattern_create, self).__init__("pattern_create", gdb.COMMAND_SUPPORT, gdb.COMPLETE_FILENAME) def invoke(self, arg, from_tty): size=arg.split(" ")[0] char1="ABCDEFGHIJKLMNOPQRSTUVWXYZ" char2="abcdefghijklmnopqrstuvwxyz" char3="0123456789" charcnt=0 pattern="" max=int(size) for ch1 in char1: for ch2 in char2: for ch3 in char3: if charcnt<max: pattern=pattern+ch1 charcnt=charcnt+1 if charcnt<max: pattern=pattern+ch2 charcnt=charcnt+1 if charcnt<max: pattern=pattern+ch3 charcnt=charcnt+1 print pattern class Pattern_offset(gdb.Command): '''pattern_offset <pattern> <size>''' def __init__(self): super(Pattern_offset, self).__init__("pattern_offset", gdb.COMMAND_SUPPORT, gdb.COMPLETE_FILENAME) def invoke(self, arg, from_tty): searchpat=arg.split(" ")[0] size=arg.split(" ")[1] mspattern="" patsize=int(size) mspattern=self.pattern_create(size) if len(searchpat)==4: ascipat2=searchpat print("Looking for %s in pattern of %d bytes" % (ascipat2,patsize)) if ascipat2 in mspattern: patpos = mspattern.find(ascipat2) print(" - Pattern %s found in Metasploit pattern at position %d" % (ascipat2,patpos)) else: print(" - Pattern %s not found in Metasploit pattern" % ascipat2) if len(searchpat)==8: searchpat="0x"+searchpat if len(searchpat)==10: hexpat=searchpat ascipat3=toascii(hexpat[8]+hexpat[9])+toascii(hexpat[6]+hexpat[7])+toascii(imm,hexpat[4]+hexpat[5])+toascii(hexpat[2]+hexpat[3]) print("Looking for %s in pattern of %d bytes" % (ascipat3,patsize)) if ascipat3 in mspattern: patpos = mspattern.find(ascipat3) print(" - Pattern %s (%s) found in Metasploit pattern at position %d" % (ascipat3,hexpat,patpos)) else: #maybe it's reversed ascipat4=toascii(hexpat[2]+hexpat[3])+toascii(hexpat[4]+hexpat[5])+toascii(hexpat[6]+hexpat[7])+toascii(hexpat[8]+hexpat[9]) print("Looking for %s in pattern of %d bytes" % (ascipat4,patsize)) if ascipat4 in mspattern: patpos = mspattern.find(ascipat4) print(" - Pattern %s (%s reversed) found in Metasploit pattern at position %d" % (ascipat4,hexpat,patpos)) else: print(" - Pattern %s not found in Metasploit pattern" % ascipat4) def pattern_create(self, size): char1="ABCDEFGHIJKLMNOPQRSTUVWXYZ" char2="abcdefghijklmnopqrstuvwxyz" char3="0123456789" charcnt=0 pattern="" max=int(size) for ch1 in char1: for ch2 in char2: for ch3 in char3: if charcnt<max: pattern=pattern+ch1 charcnt=charcnt+1 if charcnt<max: pattern=pattern+ch2 charcnt=charcnt+1 if charcnt<max: pattern=pattern+ch3 charcnt=charcnt+1 return pattern def toascii(self, n): try: asciiequival=binascii.a2b_hex(n) except: asciiequival=" " #print sys.exc_info()[0] return asciiequival Pattern_create() Pattern_offset() end
This is a simple way to define gdb commands in python, read more at http://sourceware.org/gdb/wiki/PythonGdbTutorial.
Code available here :
http://paste.pocoo.org/show/Arg0fmMLsO3cVoSCclXo/
No comments:
Post a Comment