Example #1
0
 private static void WriteKelinciStatusAsync(NetworkStream stream, DataTypes.FuzzingResult fuzzingResult,
                                             CancellationToken token)
 {
     // Send Status
     stream.WriteAsync(fuzzingResult.FuzzingStatusByte, 0, 1, token);
     // Send Bitmap
     stream.WriteAsync(fuzzingResult.Bitmap, 0, fuzzingResult.Bitmap.Length, token);
 }
Example #2
0
        public static async Task StartKelinciInterface(int port, IfTargetState targetState)
        {
            TcpListener server = new TcpListener(IPAddress.Any, port);

            try
            {
                server.Start();
                Logger.Trace("Kelinci Server Started, waiting for session");
                while (true)
                {
                    #region Initialize

                    // Start new session with Kelinci
                    TcpClient client = server.AcceptTcpClient();
                    var       stream = client.GetStream();
                    DataTypes.FuzzingResult result = new DataTypes.FuzzingResult(StatusCommError, new byte[65536]);
                    CancellationTokenSource cts    = new CancellationTokenSource();
                    Logger.Trace("{0:000000} Start", _sessionCounter);

                    #endregion

                    try
                    {
                        #region ReadKelinciData

                        cts.CancelAfter(Parameters.TimeoutReadKelinciDataAsync);
                        KelinciData kelinciData = await ReadKelinciDataAsync(stream, cts.Token);

                        Logger.Trace("{0:000000} REC KELINCI: Mode: {1}, Length: {2}, Data: {3}", _sessionCounter,
                                     kelinciData.Mode, kelinciData.Length, kelinciData.Data);

                        #endregion

                        if (Parameters.ShortCircuitTesting)
                        {
                            result.FuzzingStatus = StatusSuccess;
                        }
                        else
                        {
                            #region Start State Machine

                            cts.CancelAfter(Parameters.TimeoutStartStateMachineAsync);
                            result = await StateMachine.StartStateMachineAsync(_sessionCounter, kelinciData.Data,
                                                                               targetState, cts.Token);

                            #endregion
                        }
                    }
                    #region Error Handling and Writeback to Kelinci

                    catch (OperationCanceledException e)
                    {
                        Logger.Warn("{0:000000} TIMEOUT: {1}", _sessionCounter, e.Message);
                        result.FuzzingStatus = StatusTimeout;
                    }
                    catch (Exception e)
                    {
                        Logger.Error("{0:000000} Exception: {1}", _sessionCounter, e.Message);
                        result.FuzzingStatus = StatusCommError;
                    }

                    #region WriteKelinciStatus and close stream + client

                    try
                    {
                        cts.CancelAfter(Parameters.TimeoutWriteKelinciStatusAsync);
                        WriteKelinciStatusAsync(stream, result, cts.Token);
                        if (result.FuzzingStatus == StatusTimeout)
                        {
                            Logger.Warn("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter,
                                        result.FuzzingStatus, result.Bitmap.Length);
                        }
                        else if (result.FuzzingStatus == StatusCommError)
                        {
                            Logger.Error("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter,
                                         result.FuzzingStatus, result.Bitmap.Length);
                        }
                        else if (result.FuzzingStatus == StatusCrash)
                        {
                            Logger.Fatal("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter,
                                         result.FuzzingStatus, result.Bitmap.Length);
                            Alarms.PlayAlarmInfinite();
                        }
                        else
                        {
                            Logger.Info("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter,
                                        result.FuzzingStatus, result.Bitmap.Length);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error("{0:000000} WriteKelinciException: {1}", _sessionCounter, e.Message);
                    }
                    finally
                    {
                        stream.Close();
                        client.Close();
                    }

                    #endregion

                    //if (result.FuzzingStatus == StatusCrash)
                    //{
                    //    throw new Exception("CRASH DETECTED");
                    //}

                    Logger.Trace("{0:000000} End", _sessionCounter);
                    _sessionCounter++;

                    #endregion
                }
            }
            catch (SocketException e)
            {
                Logger.Fatal("CRASH: Kelinci Interface: SocketException: {0}", e.Message);
                server.Stop();
                throw;
            }
            finally
            {
                server.Server.Dispose();
            }
        }