WWW2Exec - .dtors & .fini_array
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)
Obecnie bardzo dziwne jest znalezienie binarnego pliku z sekcją .dtors!
Destruktory to funkcje, które są wykonywane przed zakończeniem programu (po zwróceniu funkcji main
).
Adresy tych funkcji są przechowywane w sekcji .dtors
binarnego pliku i dlatego, jeśli uda ci się zapisać adres do shellcode w __DTOR_END__
, to zostanie on wykonany przed zakończeniem programu.
Uzyskaj adres tej sekcji za pomocą:
Zazwyczaj znajdziesz znaczniki DTOR pomiędzy wartościami ffffffff
i 00000000
. Więc jeśli widzisz tylko te wartości, oznacza to, że nie ma zarejestrowanej funkcji. Więc nadpisz 00000000
adresem do shellcode, aby go wykonać.
Oczywiście, najpierw musisz znaleźć miejsce na przechowanie shellcode, aby później móc go wywołać.
Zasadniczo jest to struktura z funkcjami, które będą wywoływane przed zakończeniem programu, jak .dtors
. To jest interesujące, jeśli możesz wywołać swój shellcode, po prostu skacząc do adresu, lub w przypadkach, gdy musisz wrócić do main
, aby wykorzystać lukę po raz drugi.
Zauważ, że gdy funkcja z .fini_array
jest wykonywana, przechodzi do następnej, więc nie będzie wykonywana kilka razy (zapobiegając wiecznym pętlom), ale także da tylko 1 wykonanie funkcji umieszczonej tutaj.
Zauważ, że wpisy w .fini_array
są wywoływane w odwrotnej kolejności, więc prawdopodobnie chcesz zacząć pisać od ostatniego.
Aby wykorzystać .fini_array
do uzyskania wiecznej pętli, możesz sprawdzić, co zrobiono tutaj: Jeśli masz co najmniej 2 wpisy w .fini_array
, możesz:
Użyć swojego pierwszego zapisu, aby ponownie wywołać podatną funkcję do dowolnego zapisu
Następnie obliczyć adres powrotu na stosie przechowywany przez __libc_csu_fini
(funkcję, która wywołuje wszystkie funkcje z .fini_array
) i umieścić tam adres __libc_csu_fini
To spowoduje, że __libc_csu_fini
wywoła się ponownie, wykonując funkcje .fini_array
ponownie, co spowoduje wywołanie podatnej funkcji WWW 2 razy: raz dla dowolnego zapisu i jeszcze raz, aby ponownie nadpisać adres powrotu __libc_csu_fini
na stosie, aby ponownie się wywołał.
Zauważ, że przy Full RELRO, sekcja .fini_array
jest ustawiona na tylko do odczytu. W nowszych wersjach, nawet przy [Partial RELRO] sekcja .fini_array
jest również ustawiona na tylko do odczytu.
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)