WWW2Exec - .dtors & .fini_array

Reading time: 3 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

.dtors

caution

Günümüzde bir .dtors bölümüne sahip bir ikili bulmak çok garip!

Yıkıcılar, program sona ermeden önce (main fonksiyonu döndükten sonra) çalıştırılan fonksiyonlardır.
Bu fonksiyonların adresleri, ikilinin .dtors bölümünde saklanır ve bu nedenle, eğer __DTOR_END__ adresine bir shellcode yazmayı başarırsanız, bu, program sona ermeden önce çalıştırılacaktır.

Bu bölümün adresini almak için:

bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

Genellikle DTOR işaretlerini ffffffff ve 00000000 değerleri arasında bulursunuz. Yani bu değerleri gördüğünüzde, kayıtlı bir fonksiyon yoktur anlamına gelir. Bu yüzden 00000000 değerini shellcode'un adresine overwrite edin.

warning

Elbette, önce shellcode'u saklayacak bir yer bulmanız gerekiyor, böylece daha sonra çağırabilirsiniz.

.fini_array

Temelde bu, program sona ermeden önce çağrılacak fonksiyonlar ile bir yapıdır, tıpkı .dtors gibi. Bu, shellcode'unuzu sadece bir adrese atlayarak çağırabiliyorsanız veya vulnerabiliteyi ikinci kez istismar etmek için tekrar main'e dönmeniz gereken durumlarda ilginçtir.

bash
objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

Not edin ki .fini_array'den bir fonksiyon çalıştırıldığında bir sonraki fonksiyona geçer, bu nedenle birkaç kez çalıştırılmaz (sonsuz döngüleri önler), ancak burada yer alan fonksiyonun yalnızca 1 çalıştırılmasını sağlar.

.fini_array'deki girişlerin ters sırayla çağrıldığını unutmayın, bu nedenle sonuncusundan yazmaya başlamanız muhtemelen daha iyi olacaktır.

Sonsuz döngü

.fini_array'i kötüye kullanarak bir sonsuz döngü elde etmek için burada ne yapıldığını kontrol edebilirsiniz: Eğer .fini_array'de en az 2 girişiniz varsa, şunları yapabilirsiniz:

  • İlk yazmanızı savunmasız rastgele yazma fonksiyonunu tekrar çağırmak için kullanın
  • Ardından, __libc_csu_fini tarafından saklanan yığın üzerindeki dönüş adresini hesaplayın (tüm .fini_array fonksiyonlarını çağıran fonksiyon) ve oraya __libc_csu_fini'nin adresini koyun
  • Bu, __libc_csu_fini'nin kendisini tekrar çağırmasına neden olacak ve .fini_array fonksiyonlarını tekrar çalıştıracak, bu da savunmasız WWW fonksiyonunu 2 kez çağıracaktır: biri rastgele yazma için ve diğeri de yığında __libc_csu_fini'nin dönüş adresini tekrar yazmak için kendisini tekrar çağırmak üzere.

caution

Full RELRO, bölüm .fini_array salt okunur hale getirilmiştir. Daha yeni sürümlerde, [Partial RELRO] ile bile bölüm .fini_array salt okunur hale getirilmiştir.

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin