hacktricks/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

5.3 KiB
Raw Permalink Blame History

WWW2Exec - .dtors & .fini_array

{% hint style="success" %} AWS Hacking öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}

.dtors

{% hint style="danger" %} Günümüzde bir binary dosyası bulmak çok garip bir durum! {% endhint %}

Yıkıcılar, programın bitişinden önce (ana işlev geri döndükten sonra) çalıştırılan işlevlerdir.
Bu işlevlerin adresleri, binary dosyanın .dtors bölümünde saklanır ve bu nedenle, __DTOR_END__ içine bir shellcode adresi yazmayı başarırsanız, bu, programın sona ermeden önce çalıştırılacaktır.

Bu bölümün adresini şu şekilde alın:

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

Genellikle DTOR işaretçilerini ffffffff ve 00000000 değerleri arasında bulacaksınız. Yani eğer sadece bu değerleri görüyorsanız, bu kayıtlı herhangi bir fonksiyonun olmadığı anlamına gelir. Bu yüzden 00000000 değerini shellcode'ın adresiyle üzerine yazın ve onu çalıştırın.

{% hint style="warning" %} Tabii ki, daha sonra onu çağırmak için shellcode'ı saklamak için bir yer bulmanız gerekiyor. {% endhint %}

.fini_array

Temelde bu, programın bitişinden önce çağrılacak fonksiyonlar içeren bir yapıdır, .dtors gibi. Bu, sadece bir adrese atlayarak shellcode'ınızı çağırabiliyorsanız veya zafiyeti ikinci kez sömürmek için tekrar main'e gitmeniz gereken durumlarda ilginçtir.

objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

Not: Bir .fini_array işlevi çalıştırıldığında bir sonrakine geçer, bu nedenle birkaç kez çalıştırılmaz (sonsuz döngüleri önler), ancak yalnızca buraya yerleştirilen bir işlevin yürütülmesini sağlar.

Not: .fini_array içindeki girişler ters sırayla çağrılır, bu nedenle muhtemelen en sondan yazmaya başlamak istersiniz.

Sonsuz döngü

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

  • İlk yazmanızı zafiyetli keyfi yazma işlevini çağırmak için kullanın
  • Ardından, __libc_csu_fini tarafından depolanan yığında dönüş adresini hesaplayın (tüm .fini_array işlevlerini çağıran işlev) ve oraya __libc_csu_fini adresini koyun
  • Bu, __libc_csu_fini'nin kendisini tekrar çağırmasını sağlayacak ve .fini_array işlevlerini tekrar çalıştıracak, bu da zafiyetli WWW işlevini 2 kez çağıracak: biri için keyfi yazma ve diğeri __libc_csu_fini'nin yığında tekrar dönüş adresini üzerine yazmak için kendisini tekrar çağırmak için.

{% hint style="danger" %} Tam RELRO** ile,** bölüm .fini_array salt okunur hale getirilir. Yeni sürümlerde, [Kısmi RELRO] ile bile bölüm .fini_array salt okunur hale getirilir. {% endhint %}

{% hint style="success" %} AWS Hacking öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

Destek HackTricks
{% endhint %}