<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
**Jeśli masz do czynienia z binarnym plikiem chronionym przez canary i PIE (Position Independent Executable), prawdopodobnie musisz znaleźć sposób na ich obejście.**
Należy zauważyć, że **`checksec`** może nie wykryć, że binarny plik jest chroniony przez canary, jeśli został on statycznie skompilowany i nie jest w stanie zidentyfikować funkcji.\
Jednak można to zauważyć ręcznie, jeśli zauważysz, że wartość jest zapisywana na stosie na początku wywołania funkcji i ta wartość jest sprawdzana przed wyjściem.
Najlepszym sposobem na obejście prostego canary jest, jeśli binarny plik jest programem, który **tworzy procesy potomne za każdym razem, gdy nawiązujesz nowe połączenie** z nim (usługa sieciowa), ponieważ za każdym razem, gdy się z nim łączysz, **używany będzie ten sam canary**.
Najlepszym sposobem na obejście canary jest po prostu **brute-force'owanie go znak po znaku**, a można ustalić, czy odgadnięty bajt canary jest poprawny, sprawdzając, czy program się zawiesił czy kontynuuje swoje normalne działanie. W tym przykładzie funkcja **brute-force'uje 8-bajtowy canary (x64)** i rozróżnia między poprawnie odgadniętym bajtem a błędnym bajtem, po prostu **sprawdzając**, czy serwer **wysyła odpowiedź** (innym sposobem w **innej sytuacji** może być użycie **try/except**):
Innym sposobem na obejście canary jest jego **wyświetlenie**.\
Wyobraź sobie sytuację, w której **podatny na przepełnienie stosu program** może wykonać funkcję **puts**, która **wskazuje** na **część** przepełnionego stosu. Atakujący wie, że **pierwszy bajt canary to bajt nullowy** (`\x00`), a reszta canary to **losowe** bajty. Następnie atakujący może stworzyć przepełnienie, które **nadpisuje stos aż do pierwszego bajtu canary**.\
Następnie atakujący **wywołuje funkcję puts** na środku payloadu, co spowoduje **wyświetlenie całego canary** (z wyjątkiem pierwszego bajtu nullowego).\
Dzięki tym informacjom atakujący może **stworzyć i wysłać nowy atak**, znając canary (w tej samej sesji programu).
Oczywiście, ta taktyka jest bardzo **ograniczona**, ponieważ atakujący musi być w stanie **wyświetlić** zawartość swojego payloadu, aby **wyciec canary**, a następnie być w stanie stworzyć nowy payload (w tej samej sesji programu) i **wysłać****rzeczywiste przepełnienie bufora**.\
Przykład CTF: [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
Aby obejść PIE, musisz **wyciec pewien adres**. Jeśli binarny plik nie wycieka żadnych adresów, najlepiej jest **przełamać RBP i RIP zapisane na stosie** w podatnej funkcji.\
Na przykład, jeśli binarny plik jest chroniony zarówno przez **canary**, jak i **PIE**, możesz rozpocząć próby odgadywania canary, a następnie **następne** 8 bajtów (x64) będą zapisanym **RBP**, a **następne** 8 bajtów będą zapisanym **RIP**.
Aby przeprowadzić próby odgadywania RBP i RIP z binarnego pliku, możesz ustalić, że poprawny odgadnięty bajt jest prawidłowy, jeśli program coś wyświetla lub po prostu nie zawiesza się. **Ta sama funkcja**, która została użyta do prób odgadywania canary, może być użyta do prób odgadywania RBP i RIP:
Na podstawie **RBP** możesz obliczyć **miejsce, w którym zapisujesz swoją powłokę na stosie**. Może to być bardzo przydatne, aby wiedzieć, gdzie zamierzasz zapisać ciąg _"/bin/sh\x00"_ wewnątrz stosu. Aby obliczyć odległość między wyciekniętym RBP a twoim kodem powłoki, wystarczy ustawić **punkt przerwania po wycieku RBP** i sprawdzić, **gdzie znajduje się twój kod powłoki**, a następnie obliczyć odległość między kodem powłoki a RBP:
Na przykładzie widać, że potrzebne jest tylko **1,5 bajta**, aby zlokalizować cały kod, a więc adres bazowy w tej sytuacji będzie to **wycieknięty RIP, ale zakończony na "000"**. Na przykład, jeśli wyciekł _0x562002970**ecf**_, to adres bazowy to _0x562002970**000**_.
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.