WWW2Exec - .dtors & .fini_array
Reading time: 3 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
.dtors
caution
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, a zatem, 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ą:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
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ć.
warning
Oczywiście, najpierw musisz znaleźć miejsce na przechowanie shellcode, aby później móc go wywołać.
.fini_array
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.
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
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.
Wieczna pętla
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ć.
caution
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.
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.