Lecture 9 Aggregate Data Organization Topics Pointers Aggregate Data Array layout in memory Structures February 14, 2012 CSCE 212 Computer Architecture.

Slides:



Advertisements
Similar presentations
Machine-Level Programming IV: Structured Data Feb 5, 2004 Topics Arrays Structs Unions class08.ppt “The course that gives CMU its Zip!”
Advertisements

Today C operators and their precedence Memory layout
University of Washington Data Structures! Arrays  One-dimensional  Multi-dimensional (nested)  Multi-level Structs  Alignment Unions 1.
Structured Data: Sept. 20, 2001 Topics Arrays Structs Unions class08.ppt “The course that gives CMU its Zip!”
Machine-Level Programming V: Miscellaneous Topics Sept. 24, 2002 Topics Linux Memory Layout Understanding Pointers Buffer Overflow Floating Point Code.
Machine-Level Programming IV: Data Sept. 19, 2007 Structured Data Arrays Structs UnionsData/Control Buffer overflow class07.ppt F’07.
Machine-Level Programming V: Miscellaneous Topics Topics Linux Memory Layout Buffer Overflow Floating Point Code CS213.
Machine-Level Programming IV: Structured Data Apr. 23, 2008 Topics Arrays Structures Unions EECS213.
IA32 Stack Discipline From Last Time
Machine-Level Programming IV: Structured Data Topics Arrays Structures Unions CS213.
Structured Data I: Homogenous Data Sept. 17, 1998 Topics Arrays –Single –Nested Pointers –Multilevel Arrays Optimized Array Code class08.ppt “The.
Data Representation and Alignment Topics Simple static allocation and alignment of basic types and data structures Policies Mechanisms.
Stack Activation Records Topics IA32 stack discipline Register saving conventions Creating pointers to local variables February 6, 2003 CSCE 212H Computer.
– 1 – Referencing Examples Code Does Not Do Any Bounds Checking! ReferenceAddressValueGuaranteed? mit[3]36 + 4* 3 = 483 Yes mit[5]36 + 4* 5 = 566 No mit[-1]36.
Fabián E. Bustamante, Spring 2007 Machine-Level Prog. V – Miscellaneous Topics Today Buffer overflow Floating point code Next time Memory.
Machine Programming – IA32 memory layout and buffer overflow CENG331: Introduction to Computer Systems 7 th Lecture Instructor: Erol Sahin Acknowledgement:
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.
Machine-Level Programming 6 Structured Data Topics Structs Unions.
Machine-Level Programming V: Miscellaneous Topics Topics Buffer Overflow Floating Point Code.
Machine-Level Programming III: Procedures Topics IA32 stack discipline Register saving conventions Creating pointers to local variables class07.ppt.
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.
Buffer Overflows Many of the following slides are based on those from
University of Amsterdam Computer Systems – Data in C Arnoud Visser 1 Computer Systems New to C?
Machine-level Programming IV: Data Structures Topics –Arrays –Structs –Unions.
University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming IV: Data Topics: Arrays.
Fabián E. Bustamante, Spring 2007 Machine-Level Prog. IV - Structured Data Today Arrays Structures Unions Next time Arrays.
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Structured Data Topics Arrays Structs Unions CS 105 “Tour of the Black Holes of Computing”
Recitation 3 Outline Recursive procedure Complex data structures –Arrays –Structs –Unions Function pointer Reminders Lab 2: Wed. 11:59PM Lab 3: start early.
Machine-Level Programming V: Miscellaneous Topics Feb 10, 2004 Topics Linux Memory Layout Understanding Pointers Buffer Overflow Floating Point Code class09.ppt.
Machine-Level Programming V: Miscellaneous Topics
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 V: Miscellaneous Topics Feb 6, 2003 Topics Linux Memory Layout Understanding Pointers Buffer Overflow Floating Point Code class09.ppt.
Buffer Overflow Buffer overflows are possible because C doesn’t check array boundaries Buffer overflows are dangerous because buffers for user input are.
The Hardware/Software Interface CSE351 Winter 2013
Machine-Level Programming IV: Data
Machine-Level Programming IV: Data
Machine Language V: Miscellaneous Topics Sept. 25, 2001
Machine-Level Programming IV: Structured Data Sept. 30, 2008
Referencing Examples Code Does Not Do Any Bounds Checking!
Machine-Level Programming 5 Structured Data
Machine-Level Programming 4 Procedures
Machine-level Programming IV: Data Structures
IA32 Stack Discipline From Last Time
IA32 Stack Discipline From Last Time
Machine-Level Programming IV: Data September 8, 2008
Machine-Level Programming 6 Structured Data
Machine-Level Programming IV: Structured Data Sept. 19, 2002
Machine-Level Programming IV: Data
Instructors: Majd Sakr and Khaled Harras
Machine-Level Programming III: Procedures Sept 18, 2001
Machine-Level Programming IV: Data
Instructors: Majd Sakr and Khaled Harras
Machine-Level Programming V: Miscellaneous Topics
Machine-Level Programming V: Miscellaneous Topics October 2, 2008
Machine-Level Programming 5 Structured Data
Machine-Level Programming 5 Structured Data
Machine-Level Programming IV: Structured Data
Instructors: Majd Sakr and Khaled Harras
Structured Data I: Homogenous Data Feb. 10, 2000
Instructor: Fatma CORUT ERGİN
Machine-Level Programming IV: Structured Data
Machine-Level Programming V: Miscellaneous Topics
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Structured Data
Presentation transcript:

Lecture 9 Aggregate Data Organization Topics Pointers Aggregate Data Array layout in memory Structures February 14, 2012 CSCE 212 Computer Architecture

– 2 – CSCE 212H Spring 2012 Overview Last Time GDB recursive Lab 2 – Questions due today Test 1 Feb ?? Not Feb 15New Datalab Pointers Aggregate Data Array layout in memory Structures Next Time: Test 1 – Feb 23 February 27, Mon. Last day to drop a course or withdraw without a grade of "WF" being recorded (Session C002) Test 1 Review

– 3 – CSCE 212H Spring 2012 Pointer Code void s_helper (int x, int *accum) { if (x <= 1) return; else { int z = *accum * x; *accum = z; s_helper (x-1,accum); } int sfact(int x) { int val = 1; s_helper(x, &val); return val; } Top-Level Call Recursive Procedure Pass pointer to update location

– 4 – CSCE 212H Spring 2012 Temp. Space %esp Creating & Initializing Pointer int sfact(int x) { int val = 1; s_helper(x, &val); return val; } _sfact: pushl %ebp# Save %ebp movl %esp,%ebp# Set %ebp subl $16,%esp# Add 16 bytes movl 8(%ebp),%edx# edx = x movl $1,-4(%ebp)# val = 1 Using Stack for Local Variable Variable val must be stored on stack Need to create pointer to it Compute pointer as - 4(%ebp) Push on stack as second argument Initial part of sfact x Rtn adr Old %ebp %ebp val = 1 Unused _sfact: pushl %ebp# Save %ebp movl %esp,%ebp# Set %ebp subl $16,%esp# Add 16 bytes movl 8(%ebp),%edx# edx = x movl $1,-4(%ebp)# val = 1 _sfact: pushl %ebp# Save %ebp movl %esp,%ebp# Set %ebp subl $16,%esp# Add 16 bytes movl 8(%ebp),%edx# edx = x movl $1,-4(%ebp)# val = 1 _sfact: pushl %ebp# Save %ebp movl %esp,%ebp# Set %ebp subl $16,%esp# Add 16 bytes movl 8(%ebp),%edx# edx = x movl $1,-4(%ebp)# val = 1

– 5 – CSCE 212H Spring 2012 Passing Pointer int sfact(int x) { int val = 1; s_helper(x, &val); return val; } leal -4(%ebp),%eax# Compute &val pushl %eax# Push on stack pushl %edx# Push x call s_helper# call movl -4(%ebp),%eax# Return val # Finish Calling s_helper from sfact x Rtn adr Old %ebp %ebp val = 1 -4 Unused %esp x &val Stack at time of call leal -4(%ebp),%eax# Compute &val pushl %eax# Push on stack pushl %edx# Push x call s_helper# call movl -4(%ebp),%eax# Return val # Finish leal -4(%ebp),%eax# Compute &val pushl %eax# Push on stack pushl %edx# Push x call s_helper# call movl -4(%ebp),%eax# Return val # Finish val =x!

– 6 – CSCE 212H Spring 2012 Using Pointer movl %ecx,%eax# z = x imull (%edx),%eax# z *= *accum movl %eax,(%edx)# *accum = z void s_helper (int x, int *accum) { int z = *accum * x; *accum = z; } Register %ecx holds x Register %edx holds pointer to accum Use access (%edx) to reference memory %edx accum x x %eax %ecx accum*x

– 7 – CSCE 212H Spring 2012 Array Allocation Basic Principle T A[ L ]; Array of data type T and length L Contiguously allocated region of L * sizeof( T ) bytes char string[12]; xx + 12 int val[5]; x x + 4x + 8x + 12x + 16x + 20 double a[4]; x + 32 x + 24 x x + 8x + 16 char *p[3]; x x + 4x + 8

– 8 – CSCE 212H Spring 2012 Array Access Basic Principle T A[ L ]; Array of data type T and length L Identifier A can be used as a pointer to array element 0 ReferenceTypeValue val[4]int3 valint * x val+1int * x + 4 &val[2]int * x + 8 val[5]int ?? *(val+1)int5 val + i int * x + 4 i int val[5]; x x + 4x + 8x + 12x + 16x + 20

– 9 – CSCE 212H Spring 2012 Array Example Notes Declaration “ zip_dig cmu ” equivalent to “ int cmu[5] ” Example arrays were allocated in successive 20 byte blocks Not guaranteed to happen in general typedef int zip_dig[5]; zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig mit = { 0, 2, 1, 3, 9 }; zip_dig ucb = { 9, 4, 7, 2, 0 }; zip_dig cmu; zip_dig mit; zip_dig ucb;

– 10 – CSCE 212H Spring 2012 Array Accessing Example Memory Reference Code int get_digit (zip_dig z, int dig) { return z[dig]; } # %edx = z # %eax = dig movl (%edx,%eax,4),%eax # z[dig] Computation Register %edx contains starting address of array Register %eax contains array index Desired digit at 4*%eax + %edx Use memory reference (%edx,%eax,4)

– 11 – CSCE 212H Spring 2012 Referencing Examples Code Does Not Do Any Bounds Checking! ReferenceAddressValueGuaranteed? mit[3]36 + 4* 3 = 483 mit[5]36 + 4* 5 = 569 mit[-1]36 + 4*-1 = 323 cmu[15]16 + 4*15 = 76?? Out of range behavior implementation-dependent No guaranteed relative allocation of different arrays zip_dig cmu; zip_dig mit; zip_dig ucb; Yes No No No

– 12 – CSCE 212H Spring 2012 int zd2int(zip_dig z) { int i; int zi = 0; for (i = 0; i < 5; i++) { zi = 10 * zi + z[i]; } return zi; } Array Loop Example Original Source int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } Transformed Version As generated by GCC Eliminate loop variable i Convert array code to pointer code Express in do-while form No need to test at entrance

– 13 – CSCE 212H Spring 2012 # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop Array Loop Implementation Registers %ecxz %eaxzi %ebxzendComputations 10*zi + *z implemented as *z + 2*(zi+4*zi) z++ increments by 4 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }

– 14 – CSCE 212H Spring 2012 Nested Array Example Declaration “ zip_dig pgh[4] ” equivalent to “ int pgh[4][5] ” Variable pgh denotes array of 4 elements »Allocated contiguously Each element is an array of 5 int ’s »Allocated contiguously “Row-Major” ordering of all elements guaranteed #define PCOUNT 4 zip_dig pgh[PCOUNT] = {{1, 5, 2, 0, 6}, {1, 5, 2, 1, 3 }, {1, 5, 2, 1, 7 }, {1, 5, 2, 2, 1 }}; zip_dig pgh[4];

– 15 – CSCE 212H Spring 2012 Nested Array Allocation Declaration T A[ R ][ C ]; Array of data type T R rows, C columns Type T element requires K bytes Array Size R * C * K bytesArrangement Row-Major Ordering A[0][0]A[0][C-1] A[R-1][0] A[R-1][C-1] int A[R][C]; A [0] A [0] [C-1] A [1] [0] A [1] [C-1] A [R-1] [0] A [R-1] [C-1] 4*R*C Bytes

– 16 – CSCE 212H Spring 2012 Nested Array Row Access Row Vectors A[i] is array of C elements Each element of type T Starting address – base address of A + i * C * K A [i] [0] A [i] [C-1] A[i] A [R-1] [0] A [R-1] [C-1] A[R-1] A A [0] A [0] [C-1] A[0] int A[R][C]; A+i*C*4A+(R-1)*C*4

– 17 – CSCE 212H Spring 2012 Nested Array Row Access Code Row Vector pgh[index] is array of 5 int ’s Starting address pgh+20*indexCode Computes and returns address Compute as pgh + 4*(index+4*index) int *get_pgh_zip(int index) { return pgh[index]; } # %eax = index leal (%eax,%eax,4),%eax# 5 * index leal pgh(,%eax,4),%eax# pgh + (20 * index)

– 18 – CSCE 212H Spring 2012 Nested Array Element Access Array Elements Array Elements A[i][j] is element of type T Address of A[i][j] is base-of A + (i * C + j) * K Base-of A = starting address of array &A[0][0] C = number of columns = number of elements in a row K = size of individual element A [i] [j] A [i] [j] A[i] A [R-1] [0] A [R-1] [C-1] A[R-1] A A [0] A [0] [C-1] A[0] A+i*C*4A+(R-1)*C*4 A+(i*C+j)*4

– 19 – CSCE 212H Spring 2012 Nested Array Element Access Code Array Elements pgh[index][dig] is int Address: pgh + 20*index + 4*digCode Computes address pgh + 4*dig + 4*(index+4*index) movl performs memory reference int get_pgh_digit (int index, int dig) { return pgh[index][dig]; } # %ecx = dig # %eax = index leal 0(,%ecx,4),%edx# 4*dig leal (%eax,%eax,4),%eax# 5*index movl pgh(%edx,%eax,4),%eax# *(pgh + 4*dig + 20*index)

– 20 – CSCE 212H Spring 2012 struct rec { int i; int a[3]; int *p; }; Assembly # %eax = val # %edx = r movl %eax,(%edx)# Mem[r] = val void set_i(struct rec *r, int val) { r->i = val; } Structures Concept Contiguously-allocated region of memory Refer to members within structure by names Members may be of different types Accessing Structure Member Memory Layout iap

– 21 – CSCE 212H Spring 2012 struct rec { int i; int a[3]; int *p; }; # %ecx = idx # %edx = r leal 0(,%ecx,4),%eax# 4*idx leal 4(%eax,%edx),%eax# r+4*idx+4 int * find_a (struct rec *r, int idx) { return &r->a[idx]; } Generating Pointer to Struct. Member Generating Pointer to Array Element Offset of each structure member determined at compile time iap 0416 r *idx r

– 22 – CSCE 212H Spring 2012 struct rec { int i; int a[3]; int *p; }; # %edx = r movl (%edx),%ecx# r->i leal 0(,%ecx,4),%eax# 4*(r->i) leal 4(%edx,%eax),%eax# r+4+4*(r->i) movl %eax,16(%edx)# Update r->p void set_p(struct rec *r) { r->p = &r->a[r->i]; } Structure Referencing (Cont.) C Code ia 0416 Element i iap 0416

– 23 – CSCE 212H Spring 2012 Alignment Aligned Data Primitive data type requires K bytes Address must be multiple of K Required on some machines; advised on IA32 treated differently by Linux and Windows! Motivation for Aligning Data Memory accessed by (aligned) double or quad-words Inefficient to load or store datum that spans quad word boundaries Virtual memory very tricky when datum spans 2 pagesCompiler Inserts gaps in structure to ensure correct alignment of fields

– 24 – CSCE 212H Spring 2012 Specific Cases of Alignment Size of Primitive Data Type: 1 byte (e.g., char) no restrictions on address 2 bytes (e.g., short ) lowest 1 bit of address must be bytes (e.g., int, float, char *, etc.) lowest 2 bits of address must be bytes (e.g., double ) Windows (and most other OS’s & instruction sets): »lowest 3 bits of address must be Linux: »lowest 2 bits of address must be 00 2 »i.e., treated the same as a 4-byte primitive data type 12 bytes ( long double ) Linux: »lowest 2 bits of address must be 00 2 »i.e., treated the same as a 4-byte primitive data type

– 25 – CSCE 212H Spring 2012 struct S1 { char c; int i[2]; double v; } *p; Satisfying Alignment with Structures Offsets Within Structure Must satisfy element’s alignment requirement Overall Structure Placement Each structure has alignment requirement K Largest alignment of any element Initial address & structure length must be multiples of K Example (under Windows): K = 8, due to double element ci[0]i[1]v p+0p+4p+8p+16p+24 Multiple of 4Multiple of 8

– 26 – CSCE 212H Spring 2012 Linux vs. Windows Windows (including Cygwin): K = 8, due to double elementLinux: K = 4; double treated like a 4-byte data type struct S1 { char c; int i[2]; double v; } *p; ci[0]i[1]v p+0p+4p+8p+16p+24 Multiple of 4Multiple of 8 ci[0]i[1] p+0p+4p+8 Multiple of 4 v p+12p+20 Multiple of 4

– 27 – CSCE 212H Spring 2012 Overall Alignment Requirement struct S2 { double x; int i[2]; char c; } *p; struct S3 { float x[2]; int i[2]; char c; } *p; p+0p+12p+8p+16 Windows : p+24 Linux : p+20 ci[0]i[1]xci[0]i[1] p+0p+12p+8p+16p+20 x[0]x[1] p+4 p must be multiple of: 8 for Windows 4 for Linux p must be multiple of 4 (in either OS)

– 28 – CSCE 212H Spring 2012 Ordering Elements Within Structure struct S4 { char c1; double v; char c2; int i; } *p; struct S5 { double v; char c1; char c2; int i; } *p; c1iv p+0p+20p+8p+16p+24 c2c1iv p+0p+12p+8p+16 c2 10 bytes wasted space in Windows 2 bytes wasted space

– 29 – CSCE 212H Spring 2012 Arrays of Structures Principle Allocated by repeating allocation for array type In general, may nest arrays & structures to arbitrary depth a[0] a+0 a[1]a[2] a+12a+24a+36 a+12a+20a+16a+24 struct S6 { short i; float v; short j; } a[10]; a[1].ia[1].ja[1].v

– 30 – CSCE 212H Spring 2012 Linux Memory Layout Stack Runtime stack (8MB limit)Heap Dynamically allocated storage When call malloc, calloc, newDLLs Dynamically Linked Libraries Library routines (e.g., printf, malloc ) Linked into object code when first executedData Statically allocated data E.g., arrays & strings declared in codeText Executable machine instructions Read-only Upper 2 hex digits of address Red Hat v. 6.2 ~1920MB memory limit FF BF 7F 3F C Stack DLLs Text Data Heap 08

– 31 – CSCE 212H Spring 2012 Linux Memory Allocation Linked BF 7F 3F Stack DLLs Text Data 08 Some Heap BF 7F 3F Stack DLLs Text Data Heap 08 More Heap BF 7F 3F Stack DLLs Text Data Heap 08 Initially BF 7F 3F Stack Text Data 08

– 32 – CSCE 212H Spring 2012 Text & Stack Example (gdb) break main (gdb) run Breakpoint 1, 0x804856f in main () (gdb) print $esp $3 = (void *) 0xbffffc78 Main Address 0x804856f should be read 0x fStack Address 0xbffffc78 Initially BF 7F 3F Stack Text Data 08

– 33 – CSCE 212H Spring 2012 Dynamic Linking Example (gdb) print malloc $1 = { } 0x (gdb) run Program exited normally. (gdb) print malloc $2 = {void *(unsigned int)} 0x Initially Code in text segment that invokes dynamic linker Address 0x should be read 0x Final Code in DLL region Linked BF 7F 3F Stack DLLs Text Data 08

– 34 – CSCE 212H Spring 2012 Memory Allocation Example char big_array[1<<24]; /* 16 MB */ char huge_array[1<<28]; /* 256 MB */ int beyond; char *p1, *p2, *p3, *p4; int useless() { return 0; } int main() { p1 = malloc(1 <<28); /* 256 MB */ p2 = malloc(1 << 8); /* 256 B */ p3 = malloc(1 <<28); /* 256 MB */ p4 = malloc(1 << 8); /* 256 B */ /* Some print statements... */ }

– 35 – CSCE 212H Spring 2012 Example Addresses $esp0xbffffc78 p3 0x500b5008 p1 0x400b4008 Final malloc0x p40x1904a640 p20x1904a538 beyond 0x1904a524 big_array 0x1804a520 huge_array 0x0804a510 main()0x f useless() 0x Initial malloc0x BF 7F 3F Stack DLLs Text Data Heap 08

– 36 – CSCE 212H Spring 2012 C operators OperatorsAssociativity () [] ->.left to right ! ~ * & (type) sizeofright 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

– 37 – CSCE 212H Spring 2012 C pointer declarations int *p p is a pointer to int int *p[13] p is an array[13] of pointer to int int *(p[13]) p is an array[13] of pointer to int int **p p is a pointer to a pointer to an int int (*p)[13] p is a pointer to an array[13] of int int *f() f is a function returning a pointer to int int (*f)() f is a pointer to a function returning int int (*(*f())[13])() f is a function returning ptr to an array[13] of pointers to functions returning int int (*(*x[3])())[5] x is an array[3] of pointers to functions returning pointers to array[5] of ints

– 38 – CSCE 212H Spring 2012 Internet Worm and IM War November, 1988 Internet Worm attacks thousands of Internet hosts. How did it happen? July, 1999 Microsoft launches MSN Messenger (instant messaging system). Messenger clients can access popular AOL Instant Messaging Service (AIM) servers AIM server AIM client AIM client MSN client MSN server

– 39 – CSCE 212H Spring 2012 Internet Worm and IM War (cont.) August 1999 Mysteriously, Messenger clients can no longer access AIM servers. Microsoft and AOL begin the IM war: AOL changes server to disallow Messenger clients Microsoft makes changes to clients to defeat AOL changes. At least 13 such skirmishes. How did it happen? The Internet Worm and AOL/Microsoft War were both based on stack buffer overflow exploits! many Unix functions do not check argument sizes. allows target buffers to overflow.

– 40 – CSCE 212H Spring 2012 String Library Code Implementation of Unix function gets No way to specify limit on number of characters to read Similar problems with other Unix functions strcpy : Copies string of arbitrary length scanf, fscanf, sscanf, when given %s conversion specification /* Get string from stdin */ char *gets(char *dest) { int c = getc(); char *p = dest; while (c != EOF && c != '\n') { *p++ = c; c = getc(); } *p = '\0'; return dest; }

– 41 – CSCE 212H Spring 2012 Vulnerable Buffer Code int main() { printf("Type a string:"); echo(); return 0; } /* Echo Line */ void echo() { char buf[4]; /* Way too small! */ gets(buf); puts(buf); }

– 42 – CSCE 212H Spring 2012 Buffer Overflow Executions unix>./bufdemo Type a string: unix>./bufdemo Type a string:12345 Segmentation Fault unix>./bufdemo Type a string: Segmentation Fault

– 43 – CSCE 212H Spring 2012 Buffer Overflow Stack echo: pushl %ebp# Save %ebp on stack movl %esp,%ebp subl $20,%esp# Allocate space on stack pushl %ebx# Save %ebx addl $-12,%esp# Allocate space on stack leal -4(%ebp),%ebx# Compute buf as %ebp-4 pushl %ebx# Push buf on stack call gets# Call gets... /* Echo Line */ void echo() { char buf[4]; /* Way too small! */ gets(buf); puts(buf); } Return Address Saved %ebp [3][2][1][0] buf %ebp Stack Frame for main Stack Frame for echo

– 44 – CSCE 212H Spring 2012 Buffer Overflow Stack Example Before call to gets unix> gdb bufdemo (gdb) break echo Breakpoint 1 at 0x (gdb) run Breakpoint 1, 0x in echo () (gdb) print /x *(unsigned *)$ebp $1 = 0xbffff8f8 (gdb) print /x *((unsigned *)$ebp + 1) $3 = 0x804864d :call c d:mov 0xffffffe8(%ebp),%ebx # Return Point Return Address Saved %ebp [3][2][1][0] buf %ebp Stack Frame for main Stack Frame for echo 0xbffff8d8 Return Address Saved %ebp [3][2][1][0] buf Stack Frame for main Stack Frame for echo bffff d xx

– 45 – CSCE 212H Spring 2012 Buffer Overflow Example #1 Before Call to gets Input = “123” No Problem 0xbffff8d8 Return Address Saved %ebp [3][2][1][0] buf Stack Frame for main Stack Frame for echo bffff d Return Address Saved %ebp [3][2][1][0] buf %ebp Stack Frame for main Stack Frame for echo

– 46 – CSCE 212H Spring 2012 Buffer Overflow Stack Example #2 Input = “12345” :push %ebx :call 80483e4 # gets :mov 0xffffffe8(%ebp),%ebx b:mov %ebp,%esp d:pop %ebp# %ebp gets set to invalid value e:ret echo code: 0xbffff8d8 Return Address Saved %ebp [3][2][1][0] buf Stack Frame for main Stack Frame for echo bfff d Return Address Saved %ebp [3][2][1][0] buf %ebp Stack Frame for main Stack Frame for echo Saved value of %ebp set to 0xbfff0035 Bad news when later attempt to restore %ebp

– 47 – CSCE 212H Spring 2012 Buffer Overflow Stack Example #3 Input = “ ” Return Address Saved %ebp [3][2][1][0] buf %ebp Stack Frame for main Stack Frame for echo :call c d:mov 0xffffffe8(%ebp),%ebx # Return Point 0xbffff8d8 Return Address Saved %ebp [3][2][1][0] buf Stack Frame for main Stack Frame for echo Invalid address No longer pointing to desired return point %ebp and return address corrupted

– 48 – CSCE 212H Spring 2012 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 void bar() { char buf[64]; gets(buf);... } void foo(){ bar();... } Stack after call to gets() B return address A foo stack frame bar stack frame B exploit code pad data written by gets()