Files
ctf/2026/cscg/misc/CS_Sript_Time/cs-script-time/Program.cs
2026-03-09 21:44:25 +01:00

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();
}
}
}