This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org

Dinis Cruz Research - Draft Notes

From OWASP
Jump to: navigation, search

Found Jitted Code

This example shows a method to find the final address of JITTED (and preJiTed code)

FindingJit.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;



namespace FindingJit

{

    class FindingJit

    {

        static void Main(string[] args)

        {            

            Console.WriteLine(@"Finding JIT");   

	    outputMethodInfoPointers();                    

            FindingJit_ClassA.method1();

            outputMethodInfoPointers();

            FindingJit_ClassA.method1();

            outputMethodInfoPointers();

            FindingJit_ClassA.method2();

            outputMethodInfoPointers();

            FindingJit_ClassA.method3();

            outputMethodInfoPointers();

            Console.WriteLine(@"Done, press enter to terminate process");

            Console.ReadLine();

        }



        static void outputMethodInfoPointers()

        {

            FindingJit_ClassA fcaObject = new FindingJit_ClassA();

            getMethodProperties(fcaObject.GetType(), "method1");

            getMethodProperties(fcaObject.GetType(), "method2");

            getMethodProperties(fcaObject.GetType(), "method3");

        }

        static  void getMethodProperties(Type tObject, string strMethodName)

        {         



            MethodInfo miMethodInfo = tObject.GetMethod(strMethodName);

          

            IntPtr ipFunctionPointer = miMethodInfo.MethodHandle.GetFunctionPointer();

            Console.WriteLine("ipFunctionPointer: {0}", Convert.ToString(ipFunctionPointer.ToInt32(),16));

            //obfcaObjectject asd = FindingJit_ClassA;

          //  if (null != tType)

           // {

            //    MethodInfo miMethod = tType.GetMethod(strMethodName);



//            }

        }

    }

        



}





FindingJit_ClassA.cs



using System;

using System.Collections.Generic;

using System.Text;



namespace FindingJit

{

    public class FindingJit_ClassA

    {

        public static void method1()

        {

            Console.WriteLine(@"In FindingJit_ClassA.method1");

        }



        public static void method2()

        {

            Console.WriteLine(@"In FindingJit_ClassA.method2");

        }



        public static void method3()

        {

            Console.WriteLine(@"In FindingJit_ClassA.method3");

        }



    }

}





---


Finding JIT

ipFunctionPointer: 4909ed0

ipFunctionPointer: 4909ee0

ipFunctionPointer: 4909ef0

In FindingJit_ClassA.method1

ipFunctionPointer: 4b6a690

ipFunctionPointer: 4909ee0

ipFunctionPointer: 4909ef0

In FindingJit_ClassA.method1

ipFunctionPointer: 4b6a690

ipFunctionPointer: 4909ee0

ipFunctionPointer: 4909ef0

In FindingJit_ClassA.method2

ipFunctionPointer: 4b6a690

ipFunctionPointer: 4b6a6c0

ipFunctionPointer: 4909ef0

In FindingJit_ClassA.method3

ipFunctionPointer: 4b6a690

ipFunctionPointer: 4b6a6c0

ipFunctionPointer: 4b6a6f0

Done, press enter to terminate process






Note how the value of ipFunctionPointer changes with the JIT events.


from the above values we can make the following assumption


Value preJIT value postJIT

In FindingJit_ClassA.method1 4909ed0 4b6a690

In FindingJit_ClassA.method2 4909ee0 4b6a6c0

In FindingJit_ClassA.method3 4909ef0 4b6a6f0



doing the following patch




     static void patchPostJitMethod2WithPostJitMethod1()

        {

            Console.WriteLine(" in patchPostJitMethod2WithPostJitMethod1");

     

            string strPatch = "\xB8" + 

                              "AAAA" + 

                              "\xFF\xE0"; // jmp EAX



            //B8 41414141      MOV EAX,41414141

            //FFE0             JMP EAX





            //int iInt = Int32.Parse(strPatchRaw.Substring(0, 2), 16);            

            PatchMemory(ipMethod2.ToInt32(), strPatch); // \xE9 XXXXXXXX is JMP XXXXXXXX

            Console.WriteLine("done patchPostJitMethod2WithPostJitMethod1");

        }

    }


results in




Unhandled Exception: System.AccessViolationException: Attempted to read or write

protected memory. This is often an indication that other memory is corrupt.



which is the framework sort of handeling the exception


is cdb we see that we controled EIP


In FindingJit_ClassA.method2

ipFunctionPointer: 116bac8

ipFunctionPointer: 116bb38

ipFunctionPointer: 9136f8

in patchPostJitMethod2WithPostJitMethod1

ipFunctionPointer: 116bac8

ipFunctionPointer: 116bb38

done patchPostJitMethod2WithPostJitMethod1

(9bc.120): Access violation - code c0000005 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

eax=41414141 ebx=0012f4ac ecx=0126d180 edx=00000000 esi=00180de8 edi=00000000

eip=41414141 esp=0012f480 ebp=0012f490 iopl=0 nv up ei pl nz ac pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010216

41414141 ??  ???


)



This patches below work if I run it from Visual Studio but don't work if I run it from cmd.exe


     static void patchPostJitMethod2WithPostJitMethod1()

        {

            Console.WriteLine(" in patchPostJitMethod2WithPostJitMethod1....***");

            FindingJit_ClassA fcaObject = new FindingJit_ClassA();

            IntPtr ipMethod1 = getMethodProperties(fcaObject.GetType(), "method1");

            IntPtr ipMethod2 = getMethodProperties(fcaObject.GetType(), "method2");



	    // 		This work, but only if the exe is executed from VS.net 2005

            byte bRelativeJmpAddress = (byte)(ipMethod1.ToInt32() - ipMethod2.ToInt32() -2);



            string strPatchRaw = string.Format("{0}", Convert.ToString(bRelativeJmpAddress, 16));

            string strPatch = "\xEB" + Encoding.UTF7.GetString(new byte[] { bRelativeJmpAddress });



		// EB xx is Jmp Short (current EIP + xx)     // the [target] - [destination] needs to be adusted by two

            /* 

		This work, but only if the exe is executed from VS.net 2005

                int iRelativeJmpAddress = ipMethod1.ToInt32() - ipMethod2.ToInt32();

                string strPatch = "\xE9" + Encoding.UTF7.GetString(new byte[] { 

                  Convert.ToByte(strPatchRaw.Substring(6, 2), 16) ,

                  Convert.ToByte(strPatchRaw.Substring(4, 2),16),

                  Convert.ToByte(strPatchRaw.Substring(2, 2),16),

                  Convert.ToByte(strPatchRaw.Substring(0, 2),16)});

             */

            char[] ctest = strPatch.ToCharArray();

            string dDummy = "";

            //7C81086A   EA 41414141 0000   JMP FAR 0000:41414141                    ; Far jump

            /*

            string strPatch = "\xEA" + "AAAA" + "\x00\x00";

            

           /*



		This doesn' work because we corrupt EAX



             string strPatchRaw = "0" + Convert.ToString(ipMethod1.ToInt32(), 16);

             

             string strPatch = "\xB8" +

                                Encoding.ASCII.GetString(new byte[] { 

                                Convert.ToByte(strPatchRaw.Substring(6, 2), 16) ,

                                Convert.ToByte(strPatchRaw.Substring(4, 2),16),

                                Convert.ToByte(strPatchRaw.Substring(2, 2),16),

                                Convert.ToByte(strPatchRaw.Substring(0, 2),16)}) + 

                              //"AAAA" + 

                              "\xFF\xE0"; // jmp EAX

            */

            //B8 41414141      MOV EAX,41414141

            //FFE0             JMP EAX





            //int iInt = Int32.Parse(strPatchRaw.Substring(0, 2), 16);            

            PatchMemory(ipMethod2.ToInt32(), strPatch); // \xE9 XXXXXXXX is JMP XXXXXXXX

            Console.WriteLine("done patchPostJitMethod2WithPostJitMethod1");

        }

    }



-- what is weird is why it only works in VS.NEt (all cmd.exe, ollybdg and PEBrowe barf at this jmp)

.Net framework using reflection to invoke a private member

  • Example from the .Net framework of using reflection to invoke a private member from another class

in : System.Data, Version=2.0.0.0


in System.Data.SqlClient.SqlCachedBuffer.ToXmlReader() : XmlReader


internal XmlReader ToXmlReader() {

     XmlReader reader1;
     SqlCachedStream stream1 = new SqlCachedStream(this);
     XmlReaderSettings settings1 = new XmlReaderSettings();
     settings1.ConformanceLevel = ConformanceLevel.Fragment;
     MethodInfo info1 = typeof(XmlReader).GetMethod("CreateSqlReader", BindingFlags.NonPublic | BindingFlags.Static);
     object[] objArray1 = new object[3];
     objArray1[0] = stream1;
     objArray1[1] = settings1;
     object[] objArray2 = objArray1;
     new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Assert();
     try
     {
           reader1 = (XmlReader) info1.Invoke(null, objArray2);
     }
     finally
     {
           CodeAccessPermission.RevertAssert();
     }
     return reader1;

}

to see other similar example of this use the Analyzer on System.Security.Permissions.ReflectionPermissionFlag

System.Security.Permissions.ReflectionPermissionFlag

Depends On Used By System.AppDomainInitializerInfo.Unwrap() : AppDomainInitializer System.Data.SqlClient.SqlCachedBuffer.ToXmlReader() : XmlReader System.Data.SqlClient.SqlStream.ToXmlReader() : XmlReader System.Data.SqlTypes.SqlXml.CreateReader() : XmlReader System.DelegateSerializationHolder.GetDelegate(DelegateEntry, Int32) : Delegate System.DelegateSerializationHolder.GetDelegateSerializationInfo(SerializationInfo, Type, Object, MethodInfo, Int32) : DelegateEntry System.Reflection.Emit.DynamicMethod.PerformSecurityCheck(Module, StackCrawlMark&, Boolean) : Void System.Reflection.Emit.DynamicMethod.PerformSecurityCheck(Type, StackCrawlMark&, Boolean) : Void System.Reflection.Emit.DynamicMethod+RTDynamicMethod.Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) : Object System.RuntimeType+ActivatorCache.InitializeDelegateCreator() : Void System.Security.Permissions.ReflectionPermission..ctor(ReflectionPermissionFlag) System.Security.Permissions.ReflectionPermission.Copy() : IPermission System.Security.Permissions.ReflectionPermission.Flags : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermission.FromXml(SecurityElement) : Void System.Security.Permissions.ReflectionPermission.get_Flags() : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermission.Intersect(IPermission) : IPermission System.Security.Permissions.ReflectionPermission.IsSubsetOf(IPermission) : Boolean System.Security.Permissions.ReflectionPermission.IsUnrestricted() : Boolean System.Security.Permissions.ReflectionPermission.m_flags : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermission.Reset() : Void System.Security.Permissions.ReflectionPermission.set_Flags(ReflectionPermissionFlag) : Void System.Security.Permissions.ReflectionPermission.SetUnrestricted(Boolean) : Void System.Security.Permissions.ReflectionPermission.ToXml() : SecurityElement System.Security.Permissions.ReflectionPermission.Union(IPermission) : IPermission System.Security.Permissions.ReflectionPermission.VerifyAccess(ReflectionPermissionFlag) : Void System.Security.Permissions.ReflectionPermissionAttribute.CreatePermission() : IPermission System.Security.Permissions.ReflectionPermissionAttribute.Flags : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermissionAttribute.get_Flags() : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermissionAttribute.get_MemberAccess() : Boolean System.Security.Permissions.ReflectionPermissionAttribute.get_ReflectionEmit() : Boolean System.Security.Permissions.ReflectionPermissionAttribute.get_TypeInformation() : Boolean System.Security.Permissions.ReflectionPermissionAttribute.m_flag : ReflectionPermissionFlag System.Security.Permissions.ReflectionPermissionAttribute.set_Flags(ReflectionPermissionFlag) : Void System.Security.Permissions.ReflectionPermissionAttribute.set_MemberAccess(Boolean) : Void System.Security.Permissions.ReflectionPermissionAttribute.set_ReflectionEmit(Boolean) : Void System.Security.Permissions.ReflectionPermissionAttribute.set_TypeInformation(Boolean) : Void System.Security.Permissions.ReflectionPermissionFlag.AllFlags System.Security.Permissions.ReflectionPermissionFlag.MemberAccess System.Security.Permissions.ReflectionPermissionFlag.NoFlags System.Security.Permissions.ReflectionPermissionFlag.ReflectionEmit System.Security.Permissions.ReflectionPermissionFlag.TypeInformation System.Security.Policy.ApplicationSecurityManager.DecodeAppTrustManagerFromElement(SecurityElement) : IApplicationTrustManager System.Security.SecurityManager.GetSpecialFlags(PermissionSet, PermissionSet) : Int32 System.Security.SecurityManager.MapToSpecialFlags(SecurityPermissionFlag, ReflectionPermissionFlag) : Int32 System.Security.Util.XMLUtil.CreateCodeGroup(SecurityElement) : CodeGroup System.Security.Util.XMLUtil.CreateMembershipCondition(SecurityElement) : IMembershipCondition System.Security.Util.XMLUtil.CreatePermission(SecurityElement, PermissionState, Boolean) : IPermission System.Web.InternalSecurityPermissions.get_Reflection() : IStackWalk