Intro to Exploitation Stack Overflows

Post on 04-Feb-2016

46 views 0 download

description

Intro to Exploitation Stack Overflows. James McFadyen UTD Computer Security Group 10/20/2011. Intro to Exploitation. Only an intro to stack overflow Basic theory and application One of many types of exploitation. Outline. What is a buffer overflow? Tools Vulnerable C Functions - PowerPoint PPT Presentation

Transcript of Intro to Exploitation Stack Overflows

Intro to Exploitation Stack Overflows

James McFadyen UTD Computer Security Group

10/20/2011

Intro to Exploitation

Only an intro to stack overflow Basic theory and application One of many types of exploitation

Outline

What is a buffer overflow? Tools Vulnerable C Functions Remember the memory Learn to love assembly Stack overflow Protection Mechanisms ret2libc in Linux

Buffer Overflow

“In computer security and programming, a buffer overflow, or buffer overrun, is an anomaly where a program, while writing data to a buffer, overruns the buffer's boundary and overwrites adjacent memory. This is a special case of violation of memory safety.” - Wikipedia

Buffer Overflow

In our examples.. Give the program too much input, hijack the

instruction pointer (EIP) Control EIP Execute arbitrary code locally or remotely Achieve what we want as elevated user

Tools

Linux GDB, gcc, vi, perl/python/ruby, readelf,

objdump, ltrace, strace, ropeme Windows

WinDBG, OllyDBG, ImmunityDBG, IDA, Python, Mona (ImmunityDBG plugin)

Vulnerable C Code

strcpy(), strncpy() strcat(), strncat() sprintf(), snprintf() gets() sscanf() Many others...

Vulnerable C Code

strcpy() doesn't check size If we have

char buf[128];

strcpy(buf, userSuppliedString);

This makes it too easy...

Vulnerable C Code

char *strncpy(char *dest, const char *src, size_t n);

We have a size, but what if..

strncpy(somebuffer, str, strlen(str)); or..

strncpy(somebuffer, str, sizeof(somebuffer)); Where str is supplied by user

Vulnerable C Code

Common bug, proper fix:

strncpy(somebuffer, str, sizeof(somebuffer)-1);

Vulnerable C Code

char *strncat(char *dest, const char *src, size_t n); Ex:

int vulnerable(char *str1, char *str2)

{

char buf[256];

strncpy(buf, str1, 100);

strncat(buf, str2, sizeof(buf)-1);

return;

}

Vulnerable C Code

Fix: strncat(buf, str2, sizeof(buf) - strlen(buf) -1);

Remember the Memory

Text

Data

BSS

Heap

Stack

Initialized global and static variables

Uninitialized global and static variables

Program scratch space. Local variables, pass arguments, etc..

Code segment, machine instr.

Dynamic space.malloc(...) / free(...)new(...) / ~

Low

High * Taken from Mitchell Adair's “Stack Overflows”

Remember the Memory: The Stack

ESP

EBP

RET

arguments...previous stack frame

local variables ...

High

Low

EBP

EBP - x

EBP + x

* Taken from Mitchell Adair's “Stack Overflows”

Love the Assembly

EIP – Extended Instruction Pointer

ESP – Extended Stack Pointer

EBP – Extended Base Pointer

EAX

ECX

EDX

ESI

EDI

Next Instruction executed

Data register

Source index

Destination Index

Counter register

Accumulator register

EBX Base register

Top of stack

Base Pointer

* Taken from Mitchell Adair's “Stack Overflows”

Stack Overflow

ESP

EBP

RET

argc

*argv[]

EBP

char buf[100]

100 bytes

4 bytes

4 bytes

* Taken from Mitchell Adair's “Stack Overflows”

Stack Overflow

ESP

EBP

RET

argc

*argv[]

EBP

100 bytes

4 bytes

4 bytesRET overwrittenRET

108 bytes( 0x41 * 108)

Ret will pop the instruction pointeroff of the stack

EIP will now point to 0x41414141

Ex: $ ./program $(python -c 'print "A" * 108 ')

* Taken from Mitchell Adair's “Stack Overflows”

Stack Overflow

ESP

EBP

RET

argc

*argv[]

EBP

100 bytes

4 bytes

4 bytes0xdeadbeefRET

104 bytes( 0x41 * 104

EIP will now point to 0xdeadbeef

We can now point EIP where we want

Ex: $ ./program $(python -c 'print "A" * 104 + “\xef\xbe\xad\xde” ')

* Taken from Mitchell Adair's “Stack Overflows”

Stack Overflow

$ ./program $(python -c 'print "A" * 104 + “\xef\xbe\xad\xde” ')

We have 104 bytes for a payload

Payload can be anything, but for our purpose we would spawn a shell

The payload will be fixed size, so when we insert it, we must reduce the # of A's by the size of the payload

Stack Overflow

$ ./program $(python -c 'print "A" * 104 + “\xef\xbe\xad\xde” ')

If we had a 32 byte payload .. (real payload will not be a bunch of \xff)

$ ./program $(python -c 'print "A" * 72 + “\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff” + “\xef\xbe\xad\xde” ')

We have adjusted the buffer so the payload will fit We will then have to point EIP (\xef\xbe\xad\xde) to our

payload on the stack

Stack Overflow

$ ./program $(python -c 'print "A" * 72 + “\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff” + “\xef\xbe\xad\xde” ')

“\xef\xbe\xad\xde” would be replaced with the address of our payload

EIP will now point to the address of our payload, which will spawn a shell

NOPs help create a bigger “landing area” This technique is not very effective anymore...

why?

Protection Mechanisms (Windows)

DEP – Data execution Prevention Can't execute on the stack

/GS Flag – cookie / canary detects if stack has been altered

SafeSEH – Structured Exception Handler Try / except, catches exceptions

ASLR - Address Space Layout Randomization

Randomizes addresses in memory

Protection Mechanisms (Linux)

NX – Stack Execute Invalidation Processor feature Like DEP, can't execute on the stack

Stack Smashing Protection – cookie / canary Generally enabled by default

ASLR - Address Space Layout Randomization

Many other compiler protections...

ret2libc

Bypasses NX Point EIP to a function in libc

system(), exec() etc... system(“/bin/sh”);

We will get a shell by using the system() function in libc

ret2libc

$ ./program $(python -c 'print "A" * 104 + “\xef\xbe\xad\xde” ')

We don't need the payload where the A's are anymore

We now will point EIP to the address of system(), then the next 4 bytes will be a return address, followed by system() arguments (which will be /bin/sh)

$ ./program $(python -c 'print "A" * 104 + address_of_system + return_address + payload ')

Demo!

How to use GDB for exploitation Exploring the stack Finding important memory addresses

(ret2libc) Breakpoints Using Perl/Python/Ruby for arguments in GDB

Basic Stack Overflow Ret2libc

Additional Resources

https://www.corelan.be/index.php/articles/ http://beej.us/guide/bggdb/ http://en.wikibooks.org/wiki/X86_Assembly http://www.alexonlinux.com/how-debugger-w

orks http://smashthestack.org/ http://intruded.net/

Sources

“Source Code Auditing” - Jared Demott “Smashing the stack in 2010” - Andrea

Cugliari + Mariano Graziano “Stack Overflows” - Mitchell Adair http://en.wikipedia.org/wiki/Buffer_overflow http://en.wikipedia.org/wiki/Return-to-libc_atta

ck