hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md

6.8 KiB
Raw Blame History

WWW2Exec - __malloc_hook & __free_hook

{% 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 %}

Malloc Hook

Resmi GNU sitesine göre __malloc_hook değişkeni, malloc() çağrıldığında libc kütüphanesinin veri bölümünde depolanan bir işlevin adresine işaret eden bir işaretçidir. Bu nedenle, bu adres örneğin bir One Gadget ile üzerine yazılırsa ve malloc çağrılırsa, One Gadget çağrılacaktır.

Malloc'ı çağırmak için programın onu çağırmasını beklemek veya printf("%10000$c") çağrısını yaparak libc'in bunları yığında ayırmak için malloc çağırmasını sağlamak mümkündür.

One Gadget hakkında daha fazla bilgi için:

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

{% hint style="warning" %} Kancaların GLIBC >= 2.34 için devre dışı bırakıldığını unutmayın. Modern GLIBC sürümlerinde kullanılabilecek diğer teknikler bulunmaktadır. Bakınız: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md. {% endhint %}

Free Hook

Bu, bir hızlı bin saldırısını kötüye kullanarak bir sıralanmamış bin saldırısını kötüye kullanan sayfadan bir örnekte kötüye kullanılmıştır:

{% content-ref url="../libc-heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}

Eğer ikili dosyada semboller varsa, aşağıdaki komutla __free_hook adresini bulmak mümkündür:

gef➤  p &__free_hook

Post'ta semboller olmadan free hook'un adresini nasıl bulacağınıza dair adım adım bir kılavuz bulabilirsiniz. Özet olarak, free fonksiyonunda:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- BURADA KIR
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

Önceki kodun belirttiği kırılma noktasında $eax içinde free hook'un adresi bulunacaktır.

Şimdi bir hızlı bin saldırısı gerçekleştiriliyor:

  • İlk olarak, __free_hook konumunda 200 boyutunda hızlı parçalarla çalışmanın mümkün olduğu keşfedilir:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • Bu konumda 0x200 boyutunda hızlı bir parça elde edebilirsek, yürütülecek bir fonksiyon işaretçisini üzerine yazmak mümkün olacaktır.
  • Bunun için, boyutu 0xfc olan yeni bir parça oluşturulur ve birleştirilmiş fonksiyon o işaretçiyle iki kez çağrılır, bu şekilde hızlı bir parçanın boyutu 0xfc*2 = 0x1f8 olan bir parçanın işaretçisine ulaşılır.
  • Ardından, bu parçada edit fonksiyonu çağrılır ve bu hızlı parçanın fd adresi önceki __free_hook fonksiyonuna işaret etmek üzere değiştirilir.
  • Daha sonra, hızlı bir parçanın önceki gereksiz parçasını almak için boyutu 0x1f8 olan bir parça oluşturulur, böylece __free_hook'a hızlı bir parça parçası almak için boyutu 0x1f8 olan başka bir parça oluşturulur ve bu parça system fonksiyonunun adresiyle üzerine yazılır.
  • Ve son olarak, /bin/sh\x00 dizesini içeren bir parça silme fonksiyonunu çağırarak serbest bırakılır, __free_hook fonksiyonunu tetikler ve parametre olarak /bin/sh\x00 ile system'e işaret eder.

Referanslar

{% hint style="success" %} AWS Hacking öğrenin ve uygulayın:HackTricks Eğitim AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve uygulayın: HackTricks Eğitim GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin
{% endhint %}