Esempio n. 1
0
  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)