CNIT 127: Exploit Development

Ch 8: Windows Overflows

Part 2
Topics
• Stack Protection
• Heap-Based Buffer Overflows
• Other Overflows
Stack Protection
Windows Stack Protections
• Microsoft Visual C++ .NET provides
– /GS compiler flag is on by default
– Tells compiler to place security cookies on
the stack to guard the saved return address
– Equivalent of a canary
– 4-byte value (dword) placed on the stack after
a procedure call
– Checked before procedure return
– Protects saved return address and EBP
How is the Cookie Generated?
• When a process starts, Windows combines
these values with XOR
– DateTime (a 64-bit integer counting time
intervals of 100 nanoseconds)
– Process ID
– Thread ID
– TickCount (number of milliseconds since the
system started up)
– Performance Counter (number of CPU cycles)
Predicting the Cookie
• If an attacker can run a process on the
target to get system time values
• Some bits of the cookie can be predicted
Effectively 17 bits of Randomness
How Good is 17 Bits?
• 2^17 = 131,072
• So an attacker would have to run an
attack 100,000 times or so to win by
guessing the cookie
Prologue Modification
• __security_cookie value placed in the
stack at a carefully calculated position
• To protect the EBP and Return value
– From link Ch 8m
Epilogue Modification
• Epilogue to a function now includes these
instructions
– From link Ch 8m
__security_check_cookie
• Current cookie value is in ecx
• Compared to authoritative value stored in
the .data section of the image file of the
procedure
• If the check fails, it calls a security handler,
using a pointer stored in the .data section
Parameter Order
• Before Windows Server 2003, local
variables were placed on the stack in the
order of their declaration in the C++ source
code
• Now all arrays are moved to the bottom of
the list, closest to the saved return address
• This prevents buffer overflows in the
arrays from changing the non-array
variables
Overwriting Parameters
Overwriting Parameters
• We've changed the cookie, but if the
parameters are used in a write operation
before the function returns, we could
– Overwrite the authoritative cookie value in
the .data section, so the cookie check passes
– Overwrite the handler pointer to the security
handler, and let the cookie check fail
• Handler could point to injected code
• Or set handler to zero and overwrite the default
exception handler value
Heap-Based Buffer Overflows
Purpose of the Heap
• Consider a Web server
• HTTP requests vary in length
• May vary from 20 to 20,000 bytes or
longer (in principle)
• Once processed, the request can be
discarded, freeing memory for re-use
• For efficiency, such data is best stored on
the heap
The Process Heap
• Every process running on Win32 has a
process heap
• The C function GetProcessHeap() returns a
handle to the process heap
• A pointer to the process heap is also
stored in the Process Environment Block
The Process Heap
• This code returns that pointer in eax
• Many of the underlying functions of the
Windows API use this default process heap
Dynamic Heaps
• A process can create as many dynamic
heaps as required
• All inside the default process heap
• Created with the HeapCreate() function
• From link Ch 8o
Working with the Heap
• Application uses HeapAllocate() to borrow
a chunk of memory on the heap
– Legacy functions left from Win16 are
LocalAlloc() & GlobalAlloc(), but they do the
same thing—there's no difference in Win32
• When the application is done with the
memory, if calls HeapFree()
– Or LocalFree() or GlobalFree()
How the Heap Works
• The stack grows downwards, towards
address 0x00000000
• The heap grows upwards
• Heap starts with 128 LIST_ENTRY
structures that keep track of free blocks
Vulnerable Heap Operations
• When a chunk is freed, forward and
backward pointers must be updated
• This enables us to control a write
operation, to write to arbitrary RAM
locations
– Image from mathyvanhoef.com, link Ch 5b
Details
• There is a lot more to it, involving these
structures
– Segment list
– Virtual Allocation list
– Free list
– Lookaside list
• For details, see link Ch8o
Exploiting Heap-Based Overflows:

Three Techniques
• Overwrite the pointer to the exception
handler
• Overwrite the pointer to the Unhandled
Exception Filter
• Overwrite a pointer in the PEB
Overwrite a Pointer in the PEB
• RtlEnterCriticalSection, called by
RtlAcquirePebLock() and RtlReleasePebLock()
• Called whenever a process exits with
ExitProcess()
• PEB location is fixed for all versions of Win
NT
• Your code should restore this pointer, and
you may also need to repair the heap
Win 2003 Server
• Does not use these pointers in the PEB
• But there are Ldr* functions that call
pointers we can control
– Including LdrUnloadDll()
Vectored Exception Handling
• Introduced with Windows XP
• Traditional frame-based exception
handling stores exception registration
records on the stack
• Vectored exception handling stores
information about handlers on the heap
• A heap overflow can change them
Overwrite a Pointer to the Unhandled
Exception Filter
• First proposed at Blackhat Amsterdam
(2001)
• An application can set this value using
SetUnhandledExceptionFilter()
– Disassemble that function to find the pointer
Repairing the Heap
• The overflow corrupts the heap
• Shellcode will probably cause an access
violation
• Simplest repair process is to just make the
heap look like a fresh, empty heap
– With the one block we are using on it
Restore the Exception Handler you
Abused
• Otherwise, you could create an endless
loop
• If your shellcode causes an exception
COM Objects and the Heap
• Component Object Model (COM) Objects
– An object that can be created when needed
by another program
– It has methods that can be called to perform
a task
– It also has attributes (stored data)
• COM objects are created on the heap
Vtable in Heap
• All COM classes
have one or more
interfaces, which
are used to connect
them to a program
– Figure from link Ch
8p
COM Objects Contain Data
• If the programmer doesn't check, these
data fields could be overflowed, into the
next object's vtable
– Image from link Ch 8q
• Vunerable COM objects are often not fixed
• Just added to the "killbit" list
• Which can be circumvented
• From link Ch 8qq; Image on next slide from link
Ch 8r
Other Overflows
Overflows in the .data Section
• If a buffer is placed before function pointers in
the .data section
• Overflowing the buffer can change the pointers
TEB/PEB Overflows
• In principle, buffers in the TEB used for
converting ASCII to Unicode could be
overflowed
• Changing pointers
• There are no public examples of this type
of exploit

CNIT 127: Ch 8: Windows overflows (Part 2)

  • 1.
    CNIT 127: ExploitDevelopment
 Ch 8: Windows Overflows
 Part 2
  • 2.
    Topics • Stack Protection •Heap-Based Buffer Overflows • Other Overflows
  • 3.
  • 4.
    Windows Stack Protections •Microsoft Visual C++ .NET provides – /GS compiler flag is on by default – Tells compiler to place security cookies on the stack to guard the saved return address – Equivalent of a canary – 4-byte value (dword) placed on the stack after a procedure call – Checked before procedure return – Protects saved return address and EBP
  • 6.
    How is theCookie Generated? • When a process starts, Windows combines these values with XOR – DateTime (a 64-bit integer counting time intervals of 100 nanoseconds) – Process ID – Thread ID – TickCount (number of milliseconds since the system started up) – Performance Counter (number of CPU cycles)
  • 7.
    Predicting the Cookie •If an attacker can run a process on the target to get system time values • Some bits of the cookie can be predicted
  • 8.
    Effectively 17 bitsof Randomness
  • 9.
    How Good is17 Bits? • 2^17 = 131,072 • So an attacker would have to run an attack 100,000 times or so to win by guessing the cookie
  • 10.
    Prologue Modification • __security_cookievalue placed in the stack at a carefully calculated position • To protect the EBP and Return value – From link Ch 8m
  • 11.
    Epilogue Modification • Epilogueto a function now includes these instructions – From link Ch 8m
  • 12.
    __security_check_cookie • Current cookievalue is in ecx • Compared to authoritative value stored in the .data section of the image file of the procedure • If the check fails, it calls a security handler, using a pointer stored in the .data section
  • 13.
    Parameter Order • BeforeWindows Server 2003, local variables were placed on the stack in the order of their declaration in the C++ source code • Now all arrays are moved to the bottom of the list, closest to the saved return address • This prevents buffer overflows in the arrays from changing the non-array variables
  • 15.
  • 16.
    Overwriting Parameters • We'vechanged the cookie, but if the parameters are used in a write operation before the function returns, we could – Overwrite the authoritative cookie value in the .data section, so the cookie check passes – Overwrite the handler pointer to the security handler, and let the cookie check fail • Handler could point to injected code • Or set handler to zero and overwrite the default exception handler value
  • 17.
  • 18.
    Purpose of theHeap • Consider a Web server • HTTP requests vary in length • May vary from 20 to 20,000 bytes or longer (in principle) • Once processed, the request can be discarded, freeing memory for re-use • For efficiency, such data is best stored on the heap
  • 19.
    The Process Heap •Every process running on Win32 has a process heap • The C function GetProcessHeap() returns a handle to the process heap • A pointer to the process heap is also stored in the Process Environment Block
  • 20.
    The Process Heap •This code returns that pointer in eax • Many of the underlying functions of the Windows API use this default process heap
  • 21.
    Dynamic Heaps • Aprocess can create as many dynamic heaps as required • All inside the default process heap • Created with the HeapCreate() function
  • 22.
  • 23.
    Working with theHeap • Application uses HeapAllocate() to borrow a chunk of memory on the heap – Legacy functions left from Win16 are LocalAlloc() & GlobalAlloc(), but they do the same thing—there's no difference in Win32 • When the application is done with the memory, if calls HeapFree() – Or LocalFree() or GlobalFree()
  • 24.
    How the HeapWorks • The stack grows downwards, towards address 0x00000000 • The heap grows upwards • Heap starts with 128 LIST_ENTRY structures that keep track of free blocks
  • 25.
    Vulnerable Heap Operations •When a chunk is freed, forward and backward pointers must be updated • This enables us to control a write operation, to write to arbitrary RAM locations – Image from mathyvanhoef.com, link Ch 5b
  • 26.
    Details • There isa lot more to it, involving these structures – Segment list – Virtual Allocation list – Free list – Lookaside list • For details, see link Ch8o
  • 27.
    Exploiting Heap-Based Overflows:
 ThreeTechniques • Overwrite the pointer to the exception handler • Overwrite the pointer to the Unhandled Exception Filter • Overwrite a pointer in the PEB
  • 28.
    Overwrite a Pointerin the PEB • RtlEnterCriticalSection, called by RtlAcquirePebLock() and RtlReleasePebLock() • Called whenever a process exits with ExitProcess() • PEB location is fixed for all versions of Win NT • Your code should restore this pointer, and you may also need to repair the heap
  • 29.
    Win 2003 Server •Does not use these pointers in the PEB • But there are Ldr* functions that call pointers we can control – Including LdrUnloadDll()
  • 30.
    Vectored Exception Handling •Introduced with Windows XP • Traditional frame-based exception handling stores exception registration records on the stack • Vectored exception handling stores information about handlers on the heap • A heap overflow can change them
  • 31.
    Overwrite a Pointerto the Unhandled Exception Filter • First proposed at Blackhat Amsterdam (2001) • An application can set this value using SetUnhandledExceptionFilter() – Disassemble that function to find the pointer
  • 32.
    Repairing the Heap •The overflow corrupts the heap • Shellcode will probably cause an access violation • Simplest repair process is to just make the heap look like a fresh, empty heap – With the one block we are using on it
  • 33.
    Restore the ExceptionHandler you Abused • Otherwise, you could create an endless loop • If your shellcode causes an exception
  • 34.
    COM Objects andthe Heap • Component Object Model (COM) Objects – An object that can be created when needed by another program – It has methods that can be called to perform a task – It also has attributes (stored data) • COM objects are created on the heap
  • 35.
    Vtable in Heap •All COM classes have one or more interfaces, which are used to connect them to a program – Figure from link Ch 8p
  • 36.
    COM Objects ContainData • If the programmer doesn't check, these data fields could be overflowed, into the next object's vtable – Image from link Ch 8q
  • 37.
    • Vunerable COMobjects are often not fixed • Just added to the "killbit" list • Which can be circumvented • From link Ch 8qq; Image on next slide from link Ch 8r
  • 39.
  • 40.
    Overflows in the.data Section • If a buffer is placed before function pointers in the .data section • Overflowing the buffer can change the pointers
  • 41.
    TEB/PEB Overflows • Inprinciple, buffers in the TEB used for converting ASCII to Unicode could be overflowed • Changing pointers • There are no public examples of this type of exploit