コード例 #1
0
ファイル: gvfuzz.py プロジェクト: Berrrry/grapevine
 def __init__(self, logger, call_mech, syscalls_profile, udp_ip="0.0.0.0", udp_port=10001):
     self.logger = logger
     self.call_mech = call_mech
     self.generator = DefaultGenerator(syscalls_profile, 0)
     self.udp_ip = udp_ip
     self.udp_port = udp_port
     
     # Set up the signals
     signal.signal(signal.SIGSEGV, self.__sig_handler)
     signal.signal(signal.SIGILL, self.__sig_handler)
     signal.signal(signal.SIGSYS, self.__sig_handler)
     signal.signal(signal.SIGINT, self.__interrupt_handler)
コード例 #2
0
ファイル: gvfuzz.py プロジェクト: Berrrry/grapevine
class FuzzD:
    udp_ip = "0.0.0.0" #Listens on all addresses
    udp_port = 10001
    logger = None
    call_mech = None
    sock = None
    generator = None
    generator_namespace = {}
    syscalls_profile = None
    fuzzing = False
    fuzz_thread = None

    def __init__(self, logger, call_mech, syscalls_profile, udp_ip="0.0.0.0", udp_port=10001):
        self.logger = logger
        self.call_mech = call_mech
        self.generator = DefaultGenerator(syscalls_profile, 0)
        self.udp_ip = udp_ip
        self.udp_port = udp_port
        
        # Set up the signals
        signal.signal(signal.SIGSEGV, self.__sig_handler)
        signal.signal(signal.SIGILL, self.__sig_handler)
        signal.signal(signal.SIGSYS, self.__sig_handler)
        signal.signal(signal.SIGINT, self.__interrupt_handler)

    def listen(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.bind((self.udp_ip, self.udp_port))
        print "Socket binding success. Listening on %d." % self.udp_port
        while True:
            data, addr = self.sock.recvfrom(1024) # buffer 1024
            self.__handle(data, addr)

    def __fuzz(self):
        """Begin the fuzzing process with the specified generator inputs called by the calling mechanism."""
        while self.fuzzing:
            gin = self.generator.getNext()
            self.logger.log_syscall(gin[0], *gin[1:])
            gout = self.call_mech.call(gin[0], *gin[1:])
            self.logger.log_return(gout)
            self.generator.affectState(gout)
        

    def __sendback(self, msg, addr):
        self.sock.sendto(msg, addr)
        
    def __handle(self, data, addr):
        """Protocol handling."""
        data = data.lower().strip()
        self.logger.log_command(data, addr)
        print "Received data from host control: %s" % data
        if data == "loadgen":
            gen_name, _ = self.sock.recvfrom(2048)
            seed, _ = self.sock.recvfrom(2048)
            exe_code, _ = self.sock.recvfrom(1024*10)
            exec exe_code in self.generator_namespace # load dynamic code into temp namespace
            self.generator = self.generator_namespace[gen_name](seed, self.syscalls_profile)
            self.logger.log_data('loadgen_params', 
                                 addr, 
                                 gen_name = gen_name,
                                 seed = seed,
                                 exe_code = exe_code)
            self.__sendback("generator %s loaded" % gen_name, addr)
        elif data == "hello":
            self.__sendback("hello from %s" % self, addr)
        elif data == "bye":
            self.__sendback("bye %s:%d." % addr ,addr)
        elif data == "ping":
            self.__sendback("pong", addr)
        elif data == "log":
            log_details, _ = self.sock.recvfrom(2048) # To be sent in the form "127.0.0.1 9001"
            log_ip, log_port = log_details.split()
            self.logger.set_conn(log_ip, log_port)
            self.logger.log_data('log_params', 
                                 addr, 
                                 log_ip = log_ip,
                                 log_port = log_port)
            self.__sendback("Set the address to log on to %s:%d." % (log_ip, int(log_port)), addr)
        elif data == "dumpstate":
            self_dump = dict((name, getattr(self, name)) for name in dir(self))
            self_dump['generator_namespace'] = "Removed for practical reasons."
            dump_to_requester = "Dump of current state:\n\n"
            dump_to_requester = dump_to_requester + "".join(("%s: %s\n" % (i, str(self_dump[i])) for i in self_dump))
            self.__sendback(dump_to_requester, addr)
        elif data == "fuzz":
            if not self.fuzzing:
                self.fuzzing = True
                self.fuzz_thread = Thread(target=self.__fuzz, name="fuzz")
                self.fuzz_thread.start()
                self.__sendback("Fuzzing is turned on.", addr)
            else:
                self.__sendback("Error: A fuzzing instance is already running.", addr)
        elif data == "stopfuzz":
            if self.fuzzing:
                self.fuzzing = False
                self.__sendback("Fuzzing is turned off.", addr)
            else:
                self.__sendback("Error: There is no fuzzing instance to stop.", addr)
        elif data == "exit":
            self.__sendback("goodbye", addr)
            self.__safe_exit("Controller requests exit, terminating program.")
        else:
            self.__sendback("Error: Invalid command.", addr)
            

    # Signal handling to continue fuzzing
    def __sig_handler(self, sig_no, stack_frame):
        self.logger.log_signal(sig_no)
        print "Signal handled: %d." % sig_no

    def __interrupt_handler(self, sig_no, stack_frame):
        self.__safe_exit("Interrupt signal detected, terminating program.")

    # Ensuring a thread safe exit.
    def __safe_exit(self, reason):
        print reason
        self.fuzzing = False
        time.sleep(0)
        sys.exit()