Sanırım bunun bir geçmişi var, ama yığın neden aşağıya doğru büyüyor?
Bana göre tampon taşması , yığın yukarı doğru büyürse, sömürülmesi çok daha zor olacak gibi görünüyor ...
Sanırım bunun bir geçmişi var, ama yığın neden aşağıya doğru büyüyor?
Bana göre tampon taşması , yığın yukarı doğru büyürse, sömürülmesi çok daha zor olacak gibi görünüyor ...
Yanıtlar:
Ben inanıyorum bellek çok sınırlı iken, hesaplama ilk günlerden itibaren gelir ve o yığının tarafından özel kullanım için bellek önceden tahsis Büyük bir bölümü akıllıca değildi. Öyleyse, yığın belleği adresinden sıfır yukarı doğru atayarak ve belleği sondan itibaren bellek yığınını aşağıya atayarak, hem yığın hem de yığının aynı bellek alanını paylaşmasını sağlayabilirsiniz.
Biraz daha fazla yığına ihtiyaç duyarsanız, yığın kullanımınıza dikkat edebilirsiniz; Daha fazla yığına ihtiyacınız varsa, bir miktar yığın bellek boşaltmayı deneyebilirsiniz. Sonuçta, yığın çoğunlukla yığının üstüne ya da tam tersine üzerine yazacağından, çoğunlukla çarpıcı çökmeler oldu.
O günlerde interwebz yoktu, bu yüzden arabellek taşması sömürüleri sorunu yoktu. (Ya da en azından interwebz var olduğu sürece, hepsi birleşik devletler savunma bakanlığının yüksek güvenlik tesislerinde idi, bu yüzden kötü niyetli veri olasılığının fazla düşünülmesine gerek yoktu.)
Ondan sonra, çoğu mimaride, aynı mimarinin önceki sürümleriyle uyumluluğu korumak önemliydi. Bu yüzden ters başlıklar bugün hala yanımızda.
program hafızası geleneksel olarak
code
constants
heap (growing up)
...
stack (growing down)
yığın ve yığın değiştirilebilir
ancak yığın diğer yöne giderse arabellek taşması yine de kullanılabilir.
klasiği strcpy
örnek alarak
foo(char* in){
char[100] buff;
strcpy(buff,in);
}
yığın hafızalı olarak
ret foo
arg in
buff array
ret strcpy
buf pointer
in
Bu, kopyalama yapıldığında, dönüş adresinin strcpy
arabellekten sonra olduğu ( foo
dönüş adresi yerine ) olduğu ve içinde ne olduğu ile yazılabileceği anlamına gelir.in
Bazı donanımlar, yüksek bellekle başlayan yığın büyürken, yığın düşük bellekle büyürken başlar.
HP'nin PA-RISC donanımı, diğerleri arasında bunu yapar: http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php
Saygın Multics İşletim Sistemi büyümekte olan (muhtemelen çoğundan biri) yığınları olan donanımlara dayanıyordu: bkz. Http://www.acsac.org/2002/papers/classic-multics.pdf , bölüm 2.3.2'nin sonu:
Üçüncüsü, Multics işlemcilerindeki yığınlar negatif yönden ziyade pozitif yönde büyüdü. Bu, aslında bir arabellek taşması gerçekleştirirseniz, kendi geri dönüş işaretçiniz yerine kullanılmayan yığın çerçevelerin üzerine yazmanız ve sömürüyü çok daha zorlaştırmanız anlamına geliyordu.
Bu oldukça ilginç bir ifade. Arabellek taşması yalnızca "geleneksel" yordam çağrısı-yığın-çerçeve düzenlemesi nedeniyle bu kadar büyük bir sorun mu oldu? Ayrıca, Multics'in Tamamen Yenilmez olarak ününün ne kadarı sadece donanım tasarımının bir şansıydı?