Informatik für Ingenieure (InfIng) C - Inside Doz. Dipl.-Ing. H. Hiller WS 2012/13 Durchblick ? ! Schallplatte auflegen… … Musik hören ! Was passiert zwischen "Schallplatte auflegen" … und "Musik hören" ? Was passiert zwischen "Programm schreiben" und "Programm ausführen" ? FH D Fachhochschule Düsseldorf Seite 2 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien © blende40 - Fotolia.com Themen dieser Vorlesung Wir wollen folgender Frage nachgehen: 1. "Welche Stufen durchläuft unser Quellcode, um auf einem Rechnersystem ausgeführt zu werden?" (Prä-) Compilieren, Assemblieren, Linken, Laden FH D Fachhochschule Düsseldorf Seite 3 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Programmerstellung Vom Quellcode bis zum Laden des ausführbaren Programms Editieren Im Rahmen dieses Prozesses entstehen Zwischencodes, die nur temporärer Natur sind. Quellcode (.c) Präprozessor Preprocessed Code (.i) Hierzu gehören der Preprocessed-Code und der Assemblercode Compilieren Assemblercode (.s) Diese temporären Files werden nach ihrer Weiterverarbeitung gelöscht. Assemblieren Maschinencode (.o) Linken Maschinencode (.exe) Durch Setzen bestimmter CompilerOptionen können die Zwischencodes explizit erzeugt werden. Laden/Ausführen FH D Fachhochschule Düsseldorf Seite 4 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Programmerstellung 1. Schritt: Präprozessor Header-Files (*.h) werden zum Quelltext hinzugefügt, z.B. "include" - Dateien Preprocessed Code macht kleinen Quelltext zu einem großen Quelltext-File Datei kann mit einem Editor angesehen werden 2. Schritt: Übersetzen in Assemblercode (compilieren) Aus Quelltext wird prozessorspezifischer Assemblercode erzeugt Datei kann mit einem Editor angesehen werden 3. Schritt: Objektcode erzeugen (assemblieren) Erzeugen eines Files mit den direkten Steuerbefehlen für den Prozessor Datei kann mit einem Editor angesehen werden 4. Schritt: Binden (linken) Verbinden aller Objekte mit den Bibliotheken zu einem ausführbaren Programm FH D Fachhochschule Düsseldorf Seite 5 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 6 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Präprozessor Redaktionelle Ersetzungen (automatisch) String-Literale werden zu einem einzigen String zusammengefügt Kommentare werden entfernt und durch Leerzeichen ersetzt Überflüssige White-Space-Character (Blank, TAB, Newline) werden entfernt Einfügungen und Ersetzungen (gesteuert) Präprozessor-Anweisungen – – Alle Anweisungen an den Präprozessor werden mit dem Zeichen "#" eingeleitet Anweisungen werden durch das Zeilenende abgeschlossen, kein Semikolon (!) Kopieren von Header- und Quelldateien in den Quelltext (#include) Ersetzen von symbolischen Konstanten, z.B. Makros Bedingte Kompilierungen berücksichtigen (#if, #endif, …) Output des Präprozessors Preprocessed Code (zur Weitergabe and den Compiler) Generierung: gcc -E main.c > main.i FH D Fachhochschule Düsseldorf Seite 7 Informatik für Ingenieure WS 2012/13 Im Folgenden weitere Infos zum Präprozessor. FB 5 Fachbereich Medien Einfügen von Dateien Einfügen von Systemdateien #include < dateiname > Suchpfad (1) Verzeichnis der Systemdateien (2) Arbeitsverzeichnis (Verzeichnis, in dem sich der Quellcode befindet) Beispiel – #include <stdio.h> Einfügen von eigenen Dateien #include "dateiname" Suchpfad (1) Arbeitsverzeichnis (Verzeichnis, in dem sich der Quellcode befindet) (2) Verzeichnis der Systemdateien Beispiel – #include "meineDatei.h" FH D Fachhochschule Düsseldorf Seite 8 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Ersetzen von Text Symbolische Konstanten #define bezeichner ersatzbezeichner Symbolische Konstanten sind Ersatznamen für beliebige Konstanten Text-Austausch von bezeichner durch ersatzbezeichner im gesamten Code Vorteile von symbolischen Konstanten – – Lesbarkeit "griffige" Bezeichnungen, z.B. NULL, EOF, etc. Wartbarkeit Bei Änderung von ersatzbezeichner ist nur symb. Konstante zu ändern Beispiel int main() { #define PI 3.1415926f float d; // Makro-Definiton printf("Durchmesser des Kreises: "); scanf("%f", &d); // Benutzereingabe printf("\nUmfang = %f\n", d * PI); return 0; } FH D Fachhochschule Düsseldorf Textersetzung durch den Präprozessor printf("\nUmfang = %f\n", d * 3.1415926f); Seite 9 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Ersetzen von Text Makros #define bezeichner(a1,…, an) ersatzbezeichner Makros sind Symbole für eine oder mehrere Anweisungen Makros haben Argumente, die im Ersatzbezeichner verwendet werden – Makros ohne Argumente entsprechen symbolischen Konstanten Makros können in gewissen Grenzen sogar Funktionen ersetzen – Im Vgl. zu Funktionen sind Makros schneller, da zu "Inline-Code" expandiert Beispiel int main() { #define FL(l,b) (l)*(b) int L, B; } // Marko Textersetzung printf("Laenge und Breite: "); durch den Präprozessor scanf("%i %i", &L, &B); printf("\nFlaeche = %d qm.", FL(L, B)); return 0; printf("\nFlaeche = %d qm.", (L)*(B)); FH D Fachhochschule Düsseldorf Seite 10 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Bedingte Übersetzung Steuern von Übersetzungen Code-Abschnitte werden in Abhängigkeit symbolischer Konstanten übersetzt Vorteil: Geringere Größe der ausführbaren Datei Variante 1: #if...#endif #define DEUTSCH 1 #define ENGLISCH 2 #if test code_abschnitt_1 #else code_abschnitt_2 #endif #define SPRACHE DEUTSCH #if-Direktive entspricht der if-Anweisung Prüfung auf Wahrheitswert eines konst. Identifiers – – #if SPRACHE == DEUTSCH printf("Willkommen"); #else printf("Welcome"); #endif wahr (ungleich 0) code_abschnitt_1 compilieren falsch (gleich 0) code_abschnitt_2 compilieren Jede #if-Direktive muss mit einem #endif enden Variante 1: Kompilierung in Abhängigkeit eines Konstanten-Werts. FH D Fachhochschule Düsseldorf Seite 11 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Bedingte Übersetzung Variante 2: #ifdef...#endif #define DEUTSCH #ifdef test code_abschnitt_1 #else code_abschnitt_2 #endif #ifdef DEUTSCH printf("Willkommen"); #else printf("Welcome"); #endif Prüfung auf Existenz einer symbolischen Konstante Neben #ifdef gibt es auch #ifndef – Prüfung auf das Nicht-Vorhandensein einer symbolischen Konstante Direktive #ifdef ist eine Sonderform der #if Direktive Variante 2: Kompilierung in Abhängigkeit einer Konstanten-Definition. Dies ist eine Sonderform der #if-Direktive: Hier wird nicht auf den Wert einer symbolischen Konstanten geprüft, sondern "lediglich" auf deren Existenz! FH D Fachhochschule Düsseldorf Seite 12 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Preprocessed Code Quellcode Preprocessed Code (vgl. Hello Word) int main() { #define FL(l,b) (l)*(b) int L, B; /* Flaeche wird berechnet */ printf("Laenge und Breite: "); scanf("%i %i", &L, &B); printf("\nFlaeche = %d qm.", FL(L, B)); return 0; } Erzeugt mit gcc -E main.c > main.i int main() { Präp.-Direktive fehlt int L, B; printf("Laenge und Breite: "); scanf("%i %i", &L, &B); printf("\nFlaeche = %d qm.", (L)*(B)); return 0; } FH D Fachhochschule Düsseldorf Seite 13 Informatik für Ingenieure WS 2012/13 Kommentar fehlt Quelltext-Ersetzung FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 14 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Compilieren Lexikalische Analyse (Scanner) Quelltext-Transformation in zusammengehörige Token verschiedener Klassen Beispiel: Bezeichner (printf), Wortsymbole (else), Literale (-1.35e-10) … Syntaktische Analyse (Parser) Prüfung, ob Folge von Tokens der Grammatik der Quellsprache entsprechen Beispiel: Ist die Anweisung mit einem Semikolon abgeschlossen? Semantische Analyse Prüfung der statischen Semantik ("logische Rahmenbedingungen") Beispiel: Wird die deklarierte und definierte Variable typgerecht eingesetzt? Output des Compilers Assembler Code (zur Weitergabe an den Assembler) Generierung: gcc -S main.c Im Folgenden weitere Infos zum Assembler. FH D Fachhochschule Düsseldorf Seite 15 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Assemblercode "Low-Level" Programmiersprache Symbolische Repräsentation einer Maschinensprache (für Menschen lesbar) Repräsentiert eine system-spezifische Prozessorarchitektur (Intel, Motorola) Direkte Programmierung der Hardware Programme sind kleiner und schneller im Vergleich zu Hochsprachen-Programme Sprachumfang Kommentare Symbolische Bezeichner (Mnemonics) für Befehle, Variablen, etc. Makros für die Ersetzung häufig vorkommender Programmteile Beispiel aus der x86-Maschinensprache Intel x86-Architektur, abgeleitet von 8086/8088, 80186, 80286 etc. Laden des hexadezimalen Werts 61 in den ersten Teil des Registers A (l = low) Assembler (Mnemonic): FH D Fachhochschule Düsseldorf movb Seite 16 Informatik für Ingenieure WS 2012/13 $0x61, %al FB 5 Fachbereich Medien Assemblercode Hello Word Lable für Startup-Code (braucht der Linker) Reg. EBP wird auf den Stack geschoben Reg. ESP wird in Reg. EBP verschoben 8 Byte Speicher reservieren auf dem Stack #include <stdio.h> int main() { printf("Hello World"); return 0; } ASCII-String auf den Stack schieben Aufruf der Subroutine _printf Returnwert 0 wird in Reg. EAX gespeichert Freigeben von Speicher auf dem Stack Holen des Programmzeigers vom Stack FH D Fachhochschule Düsseldorf _main: pushl movl subl andl movl addl addl shrl sall movl movl call call movl call movl leave ret Seite 17 Informatik für Ingenieure WS 2012/13 Erzeugt mit gcc -S main.c %ebp %esp, %ebp $8, %esp $-16, %esp $0, %eax $15, %eax $15, %eax $4, %eax $4, %eax %eax, -4(%ebp) -4(%ebp), %eax __alloca ___main $LC0, (%esp) _printf $0, %eax FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 18 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Assemblieren Assembler-Code übersetzen in Maschinensprache Transformieren der Assemblerbefehle in Maschinencode Aus maschinen-nahem Code wird "echter" Maschinencode Assembler (Mnemonic) movb $0x61, %al Maschinensprache (Opcode) 10110000 01100001 Übersetzung jeder Assembleranweisung in eine Maschinenanweisung (1:1) Verwendung der numerischen Äquivalente von Opcodes, Registernamen etc. Details hängen stark von der zugrundeliegenden Maschinensprache ab Umsetzung von symbolischen Namen (z.B. Lables) in Maschinenadressen Verwendung von relativen Maschinenadressen anstelle absoluter Adressen Output des Assemblers Maschinencode (zur Weitergabe an den Linker) Generierung: gcc -c main.c FH D Fachhochschule Düsseldorf Seite 19 Informatik für Ingenieure WS 2012/13 Im Folgenden weitere Infos zum Maschinencode. FB 5 Fachbereich Medien Maschinencode Maschinencode bzw. Maschinensprache Maschinensprache besteht aus einer Folge von Bits/Bytes. Datei enthält direkte Steuerbefehle, so genannte Opcodes Maschinensprache für den Menschen praktisch nicht lesbar Objektprogramm Programmtext in Maschinensprache mit den zugehörigen Daten Nicht aufgelöste Querbezüge und globale Marken Informationen zum Verbinden mehrerer Objektprogramme Namen der global definierten Unterprogramme Namen von benötigten Unterprogrammen (Querbezüge) Verschiebungsinformationen für Befehle und Daten FH D Fachhochschule Düsseldorf Seite 20 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Maschinencode Hello World Assembler-Code pushl movl subl ... call movl call movl leave ret Maschinen-Code (Objekt-Code) %ebp %esp, %ebp $8, %esp Erzeugt mit gcc -c main.c ___main $LC0, (%esp) _printf $0, %eax 80x86-Opcodes Name Regs LEAVE Opcode Proc Description 11001001 80186 High Level Procedure Exit MOV Reg,Imm 1011wrrr 8086 Move Data RET NEAR 11000011 8086 Return from subprocedure FH D Fachhochschule Düsseldorf Seite 21 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 22 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Linken Aufgaben Erstellung eines ausführbaren Programms (.exe-Datei) Zusammenbinden aller Objekt-Dateien (.o-Dateien) Stellt sicher, dass das Programm keine undefinierten Marken enthält Sucht in Bibliotheken alle vordefinierten Teilprogramme Auflösung der Querbezüge zwischen den Programmteilen Speicherverschiebung Festlegung der jeweils belegten Speicherbereiche Verschiebung der Anweisungen Ergebnis Ausführbare Programmdatei (executable file) ELF-Format (früher a.out-Format oder COFF) Im Folgenden weitere Infos zum Linken. FH D Fachhochschule Düsseldorf Seite 23 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Linken mehrerer Objekt-Files Unabhängig voneinander erstellte Quellcode-Files Quellcode #1 Quellcode #2 Quellcode #n Alle Quellcode-Files separat übersetzt Objekt-File #1 Objekt-File #2 Objekt-File #n Linker C-Libraries Programmdatei mit allen Objekt-Files und Libraries FH D Fachhochschule Düsseldorf Ausführbare Datei .exe - File Seite 24 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Statisches und dynamisches Binden Statisches Binden Binden von Programmen und Bibliotheken zur Entwicklungszeit Funktionen werden aus Bibliotheken hinzugenommen (kopiert) Nach Kopiervorgang wird Bibliotheksdatei nicht mehr für Programm benötigt Dynamisches Binden Programme laden Bibliotheken erst, wenn sie tatsächlich benötigt werden Kein Einkopieren der Funktionen in die ausführbare Datei Bibliotheken können von mehreren Anwendungen genutzt werden Bezeichnung: DLL - Dynamic Link Library (Windows) bzw. Shared Library (UNIX) Vorteile der dynamischen Bindung Geringerer Speicherbedarf auf Festplatte und Arbeitsspeicher Effiziente Fehlerbehebung durch Austausch von DLL's (Patches) FH D Fachhochschule Düsseldorf Seite 25 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 26 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Lader Aufgabe Laden von ausführbaren Programmen in den Arbeitsspeicher Grundlegender Dienst eines jeden Betriebssystems Arbeitsweise Lader erhält Informationen… – – … woher das Programm zu holen ist und … in welchen Speicherbereich es zu laden ist Umrechnung der relativen Adressen in absolute Arbeitsspeicher-Adressen Sprung zur main() - Funktion und Übergabe der Kontrolle an das Programm Output Programm als laufender Prozess im Arbeitsspeicher Im Folgenden weitere Infos zu Speicher und Adressen. FH D Fachhochschule Düsseldorf Seite 27 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Virtueller und physikalischer Speicher Virtueller Speicher Speicher aus Sicht des Programms (Physik des Speichers unbekannt) Jedes Programm, bzw. jeder Prozess hat seinen eigenen Adressraum Prozesse können nur im eigenen Adressraum schreiben und lesen Speicherbereichsverletzung sind begrenzt auf das eigene Programm Physikalischer Speicher Tatsächlich verfügbarer Arbeitsspeicher (RAM) Maximal 4 GB Speicher bei einem 32 Bit System Virtueller Adressraum kann größer sein als physischer Speicher (Paging *) *Paging = Arbeitsspeicher-Verwaltung per Seitenadressierung Steht nicht genügend physikalischer Speicher zur Verfügung, so werden nur die Blöcke in den physikalischen Speicher geladen, die augenblicklich verwendet werden. Nichtbenötigte Speicherblöcke werden auf der Festplatte ausgelagert, in der so genannten Auslagerungs-Datei. FH D Fachhochschule Düsseldorf Seite 28 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Adressraum Adressraum eines Prozesses Arbeitsspeicher eines Prozesses ist in sogenannte Segmente aufgeteilt Segmente Text (Code-Segment) – – Prozess Programmcode, lesen/ausführen möglich, kein schreiben Schreibversuche führen zu einem "Segmentation Fault" Stack high Data (Daten-Segment) – – Globale Variablen sowie lokale statische Variablen Nur initialisierte Variablen, nicht-initialisierte landen im BSS Stack – – Heap Dynamischer Speicher, wächst in Richtung niedriger Adressen Speicherung von Rücksprung-Adresse, Parameter etc. Heap – – Dynamischer Speicher, wächst in Richtung höherer Adressen Freier Programmspeicher, Reservierung mittels malloc() BSS (Block Storage Segment) – BSS Data Text low Globale und statische Variablen, die nicht initialisiert sind FH D Fachhochschule Düsseldorf Seite 29 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Laden Programm laden Beim Laden werden Code- und Datensegment in den Arbeitsspeicher geladen Andere Programmteile (z.B. Debug-Informationen, Symbol-Table) bei Bedarf Prozess Stack Programm Heap … BSS Data Data Text Text high low … FH D Fachhochschule Düsseldorf Seite 30 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Übersicht Programmerstellung Präprozessor Compilieren Assemblieren Linken (Binden) Laden "Programmieren. Aber sicher!" FH D Fachhochschule Düsseldorf Seite 31 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Stack Stack ist vergleichbar mit einem Teller-Stapel Nach dem Spülen werden die Teller von oben auf den Stapel gelegt Zum Eindecken werden die Teller von oben herunter genommen Zugriff in aller Regel nur auf den obersten Teller des Teller-Stapels möglich leer 1 Teller 2 Teller 1 Teller leer "Last-In-First-Out" (LIFO) Elemente werden übereinander auf den Stapel gelegt und in umgekehrter Reihenfolge wieder vom Stapel genommen. FH D Fachhochschule Düsseldorf Seite 32 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Stack Vom Teller-Stapel zum Prozessor Adressen und Variablen werden auf den Stack gelegt und wieder geholt Stack wächst nach unten, Variable werden von unten nach oben beschrieben Üblicherweise ist ein Stack 4 Byte "breit" Funktionsaufrufe "landen" auf dem Stack Speicherung der Rücksprungadresse Speicherung aller Argumente und lokaler Variablen (sofern nicht static) Stapelrichtung Stack liegt i.a.R. an der höchstmöglichen Adresse Stapelrichtung meist in Richtung niedrigerer Adressen Vermeidung Kollision mit anderen Programmdaten FH D Fachhochschule Düsseldorf Seite 33 Informatik für Ingenieure WS 2012/13 Stack high Heap low FB 5 Fachbereich Medien Stack Beispiel 1 Aufruf einer Funktion mit 2 Übergabe-Parametern und 1 lokalen Variablen Auf dem Stack werden gespeichert – Rücksprung-Adresse, Übergabe-Parameter, lokale Variable Rücksprung-Adresse wird grundsätzlich als erstes auf den Stack geschrieben Stack-Pointer zeigt auf den jeweils aktuellen Eintrag im Stack int main() { int ergebnis; ergebnis = summe(1,3); } int summe(int a, int b) { int s; s = a + b; return(s); } FH D Fachhochschule Düsseldorf Seite 34 Informatik für Ingenieure WS 2012/13 Stack …. high Rückspr.-Adr. Variabel a Variable b Variable s Stack-Pointer … …. low FB 5 Fachbereich Medien Stack Beispiel 2 Aufruf einer Funktion mit Eingabe einer Zeichenfolge über die Tastatur int main() Stack { eingabe(); high Diese harmlose An…. return 0; weisung ist der Einstiegspunkt Rückspr.-Adr. } für einen Hacker… void eingabe() Zeichen 13-16 { Zeichen 09-12 char name[16]; Zeichen 05-08 printf("\nEingabe Name: \n"); Stack-Pointer scanf("%s", name); Zeichen 01-04 printf("Name: %s", name); …. low } Eingabe : > 16 Zeichen Ergebnis : Verfälschung von Daten bzw. Datenstrukturen, ggf. Programmabsturz Buffer Overflow !!! FH D Fachhochschule Düsseldorf Seite 35 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien Buffer Overflow Buffer Overflow Datenmengen werden in einen zu kleinen Speicherbereich geschrieben Speicherstellen hinter dem Ziel-Speicherbereich werden überschrieben "Feindliche" Nutzung des Buffer Overflows Angreifer gibt mehr Zeichen ein als zulässig Eingabe enthält Programmcode sowie eine manipulierte Rücksprung-Adresse Neue Rücksprung-Adresse zeigt jetzt in den eingeschleusten Programmcode Stack char name[100]; …. high Rückspr.-Adr. Zeichen xx-yy 104 Zeichen 100 Zeichen eingeschleuster Programmcode … … Zeichen aa-bb … FH D Fachhochschule Düsseldorf Seite 36 Informatik für Ingenieure WS 2012/13 low FB 5 Fachbereich Medien Buffer Overflow Faktoren, die einen Buffer Overflow begünstigen Von-Neumann-Architektur – Daten und ausführbarer Code liegen im gleichen Speicher Programmiersprache – – Standardbibliothek sowohl in C als auch in C++ enthalten "gefährliche" Funktionen Zu den "gefährlichen" Funktionen zählen u.a. scanf(), strcpy() bzw. gets() – Grenzen der Speicherbereiche werden nicht automatisch überwacht Nachlässigkeiten bei der Programmierung – Einsatz der "gefährlichen" Funktionen ohne Bereichsprüfung Maßnahmen, die einen "Angriff" abwehren können Zufallszahl-Barriere – – – – – …. Rückspr.-Adr. Zufallszahl zwischen Rücksprung-Adresse und Variablen Platz wird vom Compiler reserviert Schreiben der Zufallszahl bei jedem Funktionsaufruf Compiler fügt Code vor "Verlassen des Programms über die Rücksprungadresse" ein, mittels dem die Zufallszahl auf ihren vorgesehenen Wert hin überprüft wird Validierung fehlgeschlagen Abbruch des Programms FH D Fachhochschule Düsseldorf Stack Seite 37 Informatik für Ingenieure WS 2012/13 Zufallszahl Zeichen xx-yy … Zeichen aa-bb … FB 5 Fachbereich Medien Buffer Overflow – immer für eine Überschrift gut… FH D Fachhochschule Düsseldorf Seite 38 Informatik für Ingenieure WS 2012/13 FB 5 Fachbereich Medien