myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Reihenfolge des allozierten Speichers auf dem Stack stimmt nicht?

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 12.06.11, 20:18   #1
MaSydJun
Anfänger
 
Registriert seit: Jun 2011
Beiträge: 13
Bedankt: 0
MaSydJun ist noch neu hier! | 0 Respekt Punkte
Standard 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;
char buffer[5];
Im Debugger bekomme ich folgende Infos:
Code:
(gdb) x/x &flag
0xbffff39f:	0xfff3b400
(gdb) x/s buffer
0xbffff39a:	 "\374\267ȅ\004"
Nun, hier ist ja noch alles in Ordnung: `flag' ist vor `buffer' auf dem Stack

Wenn ich jetzt aber für den buffer mehr Speicher allozier wirds komisch:

Code:
char flag = 0;
char buffer[10];
GDB sagt:
Code:
(gdb) x/x &flag
0xbffff391:	0xd0bfff00
(gdb) x/s buffer
0xbffff392:	 "\377\277\320j\353\267\340\204", <incomplete sequence \374\267>
Jetzt ist `buffer' vor `flag' auf dem Stack. Das erscheint mir extrem verrückt.

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
MaSydJun ist offline   Mit Zitat antworten
Ungelesen 12.06.11, 22:03   #2
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Auch wenn ich selbst nur einfacher user hier bin, möchte ich dich trotzdem hier im Forum willkommen heißen: Hallo bei myGully

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.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 13.06.11, 04:32   #3
MaSydJun
Anfänger
 
Registriert seit: Jun 2011
Beiträge: 13
Bedankt: 0
MaSydJun ist noch neu hier! | 0 Respekt Punkte
Standard

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>
#include <stdlib.h>
#include <string.h>

int check_authentication(char *password) {
	int auth_flag = 0;
	char password_buffer[16];

	strcpy(password_buffer, password);
	
	if(strcmp(password_buffer, "brillig") == 0)
		auth_flag = 1;
	if(strcmp(password_buffer, "outgrabe") == 0)
		auth_flag = 1;

	return auth_flag;
}

int main(int argc, char *argv[]) {
	if(argc < 2) {
		printf("Usage: %s <password>\n", argv[0]);
		exit(0);
	}
	if(check_authentication(argv[1])) {
		printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
		printf("      Access Granted.\n");
		printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
	} else {
		printf("\nAccess Denied.\n");
   }
}

mfg MaSydJun
MaSydJun ist offline   Mit Zitat antworten
Ungelesen 13.06.11, 13:51   #4
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

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.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 14.06.11, 10:15   #5
Epeos
Ist öfter hier
 
Benutzerbild von Epeos
 
Registriert seit: Nov 2010
Beiträge: 198
Bedankt: 96
Epeos ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von slahn Beitrag anzeigen
Aber wie gesagt, der Compiler bestimmt die Reihenfolge (in allen höheren Sprachen).
Ich kenn mich mit den aktuellen C-Compilern nicht mehr so aus. Gibt's da keinen Parameter, mit dem man das Verhalten steuern kann? Ich meine, im Prinzip ist das ja schön, wenn der Compiler meinen Code optimiert, aber manchmal mache ich ja Dinge mit Absicht so, wie ich sie hingeschrieben habe (deswegen programmiere ich ja C und nicht smalltalk).
Epeos ist offline   Mit Zitat antworten
Ungelesen 14.06.11, 17:38   #6
slahn
Erfahrenes Mitglied
 
Benutzerbild von slahn
 
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
slahn ist noch neu hier! | 0 Respekt Punkte
Standard

Mal eine geile Antwort 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 
typedef struct authentication
{
   int flag;
   char password[16];
};

//deklariert Variable
authentication access;

//Struktur verwenden
access.flag = 0;
strcpy(access.password, "geheim");
Sieht doch schon ein wenig wie OOP aus

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.
__________________
"[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]" (Klopfers Vater)
slahn ist offline   Mit Zitat antworten
Ungelesen 14.06.11, 17:42   #7
MaSydJun
Anfänger
 
Registriert seit: Jun 2011
Beiträge: 13
Bedankt: 0
MaSydJun ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Epeos Beitrag anzeigen
Ich kenn mich mit den aktuellen C-Compilern nicht mehr so aus. Gibt's da keinen Parameter, mit dem man das Verhalten steuern kann? Ich meine, im Prinzip ist das ja schön, wenn der Compiler meinen Code optimiert, aber manchmal mache ich ja Dinge mit Absicht so, wie ich sie hingeschrieben habe (deswegen programmiere ich ja C und nicht smalltalk).
Unter Umständen könnte es ja auch sein, dass ältere Versionen des GCC's standartmäßig keine optimierungen durchführen, denn bei dem Autor meines Buches, klappt alles so wie es soll.


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 Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]


mfg MaSydJun
MaSydJun ist offline   Mit Zitat antworten
Ungelesen 30.08.11, 19:28   #8
kolodf
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 5
Bedankt: 0
kolodf ist noch neu hier! | 0 Respekt Punkte
Standard 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 ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 01:51   #9
Ccursed
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
Ccursed ist noch neu hier! | 0 Respekt Punkte
Standard

^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.
Ccursed ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 09:37   #10
kolodf
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 5
Bedankt: 0
kolodf ist noch neu hier! | 0 Respekt Punkte
Standard

asdfg
kolodf ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 09:37   #11
kolodf
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 5
Bedankt: 0
kolodf ist noch neu hier! | 0 Respekt Punkte
Standard

asdfg
kolodf ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 09:39   #12
kolodf
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 5
Bedankt: 0
kolodf ist noch neu hier! | 0 Respekt Punkte
Standard

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?
kolodf ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 19:33   #13
7331
Erfahrener Newbie
 
Registriert seit: Apr 2010
Beiträge: 142
Bedankt: 140
7331 ist noch neu hier! | 0 Respekt Punkte
Standard

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.
7331 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.


Sitemap

().