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)
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))
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
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]
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)
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)
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
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
def handle(self, *args, **kwargs): for cmd in self.cmds: gxf.execute(cmd, True, False)
def handle(self, *args, **kwargs): for cmd in self.cmds: gxf.execute(cmd, tty=True, tostr=False)