2012-05-23 22 views
14

Napisałem aplikację w C i próbuję zrozumieć, jaki jest cel polecenia -fno-stack-protector podczas kompilowania. W przypadku mojej konkretnej aplikacji nie ma znaczenia, czy użyję tego polecenia, czy nie, jeśli chodzi o ochronę przed przepełnieniem bufora.Jaki jest pożytek z -fno-stack-protector?

Przeczytałem w Internecie, że polecenia -fstack-protector i -fno-stack-protector włączają i wyłączają odpowiednio ochronę przed rozbiciem stosu, ale jeśli sam kompiluję aplikację, w jaki sposób można wcześniej włączyć protektora ? Czy użycie polecenia może być zależne od systemu, na którym działa aplikacja?

Dzięki

Odpowiedz

8

W GCC standard/akcji, stos ochraniacz jest domyślnie wyłączona. Jednak niektóre dystrybucje Linuksa załatały GCC, aby włączyć go domyślnie. Moim zdaniem jest to dość szkodliwe, ponieważ łamie możliwość kompilacji czegokolwiek, co nie jest powiązane ze standardowymi bibliotekami przestrzeni użytkownika, chyba że Makefile w szczególności wyłącza ochronę stosu. Mogłoby to nawet przerwać kompilację jądra Linuksa, z tym wyjątkiem, że dystrybucje z tym hackiem dodały dodatkowe ataki do GCC, aby wykryć, że jądro jest budowane i wyłączyć to.

+2

Z definicji nie byłoby niczego kompilowanego na systemie z ochroną stosu na domyślnie połączonym z bibliotekami zbudowanymi z ochroną stosu, ponieważ one z kolei zostałby skompilowany w systemie z włączoną ochroną stosu? – tbert

+1

Zakładam, że masz do czynienia z drugą częścią mojej odpowiedzi (komentarze o tym, dlaczego jest problematyczna), a jeśli tak, to w takim przypadku odpowiedź brzmi "nie". Kod nieprzeznaczony do działania w ekosystemie przestrzeni użytkownika hosta nie będzie połączony z żadną biblioteką hosta. (Na przykład jądro nie jest połączone z żadnymi bibliotekami przestrzeni użytkownika, inne to kod bootloadera, moduły przeznaczone do odczytu i używane jako szablony przez emulator dynrec/JIT, itp.) –

+0

Nie mówiłem o przestrzeni jądra, ale przestrzeń użytkownika; Kompilacja JIT nie jest wykonywana z kompilatorem C; więc muszę zapytać, jaki jest problem z włączaniem ochrony stosu w przestrzeni użytkownika, może poza ustawieniem "-fno-stack-protector" w kompilacji argumentów dla jądra Linuxa? – tbert

10

Jeśli kompilujesz z -fstack-protector, na stosie zostanie przydzielone trochę więcej miejsca i trochę więcej na wejście i powrót z funkcji, podczas gdy kod ustawia kontrole, a następnie sprawdza, czy masz nadpisał stos podczas działania.

Będzie to miało wpływ na Twój wniosek. Jeśli ta opcja jest włączona, natychmiast wyładuje ataki przepełnienia stosu. Tylko jeśli nie masz wywołań funkcji w twoim kodzie, program pozostanie niezmieniony (a ponieważ zwykle piszesz main() i jest to funkcja wywoływana przez kod startowy, będzie to miało wpływ na twój program). Jednak ataki przepełnienia stosu nie są jedynymi możliwymi atakami, które można wykorzystać, więc nie jest to panaceum. Ale jest to przydatna ochrona przy ograniczonych kosztach.

Ochrona nie zależy od samego systemu; zależy to od wersji kompilatora, którego używasz, ale to wszystko.

+0

'-fstack-protector' również zmienia układ stosu, aby ułatwić wykrywanie rozbicia. – jww

0

Zabezpieczenie stosu to kod wygenerowany przez kompilator i umieszczony w twoim programie na. To nie jest zewnętrzny program lub wywołanie systemowe, które jest wywoływane przez twój program.

1

Times gdy opcja, że ​​pasuje do domyślnego ustawienia kompilatora mogą być przydatne obejmują:

  • gdy używasz kompilacji systemu, który może mieć skomplikowaną konfigurację, którą chcesz dostosować. Zamiast zastanawiać się, gdzie w labiryncie plików Makefile może być użyta opcja fstack-protector (na przykład), może pozwolić ci łatwo przekazać dodatkowe opcje, które po prostu zostaną umieszczone na końcu listy opcji. Jeśli GCC widzi w zestawie opcji zarówno fstack-protector, jak i fno-stack-protector, ostatnia w wierszu poleceń staje się skuteczna.

  • innym razem tego rodzaju rzeczy mogą być przydatne (co nie wydaje się dotyczyć -fstack-protector, jednak), gdy masz opcję, która włącza grono "podwariantów". Na przykład, ustawienie -O2 włącza mnóstwo opcji optymalizacji -fxxx i możesz chcieć używać w większości przypadków -O2, ale nie chcesz stosować ścisłej optymalizacji aliasingowej GCC. Możesz więc określić -fno-strict-aliasing, aby przywrócić tę konkretną opcję do jej domyślnego ustawienia.(Uwaga: ten przypadek jest naprawdę równoważny z powyższym przypadkiem)

Powiązane problemy