130 lines
5.2 KiB
C#
Executable File
130 lines
5.2 KiB
C#
Executable File
using System;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using CSScriptLib;
|
|
|
|
namespace Challenge
|
|
{
|
|
internal class Program
|
|
{
|
|
private const String HEADER = @"
|
|
public object Do()
|
|
{
|
|
var result = new System.Collections.ArrayList();";
|
|
|
|
private const String FOOTER = @"
|
|
if (result.Count == 0) return null;
|
|
return result;
|
|
}
|
|
";
|
|
private const string NAMESPACES = "using System.Collections;\n" +
|
|
"using System.Collections.Generic;\n" +
|
|
"using Math = System.Math;\n" +
|
|
"using ArrayList = System.Collections.ArrayList;\n" +
|
|
"using TimeSpan = System.TimeSpan;\n" +
|
|
"using DateTime = System.DateTime;\n" +
|
|
"using Random = System.Random;\n" +
|
|
"using DayOfWeek = System.DayOfWeek;\n";
|
|
|
|
private const string SCRIPTBASE = "public class Script\n{\n";
|
|
private const string SCRIPTBASE_END = " }";
|
|
|
|
static async Task Main(string[] args)
|
|
{
|
|
await StartTcpListenerAsync();
|
|
}
|
|
|
|
private static async Task StartTcpListenerAsync()
|
|
{
|
|
TcpListener listener = new TcpListener(IPAddress.Any, 1337);
|
|
listener.Start();
|
|
Console.WriteLine("TCP Listener started on port 1337.");
|
|
|
|
while (true)
|
|
{
|
|
TcpClient client = await listener.AcceptTcpClientAsync();
|
|
Console.WriteLine("Client connected.");
|
|
_ = HandleClientAsync(client);
|
|
}
|
|
}
|
|
|
|
private static async Task HandleClientAsync(TcpClient client)
|
|
{
|
|
using (NetworkStream stream = client.GetStream())
|
|
{
|
|
var welcomeMessage = $"Welcome to the script evaluator. Write your script and finish it with $EOF\n";
|
|
|
|
byte[] welcomeMessageBytes = Encoding.UTF8.GetBytes(welcomeMessage);
|
|
await stream.WriteAsync(welcomeMessageBytes, 0, welcomeMessageBytes.Length);
|
|
|
|
byte[] buffer = new byte[1024*128];
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
do {
|
|
int offset = 0;
|
|
int bytesRead = await stream.ReadAsync(buffer, offset, buffer.Length - offset);
|
|
|
|
sb.Append(Encoding.UTF8.GetString(buffer, offset, bytesRead));
|
|
offset += bytesRead;
|
|
}
|
|
while (!sb.ToString().Contains("$EOF"));
|
|
var request = sb.ToString();
|
|
request = request.Replace("$EOF", "");
|
|
|
|
Console.WriteLine($"Received: {request}");
|
|
|
|
// Check for restricted keywords using regex
|
|
string pattern = @"\b(new|using|System|Microsoft|invoke)\b";
|
|
if (Regex.IsMatch(request, pattern, RegexOptions.IgnoreCase))
|
|
{
|
|
string errorResponse = "Script execution denied due to restricted keywords.\n";
|
|
byte[] errorResponseBytes = Encoding.UTF8.GetBytes(errorResponse);
|
|
await stream.WriteAsync(errorResponseBytes, 0, errorResponseBytes.Length);
|
|
Console.WriteLine("Error response sent due to restricted keywords.");
|
|
client.Close();
|
|
return;
|
|
}
|
|
|
|
string script = $"{NAMESPACES}\n{SCRIPTBASE}\n{HEADER}\n{request}\n{FOOTER}\n{SCRIPTBASE_END}\n\n";
|
|
|
|
var fullScriptResponse = $"\n========== \nFull Script: \n{script}";
|
|
byte[] fullScriptResponseBytes = Encoding.UTF8.GetBytes(fullScriptResponse);
|
|
await stream.WriteAsync(fullScriptResponseBytes, 0, fullScriptResponseBytes.Length);
|
|
try
|
|
{
|
|
dynamic scriptObj = CSScript.Evaluator
|
|
.LoadCode(script);
|
|
|
|
dynamic scriptResult = scriptObj.Do();
|
|
|
|
string response;
|
|
if (scriptResult != null)
|
|
{
|
|
response = $"Script executed successfully. Result: {scriptResult}";
|
|
}
|
|
else
|
|
{
|
|
response = "Script executed successfully but returned null.";
|
|
}
|
|
|
|
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
|
|
await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
|
|
Console.WriteLine("Response sent.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
string errorResponse = $"Error executing script: {ex.Message}";
|
|
byte[] errorResponseBytes = Encoding.UTF8.GetBytes(errorResponse);
|
|
await stream.WriteAsync(errorResponseBytes, 0, errorResponseBytes.Length);
|
|
Console.WriteLine("Error response sent.");
|
|
}
|
|
}
|
|
|
|
client.Close();
|
|
}
|
|
}
|
|
}
|