Stack overflow



  • Also ich hab ein bisschen mit dem Stack herumgespielt und wuerd da gerne die Ruecksprungaddresse manipulieren. Folgender Code sollte zur Ausgabe von '0' fuehren:

    #include <stdio.h>
    
    void function(int a, int b, int c) {
       char buffer1[5];
       char buffer2[10];
       int *ret;
    
       ret = buffer1 + 12;
       (*ret) += 13;
    }
    
    void main() {
      int x;
    
      x = 0;
      function(1,2,3);
      x = 1;
      printf("%d\n",x);
    }
    

    Also auf das (*ret) += 13 komm ich folgendermasen:

    0x0804844e <+0>:	push   %ebp
       0x0804844f <+1>:	mov    %esp,%ebp
       0x08048451 <+3>:	and    $0xfffffff0,%esp
       0x08048454 <+6>:	sub    $0x20,%esp
       0x08048457 <+9>:	movl   $0x0,0x1c(%esp)
       0x0804845f <+17>:	movl   $0x3,0x8(%esp)
       0x08048467 <+25>:	movl   $0x2,0x4(%esp)
       0x0804846f <+33>:	movl   $0x1,(%esp)
       0x08048476 <+40>:	call   0x8048414 <function>
       0x0804847b <+45>:	movl   $0x1,0x1c(%esp)
       0x08048483 <+53>:	mov    $0x8048560,%eax
       0x08048488 <+58>:	mov    0x1c(%esp),%edx
       0x0804848c <+62>:	mov    %edx,0x4(%esp)
       0x08048490 <+66>:	mov    %eax,(%esp)
       0x08048493 <+69>:	call   0x8048338 <printf@plt>
       0x08048498 <+74>:	leave  
       0x08048499 <+75>:	ret
    

    Der Ruecksprung aus der 'function' Methode ist 0x0804847b, das ist aber der Befehl wo x=1 erfolgt somit sollte der uebersprungen werden und erst wieder der Befehl ab 0x08048483 ausgefuehrt werden (also +13), nur funktioniert das ganze nicht...
    Hat vlt wer ne Idee??



  • 1. Die Ausgabe soll wohl eher 0 und nicht '0' sein? :p
    2. Du hast zwar ganz gut beschrieben was dein Ziel ist, aber leider nicht was stattdessen passiert.
    3. Wenn ich mich nicht täusche sollte das ins ASM Forum 😉
    4. Du weist einem int* einen char* zu und erhöhst gleichzeitig den Wert - um wie viele Bytes wird das Ganze jetzt denn verschoben?^^
    Überprüfe doch einfach mal vor (*ret) += 13 wo ret eigentlich drauf zeigt..



  • Ja klar die Ausgabe sollte 0 sein

    Zu 2) das Ziel ist wie gesagt die Ausgabe 0 nur wird stattdessen immer noch 1 ausgegeben...

    Zu 4) Ich weis dem int* doch nur die Addresse von buffer1 zu und zaehl dann 12 dazu, was dann die Return Addresse sein sollte...

    Fuer die Ausgabe der Addresse vor und nach erhoehung:

    ret = buffer1 + 12;
    	printf("%p\n", ret);
       (*ret) += 13;
    	printf("%p\n", ret);
    

    erhalte ich
    0xbfc07e73
    0xbfc07e73



  • Ich meine ja nur weil wegen

    char *p1 = (char*)100;
      int *p2 = (int*)100;
      printf("%i, %i\n", p1, p2);
      p1 += 10;
      p2 += 10;
      printf("%i, %i\n", p1, p2);
    

    😉

    Mich wundert eh dass dein Code ohne Cast überhaupt kompiliert wird..
    Woher weißt Du eigentlich dass die Rücksprungadresse bei ret = buffer1 + 12; ist?



  • Ich hab mir das jetzt so ueberlegt:
    Im Speicher wird fuer buffer1[5] 8byte angelegt und fuer buffer2[10] 12byte das ganze duerfte dann in etwa so aussehen:

    buffer2[10]   buffer1[5]  sfp   ret   a      b     c    d
    [            ][        ][    ][    ][    ][    ][    ][    ]
    

    SFP Pointer => Saved Frame Pointer

    somit wuerd ich jetzt auf:
    ret = buffer1 + 12
    kommen


Anmelden zum Antworten