Sichere Implementierung

Slides:



Advertisements
Ähnliche Präsentationen
PHP Extension und Application Repository
Advertisements

C Sharp (C#) Martin Saternus Senior Student Partner
Imperative Programmierung
der Universität Oldenburg
Forschungszentrum caesar
Einführung in die Informatik: Programmierung und Software-Entwicklung
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Imperative Programmierung -Entwicklungswerkzeuge
der Universität Oldenburg
SAP R/3 - Speichermanagement
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Java: Grundlagen der Sprache
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Oracle WebServer - Einführung. © Prof. T. Kudraß, HTWK Leipzig Oracle Web Application Server HTML WebServer ® File system Static HTML PL/SQL Packages.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Brandenburgische Technische Universität Cottbus Program Profiling Andrzej Filipiak Übung Testen von Software SoSe 2006.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Batch-Programmierung Grundlagen
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
Arrays,Strings&Pointer in C/C++
DVG Einführung in Java1 Einführung in JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
20:00.
© Gabriele Sowada © Gabriele Sowada 2 Manuell Beispiel 1 demonstriert die Vorgehensweise bei der manuellen Programm- Eingabe am.
Die Geschichte von Rudi
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
TWS/Graph HORIZONT Produktionsüberwachung für “TWS for z/OS”
Einführung in die Programmierung
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Analyse von Ablaufdiagrammen
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
HORIZONT 1 XINFO ® Das IT - Informationssystem Assembler HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 /
Dynamische Datentypen
Präsentation von Lukas Sulzer
Symmetrische Blockchiffren DES – der Data Encryption Standard
REBOL. Was ist REBOL frei verfügbar plattformübergreifend highly reflective flexibel kompakt interpretiert.
Einführung in PHP.
Einführung in PHP 5.
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Mag. Andreas Starzer weloveIT – EDV Dienstleistungen
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
1 Mathematical Programming Nichtlineare Programmierung.
1 Proseminar TUM Informatik PalmPilot und Handspring: Technik, Programmierung, Anwendung Hacks Daniel Schweighart
Numbers Greetings and Good-byes All about Me Verbs and Pronouns
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Exploiting Web Applications
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
Pentestlab — Bufferoverflows dud.inf.tu-dresden.de
Vom HW-Automaten zum Prozessor
CSL211 Computer Architecture
Implementieren von Klassen
Pentestlab — Bufferoverflows dud.inf.tu-dresden.de
 Präsentation transkript:

Sichere Implementierung Systemsicherheit: Bufferoverflow, FormatString

Motivation Übungsaufgabe Lab3: Stack-basierte Buffer Overflows Dr. Wolf Müller

“Buffer Overflow“-Angriffe „Buffer Overflow“-Angriffe nutzen Schachstellen, die sich aus Implementierungsfehlern infolge nachlässiger Programmierung resultieren. Ansatzpunkt: Programme, wo Daten in Variablen fester Länge (String, Array), eingelesen oder kopiert werden, ohne, dass die reale Länge durch das Programm geprüft wird. Variablen, in die Daten kopiert werden sind abstrakt betrachtet Pufferbereiche (buffer). Schreiben einer zu großen Datenmenge führt zum Überlauf (overflow). Dr. Wolf Müller

Ziel, Ablauf Absicht: Schritte: Ausführung beliebigen Codes Ausführung einer Remote-Shell, Installation eines Virus, Keyloggers, … Denial of service Schritte: Einbringen von Code in den Puffer Umleitung des Kontrollflusses zum Angriffs-Code Ausführung des Angriffs-Codes Dr. Wolf Müller

Buffer Overflow: Entwicklung Anfangs nur Ausnutzung von Operationen zum Kopieren von Zeichenketten Später auch Integer-Overflow Schleifen die nicht korrekt terminieren Unicode-Probleme - Länge einzelner Zeichen ist variabel Dr. Wolf Müller

Angriffsmöglichkeiten Ziele stack, heap, static area Parameter Veränderung (non-pointer data) D. h. Ändern von Parametern für existierende Aufrufe zu exec() Injizierter Code und existierender Code Absolute und relative Adressenabhängigkeiten Ähnliche Attacken Integer overflows Format-string Angriffe Dr. Wolf Müller

Adressraumverwaltung Alle gängigen OS unterstützen virtuellen Speicher Jedem Prozess virtueller Adressraum zugeordnet Drei logische Bereiche Text bzw. Codesegmet Enthält Befehle des Prozesses In der Regel durch OS gegen Überschreiben geschützt Heap Enthält dynamisch angelegte Datenobjekte, globale Variablen, globale Konstanten Wächst von niedrigen zu höheren Adressen Grenze zum Stack fließend Stack LIFO Dient Verwaltung von Prozeduraufrufen Enthält lokale Variablen von Prozeduraufrufen, deren Eingabeparameter, Rücksprungadresse, Umgebungsvariablen Wächst von höheren zu niedrigen Adressen Compiler erzeugt Maschinencode, um Daten auf Stack und Heap zu speichern oder wieder zu entfernen Stack und Heap können nicht gegen Überschreiben geschützt werden, sind in der Regel ausführbar. Dr. Wolf Müller

Segmentierung des virtuellen Adressraums 0xFFFFFFFF kernel space argument 2 argument 1 RA frame pointer locals buffer 0xC0000000 stack Attack code Address of shared library 0x42000000 heap bss static data code 0x08048000 0x00000000 Dr. Wolf Müller

Stack Stack Layout Jede aufgerufene Prozedur bekommt neuen Stack Frame auf Stack Stack wächst (in der Regel) zu niedrigen Adressen Stack Pointer zeigt auf aktuell oberstes Stackelement (erstes verfügbares Element) Frame Pointer zeigt auf Anfang des aktuellen Stackframes Größe und Offset des Frames werden zur Compile-Zeit festgelegt. Inhalt des Stackframes wird als Offset relativ zum Stackpointer oder Framepointer addressiert.

Stack Frame: Was liegt drin? Parameter Lokale Variablen Temporäre Werte Rückgabewert Stack Pointer Frame Pointer Returnadresse (gespeicherter PC) Dynamisch gelinkt Referenz auf Frame des Aufrufenden, um nach Aufruf ursprünglichen Stack wieder zu rekonstruieren. Statisch gelinkt Referenz auf auf nächsten Frame der lexikalisch einschließenden Prozedur.

Stack Layout Angenommen, Funktion f ruft g und g bereitet Aufruf von h vor ... Erste 4 Parameter in der Regel in Registern. Rest in umgekehrter Reihenfolge gespeichert, damit mit fp+increment zugegriffen werden kann. parameter 6 f-Frame parameter 5 return value return address Aktueller FP f’s Frame Pointer. Wird wieder hergestellt bei Return von g. Wichtig bei dynamischem Linken. saved fp local variables Temporäre Variablen, erzeugt durch Compiler bei Code-Generierung. temporary values g verantwortich für Sicherung und Wiederherstellung potentiell von f benutzter Register. g-Frame other saved registers h's Parameter. parameters return value Oft in Registern gespeichert. return address Aktueller SP saved fp Program Counter, damit g nächste Instruktion nach Return von h weiß.

Raten der Einsprungaddresse new return address new return address new return address new return address new return address new return address Real program nop instructions Dr. Wolf Müller

NOPs (90) mal anders IA32 27 daa ' IA32 2f das / IA32 33 c0 xor %eax,%eax IA32 37 aaa 7 IA32 3f aas ? IA32 40 inc %eax @ IA32 41 inc %ecx A IA32 42 inc %edx B IA32 43 inc %ebx C IA32 44 inc %esp D IA32 45 inc %ebp E IA32 46 inc %esi F IA32 47 inc %edi G IA32 48 dec %eax, H IA32 4a dec %edx J IA32 4b dec %ebx K … http://shellcode.org Dr. Wolf Müller

Beispiele (In)famous: Morris worm (1988) Code Red (2001) gets() in fingerd Code Red (2001) MS IIS .ida vulnerability Blaster (2003) MS DCOM RPC vulnerability Mplayer URL heap allocation (2004) % mplayer http://`perl –e ‘print “\””x1024;’` ... Dr. Wolf Müller

Privilegierte Programme (suid | sgid) openSuSE-10 Privilegierte Programme (suid | sgid) openSuSE-10.3 find / -type f \( -perm -04000 -o -perm -02000 \) -rwsr-xr-x 1 root audio /bin/eject -rwsr-xr-x 1 root root /bin/mount -rwsr-xr-x 1 root root /bin/ping -rwsr-xr-x 1 root root /bin/ping6 -rwsr-xr-x 1 root root /bin/su -rwsr-xr-x 1 root root /bin/umount -rwsr-xr-x 1 root root /opt/kde3/bin/artswrapper -rwsr-xr-x 1 root shadow /opt/kde3/bin/kcheckpass -rwxr-sr-x 1 root nogroup /opt/kde3/bin/kdesud -rwsr-xr-x 1 root root /opt/kde3/bin/kpac_dhcp_helper -rwsr-xr-x 1 root root /opt/kde3/bin/start_kdeinit -rwsr-x--- 1 root dialout /sbin/isdnctrl -rwsr-xr-x 1 root shadow /sbin/unix2_chkpwd -rwsr-xr-x 1 root shadow /sbin/unix_chkpwd -rwsr-xr-x 1 root trusted /usr/bin/at -rwsr-xr-x 1 root shadow /usr/bin/chage -rwsr-xr-x 1 root shadow /usr/bin/chfn -rwsr-xr-x 1 root shadow /usr/bin/chsh -rwsr-xr-x 1 root trusted /usr/bin/crontab -rwsr-xr-x 1 root shadow /usr/bin/expiry -rwsr-xr-x 1 root root /usr/bin/fileshareset -rwsr-xr-x 1 root trusted /usr/bin/fusermount -rwxr-sr-x 1 games games /usr/bin/glines -rwxr-sr-x 1 games games /usr/bin/gnibbles -rwxr-sr-x 1 games games /usr/bin/gnobots2 -rwxr-sr-x 1 games games /usr/bin/gnometris -rwxr-sr-x 1 games games /usr/bin/gnomine -rwxr-sr-x 1 games games /usr/bin/gnotravex -rwxr-sr-x 1 games games /usr/bin/gnotski -rwsr-xr-x 1 root shadow /usr/bin/gpasswd -rwxr-sr-x 1 games games /usr/bin/gtali -rwsr-xr-x 1 root shadow /usr/bin/kcheckpass -rwxr-sr-x 1 root nogroup /usr/bin/kdesud -rwsr-xr-x 1 lp sys /usr/bin/lppasswd -rwxr-sr-x 1 games games /usr/bin/mahjongg -rwsr-xr-x 2 root root /usr/bin/man -rwsr-xr-x 2 root root /usr/bin/mandb -rwsr-xr-x 1 root root /usr/bin/newgrp -rwsr-xr-x 1 root shadow /usr/bin/passwd -rwsr-xr-x 1 root root /usr/bin/rcp -rwsr-xr-x 1 root root /usr/bin/rlogin -rwsr-xr-x 1 root root /usr/bin/rsh -rwxr-sr-x 1 games games /usr/bin/same-gnome -rwsr-xr-x 1 root root /usr/bin/sudo -rwsr-xr-x 1 root video /usr/bin/v4l-conf -rwxr-sr-x 1 root tty /usr/bin/wall -rwxr-sr-x 1 root tty /usr/bin/write -rws--x--x 1 root root /usr/bin/Xorg -rwxr-sr-x 1 games games /usr/games/lbreakout2 -rwxr-sr-x 1 root mail /usr/lib/cyrus/bin/deliver -rwsr-xr-x 1 root root /usr/lib/libgnomesu/gnomesu-pam-backend -rwsr-xr-x 1 root root /usr/lib/mc/cons.saver -rwxr-sr-x 1 root polkituser /usr/lib/PolicyKit/polkit-grant-helper -rwsr-xr-x 1 root root /usr/lib/PolicyKit/polkit-grant-helper-pam -rwsr-xr-x 1 root root /usr/lib/pt_chown -r-xr-sr-x 1 root uucp /usr/lib/vmware-tools/bin32/vmware-tpvmlp -r-sr-xr-x 1 root root /usr/lib/vmware-tools/sbin32/vmware-hgfsmounter -rwxr-sr-x 1 root tty /usr/lib/vte/gnome-pty-helper -rwsr-xr-x 1 root root /usr/local/lib/xcdroast-0.98/bin/xcdrwrap -rwsr-xr-x 1 root root /usr/sbin/change-passwd -rwsr-xr-x 1 root uucp /usr/sbin/mgnokiidev -rwxr-sr-x 1 root maildrop /usr/sbin/postdrop -rwxr-sr-x 1 root maildrop /usr/sbin/postqueue -rwsr-xr-x 1 root root /usr/sbin/suexec2 -rwxr-sr-x 1 root tty /usr/sbin/utempter -rwsr-xr-x 1 root root /usr/sbin/zypp-checkpatches-wrapper Dr. Wolf Müller

Demo Buffer Overflow Vulnerabilities (http://nsfsecurity.pr.erau.edu/bom/index.html) http://nsfsecurity.pr.erau.edu/bom/Jumps.html http://nsfsecurity.pr.erau.edu/bom/Spock.html http://nsfsecurity.pr.erau.edu/bom/Smasher.html http://nsfsecurity.pr.erau.edu/bom/StackGuard.html Linux SuSE 12.1 https://www2.informatik.hu-berlin.de/sar/Itsec/slides_ssl/demo_bufferoverflow.tgz Smasher: Für Grün: D Dr. Wolf Müller

ASCII-Tabelle Dr. Wolf Müller

BufferOverflow/README.txt # It is a demo for buffer overflow, please use with care and only on your own system! # (c) Wolf.Mueller@informatik.hu-berlin.de # run as as root echo "0" > /proc/sys/kernel/randomize_va_space # not present in OpenSuSE 11.4 #echo "0" > /proc/sys/kernel/exec-shield gcc -fno-stack-protector -z execstack -o unsafe unsafe.c chmod u+s unsafe # run cmds as convetional user: su user ./exploit.pl #Local Root-Shell ./root_sk.pl #Local Root-Shell ./open_port*.pl #Opens Root-Shell over network # Access to networked Root-Shell via command given in rsh*. Dr. Wolf Müller

Vorbeugung Strategien Wo kann eingegriffen werden? Erkennen und entfernen der Schwachstellen (am besten) Verhindern von Code-Einschleusung Erkennung von Code-Einschleusung Verhindern der Code-Ausführung Wo kann eingegriffen werden? Analyse und Kompilierung des Codes Linken der Objekte zum Programm Laden des Programm in den Speicher Ausführung des Programms Dr. Wolf Müller

Gefährliche C-Funktionen Funktionsprototyp mögliches Problem strcpy(char *dest, const char *src) strcat(char *dest, const char *src) getwd(char *buf) gets(char *s) fscanf(FILE *stream, const char *format, ...) scanf(const char *format, ...) realpath(char *path, char resolved path[ ]) sprintf(char *str, const char *format, ...) sizeof() Overflow des dest-Puffers. Overflow des buf-Puffers. Overflow des s-Puffers. Overflow der Argumente. Overflow des path-Puffers. Verschiedene Größe bei Unicode-Transformation (Bestimmung in Byte, nicht nach Buchstabenzahl) Dr. Wolf Müller

Werkzeuge / Strategien Secure Programming (strcpy strncpy, …) Typesafe Programming Languages (Java) Splint - Check array bounds and pointers Non-executable stack Stackguard – put canary before RA Libsafe – replace vulnerable library functions RAD – check RA against copy Analyze call trace for abnormality PointGuard – encrypt pointers Binary diversity – change code to slow worm propagation PAX – binary layout randomization by kernel Randomize system call numbers Dr. Wolf Müller

Libsafe / StackGuard Wenn Quellcode vorhanden! Libsafe (Linux) Wrapper für Standard-C Bibliotheksaufrufe, insbesondere für „riskante“ Funktionen StackGuard Tool (UNIX) Patch für C-Compiler / aktuell default im gcc Compiler: Fügt spezielles Kontrollzeichen (Canary) direkt hinter der Rücksprungadresse auf dem Stack ein. Erzeugt Code, der vor dem Rücksprung prüft, ob das Kontrollzeichen verändert wurde. Bei Änderung Warnung in SysLog analog Stack Cookies (Microsoft für Windows Server 2003) Dr. Wolf Müller

Futher Reading Randomize code Randomize location of code/data Barrantes, Ackley, Forrest, Palmer, Stefanovic, Zovi, “Randomized Instruction Set Emulation to Disrupt Binary Code Injection Attacks,” ACM CCS 2003. Randomize location of code/data Bhatkar, DuVarney, Sekar, “Address Obfuscation: an Efficient Approach to Combat a Broad Range of Memory Error Exploits,” USENIX Security 2003. Dr. Wolf Müller

Randomized Instruction Sets (RISE) Bedrohung: Einschleusung von Binärcode über das Netzwerk Ziel: Diversifizierung jedes Systems in von außen nicht vorhersagbarer Weise Lösung: Jedes Programm hat verschiedenes und geheimes Instruction-Set Übersetzer der Instructions zur Ladezeitpunkt in zufälliger Weise modifiziert. In HW oder Software implementierbar Grenzen: Keine Abwehr von Manipulationen nur im Datenbereich Dr. Wolf Müller

+ RISE: loading binary RISE Memory ELF binary file Scrambled Key Code Data Data Dr. Wolf Müller

+ RISE: executing code RISE Memory Scrambled Key Code Data Hardware Dr. Wolf Müller

+ RISE: foreign code SIGILL RISE Memory Injected from network Scrambled Code Key Code Injected from network + Scrambled Code Data Code Hardware SIGILL Dr. Wolf Müller

Adressen Randomisierung Bedrohung: Speicherfehler-Exploits Ziel: Verhinderung der Vorhersagbarkeit von Speicheradressen Lösung: Neuzuordnung von Speicherbereichen Vertauchen der Reihenfolge von Variablen und Code Einführung zufälliger Lücken zwischen Grenzen: schwierig zu implementieren mit üblichen Application Binary Interface zur Ladezeit Dr. Wolf Müller

Randomisierung Randomisierung der Startadressen von Speicherbereichen Stack: großen Wert Heap: großen Block allocieren DLLs: linken mit Dummy-lib Code/static data: Konvertierung in shared lib, oder an verschiedenen Adressen neu linken Macht Angriffe mit absoluten Adressen schwieriger! kernel space stack shared library heap bss static data code Dr. Wolf Müller

Stackrandomisierung ≤ 8MB SuSE 9.3 openSuSE 11.4 Kernel: 2.6.11.4-21.17-default, ohne Stackrandomisierung Output: konstant 0xbffff570 0xbffff570 openSuSE 11.4 Kernel: 2.6.37.1-1.2-desktop mit Stackrandomisierung Output 0xbf7fd300…0xbfffbf90 0xbfa72570 0xbf92bc20 0xbff31230 0xbf9b4a70 0xbfb01600 0xbfb16e10 0xbfda88a0 #include <stdio.h> int main() {int foo; printf("%p\n", &foo); return 0;} ≤ 8MB Dr. Wolf Müller

Randomisierung Vertauschen der Reihenfolge von Variablen und Routinen routines Lokale Variables in den Stackbereich Reihenfolge statischer Variablen Reihenfolge der Routines in DLLs or ausfürbaren Programmen Macht Angriffe mit relativen Adressen schwieriger Dr. Wolf Müller

Verhinderung der Ausführung Solaris 10 Stack-Segment als nicht ausführbar konfigurierbar ähnliche Patches auch für Linux (www.openwall.org) Windows NT/2000 (securewave.com) Trusted OS (speziell abgesicherte Varianten von Standard OS) Trusted Solaris Trusted HP-UX Einbau von speziellen Compartments, die Systembereiche gegeneinander abschotten, Wirkung des BO bleibt begrenzt. Dr. Wolf Müller

NX-Bit / XD-Bit NX-Bit (no execute) Athlon 64 XD-Bit (execution disable) Itanium, P4, Core, Pentium-M Hardwareunterstützung : Bit wird Betriebssystem für Stack im Arbeitsspeicher gesetzt Unterscheidung zwischen Daten und Code als Daten markiertem Speicherbereich, (z.B. Bild), kann nicht ausgeführt werden. Betriebssystem muss dieses Bit unterstützen. Nicht für alle Programme möglich: Just in time Compiler Dynamischer Linker Dr. Wolf Müller

Buffer Overflow: Timeline Quelle: https://zynamics.files.wordpress.com/2010/02/code_reuse_timeline1.png Dr. Wolf Müller

Tools: Statische Code-Analyse http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis „Lint“ Dr. Wolf Müller

Tools: http://valgrind.org/ Framework für dynamische Analysewerkzeuge Ziel: automatische Erkennung von: Fehler in Speicherverwaltung eines Programms Fehler im Verwalten von Thrreads Profiling der Speichernutzung Dr. Wolf Müller

Fazit & Info Sicheres Programmieren = Königsoption Secure Programming HOWTO : http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/index.html Weiterführende Informationen: Simple Buffer Overflow Exploitation Tutorial - Ubuntu 10.10 http://www.youtube.com/watch?v=_Zvj1r3y1k0 Erster Buffer Overflow auf dem Heap (Solar Designer): http://www.openwall.com/articles/JPEG-COM-Marker-Vulnerability. "Exploit Writing Tutorial" auf corelan.be Teil 10 Umgehung von DEP mit ROP (return oriented programming): http://www.corelan.be/index.php/2010/06/16/exploit-writing-tutorial-part-10-chaining-dep-with-rop-the-rubikstm-cube/ Dr. Wolf Müller

Formatsrings: printf() Funktion: int printf(const char* format, ...); format Regelt, wie nachfolgende Parameter interpretiert werden. Beispiele: printf("n=%d", 42);  n=42 //dezimal printf("n=%u", 42);  n=42 //unsigned dezimal printf("n=%x", 42);  n=2A //hex printf("n=%.10d", 42);  n=0000000042 //10 Stellen printf("%s %n", string, &num_of_chars); gibt string aus und schreibt Anzahl der ausgegebenen Zeichen nach num_of_chars in den Speicher Dr. Wolf Müller

Formatsrings: Probleme printf() Was wenn keine Parameter? printf nimmt implizit an, dass Parameter auf dem Stack liegen! Beispiele: printf("%x"); oberstes Wort (32bit) vom Stack //b760bc05 printf(„%.10x"); oberstes Wort (32bit) vom Stack mit 10facher Genauigkeit // printf("%x…%x"); n * oberste Worte vom Stack printf("A…A%n"); schreibt in Speicherbereich, auf den das oberste Stackelement (Wort) zeigt Zahl der ausgegebenen Zeichen! Dr. Wolf Müller

Formatstrings: hw.c //hw.c #include <stdio.h> int main(int argc, char* argv[]) { if (argc > 1) printf(argv[1]); return 0; } #> hw "Hello World!" Hello World! #> hw "%x%x%x%x" b75efc058048439b7727ff48048430 Dr. Wolf Müller

Formatsrings: Angriffsmöglichkeiten %x Analyse des Stacks %n (mit passend vielen ausgegebenen Zeichen) schreiben von Speicherbereichen Z.B. Rücksprungadresse auf Stack legen, anschließend mit Hilfe von %n überschreiben. Dr. Wolf Müller