hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries
2024-04-07 16:14:20 +00:00
..
bf-forked-stack-canaries.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common- 2024-04-07 16:14:20 +00:00
print-stack-canary.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:48:01 +00:00
README.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:48:01 +00:00

Ochrona stosu

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

StackGuard i StackShield

StackGuard wstawia specjalną wartość znaną jako kanarek przed EIP (Extended Instruction Pointer), konkretnie 0x000aff0d (reprezentującą null, znak nowej linii, EOF, powrót karetki) w celu ochrony przed przepełnieniem bufora. Jednak funkcje takie jak recv(), memcpy(), read() i bcopy() pozostają podatne, a także nie chroni EBP (Base Pointer).

StackShield stosuje bardziej zaawansowane podejście niż StackGuard, utrzymując Globalny Stos Powrotny, który przechowuje wszystkie adresy powrotu (EIP). Ten układ zapewnia, że przepełnienie nie powoduje szkód, ponieważ umożliwia porównanie przechowywanych i rzeczywistych adresów powrotu w celu wykrycia wystąpienia przepełnienia. Dodatkowo, StackShield może sprawdzić adres powrotu względem wartości granicznej, aby wykryć, czy EIP wskazuje poza oczekiwaną przestrzeń danych. Jednak ta ochrona może być obejścia za pomocą technik takich jak Return-to-libc, ROP (Return-Oriented Programming) lub ret2ret, co oznacza, że StackShield również nie chroni zmiennych lokalnych.

Protector Stack Smash (ProPolice) -fstack-protector:

Ten mechanizm umieszcza kanarka przed EBP i przestawia zmienne lokalne w taki sposób, aby bufory znajdowały się na wyższych adresach pamięci, uniemożliwiając nadpisywanie innych zmiennych. Bezpiecznie kopiuje również argumenty przekazane na stosie powyżej zmiennych lokalnych i używa tych kopii jako argumentów. Jednak nie chroni tablic o mniej niż 8 elementach ani buforów w strukturze użytkownika.

Kanarek to losowa liczba pochodząca z /dev/urandom lub domyślna wartość 0xff0a0000. Jest przechowywany w TLS (Thread Local Storage), co pozwala na współdzielone przestrzenie pamięci między wątkami, aby miały wątkowo specyficzne zmienne globalne lub statyczne. Te zmienne są początkowo kopiowane z procesu nadrzędnego, a procesy potomne mogą zmieniać swoje dane bez wpływu na proces nadrzędny lub rodzeństwo. Niemniej jednak, jeśli używane jest fork() bez tworzenia nowego kanarka, wszystkie procesy (rodzic i dzieci) dzielą ten sam kanarek, co czyni go podatnym. Na architekturze i386, kanarek jest przechowywany pod adresem gs:0x14, a na x86_64 pod adresem fs:0x28.

Ta lokalna ochrona identyfikuje funkcje z buforami podatnymi na ataki i wstrzykuje kod na początku tych funkcji, aby umieścić kanarka, a na końcu weryfikuje jego integralność.

Gdy serwer WWW używa fork(), umożliwia atak brutalnej siły, aby zgadywać bajt kanarka po jednym bajcie. Jednak użycie execve() po fork() nadpisuje przestrzeń pamięci, unieważniając atak. vfork() pozwala procesowi potomnemu wykonywać się bez duplikacji, dopóki nie spróbuje zapisać, wtedy tworzony jest duplikat, oferując inny sposób tworzenia procesów i zarządzania pamięcią.

Długości

W binariach x64, ciasteczko kanarka to 0x8 bajtów qword. Pierwsze siedem bajtów jest losowe, a ostatni bajt to bajt null.

W binariach x86, ciasteczko kanarka to 0x4 bajty dword. Pierwsze trzy bajty są losowe, a ostatni bajt to bajt null.

{% hint style="danger" %} Najmniej znaczący bajt obu kanarków to bajt null, ponieważ będzie pierwszy na stosie pochodzący z niższych adresów i dlatego funkcje czytające ciągi znaków zatrzymają się przed jego odczytaniem. {% endhint %}

Ominięcia

Ujawnienie kanarka a następnie nadpisanie go (np. przepełnienie bufora) jego własną wartością.

  • Jeśli kanarek jest klonowany w procesach potomnych, może być możliwe brutalne siłowe odgadnięcie go po jednym bajcie:

{% content-ref url="bf-forked-stack-canaries.md" %} bf-forked-stack-canaries.md {% endcontent-ref %}

  • Jeśli w binarnym pliku istnieje jakaś interesująca luka lub podatność na arbitralne odczytywanie, może być możliwe jej ujawnienie:

{% content-ref url="print-stack-canary.md" %} print-stack-canary.md {% endcontent-ref %}

  • Nadpisywanie wskaźników przechowywanych na stosie

Stos podatny na przepełnienie stosu może zawierać adresy do ciągów znaków lub funkcji, które można nadpisać, aby wykorzystać podatność bez konieczności dotarcia do kanarka stosu. Sprawdź:

{% content-ref url="../../stack-overflow/pointer-redirecting.md" %} pointer-redirecting.md {% endcontent-ref %}

Referencje

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: