Informatik für Ingenieure (InfIng)

Werbung
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
Herunterladen