Witajcie
Ostatnio czytałem sobie o atakach komputerowych (przepełnienie stosu) i w ogóle jak należy pisać bezpieczne aplikacje.
Zdałem sobie sprawę że na dobrą sprawę nie specjalnie go rozumiem - ani czym jest ani jak działa. W związku z tym mam kilka pytań:
1)Czym jest stos?
Czy jest po prostu miejscem w pamięci o sztywno określonym rozmiarze (np 1 MB) ?
- Jaki jest jego maksymalny rozmiar ? Padały różne odpowiedzi od 64 KB do 1GB (<?> rzekomo od ustawień konsolidatora to zależy </?>)
3)Czy stos jest jeden w całym programie czy też może na przykład wątek ma swój własny stos?
4)Czy jeżeli mam moduł (dll/so) to on współdzieli tylko sterte czy tez jeszcze stos.
5)Skoro mam maksymalny rozmiar stosu to znaczy ze istnieje okreslona liczba obiektow/ zmiennych jakie mogę posiadać ?
Zakładając że rozmiar stosu to 1MB to oznacza że wszystkie zmienne oraz obiekty klas mogą razem zająć 1MB (zakładając nieużywanie sterty (new/delete) ) ? - Co to adres powrotu funkcji ?
7)Od czego rozmiar stosu zależy - czy można go sobie zmiejszyć lub powiększyć za pomocą opcji w kompilatorze / konsolidatorze ?
Spotkałem się ze zdaniem :
"Stack data - 1GB (the stack size is set by the linker, the default is 1MB. This can be increased using the Linker property System > Stack Reserve Size)."
- Jak się zabezpieczyć przed przepełnieniem stosu - szczególnie odnośnie tego : http://osworld.pl/ghost-14-letni-blad-w-bibliotece-glibc-na-linuksie/
Czy wystarczy coś takiego ?
PSEUDO KOD:
IP_Address getHostByName(const std::string & hostName)
{
if(hostName.size() > maxSizeOfName)abortFunction();
translateName();
}