<div><div align="center">Heap Overflows 103.5

Daha önce, bir yığın taşmasını kullanırken pencerelerde yığın korumalarını atlatmak için farklı teknikleri tartışmıştık.

Ancak bugün çok özel bir sürprizim var.

Bugün, başka bir yığın taşma saldırı tekniğini ele almayacağız, bunun yerine bir yığın taşması istismar tekniği kullanarak ?çifte serbest? bir güvenlik açığından nasıl yararlanılacağını öğreneceğiz.

Pek çok insan size çifte serbestliklerin sömürülmesinin çok zor olduğunu söylese de, sizi temin ederim ki bunların çoğu, tipik yığın taşmalarından çok daha kolay sömürülür.

Her zaman birinin bu güvenlik açıklarından nasıl yararlanılabileceğini merak ettim ve bu da beni kritik olarak değerlendirilen birkaç tavsiyeye işaret etti.

Aşağıdakileri içeren bir makine kurmanız gerekecek:

- Yalnızca SP2 / SP3 yüklü Windows XP
? Bağışıklık Hata Ayıklayıcısı
? pyparser
? graphviz
? Bağışıklık hata ayıklayıcı eklenti başlığımın bir kopyası
? Bir c / c ++ compilier (Dev C ++, lcc-32, MS visual C ++ 6.0 (hala alabiliyorsanız))
? Kolay bir betik dili (python kullanıyorum, belki perl kullanabilirsiniz)
? Bir beyin (ve / veya sebat)
? Biraz Assembly, C bilgisi ve bir hata ayıklayıcıda nasıl kazılacağı hakkında bilgi ? Windows yığın yönetimi iç bileşenleri hakkında bazı bilgiler
? ZMaalesef analizim sırasında, Bağışıklık Hata Ayıklayıcı her zaman çalışmadı ve aslında birkaç kez üzerime düştü ama bizi durduramaz;)

Double free nedir?

Pek popüler olmayan owasp wiki?den alınmıştır:

?free () bir bağımsız değişken olarak aynı bellek adresiyle birden fazla çağrıldığında çift serbest hata oluşur.?

Tanımlarına ilişkin son tartışmada, güvenlik açığının aslında bir arabellek taşması olmadığı sonucuna vardım (owasp aksini söylemesine rağmen).

Bir saldırgana aynı belleği iki kez serbest bırakma yeteneği verilirse, bu durumdan öbekte sarkan bir işaretçi yığınını değiştirmek ve belirli saldırılar gerçekleştirmek için **** verilerini bozmak için bunu kullanabilir.

0x24 boyutunda olmayan bir parçanız olduğunu varsayalım.

Ayrıca, lookaside [4] için son girişi double free?den biriyle doldurduğunuzu varsayalım, o zaman ikinci free listeniz FreeList [4] ?e düşecektir.

Bu nedenle, farklı yığın ayırıcılarda depolanan aynı işaretçilerden ikisine sahip olacaksınız.

Bir saldırganın * biraz * (aslında oldukça düşük) determinizm seviyelerine sahip olması durumunda, bu daha önce gördüğümüz çok çeşitli saldırılar sağlayabilir:

Aynı hafızayı bakış tarafına [n] iki kez serbest bırakarak bakış tarafındaki bir parçanın üzerine yazın ve bunlardan birini tahsis edin.

Sonra sarkan işaretçinin liste başlığının üzerine yazın ve bir işlev işaretçisinin üzerine yazmak için kötü amaçlı flink.

Görünüşe ve diğerine FreeList?e bir parça ayırın, böylece serbest listeye girişte flink / blink üzerine yazarsınız. Bunu yaparak şunları yapabilirsiniz:

> Flink?i kötü niyetli bir sahte yığın olarak ayarlayın ve ardından FreeList [0] ?e yeniden eklenmesini sağlayın bölünmüş ve bir yeniden bağlantıdan sonra geri dönmüşse, kalan yığın daha önce eklenecektir sahte flink yığını ve daha sonra sahte parçaları dolduracak, malicous?u işaret etmek için yanıp sönecek flink (Brett Moore ? FreeList [0] Yeniden bağlama saldırısı).

> Flink?i sahte bir parçaya ayarlayın, böylece sahte parçayı iade edersiniz (Brett Moore ? FreeList [0] Arama saldırısı).

> Yanıp sönmeyi bir Bakış listesi girişine veya işlev tablosuna ayarlayın ve yanıp sönmeyi başka bir işlev işaretçisi, böylece ekleme parçasının işaret ettiği adresi kontrol eder.

Bu Lookaside [n] ?de sahte yığınlar oluşturmanıza ve kötü amaçlı flink elde edilir (Brett Moore ? FreeList [0] Saldırı ekle).

> Boyutu farklı olacak şekilde ayarlayın ve girişten ayırın (Görünüm kenarını boşalttıktan sonra) ve üzerine yazılan boyut için bit eşlemi çevirin. (Nicolas Waisman 2008).

Adresi Yığın tabanının kendisinden bir ofset olan bir öbeği doğrudan iade edin, böylece size yönetim yapılarının üzerine yazmak ve kontrolü ele almak için (Nicolas Waisman 2008) FreeList [n] üzerindeki iki parçayı serbest bırakın ve boyutun üzerine yazmak için bunlardan birini ayırın ve flink / blink değerleri (FreeList [n] girişinde yalnız bir yığın olmadığını varsayarak) ve her ikisini de ayarlayın liste giriş adresi olarak flink / yanıp söner.

Boyutu ayırın ve biti çevirecek (FreeListInUse) karşılık gelen boyut için ve bir saldırganın adres, yığın tabanının ofsetidir (Nicolas Waisman 2008

Çifte serbest güvenlik açığından yararlanma örneği

Kodu alıp dev c ++ ?da derleyerek başlayın (not: vtable araması ve işlev çağrısı için satır içi derleme (AT&T) kullanıyorum):

Yakından bakarsanız, uygulamaya özgü işlev işaretçileri kullandığımızı ve aslında vtable?daki bir işlevin üzerine yazacağımızı fark edeceksiniz.

Yürütülebilir dosyayı bir hata ayıklayıcıda açın ve HeapCreate () (0x00401364) çağrısından hemen sonra adres üzerinde bir kesme noktası ayarlayın.

Şu komutu çalıştırmanız gerekecek:

<div style="margin:20px; margin-top:5px"> Kod:
char *b1,*b2,*b3,*b4,*c1,*c2,*c3,*c4,*d1,*d2,*d3;
char *trigger;
long *pHeap;
int i;
DWORD function[20];
DWORD ptr1, ptr2;

**** callback1(){
printf("(+) Executed application callback 1...\n");
}

**** callback2(){
printf("(+) Executed application callback 2...\n");
}

**** callback3(){
printf("(+) Executed application callback 3...\n");
}

**** callback4(){
printf("(+) Executed application callback 4...\n");
}

**** create_vtable(){
int x;
printf("(+) Creating vtable...\n");

(DWORD) function[0] = (DWORD) &callback1;
(DWORD) function[1] = (DWORD) &callback2;
(DWORD) function[3] = (DWORD) &callback3;
(DWORD) function[4] = (DWORD) &callback4;

for(x=5;x