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:
Das ist das Disasmble der Datei (main):
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
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: