BF Addresses in the Stack
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.
Zauważ, że checksec
może nie wykryć, że plik binarny jest chroniony przez canary, jeśli został skompilowany statycznie i nie jest w stanie zidentyfikować funkcji.
Jednak możesz to zauważyć ręcznie, jeśli odkryjesz, że wartość jest zapisywana na stosie na początku wywołania funkcji i ta wartość jest sprawdzana przed wyjściem.
Aby obejść PIE, musisz wyciekować jakiś adres. A jeśli plik binarny nie wycieka żadnych adresów, najlepiej jest brute-forcować RBP i RIP zapisane na stosie w podatnej funkcji. Na przykład, jeśli plik binarny jest chroniony zarówno przez canary, jak i PIE, możesz zacząć brute-forcować canary, a następnie następne 8 bajtów (x64) będą zapisanym RBP, a następne 8 bajtów będą zapisanym RIP.
Zakłada się, że adres powrotu wewnątrz stosu należy do głównego kodu binarnego, co, jeśli luka znajduje się w kodzie binarnym, zazwyczaj będzie miało miejsce.
Aby brute-forcować RBP i RIP z pliku binarnego, możesz ustalić, że poprawnie odgadnięty bajt jest poprawny, jeśli program coś wyświetli lub po prostu nie zawiesza się. Ta sama funkcja co podana do brute-forcowania canary może być użyta do brute-forcowania RBP i RIP:
Ostatnią rzeczą, której potrzebujesz, aby pokonać PIE, jest obliczenie przydatnych adresów z wyciekłych adresów: RBP i RIP.
Z RBP możesz obliczyć gdzie zapisujesz swój shell w stosie. Może to być bardzo przydatne, aby wiedzieć, gdzie zamierzasz zapisać ciąg "/bin/sh\x00" w stosie. Aby obliczyć odległość między wyciekłym RBP a twoim shellcode, możesz po prostu ustawić punkt przerwania po wycieku RBP i sprawdzić gdzie znajduje się twój shellcode, a następnie możesz obliczyć odległość między shellcode a RBP:
Z RIP możesz obliczyć adres bazowy binarnego pliku PIE, który będzie potrzebny do stworzenia ważnego łańcucha ROP.
Aby obliczyć adres bazowy, wystarczy wykonać objdump -d vunbinary
i sprawdzić ostatnie adresy w disasemblerze:
W tym przykładzie widać, że potrzebne jest tylko 1,5 bajta, aby zlokalizować cały kod, więc adres bazowy w tej sytuacji będzie wyciekłym RIP, ale kończącym się na "000". Na przykład, jeśli wyciekł 0x562002970ecf
, adres bazowy to 0x562002970000
.
Zgodnie z niektórymi obserwacjami z tego posta, możliwe jest, że podczas wycieku wartości RBP i RIP, serwer nie ulegnie awarii przy niektórych wartościach, które nie są poprawne, a skrypt BF pomyśli, że otrzymał dobre. Dzieje się tak, ponieważ niektóre adresy po prostu nie spowodują awarii, nawet jeśli nie są dokładnie poprawne.
Zgodnie z tym wpisem na blogu zaleca się wprowadzenie krótkiego opóźnienia między żądaniami do serwera.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)