Stack Buffer Overflow

Diskutiere Stack Buffer Overflow im Security-Zone - Sicherheitslücken, Virenschutz Forum im Bereich Hardware & Software Forum; Servus, Ich beschäftige mich seid Kürzerem mit der Thematik des Pufferüberlaufs, wobei ich noch einige Verständnis Probleme habe die, wie ich...
  • Stack Buffer Overflow Beitrag #1
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
Servus,
Ich beschäftige mich seid Kürzerem mit der Thematik des Pufferüberlaufs, wobei ich noch einige Verständnis Probleme habe die, wie ich hoffe, von euch beseitigt werden können.

Also fang ich mal an:
Ich Arbeite auf einem x86 system unter Windows, bedeutet das ich mich nur hierrauf bezziehen werde.

Mein erstes Problem ist der EBP, also der BasePointer, welcher im Stack hinter den Daten, aber vor dem EIP liegen sollte. (von 0xfff ... zu 0x000...) Worauf zeigt diese? Nach meiner jetzigen Einschätzung sollte dieser auf den BasePointer des nächsten elements zeigen, wobei ich nicht weiß ob das stimmt.

Das andere Problem ist ich habe schwierigkeiten die Rücksprung Adresse ausfindig zu machen, benutze dafür IDA Pro, bzw. OllyDbg.
Ich habe folgenden Source geschrieben und probe daran:
Code:
void Overflow()
{
	char buffer[10];
	std::cout<<"Lese: ";
	gets(buffer);
}

void Inject()
{
	std::cout<<"Erfolgreich";
	gets(NULL);
}


int main()
{
	std::cout<<"Anfang"<<std::endl;
	Overflow();
	std::cout<<std::endl<<"Ende"<<std::endl;

	return(0);
}

Das ist das Disasmble der Datei (main):
Code:
×+Ç×+ñµ
var_10= byte ptr -10h
var_4= dword ptr -4
argc= dword ptr  8
argv= dword ptr  0Ch
envp= dword ptr  10h

push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF8h
sub     esp, 10h
mov     eax, ___security_cookie
xor     eax, esp
mov     [esp+10h+var_4], eax
mov     eax, ds:__imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl(std::basic_ostream<char,std::char_traits<char>> &)
push    eax
push    ecx
mov     ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
push    offset aAnfang  ; "Anfang"
push    ecx             ; std::basic_ostream<char,std::char_traits<char> > *
call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
add     esp, 0Ch
mov     ecx, eax
call    ds:__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
mov     edx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
push    offset aLese    ; "Lese: "
push    edx             ; std::basic_ostream<char,std::char_traits<char> > *
call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
lea     eax, [esp+18h+var_10]
push    eax             ; char *
call    ds:__imp__gets
mov     ecx, ds:__imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z ; std::endl(std::basic_ostream<char,std::char_traits<char>> &)
add     esp, 0Ch
push    ecx
push    ecx
mov     edx, ecx
mov     ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
push    offset aEnde    ; "Ende"
push    edx             ; char *
call    ds:__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
push    eax             ; std::basic_ostream<char,std::char_traits<char> > *
call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
add     esp, 0Ch
mov     ecx, eax
call    ds:__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
mov     ecx, [esp+10h+var_4]
xor     ecx, esp        ; unsigned int
xor     eax, eax
call    @__security_check_cookie@4 ; __security_check_cookie(x)
mov     esp, ebp
pop     ebp
retn

Bei der Funktion gets(), wird der inhalt mit move ecx, ds:(...) in den ecx register Kopiert und anschließend im weiteren verlauf nach edx.
Darüber wird mit lea eax, [esp+18h+var_10] der speicher "reserviert",
aber hier ist mein Problem, wieso wird speicher bei eax erzeugt und nicht in dem register in dem das Kopiert wird? Desweiteren wie finde ich jetzt die Rücksprung adresse dieser variable?

Desweiteren sollte doch eig auch ein Jump befehl in die Funktion geben oder habe ich da was falsch verstanden? Denn wie sonst finde ich entsprechende Adressen raus?

Dabei zu sagen ist das ich nie Assembler gelernt habe, und das das ziel ist die Funktion Inject() durch einen Overflow auzuführen.

Hoffe auf Antwort
Mfg. Matyro
 
Zuletzt bearbeitet:
  • Stack Buffer Overflow Beitrag #2
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
*push*

Kennt sich keiner hier aus, oder will niemand antworten?
 
  • Stack Buffer Overflow Beitrag #3
B

BernieHugolutz

Mitglied
Dabei seit
25.08.2009
Beiträge
9
Reaktionspunkte
0
Ich gehe mal auf alle Punkte ein:
1. Der EBP ist nicht in jeder phase einer Funktion,
die Daten im Stackablegt hinter dem EIP.
Also Beispiel nenne ich mal die Deklaration einer Variable
int a = 1

1. Der ebp wird auf die selbe Stufe wie der eip gebracht
(zB movl %esp,%ebp)
2. dann wird esp um 1 DWORD dekrementiert (zB subl $4, %esp),
der Stack wächst nach unten, wissen wa ja alle :)
und so weiter...funktionsoperationen werden ausgeführt
(movl $1, -4(%ebp))
...
Du willst die Rücksprungadresse ausfindig machen?
compiliere doch mit debuggerinformationen
und debugge es mit gdb

#gdb programm
#list X(listet den Code auf)
#break X(breakpoint am Zeilenende der zu debuggenden Funktion)
#bt
#info frame (nummer der funktion die du debuggen willst)
im Output stehen dann alle infos
Rücksprungadresse bei "saved eip"
oder du kannst es dir einfach machen:
#info frame eip

der asm output der Datei enthält viel "Müll",
an sowas erkennt man natürlich nicht sofort,
was dieses Programm bezweckt.
du solltest dich erstmal ein bisschen mit Speicherverwaltung
auseinandersetzen.

Mein Tipp:
Lese weiter Papers, fang mit C und asm an und Speicherverwaltung.
Und zwar in aller Ruhe ;)

PS: Zu deiner Frage, habe mich eben gerade registriert ;)

Den "Exploit" machst du folgendermaßen,
wie du vielleicht weist
10 DummyBytes für den Puffer + 4 DummyBytes für den SFP
+ 4Byte Adresse der auszuführenden Funktion
über den EIP schreiben.
 
Zuletzt bearbeitet:
  • Stack Buffer Overflow Beitrag #4
B

BernieHugolutz

Mitglied
Dabei seit
25.08.2009
Beiträge
9
Reaktionspunkte
0
Ich finde keinen Editbutton, wtf...
Egal: Noch ne Frage, ist es absicht, dass keine Kommandozeilenübergabe stattfinden soll?
Sieht mir doch nach einem Konsolenprogramm aus :3
Edit-
Ah jetzt schnalle ich's :D über gets()
finde ich ein bissl plump ^^
int main(int argc, char *argv[]){...} hat mehr Stil finde ich
und kann man auch besser exploiten...
 
  • Stack Buffer Overflow Beitrag #5
Matyr

Matyr

Bekanntes Mitglied
Dabei seit
09.03.2007
Beiträge
428
Reaktionspunkte
0
Vielen dank für deine Antwort, C++ behersche ich und bin seid ca. 4 Jahren (kp kann auch etwas weniger sein oder mehr) dabei. Assembler habe ich nur minimal angeguckt da ich persönlich die Sprache auf dem ersten blick zu unübersichtlich finde (wahrscheinlich liege ich damit falsch).
Probiere die erwähnten dinge im laufe der Tage aus, werde dann eben schnell auch gets() löschen und das per übergabe parameter machen.

Mfg. Matyro
 
Thema:

Stack Buffer Overflow

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben