2012-01-23 13 views
5

Zrobiłem dwa programy C, które były dokładną kopią siebie. Skompilowałem je na platformie Linux (Ubuntu 10.04) używając kompilatora gcc i otrzymałem dwa oddzielne pliki wykonywalne. Następnie otrzymałem zespół kod zarówno plików wykonywalnych za pomocą objdump i stwierdził, że kod zespołu był dokładnie taki sam, a nawet adres odpowiednich instrukcji w dwóch plików zespołu był taki sam. Program miał wydrukować adres zmiennej w nim. Programy po uruchomieniu produkują inny adres a ponadto ten sam program tworzy inny adres, gdy jest uruchamiany za każdym razem.Dlaczego adres linii kodu jest taki sam w obu programach, ale adres zmiennych zmian nawet dla tego samego programu przy każdym uruchomieniu.Myślę, że adres wydrukowany zmiennej na ekran jest adresem wirtualnym, ale jeśli jest wirtualny, to za każdym razem nie może być taki sam. Jest to adres pokazany w kodzie zespołu uzyskanym przez objd ump jest również wirtualny?Dlaczego adres zmiennej ciągle się zmienia pomiędzy uruchomieniami

+0

Prawie wszystkie widoczne adresy są wirtualne w nowoczesnych procesorach + systemach operacyjnych. Ponadto adres nie musi być taki sam, ponieważ nie ma takiego wymogu w większości języków programowania. –

Odpowiedz

5

Jest to spowodowane address space layout randomization.

Cytując Wikipedię:

Adres układ przestrzeń randomizacji (ASLR) to metoda bezpieczeństwa komputerowego, który obejmuje losowo organizowanie stanowisk kluczowych obszarów danych, zwykle w tym podstawy wykonywalnego i położenia bibliotek, hałdy i stos w przestrzeni adresowej procesu.

Korzyści

Przestrzeń adresowa randomizacji utrudnia niektóre rodzaje ataków bezpieczeństwa poprzez uczynienie go bardziej trudne do przewidzenia atakującemu adresów docelowych. Na przykład, osoby atakujące próbujące wykonać ataki typu return-to-libc muszą zlokalizować kod do wykonania, podczas gdy inni atakujący, którzy próbują wykonać kod powłoki wstrzyknięty na stos, muszą najpierw znaleźć stos. W obu przypadkach powiązane adresy pamięci są ukryte przed atakującymi. Wartości te muszą zostać odgadnięte, a błędne przypuszczenie zwykle nie jest możliwe do naprawienia z powodu awarii aplikacji.

Na przykład, kiedy wielokrotnie uruchomić ten sam plik wykonywalny wytworzonej z następującego kodu C na moim Ubuntu 10.10 pudełka:

#include <stdio.h> 

int g = 0; 

int main() { 
    int x = 0; 
    printf("%p %p\n", &x, &g); 
} 

Adres zmiennej lokalnej (x) wciąż się zmienia, ale adres zmiennej globalnej (g) pozostaje bez zmian.

+0

Czy możesz wyjaśnić, dlaczego adres zmiennej globalnej pozostaje taki sam? Kiedy losowo zmieniamy adresy kluczowych obszarów danych. Zmieniłoby to również zakres adresów sekcji "danych" w pamięci wirtualnej procesu - która zawiera tę zmienną globalną. – user3834119

1

Tak, zawsze otrzymasz zmienioną wartość w zmiennej Adres. dzieje się tak dlatego, że gdy programujesz wchodzenie w tryb działania, kiedy wykonujesz instrukcje deklaracji zmiennych, za każdym razem kontroler tworzy zmienne oparte na dostępnych lokalizacjach pamięci. Jest to jedyny powód, dla którego za każdym razem zwraca inną wartość adresu.

Powiązane problemy