Zu einer bestimmten Adresse springen, die aber " enthält

Hallo,
in einem CrackMe soll man zu der folgenden Adresse springen: 00 22 FF 24


In dem CrackMe ist dann ein Buffer Overflow, sprich das Programm speichert per strcpy() das 1. Konsolen-Argument in einem (zu kleinem) Char-Array ab. Die oben angegeben Adresse soll dann die Rücksprungadresse der Funktiom mit dem Overflow überschreiben, so dass das Programm nicht mehr im Hauptthread weiterläuft, sondern zu der Adresse springt und die dort hinterlegte Funktion ausführt.

Eigentlich gar nicht so schwer, dachte ich, allerdings habe ich ein Problem mit der 22 in der Adresse, denn dies stellt das Zeichen " dar und es per \ zu maskieren klappt irgendwie nicht.

Ich habe dazu folgendes C Programm geschrieben:
Code:
int main() {
    char cmd[255];
    char *ziel = "crackme.exe";
    char *buffer = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"; //Ein paar NOPs zum füllen
    char *adresse = "\x24\xff\x22";
    

    strcpy(cmd, ziel);
    strcat(cmd, " \""); //1. Agrument steht zwischen "..."
    strcat(cmd, buffer); //Zeichen damit der Speicher überläuft
    strcat(cmd, adresse); //Jetzt die Adresse wohin gesprungen werden soll
    strcat(cmd "\""); //Das Abschließende "

    system(cmd);
}


So wenn ich das Programm jetzt starte, bekomme ich die Meldung, dass zu der Adresse "0002d961" nicht gesprungen werden kann.


Ändere ich die 22 in der Adresse in z.B. eine 28, so erhalte ich die Meldung, dass die Adresse "0028ff24" nicht vorhanden ist, ist ja auch logisch, da diese nicht in der Exe definiert ist, aber wie man sieht, möchte er zu der angegeben Adresse springen.

So, jetzt dachte ich mir, ich maskiere die 22 in der Adresse mittels Backslash (Nr. 5c), und habe dann folgende Adresse
char *adresse = "\x24\xff\x5c\x22";

Allerdings erhalte ich dann weiterhin, dass "0002d961" nicht vorhanden ist.


Kann mir evt. jmd. helfen, wie ich per Konsole die \x22 übergebe, so dass diese in die Rücksprungadresse übernommen wird, oder ist mein vorhaben vergebens?
 
soweit ich weiß (und gerade mit 'printf (GetCommandLine)' überprüft habe ;) - es wurde über CMD ein Teststring 'hallo"test' fehlerfrei übergeben) sollte das System nichts an dem übergebenen String ändern - für die "Extrahierung" der Argumente ist das Programm selbst verantwortlich.

Mir fällt da noch der Umweg über einen Return zum Buffer selbst. Da hat man ganze 12 Bytes für:
Code:
90
90
B8 80E45F04                               MOV EAX,45FE480
C1E8 05                                   SHR EAX,5   ;Ergebnis: 22 FF 24
FFE0                               JMP EAX
Das Problem wäre nur dass die Stackadresse auf unterschiedlichen System unterschiedlich sein könnten. Das könnte man dann auf Wunsch über einen "Local Exploit Generator" lösen ;) .
 
Hallo,
oO der Code oben funktioniert soweit einwandfrei, also er springt zu der Adresse, allerdings ist in der Routine hinter der Adresse noch eine Codezeile drin, die den genannten Fehler verursacht.
Da ich aber per Ollydebug nicht immer überprüfen wollte, wohin gesprungen wird, habe ich mich auf die Debug Meldung verlassen.

Naja war wohl gestern Abend etwas spät...
 
Zurück
Oben