示例#1
0
    def doActualFuzz(self):
        """
        The main fuzzing loop.

        all magic is performed here
        sends results via queue to the parent
        Only called once, by the fuzzingmaster
        """
        if "DebugWithFile" in self.config:
            utils.setupSlaveLoggingWithFile(self.threadId)

        random.seed(self.initialSeed)
        logging.info("Setup fuzzing...")
        signal.signal(signal.SIGINT, signal_handler)

        targetPort = self.config["target_port"] + self.threadId
        clientManager = ClientManager(self.config, self.threadId, targetPort)
        networkServerManager = ClientFuzzerServer(self.config, targetPort)

        # start the server
        if not networkServerManager.start():
            return

        iterStats = {
            "count": 0,  # number of iterations
            "crashCount": 0,  # number of crashes, absolute
            "startTime": time.time(),
            "lastUpdateTime": time.time(),
        }
        sendDataResult = None

        print(str(self.threadId) + " Start fuzzing...")
        self.queue.put((self.threadId, 0, 0, 0))

        fuzzingIterationData = None
        while True:
            self.updateStats(iterStats)
            logging.debug("\n\n")
            logging.debug("A fuzzing loop...")

            if self.config["debug"]:
                # lets sleep a bit
                time.sleep(0.5)

            selectedInput = self.selectInput()

            fuzzingIterationData = fuzzingiterationdata.FuzzingIterationData(
                self.config, selectedInput)
            if not fuzzingIterationData.fuzzData():
                logging.error("Could not fuzz the data")
                return

            networkServerManager.setFuzzData(fuzzingIterationData)
            clientManager.execute()
            networkServerManager.handleConnection()

        networkServerManager.stop()