Wie kann ich eine Adresse in eine Variable schreiben ???
-
Hallo zusammen...
Habe mich gerade neu angemeldet und hoffe hier in Zukunft viel zu lernen. Vielleicht kann ich auch dem Einen oder Anderen etwas neues zu zeigen...
Nun zu meiner Frage:
Ich schreibe gerade an meiner Maturaarbeit über Formatstringschwachstellen. Oft müsste ich eine Speicheradresse in eine Variable schreiben. Habe dann in einem Buch gelesen das ich das in der Form \xf3\x33\x22\x11 machen kann. Doch übergebe ich einer Funktion wie zum Beispiel "fgets" diese Adresse, wird diese eben nicht als eine 4 Byte lange Adresse angesehen, sondern als eine ganz normale Zeichenkette interpretiert...
Ich benutze cygwin, unter Windows XP.. Ziel wäre es das ich eine Methode finde mit welcher ich einer Funktion wie fgets oder scanf eine Adresse übergeben könnte...Hoffe habe mich klar genug ausgedrückt... Danke schon im Voraus...
MfG Piranya
-
Piranya schrieb:
Ich benutze cygwin
Wieso postest du dann im MFC-Forum?
Ich habe übrigens nicht kapiert, was du machen willst.
-
Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hmm, also als erstes bist du hier im MFC Forum, was bedeutet das du hier mit CStrings arbeiten "musst"

CStrings zu befüllen ist eh viel einfacher als die alten C++ Funktionen.
Beispiel :
// Variable erstellen CString YourString; // Variable Füllen YourString = "Hi wie gehts?";Mit "Formatstringschwachstellen" und Shellcode "\xf3\x33\x22\x11" kann man durchaus Sicherheitslücken erstellen. Dazu brauchen wir aber C++

char cString[10]; cString = "\xf3\x33\x22\x11";Hier werden 16 Buchstaben in den String geschrieben, du hast allerdings nur 10 "Speicherblöcke" reserviert, dass bedeutet das du jetzt ein sogenannten Buffer Overflow erstellt hast. Folgen sind meistens Stillstand des Programmes oder sofortiger Absturz des Programmes.
Hab zu diesen Thema auch einige Videos, wenn du willst kann ich sie uploaden.

Hoffe ich hab alles richtig erklärt, falls etwas falsch ist, bitte bescheid sagen. Aus Fehlern lernt man gewöhnlich...

Muschos Grazias .. äähh Bitteschön

HackThePlanet
-
ich weiss nich so hunderpro was du willst... ich orientier mich einfach mal an dem topic
poste mal am besten deinen code und sag was er machen soll
char* sBuffer[255] = "Hello World"; long lAdress = ( long ) sBuffer; // adresse des ersten zeichens in einem long speichern char* pAdress = ( char* ) lAdress; // adresse im long einem char pointer zuweisen
-
Bitte formulier deine Frage noch einmal genau.
Eine Speicheradresse sieht im übrigen etwas so aus: 0x31f534s (ungefähr)
-
Gut... Also dann will ich mal ein wenig ausfürlicher werden... Tut mir leid wegen dem flaschen Forum, kam mir schon ein wenig komisch vor von wegen Visual C++ aber eben, diese ganzen Titel liessen mich confused werden... und die Verzweiflung ist gross....
Aber nun zu meiner Frage (kleines Beispiel in C):
. . . scanf("%s",&buff); printf("%s",buff); . .ziel wäre jetzt das ich zur Laufzeit der scanf Funktion eine Adresse übergeben kann welche dann in Buff geschrieben wird. Genau eine Adresse der Form 0x2244f4f5...Gleichbedeutend mit dem Code:
buff[0]='\x22'
buff[1]='\x44'
buff[2]='\xf4'
buff[3]='\xf5'Doch gebe ich zur Laufzeit auf die Anfrage der scanf Funktion eben diesen String ein "\x22\x44\xf4\xf5", so wird dieser eben nicht als 4 Byte lange Adresse sondern als eine 16 Byte lange Zeichenkette angesehen..
Wenn ich unter Bash einem Programm als Startparameter eine Adresse übergeben möchte kann ich das so mach.... ./prog $'\x22\x44\xf4\xf5'... Es müsste doch jetzt auch möglich sein dies bei einer scanf Funktion zu erreichen...
Für die die es noch interessiert hier eine kleiner Crashkurs über mein Thema Formatstringschwachstellen:
zb Richtig wäre:
int main(int anf, char *zeichen[])
{
printf("%s" ,zeichen[1]);
}Flasch wäre (also klassische Format String Schwachstelle):
int main(int anf, char *zeichen[])
{
int a=2;
int b=3;
printf(zeichen[1]);
}Denn im 2ten Beispiel hat man die komplette Kontrolle über den Formatstring.. Dann könnte man eben das Prog mit dem Parameter %x%x%x%x starten und trotz den fehlenden Platzhaltervariablen setzet die Printffunktion Werte für die %x ein.. Eben die welche pro Platzhalter 1 dword oberhalb des Format Strings sind...
Bei unserem Beispiel würde das heissen dass für den erste Platzhalter %x der Wert der 1 dword oberhalb des Formatstrings ist ausgegeben wird--->3, weil b=3 und die Variable b eben 1 dword oberhald des Formatstringzeigers liegt... dann 2 dword oberhalb des Formatstrings wäre a=2--->der zweite Platzhalter wird durch 2 ersetzt.... 3 dword oberhalb des FRS wäre wahrscheinlich der gesicherte Frame Pointer und dann noch die Rücksprungadresse der Main Funktion... Diese würden dann alle ausgegeben..
Durch zusätzliche Hilfe durch den %n Platzhalter ist es nun möglich durch eine solche Schwachstelle fast jede beliebige Speicherstelle mit einem gezielten Wert zu überschreiben...Hoffe meine Frage sei jetzt klarer formuliert... Habt bitte noch eine weinig Geduld mit mir... Thanks schonmal an alle...
MfG Piranya
-
char buff[4]; scanf( "%x", buff); printf( "%x %x %x %x\n", buff[0], buff[1], buff[2], buff[3]);Nicht sicher, ob ich es verstanden habe, aber zumindest ergibt das die gewünschte Ausgabe.
-
HackThePlanet schrieb:
Hab zu diesen Thema auch einige Videos, wenn du willst kann ich sie uploaden.

HackThePlanetCool, gibt mal ne URL.
-
...Ja das wars schon fast... Das mit der Adresse passt jetzt wunderbar... Doch nun wird mir bei einer normalen Augaben nichts mehr angezeigt... das heisst:
beim Aufruf:.
.
scanf("%x",buff);
printf("buff als hex: %x buff als Text: %s",buff,buff);
.
.Wenn ich jetzt der scanf Funktion eine Adresse übergebe dann stimmt nachher auch die Ausgabe.. Eine 4 Byte lange Adresse... Doch übergebe ich der scanf Funktion nun einen normalen String, so wird mir dieser unten nicht beim %s Platzhalter nicht angezeigt.. Dies wäre nötig da ja sonst eine Formatstringschwachstelle direkt erkannt werden würde.... Es muss doch also nun möglich sein der scanf Funktion eine Adress wie auch einen normalen String zu übergeben...??
Bitte um noch weiter unterstüzung, bin schon viel weiter gekommen...
Thanks "niemand";-)MfG Piranya
-
Dazu musst Du den buffer ein Zeichen größer machen und ein \0 anhängen. Ansonsten ist es kein string. Da kommen dann aber natürlich wirre Zeichen raus.
char buff[5]; scanf( "%x", buff); buff[4] = '\0' printf( "%x %x %x %x\n", buff[0], buff[1], buff[2], buff[3]); printf( "%s", buff);Dir ist aber klar, dass wenn Du mehr als vier Zeichen eingibst, Du einen schönen Bufferoverflow produzierst.
-
Ja... Bufferoverflow Problematik ist mir bekann thanks...Es kommt meiner Sache schon ziemlich nahe.... Versuche jetzt noch gerade ein letztes mal mein Problem detailliert zu erläutern:
Dazu ein kleines Prog zur verdeutlichung meines Problems:
#include <stdio.h> int main () { char command[16]; char name[10]; int a=2; int b=3; printf("\nGeben sie den ihren Namen ein :"); fgets(name, sizeof(name), stdin); printf("\n\nBefehl eingeben...:\n"); fgets(command, sizeof(command), stdin); printf("Befehl unbekannt :"); printf(command); }Ziel ist jetzt das ich durch die Formatstringschwachstelle eine beliebige Speicherstelle überschreiben kann... Dies funktioniert so:
Ich übergebe der fgets Funktion die den Namen in "name" speichert, diese beliebige Adresse... Nun muss ich ausgehend vom Formatstringzeiger soviele dWords hinaufgehen, eben mit %x Platzhaltern, bis der Stackpointer auf die von mir in "name" hinterlegte Adresse zeigt..Nun kann ich mit Hilfe des %n Platzhalters der ja dann die von mit hinterlegte Adresse als Parameter hat, dazu bringen die länge des auszugebenden Textes eben genau an diese Adresse zu schreiben...
Das würde bei unserem Beispiel so aussehen:
Als Name übergebe ich zum Beispiel die Adresse 0x2244f5f5... Dann als Befehl einige Platzhalter um genau zu sein 5 --> %x%x%x%x%n... Somit hat der 5te Platzhalter %n eben die Adresse welche 5 dWords oberhalb des Formatstringzeigers als Parameter.. Und diese Adresse ist eben genau die welche ich hinterlegt habe...
Doch dafür müsste ich eben der fgets Funktion eine Adresse übergeben können...Welche dann in Name gespeicher wird...Hoffe jetzt sei alles klar und jemand habe noch die Motivation mir zu helfen... Wäre sehr dankbar...
MfG Piranya