Ergebnis 1 bis 12 von 12

Thema: der andere Überlauf...

  1. #1
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    162
    Renommee
    65

    der andere Überlauf...

    hi,
    so langsam werde ich zum Top-Fragesteller, ist aber keine Absicht :-)

    erstmal der Quelltext:
    PHP-Code:
    #include <stdio.h>
    #include <string.h>

    int main(int argcchar *argv[]) {
        
    int value 5;
        
    char buffer_one[8], buffer_two[8];

        
    strcpy(buffer_one"one"); /* put "one" into buffer_one */
        
    strcpy(buffer_two"two"); /* put "two" into buffer_two */
        
        
    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n"buffer_twobuffer_two);
        
    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n"buffer_onebuffer_one);
        
    printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &valuevaluevalue);

        
    printf("\n[STRCPY] copying %d bytes into buffer_two\n\n",  strlen(argv[1]));
        
    strcpy(buffer_twoargv[1]); /* copy first argument into buffer_two */

        
    printf("[AFTER] buffer_two is at %p and contains \'%s\'\n"buffer_twobuffer_two);
        
    printf("[AFTER] buffer_one is at %p and contains \'%s\'\n"buffer_onebuffer_one);
        
    printf("[AFTER] value is at %p and is %d (0x%08x)\n", &valuevaluevalue);


    Wenn ich mein SuSE 11.2 nehme, tippe ich flogendes ein:

    PHP-Code:
    tomycat@linux-a4gd:~/hacking> ./overflow_example $(perl -'print "A"x16 . "\xef\xbe\xad\xde"')
    [
    BEFOREbuffer_two is at 0xbfffef0c and contains 'two'
    [BEFOREbuffer_one is at 0xbfffef14 and contains 'one'
    [BEFOREvalue is at 0xbfffef1c and is 5 (0x00000005)

    [
    STRCPYcopying 20 bytes into buffer_two

    [AFTERbuffer_two is at 0xbfffef0c and contains 'AAAAAAAAAAAAAAAAᆳ�'
    [AFTERbuffer_one is at 0xbfffef14 and contains 'AAAAAAAAᆳ�'
    [AFTERvalue is at 0xbfffef1c and is -559038737 (0xdeadbeef)
    tomycat@linux-a4gd:~/hacking
    Es stimmt alles, Live CD + Buch ergänzten sich 1a.
    Wenn ich die Suse 12.1 nehme muss ich nicht print"A"x20 sondern nur print"A"x16 eintippen.
    Erst dann komme ich auf den gleichen Effekt.
    Warum ist das so?

  2. #2
    Member
    Registriert seit
    May 2004
    Beiträge
    1.407
    Renommee
    1133

    Re: der andere Überlauf...

    Wie sieht denn da die Ausgabe mit 20 aus?

  3. #3
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: der andere Überlauf...

    Ist doch ganz einfach. In den ersten Buffer passen 8 Byte. Kopierst du mehr, wird über den Buffer hinaus geschrieben. Absichtlich beginn da aber der zweite Buffer und der Inhalt wird überschrieben.

    kater@mintux:~$ ./a.out 123456789012
    [STRCPY] copying 12 bytes into buffer_two
    [AFTER] buffer_two is at 0xbfcc344c and contains '123456789012'
    [AFTER] buffer_one is at 0xbfcc3454 and contains '9012'
    printf gibt solange Daten aus, bis die Zahl 0 kommt. Nicht das Zeichen 0. Deswegen wird erst der komplette String ausgeben. Und dann ur 4 Zeichen die in den nächsten Buffer geruscht sind.

    ----

    Ne alles falsch. Ich schaue mir gerade die Adresse von buffer_one und buffer_two an. One steht als erstes im Code, steht aber im Speicher weiter hinten. Deswegen musst du in den zweiten Buffer schreiben um den ersten zu überschreiben. Das ist doch blöd. Warum macht der gcc das?

    Naja egal. Aber ich denke es ist klar was da passiert.

  4. #4
    Member
    Registriert seit
    May 2004
    Beiträge
    1.407
    Renommee
    1133

    Re: der andere Überlauf...

    Zitat Zitat von retak Beitrag anzeigen
    One steht als erstes im Code, steht aber im Speicher weiter hinten. Deswegen musst du in den zweiten Buffer schreiben um den ersten zu überschreiben. Das ist doch blöd. Warum macht der gcc das?
    Das hat nichts mit dem GCC zu tun, sondern mit der Implementierung des Stacks im Prozessor und die ist nun mal so, dass in Richtung 0 gestapelt wird.

    Im übrigen gehst Du in keiner Form auf die Frage ein.

  5. #5
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    162
    Renommee
    65

    Re: der andere Überlauf...

    @Shakademus
    Mit meiner Live CD unbunto geht das mit 20.Das ist jetzt die Ausgabe von Suse 11.2
    Warum ist das so?

    tomycat@linux-a4gd:~/hacking> ./overflow_example $(perl -e 'print "A"x20 . "\xef\xbe\xad\xde"')
    [BEFORE] buffer_two is at 0xbff4448c and contains 'two'
    [BEFORE] buffer_one is at 0xbff44494 and contains 'one'
    [BEFORE] value is at 0xbff4449c and is 5 (0x00000005)

    [STRCPY] copying 24 bytes into buffer_two

    [AFTER] buffer_two is at 0xbff4448c and contains 'AAAAAAAAAAAAAAAAAAAAᆳ�'
    [AFTER] buffer_one is at 0xbff44494 and contains 'AAAAAAAAAAAAᆳ�'
    [AFTER] value is at 0xbff4449c and is 1094795585 (0x41414141)

  6. #6
    Member
    Registriert seit
    May 2004
    Beiträge
    1.407
    Renommee
    1133

    Re: der andere Überlauf...

    OK, das macht ja Sinn soweit - jeweils 8 der 20 A-Bytes landen in den Buffern und die letzten vier in value.

    Und wie sieht ein funktionierender Aufruf mit 20 aus? Also insbesondere die Speicherbereiche? Irgendwas muss sich da verschieben.

  7. #7
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: der andere Überlauf...

    @Shakademus
    Stimmt das liegt ja noch alles im Stack. Habe irgendwie automatisch an den Heap gedacht.
    Ich antworte nicht auf die Frage, weil ich sie nicht verstehe, da doch alles da steht und ich keine Frage sehe

  8. #8
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    162
    Renommee
    65

    Re: der andere Überlauf...

    erstmal thx,
    ich erkläre es noch mal, vielleicht habe ich mich falsch ausgedrückt:

    Buch-Live-Ubunto-CD gebooten und ich gab flogendes in den Console ein:
    Man ( oder Frau ) nimmt den Quellcode von oben und compiliert hin.
    PHP-Code:
    reader@hacking:~/booksrc $ ./overflow_example $(perl -'print "A"x[B][U][I]20[/I][/U][/B] .
    "\xef\xbe\xad\xde"'
    )
    [
    BEFOREbuffer_two is at 0xbffff7e0 and contains 'two'
    [BEFOREbuffer_one is at 0xbffff7e8 and contains 'one'
    [BEFOREvalue is at 0xbffff7f4 and is 5 (0x00000005)
    [
    STRCPYcopying 24 bytes into buffer_two
    [AFTERbuffer_two is at 0xbffff7e0 and contains 'AAAAAAAAAAAAAAAAAAAA??'
    [AFTERbuffer_one is at 0xbffff7e8 and contains 'AAAAAAAAAAAA??'
    [AFTERvalue is at 0xbffff7f4 and is -559038737 (0xdeadbeef)
    reader@hacking:~/booksrc $

    Es funktioniert alles nach Buch mit der Buch-Live-Ubunto-CD mit der 
    -----------------------------------------------------------------------------------------------------------------------
    Jetzt starte ich meine SuSE 12.1, die ich vor kurzem installiert habe.
    Ich nehme den gleichen Quellcode
    Man ( oder Frau ) nimmt den Quellcode von oben und compiliert hin.

    DANN tippe ich das gleiche ein wie von meinem BUCH, mit dem Ergebnis:
    PHP-Code:
    tomycat@linux-a4gd:~/hacking> ./overflow_example $(perl -'print "A"[B][I][U]x20[/U][/I][/B] . "\xef\xbe\xad\xde"')
    [
    BEFOREbuffer_two is at 0xbff4448c and contains 'two'
    [BEFOREbuffer_one is at 0xbff44494 and contains 'one'
    [BEFOREvalue is at 0xbff4449c and is 5 (0x00000005)

    [
    STRCPYcopying 24 bytes into buffer_two

    [AFTERbuffer_two is at 0xbff4448c and contains 'AAAAAAAAAAAAAAAAAAAAᆳ�'
    [AFTERbuffer_one is at 0xbff44494 and contains 'AAAAAAAAAAAAᆳ�'
    [AFTERvalue is at 0xbff4449c and is 1094795585 (0x41414141
    leider steht das tote Tier nicht in der Klammer.Nach herumprobieren stellte ich fest ich muss statt x20 jetzt x16 nehmen.
    Das Ergebnis:
    PHP-Code:
    tomycat@linux-a4gd:~/hacking> ./overflow_example $(perl -'print "A"[B][I][U]x16 [/U][/I][/B]. "\xef\xbe\xad\xde"')
    [
    BEFOREbuffer_two is at 0xbfffef0c and contains 'two'
    [BEFOREbuffer_one is at 0xbfffef14 and contains 'one'
    [BEFOREvalue is at 0xbfffef1c and is 5 (0x00000005)

    [
    STRCPYcopying 20 bytes into buffer_two

    [AFTERbuffer_two is at 0xbfffef0c and contains 'AAAAAAAAAAAAAAAAᆳ�'
    [AFTERbuffer_one is at 0xbfffef14 and contains 'AAAAAAAAᆳ�'
    [AFTERvalue is at 0xbfffef1c and is -559038737 (0xdeadbeef)
    tomycat@linux-a4gd:~/hacking
    WARUM MUSS ICH MIT SUSE 16 nehmen und nicht 20?

  9. #9
    Member
    Registriert seit
    May 2004
    Beiträge
    1.407
    Renommee
    1133

    Re: der andere Überlauf...

    Die Frage ist eher: Warum musst Du bei Ubuntu 20 nehmen?

    Bei SUSE sieht der Speicher so aus: 8 B buffer_two, 8 B buffer_one, 4 B value. Logisch.

    Bei Ubuntu sind zwischen buffer_one und value offenbar 4 B "Lücke", die mit den zusätzlichen As aufgefüllt werden müssen. Woher die kommt, weiß ich nicht. Was sagt denn diese Buch, wie man auf die Zahl 20 kommt?

    Führst Du auf den Systemen dieselbe Datei aus oder kompilierst Du jeweils zuerst den Code? Probier mal auf einem der Systeme zu kompilieren und das dann auf dem anderen auszuführen, um die Frage zu klären, ob der Unterschied bereits beim Kompilieren oder erst zur Laufzeit entsteht.

  10. #10
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: der andere Überlauf...

    Möglicherweise ist der Speicher immer auf 8Byte ausgerichtet. Dann muss man 4B ungenutzt lassen um die 4B von value auszurichten.
    64/32 Bit Betriebsystem?

  11. #11
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    162
    Renommee
    65

    Re: der andere Überlauf...

    Zitat Zitat von retak Beitrag anzeigen
    Möglicherweise ist der Speicher immer auf 8Byte ausgerichtet. Dann muss man 4B ungenutzt lassen um die 4B von value auszurichten.
    64/32 Bit Betriebsystem?
    Es ist alles 32 Bit.
    Die Live CD/DVD arbeitet mit sh3.2
    Das neuste Suse 11.2 mit sh4.2
    @Shakademus
    bin noch nicht dazugekommen.

  12. #12
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    162
    Renommee
    65

    Re: der andere Überlauf...

    @Shakademus
    ok,
    die Datei mit Ubunto compiliert und meiner Suse getestet, Ergebnis:
    mit x20 sehe ich jetzt das tote Tier.

    Es liegt am Compiler.

    Danke für Tip

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 20.02.2007, 14:30
  2. [ProFTP]Andere User -> Andere Verzeichnisse
    Von rootkid im Forum UNIX/Linux
    Antworten: 13
    Letzter Beitrag: 06.03.2003, 15:27
  3. Mid und andere
    Von Killjaeden im Forum VisualBasic / VBScript
    Antworten: 5
    Letzter Beitrag: 17.08.2002, 11:01

Berechtigungen

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