Meine erste HackMe
-
Hi,ich habe folgende HackMe(programm das dazu da ist von anderen 4fun gecrackt zu werden)geschrieben:
//bsp.exe #include <iostream> int wahoo(void) { char buffer[12]; puts ("Wie heisst du?"); gets(buffer); printf("Hallo, %s!\n",buffer); if (!strcmp(buffer,"BLIBLABLUBB")) return 1; return 0; } int main(void) { if (wahoo()) puts ("Du kennst das Geheimnis!"); else puts("Hau ab!"); return 0; }
,und will mit folgendem Exploit "Du kennst das Geheimniss" als ausgabe bekommen:
//exploit.exe #include <iostream> int main(void) { printf("123456789abc"); printf("1234"); printf("%c%c%c",0x5f,0x13,0x40); fflush(stdout); return 0; }
Dabei hab ich gdb benutzt um die Rücksprungadresse zu bekommen,hier ein Bild der Konsole,mit gdb-ausgabe und Aufruf von bsp.exe mit dem Exploit als Eingabe:
KonsoleWisst ihr an was das liegt?
Hoffe mir kann wer helfen,danke im Voraus,
Xalon
-
Was hindert dich daran BLIBLABLUBB einzugeben? Der String ist hard-coded im Programm zu finden und fällt auch im HexEditor dezent auf.
Oder soll die Sicherheitslücke nun gets() mit buffer[12] sein?
MfG SideWinder
-
Die sicherheitslücke soll ein Pufferüberlauf also gets()+buffer[] sein.
mfg
Xalon
-
Ich sag nur zotteljedi.de
-
Genau das Tut hab ich
aber von einer anderen Seite.
[edit]GESCHAFFT:
#include <iostream> using namespace std; void wahoo(int); int wahoo(void) { char buffer[8]; puts ("Wie heisst du?"); gets(buffer); printf("Hallo, %s!\n",buffer); if (!strcmp(buffer,"BLIBLABLUBB")) return 1; return 0; } int main(void) { if (wahoo()) puts ("Du kennst das Geheimnis!"); else puts("Hau ab!"); return 0; }
Wurde mit
#include <iostream> int main(void) { printf("12345678"); printf("1234"); printf("%c%c%c%c",0x57,0x13,0x40,0x00); fflush(stdout); return 0; }
Gehackt/crackt/exploitet
[/edit]Aber wenn ich den Buffer statt 8 die Größe 12 gib und beim exploit statt 12345678 zum überschreiben des puffers 123456789abc
schreib funzt es nicht?! WARUM?
Xalon
-
Kenn mich da nicht so aus, aber vllt. gibts zwischen Linux und Windows nen Unterschied.
-
Zu früh abgeschickt, versuch mal (mit 12er buffer):
#include <iostream> int main(void) { printf("123456789abc"); printf("%c%c%c%c",0x57,0x13,0x40,0x00); //printf("1234"); //man muss den base pointer ja nicht zwingend killen, wenn es auch so geht fflush(stdout); return 0; }
-
habe auch ein problem, und zwar beginnt der gets-puffer in meinem fehlerhaften programm dummerweise auf 0x080485d4. blöd, weil 0x04 das ende der übertragung (end of transmission) bedeutet und den gets-aufruf beendet.