Beispiel #1
0
    def run(self, args):
        def section(name):
            print(name.center(80, "-"))

        if not any((args.regs, args.code, args.stack)):
            args.regs = True
            args.code = True
            args.stack = True
            args.frame = True

        if args.regs:
            section("registers")
            gxf.execute("gx registers -M", True, False)

        if args.code:
            section("code")
            gxf.execute("gx heading $pc -b3 -c5", True, False)

        if args.stack:
            section("stack")
            gxf.execute("gx telescope $sp -c8", True, False)

        if args.frame:
            section("frame")
            gxf.execute("frame", True, False)
Beispiel #2
0
    def run(self, args):

        fifo = "/tmp/gxf"

        try:
            os.unlink(fifo)
        except:
            pass

        os.mkfifo(fifo)

        spawn_terminal(args.terminal, args.exploit, "--tty", "--writeback",
                       fifo, *args.args)

        while True:
            try:
                # TODO add alarm, gdb isnt catching ctrl-c if no interupts occur.
                back = open(fifo)
            except InterruptedError:
                continue
            else:
                break

        data = ""
        while True:
            arg = back.read()
            if arg:
                data += arg
            else:
                break

        os.unlink(fifo)

        targetargs = data.split("\x00")
        tty, targetargs = targetargs[0], targetargs[1:]

        print("binexpect started tty at %s" % tty)
        print("binexpect recommends run %s" % " ".join(targetargs))

        gxf.execute("set inferior-tty %s" % tty)

        if not args.wait:
            gxf.execute("run %s" % " ".join(targetargs))
Beispiel #3
0
    def _read_sections(self):
        data = gxf.execute("maintenance info sections")

        sections = []

        for line in data.splitlines()[2:]:
            try:
                _, startend, _, _, name, tags = line.split(None, 5)
                start, end = (int(x, 16) for x in startend.split("->"))
            except:
                continue
            tags = tags.split()
            if "LOAD" in tags:
                sections.append(Section(start, end, name, tags))

        return sections
Beispiel #4
0
    def _read_sections(self):
        data = gxf.execute("maintenance info sections")

        sections = []

        for line in data.splitlines()[2:]:
            try:
                _, startend, _, _, name, tags = line.split(None, 5)
                start, end = (int(x, 16) for x in startend.split("->"))
            except:
                continue
            tags = tags.split()
            if "LOAD" in tags:
                sections.append(Section(start, end, name, tags))

        return sections
Beispiel #5
0
def _disassemble(startaddr, endaddr=None, hexdump=True, ignmemerr=False):
    # TODO: We might want to use Architecture.disassemble
    # problems with that:
    #   - not sure how to get hexdump
    #   - we can't limit on function bounds as we do now.

    modifier = " /r" if hexdump else ""
    what = ",".join(hex(int(addr)) for addr in (startaddr, endaddr) if addr)
    try:
        data = gxf.execute("disassemble%s %s" % (modifier, what), False, True)
    except gxf.MemoryError as e:
        if not ignmemerr:
            raise
        # if failaddr == startaddr this will return nothing.
        return _disassemble(startaddr, e.address, hexdump)

    start, end = data.find('\n') + 1, data.rfind('\n', 0, -1)
    return data[start:end], data[:start - 1]
Beispiel #6
0
def _disassemble(startaddr, endaddr=None, hexdump=True, ignmemerr=False):
    # TODO: We might want to use Architecture.disassemble
    # problems with that:
    #   - not sure how to get hexdump
    #   - we can't limit on function bounds as we do now.

    modifier = " /r" if hexdump else ""
    what = ",".join(hex(int(addr)) for addr in (startaddr, endaddr) if addr)
    try:
        data = gxf.execute("disassemble%s %s" % (modifier, what), False, True)
    except gxf.MemoryError as e:
        if not ignmemerr:
            raise
        # if failaddr == startaddr this will return nothing.
        return _disassemble(startaddr, e.address, hexdump)

    start, end = data.find('\n') + 1, data.rfind('\n', 0, -1)
    return data[start:end], data[:start - 1]
Beispiel #7
0
    def __init__(self):
        data = gxf.execute("info registers", False, True)

        self.regs = collections.OrderedDict()
        for l in data.splitlines():
            sl = l.split(None, 2)
            self.regs[sl[0]] = int(sl[1], 0)

        eflags = self.regs["eflags"]

        self.flags = {}

        self.flags["CF"] = bool(eflags & self.EFLAGS_CF)
        self.flags["PF"] = bool(eflags & self.EFLAGS_PF)
        self.flags["AF"] = bool(eflags & self.EFLAGS_AF)
        self.flags["ZF"] = bool(eflags & self.EFLAGS_ZF)
        self.flags["SF"] = bool(eflags & self.EFLAGS_SF)
        self.flags["TF"] = bool(eflags & self.EFLAGS_TF)
        self.flags["IF"] = bool(eflags & self.EFLAGS_IF)
        self.flags["DF"] = bool(eflags & self.EFLAGS_DF)
        self.flags["OF"] = bool(eflags & self.EFLAGS_OF)
Beispiel #8
0
    def __init__(self):
        data = gxf.execute("info registers", False, True)

        self.regs = collections.OrderedDict()
        for l in data.splitlines():
            sl = l.split(None, 2)
            self.regs[sl[0]] = int(sl[1], 0)

        eflags = self.regs["eflags"]

        self.flags = {}

        self.flags["CF"] = bool(eflags & self.EFLAGS_CF)
        self.flags["PF"] = bool(eflags & self.EFLAGS_PF)
        self.flags["AF"] = bool(eflags & self.EFLAGS_AF)
        self.flags["ZF"] = bool(eflags & self.EFLAGS_ZF)
        self.flags["SF"] = bool(eflags & self.EFLAGS_SF)
        self.flags["TF"] = bool(eflags & self.EFLAGS_TF)
        self.flags["IF"] = bool(eflags & self.EFLAGS_IF)
        self.flags["DF"] = bool(eflags & self.EFLAGS_DF)
        self.flags["OF"] = bool(eflags & self.EFLAGS_OF)
Beispiel #9
0
    def run(self, args):

        def section(name):
            print(name.center(80, "-"))

        if not any((args.regs, args.code, args.stack)):
            args.regs = True
            args.code = True
            args.stack = True

        if args.regs:
            section("registers")
            gxf.execute("gx registers -M", True, False)

        if args.code:
            section("code")
            gxf.execute("gx heading $pc -b3 -c5", True, False)

        if args.stack:
            section("stack")
            gxf.execute("gx telescope $sp -c8", True, False)
Beispiel #10
0
 def __init__(self):
     self.message = gxf.execute("show disassembly-flavor").strip()
     value = gdb.parameter("disassembly-flavor")
     super().__init__(
         "disassembly-flavor", gdb.COMMAND_DATA, gdb.PARAM_ENUM, [value])
     self.value = value
Beispiel #11
0
 def __init__(self):
     self.message = gxf.execute("show disassembly-flavor").strip()
     value = gdb.parameter("disassembly-flavor")
     super().__init__("disassembly-flavor", gdb.COMMAND_DATA,
                      gdb.PARAM_ENUM, [value])
     self.value = value
Beispiel #12
0
 def handle(self, *args, **kwargs):
     for cmd in self.cmds:
         gxf.execute(cmd, True, False)
Beispiel #13
0
 def handle(self, *args, **kwargs):
     for cmd in self.cmds:
         gxf.execute(cmd, tty=True, tostr=False)
Beispiel #14
0
 def handle(self, *args, **kwargs):
     for cmd in self.cmds:
         gxf.execute(cmd, True, False)