|
|
|
|
Exploit in C oder C++ |
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
|
|
Exploit in C oder C++ |
|
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 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
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 |
|
|
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
Themenstarter
|
|
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 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
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 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
data segment? mann kann nähmlich die Variablen im datensegment auch "locker" überschreiben (ein Meister spricht von seinen erfahrungen
) für Kalka erwähne ich auch,dass je nach Linkeroption der Codesegment auch beschreibbar ist...
|
|
29.12.2002 21:19 |
|
|
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
Themenstarter
|
|
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 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
@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 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
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
) komplett so abgebieldet, wie sie binär darliegt - ich hab mein Icon und Dialoge wiedergefunden
.
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 |
|
|
|
|
|
|