![]() |
Reihenfolge des allozierten Speichers auf dem Stack stimmt nicht?
Hallo,
bin Backfrisch hier im Forum. Hab folgende Frage bzw. kuriose Feststellung: Ich definiere 2 Variablen (in C): Code:
char flag = 0; Code:
(gdb) x/x &flag Wenn ich jetzt aber für den buffer mehr Speicher allozier wirds komisch: Code:
char flag = 0; Code:
(gdb) x/x &flag Ich will nämlich eigentlich einen Buffer Overflow erzeugen und so die Variable `flag' überschreiben. Warum werden die beiden Variablen in verschiedenen Reihenfolgen auf den Stack gelegt? Vielen Dank für Müh und Not ;) |
Auch wenn ich selbst nur einfacher user hier bin, möchte ich dich trotzdem hier im Forum willkommen heißen: Hallo bei myGully :D
So, jetzt zu deiner Frage: Immerhin entscheidet hier immer noch der Compiler wie er deinen Code in Assembler umsetzt. Wie du selbst siehst, ist es ein bisschen übersichtlicher zuerst flag und dann erst buffer auf den Stack ab zu legen, da die Adressen gleich hintereinander liegen. Du muss jetzt auch nur +1 auf den SP wirken, um auf das erste Element von buffer zu kommen. Wenn du dieses verhalten steuern willst musst du deinen Code schon in Assembler schreiben. |
Vielen Dank für die Antwort!
Das macht Sinn. Ich lese zu Zeit das Buch "Hacking - Die Kunst des Exploits" (Ja, die deutsche Übersetzung ;)) In dem ist auch eben dieses Beispiel angegeben, in dem mit einem Bufferoverflow ein flag gesetzt wird und man damit quasi eine "Passwortabfrage" umgeht. Und laut Buch sollte das so funktionieren… Hier ist der im Buch beschriebene Code, falls es jemanden interessiert: Code:
#include <stdio.h> mfg MaSydJun |
Aber wie gesagt, der Compiler bestimmt die Reihenfolge (in allen höheren Sprachen).
Und bei heutigen Programmen wird dies nicht Funktionieren, da man entweder nur die Pufferlänge einliest (also eben nicht als Parameter, was ja eh wenig sinn macht, da es dann ja jeder lesen kann, der Zugriff auf die Logs hat), oder man ersetzt ganz einfach in der Funktion "check_authentication(char *password)" das "strcpy()" durch ein "strncpy()", wo dann die länge angegeben werden kann. |
Zitat:
|
Mal eine geile Antwort :T Aber VORSICHT, es gibt in dem Border ein paar eingefleischte OOPler, die dich für so etwas verbal Lynchen würden ;).
Es gibt die Möglichkeit dies zu steuern, jedoch ist dies sehr Compiler spezifisch und für den Compiler noch immer keine Pflicht. Was auch noch gehen sollte, wenn du die beiden Variablen in einen Struktur packst. Die werden nicht optimiert, da man dort oft auch Binärdaten strukturiert hinterlegt und die Optimierung würde die Funktion beeinflussen. wenn du nicht weißt was eine Struktur ist, das Funktioniert so: Code:
// deklariert den Strukturtyp Wenn du eh weißt was struct ist, habe ich mich hier gerade ein wenig zum Trottel gemacht, wenn du noch nix verstanden hast, kannst du ja noch nach fragen. |
Zitat:
mfg MaSydJun [EDIT] Ok, Jungs entwarnung! Hab die Lösung gefunden: Mit dem Compilerschalter `-fno-stack-protector' wird die "richtige" Reihenfolge befolgt. Quelle: [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] mfg MaSydJun |
Problem mit Assemblercode
hi,
ich hab auch ein Problem mit Assemblercode: ich hab mein Passwort für eine 7z-Datei verlohren: das einzige was ich noch weiß, was mir aber nicht viel bringt ist, das Passwort ist nicht kompliziert dann hatte ich die Idee "einfach" das Programm 7-zip mit Assemblercode zu ändern, so dass 7-zip die Passwortabfrage immer "bejaht" => sowas wie Assemblercode: "jne" in "je" ändern oder so nur ich find die Stelle im Code nicht!!! Wer kann mir helfen?! Mit freundlichen Grüßen hedfd |
^kolodf
1. Das Passwort gibt ja nicht einfach nur ein "ja" bei richtigem Passwort zurück, sondern hat die Daten im Archiv entsprechent dem Passwort gespeichert, also wird das ohne Passwort nicht klappen. 2. Das Programm decompilieren und verändern wird sich als äußerst .... schwierig gestalten. 3. Wenn du weißt, dass das Passwort "einfach" war, und mit einfach meine ich kurz, kannst du versuchen zu Bruteforcen. |
asdfg
|
asdfg
|
Nein, lustig ist das nicht!!!
Aber Bruteforce könnte ich probieren! Vielen Dank für die Antwort! PS: Warum kann meine Idee nicht funktionieren? Das Programm vergleicht doch die Passwörter und macht dann eine Aktion: sperren, oder entpacken und wenn ich das Programm so ändere, dass es immer in die Aktion "entpacken" springt, müsste das doch funktionieren, theoretisch? |
Die 7z Datei an sich ist extrem stark verschlüsselt und ohne Kennwort kann es nicht entschlüsselt werden. Bei der Eingabe eines Passworts versucht 7zip es zu entschlüsseln und zeigt einen Fehler an, wenns nicht geklappt hat. Diese MessageBox umpachtchen kann sehr leicht sein, aber nützt hier rein gar nicht. Nur bei reinen "Nerv-Abfragen", wie manche CD-Checks bei alten Spielen kann man so umgehen.
Wenns wirklcih kurz war, versuche einen Bruteforce oder Dictionary Angriff mit dem Passwort Recovery Tool von Elcom Soft. Diese Firma bietet in diesem Bereich das Beste. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.