Machine Level Representation of Programs (IV)

Slides:



Advertisements
Similar presentations
Buffer Overflows Nick Feamster CS 6262 Spring 2009 (credit to Vitaly S. from UT for slides)
Advertisements

Smashing the Stack for Fun and Profit
David Brumley Carnegie Mellon University Credit: Some slides from Ed Schwartz.
Review: Software Security David Brumley Carnegie Mellon University.
Today C operators and their precedence Memory layout
University of Washington Last Time For loops  for loop → while loop → do-while loop → goto version  for loop → while loop → goto “jump to middle” version.
1 Function Calls Professor Jennifer Rexford COS 217 Reading: Chapter 4 of “Programming From the Ground Up” (available online from the course Web site)
Assembly תרגול 8 פונקציות והתקפת buffer.. Procedures (Functions) A procedure call involves passing both data and control from one part of the code to.
Andrea Bittau, Adam Belay, Ali Mashtizadeh, David Maziéres, Dan Boneh
September 22, 2014 Pengju (Jimmy) Jin Section E
Fabián E. Bustamante, Spring 2007 Machine-Level Prog. V – Miscellaneous Topics Today Buffer overflow Floating point code Next time Memory.
Security Exploiting Overflows. Introduction r See the following link for more info: operating-systems-and-applications-in-
Machine Programming – IA32 memory layout and buffer overflow CENG331: Introduction to Computer Systems 7 th Lecture Instructor: Erol Sahin Acknowledgement:
Carnegie Mellon 1 This week Buffer Overflow  Vulnerability  Protection.
Introduction CS 104: Applied C++ What is Programming? For some given problem: __________ a solution for it -- identify, organize & store the problem's.
1 Carnegie Mellon Stacks : Introduction to Computer Systems Recitation 5: September 24, 2012 Joon-Sup Han Section F.
Buffer Overflow Computer Organization II 1 © McQuain Buffer Overflows Many of the following slides are based on those from Complete Powerpoint.
University of Washington Today Memory layout Buffer overflow, worms, and viruses 1.
1 Machine-Level Programming V: Advanced Topics Andrew Case Slides adapted from Jinyang Li, Randy Bryant & Dave O’Hallaron.
Ithaca College 1 Machine-Level Programming IX Memory & buffer overflow Comp 21000: Introduction to Computer Systems & Assembly Lang Systems book chapter.
Mitigation of Buffer Overflow Attacks
University of Washington Today Happy Monday! HW2 due, how is Lab 3 going? Today we’ll go over:  Address space layout  Input buffers on the stack  Overflowing.
Smashing the Stack Overview The Stack Region Buffer Overflow
Buffer Overflows Many of the following slides are based on those from
Overflows & Exploits. In the beginning 11/02/1988 Robert Morris, Jr., a graduate student in Computer Science at Cornell, wrote an experimental, self-replicating,
Lecture 8: Buffer Overflow CS 436/636/736 Spring 2013 Nitesh Saxena *Adopted from a previous lecture by Aleph One (Smashing the Stack for Fun and Profit)
What is exactly Exploit writing?  Writing a piece of code which is capable of exploit the vulnerability in the target software.
1 Understanding Pointers Buffer Overflow. 2 Outline Understanding Pointers Buffer Overflow Suggested reading –Chap 3.10, 3.12.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming V: Buffer overflow Slides.
University of Amsterdam Computer Systems – the instruction set architecture Arnoud Visser 1 Computer Systems The instruction set architecture.
Slides by Kent Seamons and Tim van der Horst Last Updated: Nov 11, 2011.
Machine-Level Programming Advanced Topics Topics Linux Memory Layout Buffer Overflow.
1 Assembly Language: Function Calls Jennifer Rexford.
Machine-Level Programming V: Miscellaneous Topics
Buffer Overflow Attacks 1 Basic Idea Sample Attacks Protection , Computer & Network Security.
CS 3214 Computer Systems Godmar Back Lecture 7. Announcements Stay tuned for Project 2 & Exercise 4 Project 1 due Sep 16 Auto-fail rule 1: –Need at least.
Machine-Level Programming V: Miscellaneous Topics Topics Linux Memory Layout Understanding Pointers Buffer Overflow Floating-Point Code CS 105 Tour of.
Machine-Level Programming Advanced Topics Topics Linux Memory Layout Understanding Pointers Buffer Overflow.
Machine-Level Programming Advanced Topics Topics Buffer Overflow.
Mitigation against Buffer Overflow Attacks
Buffer Overflow Buffer overflows are possible because C doesn’t check array boundaries Buffer overflows are dangerous because buffers for user input are.
Machine-Level Programming V: Buffer overflow
CS 177 Computer Security Lecture 9
Reading Condition Codes (Cont.)
Virtualization Virtualize hardware resources through abstraction CPU
C function call conventions and the stack
The Hardware/Software Interface CSE351 Winter 2013
Introduction to Information Security
Homework Reading Machine Projects Labs PAL, pp ,
Machine Language V: Miscellaneous Topics Sept. 25, 2001
Machine-Level Programming V: Miscellaneous Topics
Homework In-line Assembly Code Machine Language
CMSC 414 Computer and Network Security Lecture 21
Buffer overflows Buffer overflows are possible because C does not check array boundaries Buffer overflows are dangerous because buffers for user input.
Computer Architecture adapted by Jason Fritts then by David Ferry
Y86 Processor State Program Registers
Machine-Level Programming 4 Procedures
CS 465 Buffer Overflow Slides by Kent Seamons and Tim van der Horst
Defeating Instruction Set Randomization Nora Sovarel
Assembly Language Programming II: C Compiler Calling Sequences
Machine-Level Programming V: Miscellaneous Topics
Machine Level Representation of Programs (IV)
Machine-Level Programming V: Miscellaneous Topics October 2, 2008
Week 2: Buffer Overflow Part 2.
Heterogeneous Data Structures & Alignment * heterogeneous: 不同种类的
Instructors: Majd Sakr and Khaled Harras
“Way easier than when we were students”
Machine-Level Programming V: Miscellaneous Topics
Computer Architecture and System Programming Laboratory
Return-to-libc Attacks
Presentation transcript:

Machine Level Representation of Programs (IV)

Outline Buffer overflow Suggested readings Chap 3.12

Understanding Pointers Buffer Overflow

Outline Understanding Pointers Buffer Overflow

Every pointer has a type Pointers Every pointer has a type If the object has type T A pointer to this object has type T * Special void * type Represents a generic pointer malloc returns a generic pointer Every pointer has a value

Pointers are created with the & operator Applied to lvalue expression Lvalue expression can appear on the left side of assignment Pointers are dereferenced with the operator * The result is a value having the type associated with the pointer Arrays and pointers are closed related The name of array can be viewed as a pointer constant ip[0] is equivalent to *ip

Addition and subtraction Pointer Arithmetic Addition and subtraction p+i , p-i (result is a pointer) p-q (result is a int) Referencing & dereferencing *p, &E Subscription A[i], *(A+i)

Pointers can point to functions void (*f)(int *) f is a pointer to function The function taken int * as argument The return type of the function is void Assignment makes f point to func f = func Notice the precedence of the operators void *f(int *) declares f is a function (void *) f(int *)

Pointer Declaration char **argv ; int (*daytab)[13] int (*comp)() char (*(*x())[])() Function returning pointer to array[ ] of pointer to function returning char char (*(*x[3])())[5] Array[3] of pointer to function returning pointer to array[5] of char

C operators Operators Associativity () [] -> . ++ -- left to right ! ~ ++ -- + - * & (type) sizeof right to left * / % left to right + - left to right << >> left to right < <= > >= left to right == != left to right & left to right ^ left to right | left to right && left to right || left to right ?: right to left = += -= *= /= %= &= ^= != <<= >>= right to left , left to right Note: Unary +, -, and * have higher precedence than binary forms

Parameter Passing Call by value f(xp) Call by reference f(&xp)

Out-of-Bounds Memory References 1 /* Implementation of library function gets() */ 2 char *gets(char *s) 3 { 4 int c; 5 char *dest = s; 6 int got_char = 0 ; /Has at least one character been read? */ 7 while ((c = getchar()) != ’\n’ && c != EOF) { 8 *dest++ = c; /* No bounds checking */ 9 gotchar = 1; 10 }

Out-of-Bounds Memory References 11 *dest++ = ’\0’; /* Terminate String */ 12 if (c == EOF && !gotchar) 13 return NULL; /* End of file or error */ 14 return s; 15 } 16 Type ctrl-d at keyboard means EOF

Out-of-Bounds Memory References 14 /* Read input line and write it back */ 15 void echo() 16 { 17 char buf[8]; /* Way too small ! */ 18 gets(buf); 19 puts(buf); 20 }

Out-of-Bounds Memory References 1 echo: 2 pushl %ebp Save %ebp on stack 3 movl %esp, %ebp 4 pushl %ebx Save %ebx 5 subl $20, %esp Allocate 20 bytes on stack 6 leal -12(%ebp), %ebx Compute buf as %ebp-12 7 movl %ebx, (%esp) Store buf at top of stack 8 call gets Call gets 9 movl %ebx, (%esp) Store buf at top of stack 10 call puts Call puts 11 addl $20, %esp Deallocate stack space 12 popl %ebx Restore %ebx 13 popl %ebp Restore %ebp 14 ret Return

Out-of-Bounds Memory References Return address Saved %ebp Saved %ebx [7] [6] [5] [4] [3] [2] [1] [0] Stack frame for caller %ebp Stack frame for echo buf

Out-of-Bounds Memory References Return address Saved %ebp [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0] Stack frame for caller %ebp Stack frame for echo buf

Out-of-Bounds Memory References Return address [15] 1[4] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0] Stack frame for caller %ebp Stack frame for echo buf

Out-of-Bounds Memory References [19] [18] [17] [16] [15] 1[4] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0] Stack frame for caller %ebp Stack frame for echo buf

Out-of-Bounds Memory References 1 /* This is very low-quality code. 2 It is intended to illustrate bad programming practices. 3 See Problem 3.43. */ 4 char *getline() 5 { 6 char buf[8]; 7 char *result; 8 gets(buf); 9 result = malloc(strlen(buf)); 10 strcpy(result, buf); 11 return result; 12 }

Out-of-Bounds Memory References 1 080485c0 <getline>: 2 80485c0: 55 push %ebp 3 80485c1: 89 e5 mov %esp,%ebp 4 80485c3: 83 ec 28 sub $0x28,%esp 5 80485c6: 89 5d f4 mov %ebx,-0xc(%ebp) 6 80485c9: 89 75 f8 mov %esi,-0x8(%ebp) 7 80485cc: 89 7d fc mov %edi,-0x4(%ebp) Diagram stack at this point 8 80485cf: 8d 75 ec lea -0x14(%ebp),%esi 9 80485d2: 89 34 24 mov %esi,(%esp) 80485d5: e8 a3 ff ff ff call 804857d <gets> Modify diagram to show stack contents at this point

Out-of-Bounds Memory References 2 push %ebp 3 mov %esp,%ebp 4 sub $0x28,%esp 5 mov %ebx,-0xc(%ebp) 6 mov %esi,-0x8(%ebp) 7 mov %edi,-0x4(%ebp) Diagram stack at this point 8 lea -0x14(%ebp),%esi 9 mov %esi,(%esp) call 804857d <gets> 08 04 86 43 Return address bf ff fc 94 %ebp 0x01 %ebx 0x02 %edi 0x03 %esi

Out-of-Bounds Memory References %ebp 2 push %ebp 3 mov %esp,%ebp 4 sub $0x28,%esp 5 mov %ebx,-0xc(%ebp) 6 mov %esi,-0x8(%ebp) 7 mov %edi,-0x4(%ebp) Diagram stack at this point 8 lea -0x14(%ebp),%esi 9 mov %esi,(%esp) call 804857d <gets> 08 04 86 43 bf ff fc 94 02 03 01 Return address Saved %ebp Saved %edi Saved %esi Saved %ebx bf ff fc 94 %ebp 0x01 %ebx 0x02 %edi 0x03 %esi

Out-of-Bounds Memory References %ebp 2 push %ebp 3 mov %esp,%ebp 4 sub $0x28,%esp 5 mov %ebx,-0xc(%ebp) 6 mov %esi,-0x8(%ebp) 7 mov %edi,-0x4(%ebp) 8 lea -0x14(%ebp),%esi 9 mov %esi,(%esp) call 804857d <gets> Modify diagram to show stack contents at this point 08 04 86 00 33 32 31 30 39 38 37 36 35 34 33 32 31 30 39 38 37 36 35 34 Return address Saved %ebp Saved %edi Saved %esi Saved %ebx bf ff fc 94 %ebp 0x01 %ebx 0x02 %edi 0x03 %esi “012345678901234567890123”

Malicious Use of Buffer Overflow Stack after call to gets() B foo stack frame bar stack frame exploit code pad data written by gets() void bar() { char buf[64]; gets(buf); ... } void foo(){ bar(); return address A

Malicious Use of Buffer Overflow Input string contains byte representation of executable code Overwrite return address with address of buffer When bar() executes ret, will jump to exploit code

The Famous Internet Worm of November 1988 To gain access to many of the computers across the Internet 4 different ways One was a buffer overflow attack on the fingerd Hundreds of machines were effectively paralyzed The author of the worm was caught and prosecuted. He was sentenced to 3 years probation 400 hours of community service and a $10,500 fine

The Famous Internet Worm of November 1988 Steps invoked finger with an appropriate string Made a process at a remote site have a buffer overflow executed code that gave the worm access to the remote system The worm replicated itself and consumed virtually all of the machine’s computing resources

Making a vulnerability to have a stack overflow Stack Randomization Making a vulnerability to have a stack overflow Try the right string on your own computer The string contains The exploit code and The address of this code Put the string to the remote computer Stack randomization makes it hard to determine the address of the exploit code

3 printf("local at %p\n", &local); 4 return 0; 5 } Stack Randomization 1 int main() { 2 int local; 3 printf("local at %p\n", &local); 4 return 0; 5 } Running the code 10,000 times on a Linux (maybe 2.6.16) machine in 32-bit mode the addresses ranged from 0xff7fa7e0 to 0xffffd7e0 A range of around 223

Running in 64-bit mode on the newer machine The addresses ranged from Stack Randomization Running in 64-bit mode on the newer machine The addresses ranged from 0x7fff00241914 to 0x7ffffff98664 A range of nearly 232 Address-space layout randomization (ASLR) each time a program is run different parts of the program are loaded into different regions of memory code, data, heap data, library code, stack

Include a “nop sled” before the actual exploit code Stack Randomization Nop sled a program “slides” through a long sequence of “nop” Nop no operation instruction Include a “nop sled” before the actual exploit code If insert 256-byte nop sled Need to guess 215 starting addresses (no too much) for 32-bit machine Still have too many 224 guesses

Stack Corruption Detection Return address Saved %ebp Saved %ebx Canary [7] [6] [5] [4] [3] [2] [1] [0] Stack frame for caller %ebp Stack frame for echo buf

Stack Corruption Detection 1 echo: 2 pushl %ebp 3 movl %esp, %ebp 4 pushl %ebx 5 subl $20, %esp 6 movl %gs:20, %eax Retrieve canary 7 movl %eax, -8(%ebp) Store on stack 8 xorl %eax, %eax Zero out register 9 leal -16(%ebp), %ebx Compute buf as %ebp-16 10 movl %ebx, (%esp) Store buf at top of stack 11 call gets Call gets 12 movl %ebx, (%esp) Store buf at top of stack 13 call puts Call puts GS is a segment register

Stack Corruption Detection 14 movl -8(%ebp), %eax Retrieve canary 15 xorl %gs:20, %eax Compare to stored value 16 je .L19 If =, goto ok 17 call __stack_chk_fail Stack corrupted! 18 .L19: ok: 19 addl $20, %esp Normal return ... 20 popl %ebx 21 popl %ebp 22 ret %gs:20 Segmented addressing which appeared in 80286 and seldom used today It is marked as read only

Limiting Executable Code Regions Page 4k bytes As a protected unit by OS Should be marked as “readable”, “writable” and “executable” 3 bits are required Originally Intel merged the “readable” and “executable” into one The exploit code in the stack can be executed AMD introduced “NX” in X86-64 Now there 3 bits How about “JIT”?

Return-oriented Programming Code Reuse Attack Return-oriented Programming Find code gadgets in existed code base (e.g. libc) Push address of gadgets on the stack Leverage ‘ret’ to connect code gadgets No code injection Solutions Return-less kernels Heuristic means New Attacks: Jump-oriented Use gadget as dispatcher Address C Address B Address A return addr 0101011010 saved ebp 0101011010 A 0101011010 B C 0101011010

Motivation: Code Reuse Attack