CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou Spring 2012.

Slides:



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

What is a pointer? First of all, it is a variable, just like other variables you studied So it has type, storage etc. Difference: it can only store the.
CSc 352 Programming Hygiene Saumya Debray Dept. of Computer Science The University of Arizona, Tucson
Intro to Exploitation Stack Overflows James McFadyen UTD Computer Security Group 10/20/2011.
Stack-Based Buffer Overflows Attacker – Can take over a system remotely across a network. local malicious users – To elevate their privileges and gain.
CMSC 414 Computer and Network Security Lecture 24 Jonathan Katz.
Chapter 15 : Attacking Compiled Applications Alexis Kirat - International Student.
Gabe Kanzelmeyer CS 450 4/14/10.  What is buffer overflow?  How memory is processed and the stack  The threat  Stack overrun attack  Dangers  Prevention.
Netprog: Buffer Overflow1 Buffer Overflow Exploits Taken shamelessly from: netprog/overflow.ppt.
Control hijacking attacks Attacker’s goal: – Take over target machine (e.g. web server) Execute arbitrary code on target by hijacking application control.
Software bugs (and security implications). Software security Code can have perfect design and algorithm, but still have implementation vulnerabilities.
Security Exploiting Overflows. Introduction r See the following link for more info: operating-systems-and-applications-in-
Buffer overflows.
Web Application Access to Databases. Logistics Test 2: May 1 st (24 hours) Extra office hours: Friday 2:30 – 4:00 pm Tuesday May 5 th – you can review.
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2011.
Lecture 0 Appendix on Implementation Threats Material from Warren Page & Chpt 11, Information Security by Mark Stamp.
System Programming Topic 19
Chapter 6 Buffer Overflow. Buffer Overflow occurs when the program overwrites data outside the bounds of allocated memory It was one of the first exploited.
Exploiting Buffer Overflows on AIX/PowerPC HP-UX/PA-RISC Solaris/SPARC.
Buffer Overflows Lesson 14. Example of poor programming/errors Buffer Overflows result of poor programming practice use of functions such as gets and.
CSCD 303 Essential Computer Security Spring 2013 Lecture 17 Buffer Overflow Attacks.
Introduction to Honeypot, measurement, and vulnerability exploits
Overflow Examples 01/13/2012. ACKNOWLEDGEMENTS These slides where compiled from the Malware and Software Vulnerabilities class taught by Dr Cliff Zou.
Overflows & Exploits. In the beginning 11/02/1988 Robert Morris, Jr., a graduate student in Computer Science at Cornell, wrote an experimental, self-replicating,
Section 3.4: Buffer Overflow Attack: Attack Techniques 1.
Lecture 9: Buffer Ovefflows and ROP EEN 312: Processors: Hardware, Software, and Interfacing Department of Electrical and Computer Engineering Spring 2014,
What is exactly Exploit writing?  Writing a piece of code which is capable of exploit the vulnerability in the target software.
A Tool for Pro-active Defense Against the Buffer Overrun Attack D. Bruschi, E. Rosti, R. Banfi Presented By: Warshavsky Alex.
CSC141- Introduction to Computer programming Teacher: AHMED MUMTAZ MUSTEHSAN Lecture – 21 Thanks for Lecture Slides:
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou Spring 2015.
Buffer overflow and stack smashing attacks Principles of application software security.
Sairajiv Burugapalli. This chapter covers three main categories of classic software vulnerability: Buffer overflows Integer vulnerabilities Format string.
Information Security - 2. A Stack Frame. Pushed to stack on function CALL The return address is copied to the CPU Instruction Pointer when the function.
Slides by Kent Seamons and Tim van der Horst Last Updated: Nov 11, 2011.
CS426Fall 2010/Lecture 141 Computer Security CS 426 Lecture 14 Software Vulnerabilities: Format String and Integer Overflow Vulnerabilities.
1988 Morris Worm … estimated 10% penetration 2001 Code Red … 300,00 computers breached 2003 Slammer/Sapphire … 75,00 infections in 10 min Zotob …
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2014.
Software Security. Bugs Most software has bugs Some bugs cause security vulnerabilities Incorrect processing of security related data Incorrect processing.
Principles of Programming - NI Chapter 10: Character & String : In this chapter, you’ll learn about; Fundamentals of Strings and Characters The difference.
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou Spring 2010.
CSC 482/582: Computer Security
Content Coverity Static Analysis Use cases of Coverity Examples
Overflows Mark Shtern.
Refs: rootshell, antionline, your favorite hacker site…
Buffer Overflow Buffer overflows are possible because C doesn’t check array boundaries Buffer overflows are dangerous because buffers for user input are.
Protecting Memory What is there to protect in memory?
Webserver w/user threads
The Hardware/Software Interface CSE351 Winter 2013
Protecting Memory What is there to protect in memory?
Protecting Memory What is there to protect in memory?
CNT4704: Computer Networking Special Topic: Buffer Overflow I: Attack Introduction Cliff Zou Fall 2009.
CS 465 Buffer Overflow Slides by Kent Seamons and Tim van der Horst
Objective Explain basic fuzzing with concrete coding example
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou Spring 2016.
Format String.
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2015.
CNT4704: Analysis of Computer Communication Network Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Fall 2011.
Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou University of Central Florida.
Introduction to Static Analyzer
CNT4704: Analysis of Computer Communication Network Special Topic: Buffer Overflow I: Attack Introduction Cliff Zou Fall 2011.
Software vulnerabilities
CS5123 Software Validation and Quality Assurance
Malware and Software Vulnerability Analysis Fuzzing Test Example Cliff Zou University of Central Florida.
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2016.
Understanding and Preventing Buffer Overflow Attacks in Unix
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2013.
CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow : Example of Using GDB to Check Stack Memory Cliff Zou Spring 2010.
Format String Vulnerability
Overflows, Injection, & Memory Safety
Presentation transcript:

CAP6135: Malware and Software Vulnerability Analysis Buffer Overflow I: Attack Introduction Cliff Zou Spring 2012

2 Acknowledgement  This lecture uses some contents from:  Dr. Erik Poll : software security software security  Dr. Dawn Song: CS161: computer securityCS161: computer security  Buffer Overflow Prevention Buffer Overflow Prevention  Buffer Overflow Buffer Overflow  Dr. Ninghui Li: CS426: Computer SecurityCS426: Computer Security

3 The Problem void foo(char *s) { char buf[10]; strcpy(buf,s); printf(“buf is %s\n”,s); } … foo(“thisstringistolongforfoo”);

4 Exploitation  The general idea is to give servers very large strings that will overflow a buffer.  For a server with sloppy code – it’s easy to crash the server by overflowing a buffer.  It’s sometimes possible to actually make the server do whatever you want (instead of crashing).

5 Necessary Background  C functions and the stack.  A little knowledge of assembly/machine language.  How system calls are made (at the level of machine code level).  exec() system calls  How to “guess” some key parameters.

6 What is a Buffer Overflow?  Intent  Arbitrary code execution  Spawn a remote shell or infect with worm/virus  Denial of service  Cause software to crash  E.g., ping of death attack  Steps  Inject attack code into buffer  Overflow return address  Redirect control flow to attack code  Execute attack code

7 Attack Possibilities  Targets  Stack, heap, static area  Parameter modification (non-pointer data)  Change parameters for existing call to exec()  Change privilege control variable  Injected code vs. existing code  Absolute vs. relative address dependence  Related Attacks  Integer overflows  Format-string attacks

8  Stack Overflow Overview

9 Address Space 0x x code static data bss heap shared library stack kernel space 0x xC xFFFFFFFF From Dawn Song’s RISE:

10 C Call Stack  C Call Stack  When a function call is made, the return address is put on the stack.  Often the values of parameters are put on the stack.  Usually the function saves the stack frame pointer (on the stack).  Local variables are on the stack.

11 A Stack Frame Parameters Return Address Calling Stack Pointer Local Variables Addresses SP SP+offset SP: stack pointer BP: base/frame pointer BP

12 Sample Stack 18 addressof(y=3) return address saved stack pointer buf y x x=2; foo(18); y=3; void foo(int j) { int x,y; char buf[100]; x=j; … }

13 “Smashing the Stack”*  The general idea is to overflow a buffer so that it overwrites the return address.  When the function is done it will jump to whatever address is on the stack.  We put some code in the buffer and set the return address to point to it! *taken from the title of an article in Phrack 49-7

14 Before and After void foo(char *s) { char buf[100]; strcpy(buf,s); … address of s return-address saved sp buf address of s pointer to pgm Small Program

15  What causes buffer overflow?

16 Example: gets() char buf[20]; gets(buf); // read user input until // first EoL or EoF character  Never use gets  Use fgets(buf, size, stdout) instead

17 Example: strcpy() char dest[20]; strcpy(dest, src); // copies string src to dest  strcpy assumes dest is long enough, and assumes src is null-terminated  Use strncpy(dest, src, size) instead

18 Spot the defect! (1) char buf[20]; char prefix[] = ” strcpy(buf, prefix); // copies the string prefix to buf strncat(buf, path, sizeof(buf)); // concatenates path to the string buf

19 Spot the defect! (1) char buf[20]; char prefix[] = ” strcpy(buf, prefix); // copies the string prefix to buf strncat(buf, path, sizeof(buf)); // concatenates path to the string buf strncat’s 3rd parameter is number of chars to copy, not the buffer size Another common mistake is giving sizeof(path) as 3rd argument...

20 Spot the defect! (2) char src[9]; char dest[9]; char base_url = ” strncpy(src, base_url, 9); // copies base_url to src strcpy(dest, src); // copies src to dest base_url is 10 chars long, incl. its null terminator, so src won’t be not null-terminated so strcpy will overrun the buffer dest

21 Example: strcpy and strncpy  Don’t replace strcpy(dest, src) by  strncpy(dest, src, sizeof(dest))  but by  strncpy(dest, src, sizeof(dest)-1)  dest[sizeof(dest)-1] = `\0`;  if dest should be null-terminated!  A strongly typed programming language could of course enforce that strings are always null- terminated...

22 Spot the defect! (3) char *buf; int i, len; read(fd, &len, sizeof(len)); buf = malloc(len); read(fd,buf,len);

23 Spot the defect! (3) char *buf; int i, len; read(fd, &len, sizeof(len)); buf = malloc(len); read(fd,buf,len);  Memcpy() prototype:  void *memcpy(void *dest, const void *src, size_t n);  Definition of size_t: typedef unsigned int size_t; Didn’t check if negative len cast to unsigned and negative length overflows

24 Implicit Casting Bug  A signed/unsigned or an implicit casting bug  Very nasty – hard to spot  C compiler doesn’t warn about type mismatch between signed int and unsigned int  Silently inserts an implicit cast

25 Spot the defect! (4) char *buf; int i, len; read(fd, &len, sizeof(len)); if (len < 0) {error ("negative length"); return; } buf = malloc(len+5); read(fd,buf,len); buf[len] = '\0'; // null terminate buf May results in integer overflow

26 Spot the defect! (5) #define MAX_BUF = 256 void BadCode (char* input) { short len; char buf[MAX_BUF]; len = strlen(input); if (len < MAX_BUF) strcpy(buf,input); } What if input is longer than 32K ? len will be a negative number, due to integer overflow hence: potential buffer overflow

27 Spot the defect! (6) char buff1[MAX_SIZE], buff2[MAX_SIZE]; // make sure it’s a valid URL and will fit if (! isValid(url)) return; if (strlen(url) > MAX_SIZE – 1) return; // copy url up to first separator, ie. first ’/’, to buff1 out = buff1; do { // skip spaces if (*url != ’ ’) *out++ = *url; } while (*url++ != ’/’); strcpy(buff2, buff1);... what if there is no ‘/’ in the URL? Loop termination (exploited by Blaster worm)

28 Spot the defect! (7) #include int main(int argc, char* argv[]) { if (argc > 1) printf(argv[1]); return 0; } This program is vulnerable to format string attacks, where calling the program with strings containing special characters can result in a buffer overflow attack.

29 Format String Attacks  int printf(const char *format [, argument]…);  snprintf, wsprintf …  What may happen if we execute printf(string);  Where string is user-supplied ?  If it contains special characters, eg %s, %x, %n, %hn?

Format String Attacks  Why this could happen?  Many programs delay output message for batch display:  fprintf(STDOUT, err_msg);  Where the err_msg is composed based on user inputs  If a user can change err_msg freely, format string attack is possible 30

31 Format String Attacks  %x reads and prints 4 bytes from stack  this may leak sensitive data  %n writes the number of characters printed so far onto the stack  this allow stack overflow attacks...  C format strings break the “don’t mix data & code” principle.  “Easy” to spot & fix:  replace printf(str) by printf(“%s”, str)

Use Unix Machine in Department  The Unix machine: eustis.eecs.ucf.edu  Must use SSH to connect  Find free SSH clients on Internet  E.g., Putty (command line based)   Find a GUI-based SSH client  Username: NID  Default password: the first initial of your last name in uppercase and the last 5 digits of your PID 32

33 Example of “%x” --- Memory leaking #include void main(int argc, char **argv){ int a1=1; int a2=2; int a3=3; int a4=4; printf(argv[1]); } "what is this?" what is "%x %x %x %x %x %x" bfc994b0 Bfc994b0: saved stack pointer Bfc99508: return address

#include void foo(char *format){ int a1=11; int a2=12; int a3=13; int a4=14; printf(format); } void main(int argc, char **argv){ foo(argv[1]); printf("\n"); } $./format-x-subfun "%x %x %x %x : %x, %x, %x " 80495bc e d c : b, bffff7e8, 80483f4 34 Return address Four variables

35  What does this string (“%x:%x:%s”) do?  Prints first two words of stack memory  Treats next stack memory word as memory addr and prints everything until first '\0‘  Could segment fault if goes to other program’s memory

36  Use obscure format specifier (%n) to write any value to any address in the victim’s memory  %n --- write 4 bytes at once  %hn --- write 2 bytes at once  Enables attackers to mount malicious code injection attacks  Introduce code anywhere into victim’s memory  Use format string bug to overwrite return address on stack (or a function pointer) with pointer to malicious code

Example of “%n”---- write data in memory #include void main(int argc, char **argv){ int bytes; printf(“%s%n\n”, argv[1], &bytes); printf(“You input %d characters\n”, bytes); } hello hello You input 5 characters 37

Function Pointer Overwritten  Function pointers: (used in attack on PHP 4.0.2)  Overflowing buf will override function pointer.  Harder to defend than return-address overflow attacks 38 High addr. Of stack buf[128] FuncPtr

Finding buffer overflows  Hackers find buffer overflows as follows:  Run target server program on local machine.  Issue requests with long tags. All long tags end with “$$$$$”.  If web server crashes, search core dump for “$$$$$” to find overflow location.  Some automated tools exist. (eEye Retina, ISIC).  Then use disassemblers and debuggers (e..g IDA-Pro) to construct exploit. 39

 char Signed 8-bit integer or text string  You should not assign a value > 128 to a “char” variable  unsigned char Unsigned 8-bit integer  short Signed 16-bit integer  unsigned short Unsigned 16-bit integer  int Signed 32-bit integer (Do not use long)  unsigned int Unsigned 32-bit integer  long long Signed 64-bit integer  unsigned long long Unsigned 64-bit integer  float 32-bit real  double 64-bit real 40

Test by Yourself #include void main(void){ /* short x = 32767;*/ unsigned short x = 65535; x = x +1; printf("x= %d\n", x); }  Try to run it to see how overflow happens.  Modify the x definition to see other integer overflow cases 41