def run(self): global buf os.putenv("LANG", "C") logfile = mkstemp()[1] try: cmd = '/bin/bash -c "/usr/bin/gdb -q --batch --command=%s --args %s" 2>/dev/null > %s' cmd %= (self.gdb_commands, self.program, logfile) print cmd print "Running %s" % cmd cmd_obj = TimeoutCommand(cmd) cmd_obj.shell = True cmd_obj.run(self.timeout) buf = open(logfile, "rb").readlines() self.parse_dump(buf) if self.signal: crash_data = CCrashData(self.pc, self.signal) i = 0 for stack in self.stack: crash_data.add_data("stack trace", "%d" % i, stack) i += 1 for reg in self.registers: crash_data.add_data("registers", reg, self.registers[reg]) crash_data.add_data("disassembly", int(self.pc), self.disasm) for dis in self.disasm_around: if type(dis[0]) in (int,long) or dis[0].isdigit(): crash_data.add_data("disassembly", dis[0], dis[1]) crash_data.disasm = [self.pc, self.disasm] if self.exploitability is not None: crash_data.exploitable = self.exploitability if self.exploitability_reason is not None: crash_data.add_data("exploitability", "reason", self.exploitability_reason) crash_data_buf = crash_data.dump_json() crash_data_dict = crash_data.dump_dict() print print "Yep, we got a crash! \o/" print return crash_data_dict return finally: os.remove(logfile)