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

.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ą:

bash
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.

bash
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