BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Exploit in C oder C++ » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Exploit in C oder C++
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Kalka Kalka ist männlich
BlackBoarder


Dabei seit: 16.03.2002
Beiträge: 856

Exploit in C oder C++       Zum Anfang der Seite springen

hallo Leute,
kann mir vielleicht einer einen ganz kurzen und leicht zu verstehenden Exploit geben? Am besten in C oder C++, Wäre echt cool!

und nochwas, kann man damit einen BufferOverflow erzeugen (also ich will damit nichts dollet anstellen, wird auch wohl kaum gehen, nur würd ich gern ma wissen ob das so vom Prinzip richtig ist):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
#include <iostream.h>
#include <string.h>

char c[1];

int main (int argc, char *argv[])  
{

	if (argc == 2)
	{
		cout << "\n\n";
		strcpy(c,"");
		strcpy(c,argv[1]);

		cout << c;
		cout << "\n\n";
	}
	return 0;
}


wenn man das jetzt so aufruft:

Test.exe 1234567890

müsste doch was überschrieben werden, oder?

cu Kalka

__________________
In wirklichkeit sind wir alle kleine grüne Kaninchen!
29.12.2002 20:13 Kalka ist offline E-Mail an Kalka senden Homepage von Kalka Beiträge von Kalka suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

Das ist richtig.

Das Problem ist, daß sich die Variable "c" nicht auf dem Stack befindet, sondern global definiert ist. Wenn Du sie lokal deklarierst solltest Du es packen.
29.12.2002 20:30 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
Kalka Kalka ist männlich
BlackBoarder


Dabei seit: 16.03.2002
Beiträge: 856

Themenstarter Thema begonnen von Kalka
      Zum Anfang der Seite springen

sind globale variablen nicht auf dem Stack? ich dachte da sind alle variablen???

Wie kann man denn eigentlich an Werte von Speicheraddressen rausbekommen? Also Von Variablen, die nicht aus dem eigenen programm sind?

cu Kalka

__________________
In wirklichkeit sind wir alle kleine grüne Kaninchen!
29.12.2002 20:39 Kalka ist offline E-Mail an Kalka senden Homepage von Kalka Beiträge von Kalka suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

Ich bin mir jetzt nicht sicher, ob globale Variablen sich gar nicht auf dem Stack befinden (meiner Meinung aber schon). Aber was ich meinte, die globale Variable ist für einen Buffer Overflow weniger geeignet.

Denn der Stack wächst von den hochen zu den niedrigen Adressen. Wenn Du nun aber Variablen mit Werten beschreibst, werden i.d.R. die Adressen von unten nach oben gefüllt (je nachdem ob das Direction Flag gesetzt oder gelöscht ist). Daher kann man die Rückprungadresse überschreiben, die sich ja über den lokalen Variablen befindet.

Wie man an die Speicheradressen kommt? Ich benutze immer OllyDbg dazu (Wenn Du das in www.google.de eintippst solltest Du fündig werden). Das ist ein sehr guter Debugger. Da gibt es ein extra Stack-Fenster in dem auch die Rückrpungadressen besonders gekennzeichnet sind. Was auch noch wichtig wäre: Die Adresse auf dem Stack sind mehr oder weniger statisch. Was ich damit sagen will ist, daß bei jedem Programmaufruf sich die Variable an der gleichen Speicheradresse befinden (anders als im Heap).

[Edit]
So, ich habe jetzt grade noch mal den Debugger angeworfen, weil mich das auch interessiert hat, wo globale Variablen gespeichert werden. Sie sind definitiv nicht auf dem Stack. Ich vermute, wegen der Speicheradresse an der ich sie gefunden habe, daß sie im Code-Segment liegen, kann aber genausogut der Heap sein. Ich dachte immer das Code-Segment wäre schreibgeschützt...
[/edit]

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Compuholic: 31.12.2002 10:50.

29.12.2002 20:46 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

data segment? mann kann nähmlich die Variablen im datensegment auch "locker" überschreiben (ein Meister spricht von seinen erfahrungen smile ) für Kalka erwähne ich auch,dass je nach Linkeroption der Codesegment auch beschreibbar ist...
29.12.2002 21:19 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Kalka Kalka ist männlich
BlackBoarder


Dabei seit: 16.03.2002
Beiträge: 856

Themenstarter Thema begonnen von Kalka
      Zum Anfang der Seite springen

ich glaube ich muss mal nen bissle Assambler lernen - ich schnall irgendwie fast gar nicht mehr hier...

cu Kalka

__________________
In wirklichkeit sind wir alle kleine grüne Kaninchen!
29.12.2002 21:34 Kalka ist offline E-Mail an Kalka senden Homepage von Kalka Beiträge von Kalka suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

@CDW:

Mein Verständnisproblem liegt gerade da. Mit ist schon klar, daß globale Daten ins Daten-Segment kommen. Doch das Daten-Segment existiert nur in der EXE-Datei. Was passiert, wenn die EXE in den Speicher geladen wird. Das OS legt ja im virt. Addressraum 3 Segmente an (Code, Heap und Stack).

Meiner Meinung nach müßte der ganze Inhalt der EXE-Datei ins Code-Segment. Ich dachte aber immer, daß das Code-Segment schreibgeschützt, also für Variablen nicht geeignet ist. Aber merkwürdigerweise kann man jede Sektion in einer EXE-Datei mit speziellen Flags extra schreibschützen (indem man die Sektion auf "Code" setzt).

Ich muß zugeben, daß ich etwas verwirrt bin. Die Sektionen der EXE müssen ja auch irgendwie nach dem Laden Gültigkeit haben, sonst macht das Ganze ja keinen Sinn. Aber was sollen ja dann die 3 Segmente im Addressraum? Gehören die Sektionen der EXE komplett ins Codesegment des OS?

Vielleicht kannst Du mir ja helfen. Danke
29.12.2002 23:04 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

ich muss zugeben, dass ich unter Google auf die schnelle nix gefunden hab, außer:
Zitat:
Organisation des Hauptspeichers Der verwendete Hauptspeicher ist konventionell aufgebaut. Der Benutzer-Adressierungsraum ist in drei Teile aufgeteilt. Das Textsegment, in dem die ausfuhrbaren Programme gespeichert werden, bildet den unteren Teil und beginnt bei Adresse 0x00400000, ab Adresse 0x10000000 beginnt das Datensegment, welches wiederum zweigeteilt ist. Der statische Datenbereich, in dem Objek- te, deren Gr
ossen und Adressen zur Ubersetzungszeit bekannt sin, abgespeichert werden, beginnt ab Adresse 0x10000000. Oberhalb davon liegt der Stack. Dieser beginnt bei Adresse 0x7fffffff und wächst von oben nach unten, also zu den kleinen Adressen hin. Der Kerneladressierungsraum,
der im wesentlichen fur das Betriebssystem reserviert ist, enthält einen Datenbereich, welcher
bei Adresse 0x90000000, und ein Textsegment, welches an der Adresse 0x80000000 beginntf

([URL]http://www.google.de/search?q=cache:h5X8V2C-7ZAC:www.ift.cs.uni-potsdam.de/~pvogel/uebung...&hl=de&ie=UTF-8[/URL])

es hanelt sich zwar anscheinen für Linux, jedoch kann ich es für win fast vollständig bestätigen... - außer des Datensegments.
und zwar habe ich einfach ein Programm(creckme(easy)) mit Olly betrachtet und man sieht zum beispiel (nach dem man GetMpoduleHandle aufruft tut man das Handle in eine variable rein) dass die (Globalvariablen)Adressen FEST verankert sind und zwar schon bei der compilierung:
MOV DWORD PTR DS:[403218],EAX
ist in Hex:
A3 18324000
da ja die Adressen virtuell sind,ists kein Problem...
bei mir endet der Codesegment bei 0041FFFF (wird mit 00 ausgefühlt um die volle 512 Page zu kriegen...
ab 0042000 beginnen die APIimporte
und ab 0043000 beginnen die besagten Variablen-zuerst die initialiesierten,danach die nicht initialisierten... da alles sich im 0x400000 Adressraum abspielt,würde ich sagen, dass es wirklich ins Codesegment gehört - die EXE wird komplett in den Speicher geladen - wenn man weiter geht (man muss immer "Go to Expression" nutzen) sieht man auch die Ressourcedateien. Anscheinen wird die Exe ab dem Codeanfang (also ohne Header smile ) komplett so abgebieldet, wie sie binär darliegt - ich hab mein Icon und Dialoge wiedergefunden smile .
Ich würde sagen,dass es OS abhängig ist, ob codesegment beschreibbar ist oder nicht.Einzelne Unterteilungen werden wohl über Flags vorgenommen.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von CDW: 30.12.2002 18:26.

30.12.2002 18:25 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Exploit in C oder C++

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH