Ergebnis 1 bis 11 von 11

Thema: Bufferoverflow austricken...

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

    Bufferoverflow austricken...

    hallo,
    erstmal den Quellcode:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int check_authentication(char *password) {
        
    int auth_flag 0;
        
    char password_buffer[16];

        
    strcpy(password_bufferpassword);
        
        if(
    strcmp(password_buffer"brillig") == 0)
            
    auth_flag 1;
        if(
    strcmp(password_buffer"outgrabe") == 0)
            
    auth_flag 1;

        return 
    auth_flag;
    }

    int main(int argcchar *argv[]) {
        if(
    argc 2) {
            
    printf("Usage: %s <password>\n"argv[0]);
            exit(
    0);
        }
        if(
    check_authentication(argv[1])) {
            
    printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
            
    printf("      Access Granted.\n");
            
    printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
        } else {
            
    printf("\nAccess Denied.\n");
       }

    Wenn ich das Prog compiliere, kann ich das Password umgehen, indem ich
    ./a.out AAAAAAAAAAAAAAAAAAAAAAAAAA

    mein gdb:
    PHP-Code:
    (gdbx/s password_buffer
    0xbffff7a0
    'A' <repeats 30 times>
    (
    gdbx/&auth_flag
    0xbffff7bc
    0x00004141
    (gdbx/16xw password_buffer
    0xbffff7a0
    0x41414141 0x41414141 0x41414141 0x41414141
    0xbffff7b0
    0x41414141 0x41414141 0x41414141 0x00004141
    0xbffff7c0
    0xb7ff47b0 0x08048510 0xbffff7d8 0x080484bb
    0xbffff7d0
    0xbffff9af 0x08048510 0xbffff838 0xb7eafebc
    (gdbx/4cb &auth_flag
    0xbffff7bc
    65 'A' 65 'A' '\0' '\0'
    (gdbx/dw &auth_flag
    0xbffff7bc
    16705 
    Soweit so gut. Ich überschreibe einfach den &auth_flag.

    zu meinem Problem:
    Wenn ich die 2 Zeilen:

    int auth_flag = 0;
    char password_buffer[16];

    ...vertausche.
    Dann kann ich nicht mehr auth_flag überschreiben. Mit meiner Ubunto Live CD geht das auch. Wenn ich den Quellcode mit einer Suse compiliere, dann kann ich trotzdem auth_flag überschreiben. Ich weis, das liegt man Compiler. Aber warum ist das so?

    Auszug aus Suse Linux 11.2:
    PHP-Code:
    (gdbi r esp
    esp            0xbfffeeb0       0xbfffeeb0
    (gdbx/32xw $esp
    0xbfffeeb0
    :     0xbffff1f9      0xb7e67d57      0xb7fb6ff4      0xb7fb51d4
    0xbfffeec0
    :     0x00000000      0x08049ff4      0x00000002      0x08048371
    0xbfffeed0
    :     0x00000000      0xb7fff8e8      0x08049ff4      0x00000000
    0xbfffeee0
    :     0x00000000      0x00000000      0xbfffef08      0x0804856e
    0xbfffeef0
    :     0xbffff21e      0xb7e7fc05      0x080485b9      0xb7fb6ff4
    0xbfffef00
    :     0x080485b0      0x00000000      0x00000000      0xb7e68003
    0xbfffef10
    :     0x00000002      0xbfffefa4      0xbfffefb0      0xb7fde430
    0xbfffef20
    :     0xb7ffefc4      0xb7fff8e8      0x00000001      0x0804a004
    (gdbx/x password_buffer
    0xbfffeecc
    :     0x08048371
    (gdbx/&auth_flag
    0xbfffeedc
    :     0x00000000 

  2. #2
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Bufferoverflow austricken...

    Welche gcc-Version ist das denn jeweils? Kannst ja auch mal den gcc von Suse nach Ubuntu kopieren (./gcc_suse) und dann mal testen. Das Problem ist ja einfach nur, dass die beiden gcc's versionsabhängig/wovon-auch-immer-abhängig die Variablen auf dem Stack anders belegen.
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

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

    Re: Bufferoverflow austricken...

    hi,
    Version gcc 3.3.6-15 unter Ubuntu
    und einmal
    Version gcc 4.6.2 unter Suse Linux

    Fakt ist:
    Die gcc 3.3.6 Version nimmt legt erst auth_flag auf den Stack und dann Password_buffer. Dann kann nicht auth_flag überschreiben werden.

    Bei Version gcc 4.6.2 unter Suse Linux ist das umgekehrt, und dann kann ich den auth_flag überschreiben.

    Meine Frage ist nur, warum das so ist?

  4. #4
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Bufferoverflow austricken...

    Buffer werden GENAU DESWEGEN so angeordnet, damit man nichts so einfach exploiten kann.
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

  5. #5
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: Bufferoverflow austricken...

    Du könntest auth_flag auch dann überschreiben, wenn es vor password_buffer im RAM liegt. Mit password_buffer[-1] bzw -4 landest du bei auth_flag

    Wenn das unterschiedliche Verhalten am großen Versionssprung liegt, tja dann wird das einfach ein Nebeneffekt sein wie gcc lokale Variablen behandelt.
    Du kannst ja mal --verbose machen. Vllt. ergibt sich was neues.

  6. #6
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Bufferoverflow austricken...

    Zitat Zitat von retak Beitrag anzeigen
    Du könntest auth_flag auch dann überschreiben, wenn es vor password_buffer im RAM liegt. Mit password_buffer[-1] bzw -4 landest du bei auth_flag
    Erkläre das mal der strcpy().
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

  7. #7
    Member
    Registriert seit
    May 2004
    Beiträge
    1.432
    Renommee
    1142

    Re: Bufferoverflow austricken...

    Zitat Zitat von gruena Beitrag anzeigen
    Erkläre das mal der strcpy().
    strcpy(password_buffer-4, password)

    Keine Rocket Science...

  8. #8
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Bufferoverflow austricken...

    Ja ne is klar, aber über argv[1] ^^
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

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

    Re: Bufferoverflow austricken...

    thx all,
    wenn ich passsword_buffer mit auth_flag verdrehe, warum ist immer passwaor_buffer immer als erstes im Stack?
    aber warum arbeitet gcc 3 zu gcc4 so anderst?

  10. #10
    Member
    Registriert seit
    May 2004
    Beiträge
    1.432
    Renommee
    1142

    Re: Bufferoverflow austricken...

    Weil es als erstes verwendet wird. Die Definitionen bedeuten im Maschinencode ja erst mal gar nichts.

  11. #11
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Bufferoverflow austricken...

    Nein, nicht weil password_buffer als erstes verwendet wird, sondern weil es explizit so gewollt ist.

    Was wären wir nur ohne Wikipedia.

    http://en.wikipedia.org/wiki/Buffer_overflow_protection
    GCC Stack-Smashing Protector (ProPolice)

    The "Stack-Smashing Protector" or SSP, also known as ProPolice, is an enhancement of the StackGuard concept written and maintained by Hiroaki Etoh of IBM. Its name derives from the word propolis. ProPolice differs from StackGuard in three ways:

    ProPolice moves canary code generation from the back-end to the front-end of the compiler.
    ProPolice also protects all registers saved in function's prologue (for example the frame pointer), and not only the Return Address.
    ProPolice, in addition to canary protection, also sorts array variables (where possible) to the highest part of the stack frame, to make it more difficult to overflow them and corrupt other variables. It also creates copies of arguments of the function, and relocates them together with local variables, effectively protecting the arguments.

    It was implemented as a patch to GCC 3.x; a less intrusive reimplementation is included in the GCC 4.1 release. Currently, SSP is standard in OpenBSD, FreeBSD (since 8.0), Ubuntu (since 6.10 [10]), Hardened Gentoo (in gcc 4.x by default since October 2010, previously also in gcc 3.x) and DragonFly BSD. It is also available in NetBSD (enabled by default on x86), Debian and Gentoo, disabled by default.

    By default, stack-smashing protection can be attained by adding the -fstack-protector flag for string protection, or -fstack-protector-all for protection of all types. On some systems, as under OpenBSD, ProPolice is enabled by default, and the -fno-stack-protector flag disables it. With GCC 4.1 and above the array size threshold for stack-smashing protection to be enabled can be tuned with --param ssp-buffer-size=....
    http://en.opensuse.org/openSUSE:Security_Features
    Runtime stack overflow checking using -fstack-protector is used in some critical packages in SUSE Linux 10.1 and SUSE Linux Enterprise 10 and enabled by default for all packages starting with openSUSE 10.2.
    Ich gehe mal davon aus, dass tomycats eine openSUSE-Version >= 10.2 benutzt, wegen der neueren gcc-Version. Deswegen hat er dort auch stack-protection standardmäßig aktiviert.

    Wenn er mit der Option -fno-stack-protector kompilieren würde, sollte auth_flag wieder manipulierbar sein.
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

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. Winamp und Bufferoverflow
    Von redman im Forum (In)Security allgemein
    Antworten: 3
    Letzter Beitrag: 10.09.2003, 19:22
  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
  •