5.8 KiB
WWW2Exec - __malloc_hook & __free_hook
AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na(https://github.com/sponsors/carlospolop) göz atın!
- Resmi PEASS & HackTricks ürünlerini alın
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuzu keşfedin
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live** takip edin**.
- Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
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 çağrılabilir, bu da çok fazla bayt ayırarak libc
'nin bunları yığında ayırmasını sağlar.
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 kullandıktan sonra bir sıralanmamış bin saldırısını kötüye kullanan sayfadan bir örnekte kötüye kullanıldı:
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
Eğer ikili sembolleri olan bir ikili 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 rehber 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 boyutu0xfc*2 = 0x1f8
olan bir serbest bırakılmış parçanın işaretçisine ulaşılır hızlı binde. - Ardından, bu parçada edit fonksiyonu çağrılır ve bu hızlı binin
fd
adresi önceki__free_hook
fonksiyonuna işaret etmek üzere değiştirilir. - Daha sonra, hızlı bindeki önceki gereksiz parçayı almak için boyutu
0x1f8
olan bir parça oluşturulur, böylece__free_hook
içinde bir hızlı bin parçası alınır vesystem
fonksiyonunun adresiyle üzerine yazılır. - Ve son olarak,
/bin/sh\x00
dizesini içeren bir parça silinerek delete fonksiyonu çağrılır,__free_hook
fonksiyonu tetiklenir ve/bin/sh\x00
parametre olarak system fonksiyonuna işaret eder.