hacktricks/binary-exploitation/heap/use-after-free/first-fit.md

5.8 KiB
Raw Blame History

İlk Uygun

Sıfırdan kahraman olacak şekilde AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

İlk Uygun

Bir programda glibc kullanarak belleği 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.

Sıralanmamış Kutular

Hızlı bir parça olmayan bir bellek parçasını serbest bıraktığınızda, bu parça sıralanmamış kutuya gider. Bu kutu, yeni serbest bırakılan parçaların önüne (başa) eklenen bir liste gibi davranır. Yeni bir bellek parçası istediğinizde, tahsisatçı, istediğinizden yeterince büyük bir parça bulmak için sıralanmamış kutuya arkadan (kuyruk) bakar. Eğer sıralanmamış kutudan bir parça isteğinizden büyükse, bölünür; ön kısmı geri döndürülür ve geri kalan kısım kutuda kalır.

Örnek:

  • 300 bayt (a) tahsis edersiniz, ardından 250 bayt (b) tahsis edersiniz, a'yı serbest bırakırsınız ve tekrar 250 bayt (c) istersiniz.
  • a'yı serbest bıraktığınızda, sıralanmamış kutuya gider.
  • Sonra 250 bayt daha isterseniz, tahsisatçı a'yı kuyrukta bulur ve bölerek, isteğinize uygun olan kısmı geri döndürür ve geri kalanı kutuda tutar.
  • c, önceki a'ya işaret edecek ve a'ların içeriğiyle dolacak.
char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

Fastbins

Fastbins küçük bellek parçaları için kullanılır. Sıralanmamış kovaların aksine, fastbins yeni parçaları başa ekler ve son giren-ilk çıkan (LIFO) davranışı oluşturur. Eğer küçük bir bellek parçası isterseniz, ayırıcı fastbin'in başından alacaktır.

Örnek:

  • 20 baytlık dört parça (a, b, c, d) ayırırsınız.
  • Onları herhangi bir sırayla serbest bıraktığınızda, serbest bırakılan parçalar fastbin'in başına eklenir.
  • Sonra 20 baytlık bir parça isterseniz, ayırıcı en son serbest bırakılan parçayı fastbin'in başından döndürecektir.
char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

Diğer Referanslar ve Örnekler

  • https://heap-exploitation.dhavalkapil.com/attacks/first_fit
  • https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/
  • ARM64. Use after free: Bir kullanıcı nesnesi oluştur, serbest bırak, serbest bırakılan parçayı alan bir nesne oluştur ve ona yazma izni ver, önceki kullanıcı->şifre konumunu üzerine yaz. Kullanıcıyı tekrar kullanarak şifre kontrolünü atla
  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example
  • Program notlar oluşturmaya izin verir. Bir not, not bilgisini içeren malloc(8) (çağrılabilen bir işlevin işaretçisiyle) ve notun içeriğini içeren başka bir malloc(<boyut>) işaretçisine sahip olacaktır.
  • Saldırı, not bilgi boyutundan daha büyük malloc içeriğine sahip 2 not (not0 ve not1) oluşturmak ve ardından bunları serbest bırakarak hızlı bin (veya tcache) içine almaktır.
  • Sonra, içerik boyutu 8 olan başka bir not (not2) oluşturun. İçerik, parçanın yeniden kullanılacağı not1'de olacak, burada işlev işaretçisini win işlevine yönlendirebilir ve ardından not1'i Use-After-Free yaparak yeni işlev işaretçisini çağırabilirsiniz.
  • https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html
  • Bazı bellek ayırmak, istenen değeri yazmak, serbest bırakmak, yeniden boyutlandırmak mümkündür ve önceki veriler hala orada olduğundan, parçadaki yeni beklenen yapıya göre işlem görecektir, bu da değeri ayarlamayı veya bayrağı almayı mümkün kılar.
  • https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html
  • Bu durumda, belirli bir parçanın içine 4 yazmak gereklidir, bu ilk ayrılan parçadır (hepsini zorla serbest bıraktıktan sonra bile). Her yeni ayrılan parçada, dizin içindeki numarası saklanır. Sonra, 4 parça (+ başlangıçta ayrılan) tahsis edin, sonuncusu içinde 4 bulunacak, onları serbest bırakın ve ilk parçanın yeniden tahsisini zorlayın, bu da içinde 4 olan son parçayı kullanacaktır.