arasında değişmeye devam ediyor Birbirlerinin tam kopyası olan iki C programı hazırladım. Linux platformunda (Ubuntu 10.04) gcc derleyicisini kullanarak sıkıştırdım ve iki ayrı çalıştırılabilir dosya aldım. Daha sonra derlemeyi aldım her iki çalıştırılabilir kodun objdump kullanarak kodu ve derleme kodunun tam olarak aynı olduğunu ve hatta iki montaj dosyasında karşılık gelen talimatların adresinin aynı olduğunu tespit etti.Program, içindeki bir değişkenin adresini yazdırmaktı. Çalıştırıldığında programlar farklı adres üretiyor ve aynı program her zaman çalıştırırken farklı bir adres üretir. Kod çizgilerinin iki adresi aynı programda aynıdır, ancak her defasında aynı program için bile değişkenin adresi değişir. ekran sanal adres, ancak sanal nedense her zaman aynı olamaz. yumru da sanal mı?Neden değişkenin adresi
cevap
address space layout randomization nedeniyle.
Adres alanı düzeni rasgele seçim (ASLR) rastgele genellikle yürütülebilir tabanında ve kütüphaneler pozisyonunda, yığın dahil anahtar veri alanlarının konumlarını düzenlenmesi içeren bir bilgisayar güvenlik yöntemidir:
Wikipedia alıntı yapacak ve bir işlemin adres alanında yığın.Faydaları
Adres uzay randomizasyon daha zor bir saldırganın hedef adreslerini tahmin etmek için yaparak güvenlik saldırılarından bazı türlerini engelliyor. Örneğin, librole geri dönüş saldırılarını yürütmeye çalışan saldırganlar, çalıştırılacak kodu bulmalı, diğer saldırganlar yığında enjekte edilen kabuk kodlarını çalıştırmaya çalışırken, önce yığını bulmak zorundadır. Her iki durumda da, ilgili hafıza adresleri saldırganlardan gizlenmiştir. Bu değerler tahmin edilmeli ve uygulama çökmesi nedeniyle yanlış tahmin genellikle kurtarılamaz. Örneğin
, ben defalarca benim Ubuntu 10.10 kutuyu aşağıdaki C kodundan üretilen aynı yürütülebilir çalıştırdığınızda:
#include <stdio.h>
int g = 0;
int main() {
int x = 0;
printf("%p %p\n", &x, &g);
}
yerel değişkenin adresi (x
) sürekli değişiyor, ama adrese Global değişken (g
) aynı kalır.
Küresel değişkenin adresinin neden aynı kaldığını açıklayabilir misiniz? Anahtar veri alanlarının adreslerini rasgele değiştirdiğimizde. Bu aynı zamanda, bu global değişkeni içeren işlemin sanal belleğindeki "veri" bölümünün adres aralığını da değiştirir. – user3834119
Evet, her zaman Adres değişkeninde değiştirilen değeri alırsınız. Bunun nedeni, çalışma modunda geldiğinizde, değişken bildirim deyimlerini yürüttüğünüzde, her zaman denetleyici, kullanılabilir bellek konumlarına göre değişkenler oluşturur. Bu tek sebep, her defasında adres için farklı değer döndürüyor.
- 1. Her bir cpu değişkenin adresi
- 2. Birden çok '&' eklediğimde neden bir değişkenin adresi değişiyor?
- 3. C++ operatörsüz değişkenin adresini alın &
- 4. Firefox neden değişkenin değerini unutuyor? Hata ayıklama çözümü
- 5. Bir değişkenin tanımı neden C++ 11'in gelişimi sırasında değişti?
- 6. Golang derleyici neden değişkenin bildirildiğini düşünür, ancak kullanılmaz?
- 7. Resmi, adresi
- 8. Etiketlerin Adresi (MSVC)
- 9. Neden bir dizi öğesinin adresi bazen bir bildirim için yanılıyor?
- 10. Bu bellek adresi neden rasgele bir değere sahip?
- 11. Bunu kullanırken bir döngü değişkeninin adresi neden değişiyor?
- 12. Uygulamamdaki HTTP adresi Neden Taşımacılık Güvenliği tarafından engellendi?
- 13. TARGET_ARCH değişkenin amacı Makefile
- 14. İki değişkenin Maple Entegrasyonu
- 15. BSSID vs MAC adresi?
- 16. Raphael.js için URL adresi
- 17. İstemci IP adresi
- 18. IP Adresi sk_buff dan
- 19. Mac Adresi formatı
- 20. Yerel posta adresi alınamadı
- 21. Tomcat WAR uzak adresi
- 22. Silverlight IP adresi
- 23. Genymotion IP adresi alamıyorum
- 24. Kullanıcının IP Adresi .net?
- 25. IP adresi ':: 1' nedir?
- 26. IP adresi dizesini Python
- 27. değişen sayfa adresi biçimi
- 28. Aynı değişkenin birden çok örneği
- 29. Bir değişkenin türünü alın ve
- 30. lldb: Bir değişkenin adresini yazdırma
Modern CPU'ların + İşletim Sistemlerinde hemen hemen tüm görünür adresler sanaldır. Ayrıca, adresin aynı olması gerekmez, çünkü çoğu programlama dilinde böyle bir gereksinim yoktur. –