Ergebnis 1 bis 3 von 3

Thema: Verständnis Probleme bei Bufferoverflow

  1. #1
    Registered User
    Registriert seit
    Jun 2010
    Beiträge
    2
    Renommee
    10

    Verständnis Probleme bei Bufferoverflow

    Hallo zusammen,

    ich setze mich gerade mit dem Thema Bufferoverflows auseinander mit folgenden Dokument:
    http://www.zotteljedi.de/documents/B...Jedermann.html

    Beim Versuch das Beispiel auf Seite 7 und Folgende nachzuarbeiten, tut sich mir ein Verständnisproblem auf:
    Code:
    (gdb) disas pw          
    Dump of assembler code for function pw:
    0x080484e4 <pw+0>:      push   %ebp    
    0x080484e5 <pw+1>:      mov    %esp,%ebp
    0x080484e7 <pw+3>:      sub    $0x28,%esp
    0x080484ea <pw+6>:      movl   $0x8048660,(%esp)
    0x080484f1 <pw+13>:     call   0x80483d8 <printf@plt>
    0x080484f6 <pw+18>:     mov    0x804a040,%eax        
    0x080484fb <pw+23>:     mov    %eax,(%esp)           
    0x080484fe <pw+26>:     call   0x80483c8 <fflush@plt>
    0x08048503 <pw+31>:     lea    -0xe(%ebp),%eax       
    0x08048506 <pw+34>:     mov    %eax,(%esp)           
    0x08048509 <pw+37>:     call   0x80483a8 <gets@plt>  
    0x0804850e <pw+42>:     movl   $0x804866b,0x4(%esp)  
    0x08048516 <pw+50>:     lea    -0xe(%ebp),%eax       
    0x08048519 <pw+53>:     mov    %eax,(%esp)           
    0x0804851c <pw+56>:     call   0x80483f8 <strcmp@plt>
    0x08048521 <pw+61>:     mov    %eax,-0x4(%ebp)       
    0x08048524 <pw+64>:     cmpl   $0x0,-0x4(%ebp)       
    0x08048528 <pw+68>:     jne    0x8048533 <pw+79>     
    0x0804852a <pw+70>:     movl   $0x1,-0x14(%ebp)      
    0x08048531 <pw+77>:     jmp    0x804853a <pw+86>     
    0x08048533 <pw+79>:     movl   $0x0,-0x14(%ebp)      
    0x0804853a <pw+86>:     mov    -0x14(%ebp),%eax      
    0x0804853d <pw+89>:     leave                        
    0x0804853e <pw+90>:     ret                          
    End of assembler dump.
    In <pw+3> reserviert er 0x28 Byte also 40 Byte dezimal.
    Dennoch funktioniert ein Überlauf schon mit 16 Zeichen:
    Code:
    ./peter
    Dieses Programm findet den Peter!
    Dein Name: 1234567891234567
    Speicherzugriffsfehler
    Code:
    gcc --version
    gcc (Gentoo 4.3.4 p1.1, pie-10.1.5) 4.3.4
    Copyright (C) 2008 Free Software Foundation, Inc.
    Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
    gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
    
    gcc -o peter peter.c
    /tmp/ccuMgjUh.o: In function `ask_user':
    peter.c:(.text+0x26): warning: the `gets' function is dangerous and should not be used.




    Viele Grüße und vielen Dank schonmal :-)

    creedron

  2. #2
    Administrator
    Registriert seit
    Apr 2004
    Beiträge
    754
    Renommee
    1274

    Re: Verständnis Probleme bei Bufferoverflow

    Interessant ist nicht nur, wieviel Platz auf dem Stack reserviert wurde, sondern vor allem, an welcher Stelle die lokale Variable, in die gets() schreibt, liegt. Die 40 Bytes beinhalten naemlich auch den Platz fuer den Rueckgabewert von strcmp() (der in einer 4-Byte grossen, lokalen DWORD-Variable abgelegt wird), sowie den Platz fuer die Parameter fuer printf(), fflush(), gets() und strcmp() (jeweils ein 4-Byte langer Pointer, fuer strcmp() zwei davon - insgesamt also 4 + 4 + 4 + 2 * 4 = 20 Bytes fuer die Funktionsparameter). Der Compiler baut den Code hier naemlich so, dass einzelne Parameter nicht getrennt ge'push't werden, sondern der gesamte Platz auf dem Stack davor einmal reserviert und dann jeweils vor den Funktionsaufrufen mit mov %eax,(%esp) (wobei eax zuvor natuerlich jeweils mit sinnvollen Werten gefuellt wird) beschrieben wird. Im Beispielcode im PDF ist das einfacher, weil dort der Compiler die Funktionsaufrufe in einzelne pushs/calls uebersetzt und auf dem Stack anfangs nur Speicher fuer die lokalen Variablen reserviert wird.

    Dadurch kommen die 16 + 4 + 20 = 40 Bytes auf dem Stackframe zustande...

    Worauf es jetzt noch ankommt, ist, in welcher Reihenfolge die einzelnen Variablen auf dem Stack liegen, da es bei einem Buffer overflow ja haeufig das Ziel ist, die Ruecksprungadresse zu manipulieren. Wo die lokale Variable, in welcher der gets()-Input hinterlegt wird, liegt, findet man am einfachsten heraus, wenn man kurz schaut, was fuer ein Pointer an gets() uebergeben wird (mit etwas mehr Erfahrung haette man das auch sofort am Sourcecode erkannt, wenn man weiss, in welcher Reihenfolge Funktionsargumente und lokale Variablen vom Compiler ohne zusaetzliche Optimierungen und Stack-Smashing-Protection o.ae. abgelegt werden):
    Zitat Zitat von creedron Beitrag anzeigen
    Code:
    0x08048503 <pw+31>:     lea    -0xe(%ebp),%eax       
    0x08048506 <pw+34>:     mov    %eax,(%esp)           
    0x08048509 <pw+37>:     call   0x80483a8 <gets@plt>
    Bei <pw+34> wird der Pointer aus dem Register eax geholt, an <pw+31> wird der Pointer berechnet, indem vom Base-Pointer 0xe = 14 Bytes subtrahiert werden. Somit liegt die Variable 14 Bytes vor dem Ende des Stackframes, d.h. ab einer Eingabe mit einer Laenge von 14 Bytes kann man den Stack schrotten (gets() haengt automatisch ein Null-Char an, sodass eine Eingabe von 14 Zeichen schon effektiv dafuer sorgt, dass 15 Bytes in den Speicher geschrieben werden).

  3. #3
    Registered User
    Registriert seit
    Jun 2010
    Beiträge
    2
    Renommee
    10

    Re: Verständnis Probleme bei Bufferoverflow

    Vielen Dank für Deine schnelle Antwort. Das hat mir sehr weiter geholfen.
    Bin jetzt gut erfolgreich weiter gekommen :-)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Bufferoverflow vermeiden
    Von Killsystem im Forum C / C++
    Antworten: 3
    Letzter Beitrag: 04.11.2005, 10:46
  2. Bufferoverflow in FTP von WinXP
    Von DKT im Forum (In)Security allgemein
    Antworten: 15
    Letzter Beitrag: 23.10.2004, 11:46
  3. Bufferoverflow
    Von nexn im Forum (In)Security allgemein
    Antworten: 4
    Letzter Beitrag: 28.04.2002, 09:13
  4. Bufferoverflow per NetBIOS ?
    Von Oliver Derrick im Forum (In)Security allgemein
    Antworten: 4
    Letzter Beitrag: 18.09.2001, 14:39
  5. [Suche] Bufferoverflow
    Von Thief im Forum Technisches Off-Topic
    Antworten: 5
    Letzter Beitrag: 02.04.2001, 15:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •