WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Resmi GNU sitesine göre, __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 onu çağırmasını beklemek veya printf("%10000$c")
çağrısını yapmak mümkündür; bu, libc
'nin bunları yığın içinde tahsis etmesi için çok fazla byte tahsis eder.
One Gadget hakkında daha fazla bilgi için:
One GadgetHooks'un GLIBC >= 2.34 için devre dışı bırakıldığını 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.
Bu, sıralanmamış bir bin saldırısından sonra hızlı bir bin saldırısını kötüye kullanan sayfadaki örneklerden birinde kötüye kullanıldı:
Unsorted Bin AttackBinary'nin sembolleri varsa __free_hook
adresini bulmak mümkündür:
Postta semboller olmadan free hook'un adresini nasıl bulacağınıza dair adım adım bir kılavuz bulabilirsiniz. Özetle, free fonksiyonunda:
Önceki kodda belirtilen kırılmada $eax
içinde free hook'un adresi bulunacaktır.
Şimdi bir fast bin attack gerçekleştiriliyor:
Öncelikle, __free_hook
konumunda 200 boyutunda hızlı parçalar ile çalışmanın mümkün olduğu keşfedildi:
$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ı bin içinde 0xfc*2 = 0x1f8
boyutunda serbest bırakılmış bir parçanın işaretçisini elde ederiz.
Ardından, bu parçadaki edit fonksiyonu çağrılır ve bu hızlı binin fd
adresi önceki __free_hook
fonksiyonuna işaret edecek şekilde değiştirilir.
Sonra, hızlı bin'den önceki işe yaramaz parçayı almak için 0x1f8
boyutunda bir parça oluşturulur, böylece __free_hook
içinde system
fonksiyonunun adresi ile üzerine yazılan 0x1f8
boyutunda başka bir parça oluşturulur.
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 işlevine işaret eder.
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)