Skip to content

Instantly share code, notes, and snippets.

@galenguyer
Last active February 27, 2020 01:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save galenguyer/6d8ce5c57fecbe737b99c8bad17ecdf8 to your computer and use it in GitHub Desktop.
Save galenguyer/6d8ce5c57fecbe737b99c8bad17ecdf8 to your computer and use it in GitHub Desktop.
Arbitrary Code Execution for C#
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Threading.Tasks;
/*
To execute, run
string code = "your code here";
if (!code.Contains("return")) code = "return " + code;
code = code.Trim().TrimEnd(';') + ";";
var result = await new CodeEval().CSharp(code);
*/
namespace Program
{
public class CodeEval
{
public async Task<string> CSharp(string code)
{
string result = "";
try{
CodeDomProvider evaluator = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Runtime.dll");
parameters.ReferencedAssemblies.Add("System.Linq.dll");
parameters.ReferencedAssemblies.Add("System.Threading.Tasks.dll");
parameters.ReferencedAssemblies.Add("System.Interactive.Async.dll");
parameters.ReferencedAssemblies.Add("System.Collections.Immutable.dll");
parameters.CompilerOptions = "/t:library";
parameters.GenerateInMemory = true;
string classCode = "using System;\n" +
"using System.Runtime;\n" +
"using System.Threading.Tasks;\n" +
"using System.Collections;\n" +
"using System.Collections.Generic;\n" +
"using System.Text.RegularExpressions;\n" +
"using System.Linq;\n\n" +
"namespace CodeEvaluator\n" +
"{\n" +
"public class CodeEvaluator\n" +
"{\n" +
"public async Task<object> EvalCode()\n" +
"{\n" +
"try\n" +
"{\n" +
code +
"}\n" +
"catch(Exception exception)\n" +
"{\n" +
"return exception.Message;\n" +
"}\n" +
"}\n" +
"}\n" +
"}";
CompilerResults codeResults = evaluator.CompileAssemblyFromSource(parameters, classCode);
if (codeResults.Errors.Count > 0)
{
return codeResults.Errors[0].ErrorText;
}
if (!string.IsNullOrEmpty(result))
return result;
Assembly assembly = codeResults.CompiledAssembly;
object instance = assembly.CreateInstance("CodeEvaluator.CodeEvaluator");
if (instance == null)
return (string) null;
MethodInfo method = instance.GetType().GetMethod("EvalCode");
object returnedObject = await (Task<object>) method.Invoke(instance);
result = returnedObject == null ? (string) null : returnedObject.ToString();
evaluator.Dispose();
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
}
}
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Threading.Tasks;
/*
To execute, run
string code = "your code here";
if (!code.Contains("return")) code = "return " + code;
code = code.Trim().TrimEnd(';') + ";";
var result = await new CodeEval().CSharp(code);
*/
namespace Program
{
public class CodeEval
{
public async Task<string> CSharp(string code, object obj)
{
string result = "";
try{
CodeDomProvider evaluator = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Runtime.dll");
parameters.ReferencedAssemblies.Add("System.Linq.dll");
parameters.ReferencedAssemblies.Add("System.Threading.Tasks.dll");
parameters.ReferencedAssemblies.Add("System.Interactive.Async.dll");
parameters.ReferencedAssemblies.Add("System.Collections.Immutable.dll");
parameters.CompilerOptions = "/t:library";
parameters.GenerateInMemory = true;
string classCode = "using System;\n" +
"using System.Runtime;\n" +
"using System.Threading.Tasks;\n" +
"using System.Collections;\n" +
"using System.Collections.Generic;\n" +
"using System.Text.RegularExpressions;\n" +
"using System.Linq;\n\n" +
"namespace CodeEvaluator\n" +
"{\n" +
"public class CodeEvaluator\n" +
"{\n" +
"public async Task<object> EvalCode(object obj)\n" +
"{\n" +
"try\n" +
"{\n" +
code +
"}\n" +
"catch(Exception exception)\n" +
"{\n" +
"return exception.Message;\n" +
"}\n" +
"}\n" +
"}\n" +
"}";
CompilerResults codeResults = evaluator.CompileAssemblyFromSource(parameters, classCode);
if (codeResults.Errors.Count > 0)
{
return codeResults.Errors[0].ErrorText;
}
if (!string.IsNullOrEmpty(result))
return result;
Assembly assembly = codeResults.CompiledAssembly;
object instance = assembly.CreateInstance("CodeEvaluator.CodeEvaluator");
if (instance == null)
return (string) null;
MethodInfo method = instance.GetType().GetMethod("EvalCode");
object returnedObject = await (Task<object>) method.Invoke(instance, new object[1]
{
(object) obj
});
result = returnedObject == null ? (string) null : returnedObject.ToString();
evaluator.Dispose();
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment