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