Hallo Leute!
Ich habe vor kurzem ein tut über exploids gefunden insecure.org/stf/smashstack.html
Jetzt habe ich mich mal etwas mit dem Thema versucht zu befassen und habe ein paar Fragen.
Dazu muss ich sagen ich arbeite auf einer 64bit maschine
zu erstmal wird Speicher ja immer durch das vielfache des Datenwortes allokiert heißt bei mir ich kann nur speicher mit dem Vielfachen von 8 byte allokieren
wenn ich jetzt aber
schreibe dann müsste er doch für den ersten buffer 8 byte reservieren weil er ist ja nur 5 groß für den zweiten buffer würden 2 Datenworte reichen also 16 byte aber er allokiert den ersten mit 16 byte und den zweiten mit 32 byte warum ? (das weiß ich weil ich mir mit gcc -S den assembler code angeschaut habe )
als nächstes versuche ich gezielt eine neue Return adresse zu setzen und somit eine Anweisung im Code zu überspringen wie im tut beschrieben
hier ist die zeile x=1 das was ich überspringen möchte mit ret = buffer1[]+24 gehe ich an das ende der adresse von buffer 1 auf 24 komme ich in dem ich 16 byte so groß ist der buffer + 8 byte (länge des Datenworts ) auf addiere so und dann zähle ich auf die ret noch mal 17 byte drauf um die zeile mit x =1 zu überspringen die 17 byte ergeben sich aus gdb
nach aufruf der Funktion kann man erkennen das eine 1 in den rpb (stack pointer ) geschrieben wird das ist nun die zeile die ich überspringen möchte also springe ich zu <+47> daher kommen nun die 17 byte allerdings bekomm ich dann nach dem ausführen des programmes nichts mehr ausgegeben ? warum rechne ich etwas falsch oder springe ich zur falschen adresse ? wo werden die 17 byte auf den rpb aufaddiert (müsste doch irgenwo zu finden sein im assembler ?)
Ich hoffe ihr könnt mir weiter helfen und ich habe mich deutlich genug ausgedrückt .. hoffe das ist der richtige platz für den Thread wenn nicht entschuldigung einfach verschieben Danke
Ich habe vor kurzem ein tut über exploids gefunden insecure.org/stf/smashstack.html
Jetzt habe ich mich mal etwas mit dem Thema versucht zu befassen und habe ein paar Fragen.
Dazu muss ich sagen ich arbeite auf einer 64bit maschine
zu erstmal wird Speicher ja immer durch das vielfache des Datenwortes allokiert heißt bei mir ich kann nur speicher mit dem Vielfachen von 8 byte allokieren
wenn ich jetzt aber
Code:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
schreibe dann müsste er doch für den ersten buffer 8 byte reservieren weil er ist ja nur 5 groß für den zweiten buffer würden 2 Datenworte reichen also 16 byte aber er allokiert den ersten mit 16 byte und den zweiten mit 32 byte warum ? (das weiß ich weil ich mir mit gcc -S den assembler code angeschaut habe )
als nächstes versuche ich gezielt eine neue Return adresse zu setzen und somit eine Anweisung im Code zu überspringen wie im tut beschrieben
Code:
void function(int a, int b, int c)
{
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 +24;
(*ret) +=17;
}
void main(){
int x;
x=0;
function(1,2,3);
x=1;
printf("%d\n",x);
}
hier ist die zeile x=1 das was ich überspringen möchte mit ret = buffer1[]+24 gehe ich an das ende der adresse von buffer 1 auf 24 komme ich in dem ich 16 byte so groß ist der buffer + 8 byte (länge des Datenworts ) auf addiere so und dann zähle ich auf die ret noch mal 17 byte drauf um die zeile mit x =1 zu überspringen die 17 byte ergeben sich aus gdb
Code:
Dump of assembler code for function main:
0x000000000040059a <+0>: push %rbp
0x000000000040059b <+1>: mov %rsp,%rbp
0x000000000040059e <+4>: sub $0x10,%rsp
0x00000000004005a2 <+8>: movl $0x0,-0x4(%rbp)
0x00000000004005a9 <+15>: mov $0x3,%edx
0x00000000004005ae <+20>: mov $0x2,%esi
0x00000000004005b3 <+25>: mov $0x1,%edi
0x00000000004005b8 <+30>: callq 0x400564 <function>
0x00000000004005bd <+35>: movl $0x1,-0x4(%rbp)
0x00000000004005c4 <+42>: mov $0x4006cc,%eax
0x00000000004005c9 <+47>: mov -0x4(%rbp),%edx
0x00000000004005cc <+50>: mov %edx,%esi
0x00000000004005ce <+52>: mov %rax,%rdi
0x00000000004005d1 <+55>: mov $0x0,%eax
0x00000000004005d6 <+60>: callq 0x400460 <printf@plt>
0x00000000004005db <+65>: leaveq
0x00000000004005dc <+66>: retq
nach aufruf der Funktion kann man erkennen das eine 1 in den rpb (stack pointer ) geschrieben wird das ist nun die zeile die ich überspringen möchte also springe ich zu <+47> daher kommen nun die 17 byte allerdings bekomm ich dann nach dem ausführen des programmes nichts mehr ausgegeben ? warum rechne ich etwas falsch oder springe ich zur falschen adresse ? wo werden die 17 byte auf den rpb aufaddiert (müsste doch irgenwo zu finden sein im assembler ?)
Ich hoffe ihr könnt mir weiter helfen und ich habe mich deutlich genug ausgedrückt .. hoffe das ist der richtige platz für den Thread wenn nicht entschuldigung einfach verschieben Danke