Basic Stack Binary Exploitation Methodology
Last updated
Last updated
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)
Zanim zaczniesz eksploatować cokolwiek, warto zrozumieć część struktury pliku binarnego ELF:
ELF Basic InformationPrzy tak wielu technikach dobrze jest mieć schemat, kiedy każda technika będzie przydatna. Zauważ, że te same zabezpieczenia będą wpływać na różne techniki. Możesz znaleźć sposoby na obejście zabezpieczeń w każdej sekcji zabezpieczeń, ale nie w tej metodologii.
Istnieją różne sposoby, w jakie możesz kontrolować przepływ programu:
Przepełnienia Stosu nadpisując wskaźnik powrotu ze stosu lub EBP -> ESP -> EIP.
Może być konieczne nadużycie Przepełnień Liczbowych, aby spowodować przepełnienie.
Lub poprzez Arbitralne Zapisanie + Write What Where to Execution.
Formaty ciągów: Nadużyj printf
, aby zapisać arbitralną zawartość w arbitralnych adresach.
Indeksowanie Tablic: Nadużyj źle zaprojektowanego indeksowania, aby móc kontrolować niektóre tablice i uzyskać arbitralne zapisanie.
Może być konieczne nadużycie Przepełnień Liczbowych, aby spowodować przepełnienie.
bof do WWW poprzez ROP: Nadużyj przepełnienia bufora, aby skonstruować ROP i móc uzyskać WWW.
Możesz znaleźć techniki Write What Where to Execution w:
Write What Where 2 ExecCoś, co należy wziąć pod uwagę, to że zazwyczaj jedna eksploatacja luki może nie być wystarczająca, aby przeprowadzić udaną eksploatację, szczególnie niektóre zabezpieczenia muszą być obejście. Dlatego warto omówić kilka opcji, aby uczynić jedną lukę eksploatowalną wiele razy w tej samej egzekucji binarnej:
Zapisz w łańcuchu ROP adres funkcji main
lub adres, w którym występuje luka.
Kontrolując odpowiedni łańcuch ROP, możesz wykonać wszystkie akcje w tym łańcuchu.
Zapisz w adresie exit
w GOT (lub jakiejkolwiek innej funkcji używanej przez binarny przed zakończeniem) adres, aby wrócić do luki.
Jak wyjaśniono w .fini_array, przechowuj tutaj 2 funkcje, jedną do ponownego wywołania luki i drugą do wywołania __libc_csu_fini
, która ponownie wywoła funkcję z .fini_array
.
ret2win: Istnieje funkcja w kodzie, którą musisz wywołać (może z pewnymi specyficznymi parametrami), aby uzyskać flagę.
W bof z PIE, będziesz musiał to obejść.
W bof z canary, będziesz musiał to obejść.
Jeśli musisz ustawić kilka parametrów, aby poprawnie wywołać funkcję ret2win, możesz użyć:
Łańcucha ROP jeśli jest wystarczająco dużo gadżetów, aby przygotować wszystkie parametry.
SROP (w przypadku, gdy możesz wywołać ten syscall) do kontrolowania wielu rejestrów.
Poprzez Write What Where możesz nadużyć innych luk (nie bof), aby wywołać funkcję win
.
Przekierowywanie Wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma być wywołana lub do ciągu, który ma być użyty przez interesującą funkcję (system lub printf), możliwe jest nadpisanie tego adresu.
Niezainicjowane zmienne: Nigdy nie wiesz.
(Stos) Shellcode: To jest przydatne do przechowywania shellcode na stosie przed lub po nadpisaniu wskaźnika powrotu, a następnie skoczyć do niego, aby go wykonać:
W każdym przypadku, jeśli istnieje canary, w zwykłym bof będziesz musiał to obejść (leak).
Z ASLR będziesz potrzebować technik takich jak ret2esp/ret2reg, aby do niego skoczyć.
To połączy shellcode z łańcuchem ROP.
Ret2syscall: Przydatne do wywołania execve
, aby uruchomić arbitralne polecenia. Musisz być w stanie znaleźć gadżety do wywołania konkretnego syscall z parametrami.
SROP może być przydatne do przygotowania ret2execve.
Ret2lib: Przydatne do wywołania funkcji z biblioteki (zwykle z libc
) jak system
z pewnymi przygotowanymi argumentami (np. '/bin/sh'
). Musisz, aby binarny załadował bibliotekę z funkcją, którą chciałbyś wywołać (zwykle libc).
Jeśli skompilowane statycznie i bez PIE, adres system
i /bin/sh
nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
Bez ASLR i znając wersję libc załadowaną, adres system
i /bin/sh
nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
Użyj ret2dlresolve
, aby rozwiązać adres system
i go wywołać.
Obejdź ASLR i oblicz adres system
i '/bin/sh'
w pamięci.
Obejść PIE.
Znaleźć wersję libc
używaną (leak kilka adresów funkcji).
Sprawdzić poprzednie scenariusze z ASLR, aby kontynuować.
Pivotowanie Stosu / EBP2Ret / Łańcuchowanie EBP: Kontroluj ESP, aby kontrolować RET poprzez przechowywane EBP na stosie.
Przydatne dla przepełnień stosu off-by-one.
Przydatne jako alternatywny sposób na kontrolowanie EIP, nadużywając EIP do skonstruowania ładunku w pamięci, a następnie skacząc do niego poprzez EBP.
Przekierowywanie Wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma być wywołana lub do ciągu, który ma być użyty przez interesującą funkcję (system lub printf), możliwe jest nadpisanie tego adresu.
Niezainicjowane zmienne: Nigdy nie wiesz.
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)