2012-01-23 17 views
5

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

+0

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. –

cevap

5

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.

+0

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

1

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.