WWW2Exec - __malloc_hook & __free_hook

Reading time: 4 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

Malloc Hook

Resmi GNU sitesinde belirtildiği gibi, __malloc_hook değişkeni, malloc() çağrıldığında çağrılacak bir fonksiyonun adresine işaret eden bir işaretçidir ve bu adres libc kütüphanesinin veri bölümünde saklanır. Bu nedenle, bu adres bir One Gadget ile üzerine yazılırsa ve malloc çağrılırsa, One Gadget çağrılacaktır.

Malloc'u çağırmak için programın bunu çağırmasını beklemek veya printf("%10000$c") çağrısı yaparak, libc'nin bunları yığın üzerinde tahsis etmesini sağlamak mümkündür.

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

One Gadget

warning

Hooks'un GLIBC >= 2.34 için devre dışı olduğunu unutmayın. Modern GLIBC sürümlerinde kullanılabilecek diğer teknikler vardır. Bakınız: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Bu, sıralanmamış bir kutu saldırısından sonra hızlı bir kutu saldırısını kötüye kullanan sayfadaki örneklerden birinde kötüye kullanıldı:

Unsorted Bin Attack

Binariesinin sembolleri varsa __free_hook adresini bulmak mümkündür:

bash
gef➤  p &__free_hook

Postta semboller olmadan serbest kancanın adresini nasıl bulacağınıza dair adım adım bir kılavuz bulabilirsiniz. Özetle, serbest fonksiyonda:

gef➤  x/20i free
0xf75dedc0 : push   ebx
0xf75dedc1 : call   0xf768f625
0xf75dedc6 : add    ebx,0x14323a
0xf75dedcc :  sub    esp,0x8
0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 :  mov    eax,DWORD PTR [eax]--- BURADA KIRIL
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 

Yukarıdaki kodda belirtilen kırılma noktasında $eax içinde serbest kancanın adresi bulunacaktır.

Şimdi bir fast bin saldırısı gerçekleştirilir:

  • Öncelikle, __free_hook konumunda 200 boyutunda hızlı parçalar ile ç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

  • Eğer bu konumda 0x200 boyutunda bir hızlı parça elde edebilirsek, çalıştırılacak bir fonksiyon işaretçisini yazmak mümkün olacaktır.
  • Bunun için, 0xfc boyutunda yeni bir parça oluşturulur ve birleştirilmiş fonksiyon bu işaretçi ile iki kez çağrılır, bu şekilde hızlı parçadaki 0xfc*2 = 0x1f8 boyutunda serbest bir parçaya işaret eden bir işaretçi elde ederiz.
  • Ardından, bu parçadaki düzenleme fonksiyonu çağrılır ve bu hızlı parçanın fd adresi önceki __free_hook fonksiyonuna işaret edecek şekilde değiştirilir.
  • Sonra, hızlı parçadan önceki işe yaramaz parçayı almak için 0x1f8 boyutunda bir parça oluşturulur, böylece __free_hook içinde bir hızlı parça elde etmek için 0x1f8 boyutunda başka bir parça oluşturulur ve bu parça system fonksiyonunun adresi ile üzerine yazılır.
  • Ve nihayet, /bin/sh\x00 dizesini içeren bir parça silme fonksiyonu çağrılarak serbest bırakılır, bu da __free_hook fonksiyonunu tetikler ve /bin/sh\x00 parametre olarak sistem fonksiyonuna işaret eder.

Referanslar

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