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