First Fit
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Bir programda glibc kullanarak bellek serbest bıraktığınızda, bellek parçalarını yönetmek için farklı "kutular" kullanılır. İşte iki yaygın senaryonun basitleştirilmiş bir açıklaması: sıralanmamış kutular ve hızlı kutular.
Hızlı bir parça olmayan bir bellek parçasını serbest bıraktığınızda, bu sıralanmamış kutuya gider. Bu kutu, yeni serbest bırakılan parçaların ön tarafa (baş) eklendiği bir liste gibi davranır. Yeni bir bellek parçası talep ettiğinizde, ayırıcı sıralanmamış kutuya arka taraftan (kuyruk) bakarak yeterince büyük bir parça bulur. Eğer sıralanmamış kutudan bir parça, ihtiyacınız olandan büyükse, bu parça bölünür; ön kısmı geri döner ve kalan kısım kutuda kalır.
Örnek:
300 bayt (a
) ayırırsınız, ardından 250 bayt (b
), a
'yı serbest bırakır ve tekrar 250 bayt (c
) talep edersiniz.
a
'yı serbest bıraktığınızda, bu sıralanmamış kutuya gider.
Eğer tekrar 250 bayt talep ederseniz, ayırıcı a
'yı kuyrukta bulur ve onu böler, talebinize uyan kısmı geri döner ve geri kalanını kutuda tutar.
c
, önceki a
'ya işaret edecek ve a
'larla doldurulacaktır.
Fastbins, küçük bellek parçaları için kullanılır. Sıralanmamış kutuların aksine, fastbins yeni parçaları başa ekler ve bu da son giren ilk çıkar (LIFO) davranışı oluşturur. Küçük bir bellek parçası talep ettiğinizde, allocator fastbin'in başından alır.
Örnek:
Dört adet 20 baytlık parça (a
, b
, c
, d
) ayırırsınız.
Bunları herhangi bir sırayla serbest bıraktığınızda, serbest bırakılan parçalar fastbin'in başına eklenir.
Daha sonra 20 baytlık bir parça talep ederseniz, allocator fastbin'in başından en son serbest bırakılan parçayı döndürecektir.
ARM64. Kullanımdan sonra serbest bırakma: Bir kullanıcı nesnesi oluşturun, serbest bırakın, serbest bırakılan parçayı alan bir nesne oluşturun ve buna yazma izni verin, önceki kullanıcı->şifre konumunu üzerine yazarak. Kullanıcıyı yeniden kullanarak şifre kontrolünü atlayın.
Program notlar oluşturulmasına izin verir. Bir not, bir malloc(8) içinde not bilgilerini (çağrılabilecek bir işlevin işaretçisi ile) ve notun içeriği ile başka bir malloc(<boyut>) için bir işaretçi içerecektir.
Saldırı, not bilgisi boyutundan daha büyük malloc içeriklerine sahip 2 not (not0 ve not1) oluşturmak ve ardından bunları serbest bırakmak olacaktır, böylece hızlı kutuya (veya tcache) gireceklerdir.
Ardından, içerik boyutu 8 olan başka bir not (not2) oluşturun. İçerik, parça yeniden kullanılacağı için not1'de olacak, burada işlev işaretçisini kazanan işlevine işaret edecek şekilde değiştirebiliriz ve ardından Kullanımdan Sonra Serbest Bırakma ile not1'i yeni işlev işaretçisini çağırmak için kullanabiliriz.
Bazı bellek ayırmak, istenen değeri yazmak, serbest bırakmak, yeniden ayırmak ve önceki veriler hala orada olduğu için, parçadaki yeni beklenen yapı ile işlenmesi mümkün olacaktır, bu da değeri ayarlayıp bayrağı almayı mümkün kılar.
Bu durumda, belirli bir parçanın içine 4 yazmak gereklidir, bu da ilk tahsis edilen parçadır (hepsini zorla serbest bıraktıktan sonra bile). Her yeni tahsis edilen parçanın dizideki numarası saklanır. Ardından, 4 parça (+ başlangıçta tahsis edilen) ayırın, sonuncusu içinde 4 olacak, bunları serbest bırakın ve ilk parçanın yeniden tahsis edilmesini zorlayın, bu da içinde 4 olan son serbest bırakılan parçayı kullanacaktır.