12
Introduction to Information Security Stack Overflow 1

Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Introduction to Information SecurityStack Overflow

1

Page 2: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Buffer Overflow• Low-level languages (assembly, C, C++) don't have boundary checks

• Careless programmers and large inputs may cause buffer to overflow

• This usually leads to a crash

• Denial of Service (DoS)

• But sometimes, the input can be crafted to affect the execution flow

• Control Hijacking

s xs

if (x->field > 1)...

x->method()2

Page 3: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Stack Overflow• When a function is called

• Its return address is pushed unto the stack

• It is jumped to, and allocates a stack frame

• When the function returns

• It deallocates its stack frame

• Its return address is popped off the stack and jumped to

• What if we overflow a buffer until we overflow its return address?

• A crash!

• Or maybe...

0x120

0x11C

0x118

0x114

0x110

0x10C

0x108

0x104

0x100

RET

BUF

...

...

BUF

3

Page 4: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Stack Overflow• The buffer is at 0x108

• We can write code unto the buffer

• And rewire the return address to jump to it

0x120

0x11C

0x118

0x114

0x110

0x10C

0x108

0x104

0x100

RET

BUF

...

...

0x108

0xeb0x120xc00xb00x5a0x2f

4

Page 5: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

The Return Address• But what is the return address?

• When a program crashes, it creates a core dump – a snapshot of its state just before it crashed

• Core dumps can be opened in GDB, to view the program's memory image (among other things)

5

Page 6: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

The Code• But what code do we write?

• Raw opcodes (not an ELF file) that opens a shell – a shellcode

MOV EAX, 0x0BMOV EBX, "/bin/sh"MOV ECX, 0x00INT 0x80 # system call: execve("/bin/sh", NULL)

MOV EAX, 0x0BMOV EBX, "/bin/sh"MOV ECX, 0x00INT 0x80 # system call: execve("/bin/sh", NULL)

JMP _GET_BIN_BASH_GOT_BIN_BASH:MOV EAX, 0x0BPOP EBXMOV ECX, 0x00INT 0x80 # system call: execve("/bin/sh", NULL)_GET_BIN_BASH:CALL _GOT_BIN_BASH.STRING "/bin/sh"

pushed unto the stack as the return address

# and popped right off# This one you solve yourself

6

Page 7: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

NOP Slides• We don't have to jump precisely to our code

• We can land nearby and "slide" to it on NOPs

0x???

0x???

0x???

0x???

0x???

0x???

0x???

0x???

0x???

RET

BUF

...

...

0x5a0x2f0x900x900x900x90

\xeb\r\xb8\x0b\x00\x00\x00[\xb9\x00\x00\x00\x00\xcd\x80\xe8\xee\xff\xff\xff/bin/sh\x00

\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xeb\r\xb8\x0b\x00\x00\x00[\xb9\x00\x00\x00\x00\xcd\x80\xe8\xee\xff\xff\xff/bin/sh\x00

7

Page 8: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Null Bytes• Many stack overflows are caused by use of insecure standard functions like strcpy or strcat

• These functions copy until a null byte ('\x00') is reached

• On one hand – the input size is not checked!

• Today, more secure functions like strncpy and strncat are used instead

• On the other hand – the shellcode can't contain null bytes

• What can we do with MOV ECX, 0?

• XOR ECX, ECX

• What can we do with .STRING "/bin/bash"?

• .ASCII "/bin/bash#"

• Load it, and then fix it

b9 00 00 00 00

31 c9

2f 62 69 6e 2f 62 61 73 68 00

2f 62 69 6e 2f 62 61 73 68 23

8

Page 9: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

AddendumRelated Vulnerabilities

9

Page 10: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Format String Vulnerabilities• Another way to find out the stack address

• printf("%s", input) is OK

• printf(input) is not

• What if input is "%d"?

10

Page 11: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Integer Overflow• Checking the input size should do it, right?

• Not unless the programmers keep being careless

• If int x = 10, then x > 5 is false

• If int x = 4294967295, is x > 5 still false?

11

Page 12: Introduction to Information Security - TAU...Introduction to Information Security Stack Overflow 1 Buffer Overflow • Low-level languages (assembly, C, C++) don't have boundary checks

Heap Spray• Overflows can happen on the heap as well as the stack

• "Use after free" vulnerability

• More common than you think, especially in complex, multi-threaded code

• The attacker allocates lots of "mines" (that is – sprays the heap with them)

• When the freed object is used, it may trigger a mine

• Can be used to hijack control

• Can be used to escape a sandbox

12