Off by one overflow
Temel Bilgiler
Yalnızca 1B aşımına erişim sağlamak, saldırganın bir sonraki parçanın size
alanını değiştirmesine olanak tanır. Bu, hangi parçaların gerçekten serbest bırakıldığını değiştirmeyi sağlar ve potansiyel olarak başka bir meşru parçayı içeren bir parça oluşturabilir. Sömürü, çift serbest bırakma veya parçaların üst üste binmesiyle benzerdir.
Bir birim aşımı zafiyetinin 2 türü vardır:
Keyfi bayt: Bu tür, o baytı herhangi bir değerle üzerine yazmayı sağlar
Null baytı (off-by-null): Bu tür, o baytı yalnızca 0x00 ile üzerine yazmayı sağlar
Bu zafiyetin yaygın bir örneği,
strlen
vestrcpy
işlevlerinin tutarsız davranışının görüldüğü aşağıdaki kodda görülebilir, bu da bir sonraki parçanın başında 0x00 baytını ayarlamayı mümkün kılar.Bu, House of Einherjar ile sömürülebilir.
Tcache kullanılıyorsa, bu çift serbest bırakma durumuna dönüştürülebilir.
Diğer kontroller arasında, artık bir parça serbest bırakıldığında önceki boyut, metadatadaki parçanın yapılandırılmış boyutuyla karşılaştırılır, bu saldırı 2.28 sürümden itibaren oldukça karmaşık hale getirir.
Kod örneği:
Bu saldırı artık Tcache'lerin kullanımı nedeniyle çalışmıyor.
Ayrıca, daha büyük parçalar kullanarak (bu durumda Tcache'lerin dahil olmadığı) kötüye kullanmaya çalışırsanız, hata alırsınız:
malloc(): invalid next size (unsorted)
Amaç
Bir parçanın başka bir parçanın içinde bulunmasını sağlamak, böylece ikinci parçanın üzerinde yazma erişimi, içerilen parçayı üzerine yazmamıza olanak tanır
Gereksinimler
Boyut metadatası bilgisini değiştirmek için bir fazla bir taşma
Genel off-by-one saldırısı
Üç parça
A
,B
veC
(örneğin boyutları 0x20) tahsis edilir ve üst parçayla birleşmeyi önlemek için başka bir parça tahsis edilir.C
serbest bırakılır (0x20 Tcache serbest listesine eklendi).Parça
A
yıB
üzerine taşır.B
ninsize
alanını 0x21'den 0x41'e değiştirmek için fazla bir taşmayı kötüye kullanın.Şimdi
B
, serbest parçaC
yi içeriyorB
'yi serbest bırakın ve 0x40 parça tahsis edin (buraya tekrar yerleştirilecektir)Hala serbest olan
C
ninfd
işaretçisini değiştirebiliriz (Tcache zehirlenmesi)
Off-by-null saldırısı
Bellekten üç parça (a, b, c) sırayla ayrılır. Ardından ortadaki parça serbest bırakılır. İlk parça fazla bir taşma açığı içerir ve saldırgan bunu 0x00 ile kötüye kullanır (önceki bayt 0x10 ise, ortadaki parçanın gerçekten olduğundan 0x10 daha küçük olduğunu gösterir).
Daha sonra, ortadaki serbest bırakılan parçaya (b) 2 daha küçük parça tahsis edilir, ancak
b + b->size
ifadesi c parçasını güncellemez çünkü işaret edilen adres olması gereken adresten daha küçüktür.Daha sonra, b1 ve c serbest bırakılır.
c - c->prev_size
hala b'yi (şimdi b1) işaret ettiği için, her ikisi de bir parçada birleştirilir. Ancak, b2 hala b1 ve c arasında içindedir.Son olarak, bu bellek alanını geri kazanmak için yeni bir malloc işlemi gerçekleştirilir ve bu aslında b2'yi içerecek şekilde olacaktır, bu da yeni malloc sahibinin b2 içeriğini kontrol etmesine olanak tanır.
Bu resim saldırıyı mükemmel bir şekilde açıklar:
Diğer Örnekler ve Referanslar
strlen
'in bir sonraki parçanınsize
alanını düşünerek bir off-by-one hatası oluşturması.Tcache kullanılıyor, bu nedenle genel off-by-one saldırıları, Tcache zehirlenmesi ile keyfi yazma işlemine izin vermek için çalışır.
Bir off-by-one'ı kötüye kullanarak bir adres sızdırmak mümkündür çünkü bir dizenin sonundaki 0x00 baytı bir sonraki alan tarafından üzerine yazılır.
Keyfi yazma, işaretçiyi başka bir yere işaret etmek için off-by-one yazmayı kötüye kullanarak yapılır ve sahte işaretçilerle sahte bir yapı oluşturulur. Daha sonra, bu yapının işaretçisini takip ederek keyfi yazma elde etmek mümkündür.
Libc adresi sızdırılır çünkü heap, mmap kullanılarak genişletildiğinde, mmap tarafından ayrılan belleğin libc'ten sabit bir ofseti vardır.
Son olarak, keyfi yazma, __free_hook adresine bir tane araçla yazmak için kötüye kullanılır.
Kullanıcı giriş satırlarını okuyan
getline
işlevinde NULL off-by-one bir zafiyet bulunmaktadır. Bu işlev, içeriğin "anahtarını" okumak için kullanılır.5 başlangıç parçası oluşturulur:
parça1 (0x200)
parça2 (0x50)
parça5 (0x68)
parça3 (0x1f8)
parça4 (0xf0)
parça savunması (0x400), üst parçayla birleşmeyi önlemek için
Ardından parça 1, 5 ve 3 serbest bırakılır, böylece:
[ 0x200 Parça 1 (serbest) ] [ 0x50 Parça 2 ] [ 0x68 Parça 5 (serbest) ] [ 0x1f8 Parça 3 (serbest) ] [ 0xf0 Parça 4 ] [ 0x400 Parça savunması ]
[ 0x200 Parça 1 (serbest) ] [ 0x50 Parça 2 ] [ 0x68 Parça 5 (serbest) ] [ 0x1f8 Parça 3 (serbest) ] [ 0xf0 Parça 4 ] [ 0x400 Parça savunması ]
Last updated