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
Odpowiedz
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.
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
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.
- 1. Dlaczego zmienia się identyfikator wdrożenia Google OpenID?
- 2. Visual Studio 2010 ciągle zmienia domyślną przeglądarkę.
- 3. Jak mogę się dowiedzieć, dlaczego vim ciągle zmienia moje ustawienie expandtab?
- 4. Matplotlib narysowanie pojedynczej linii, która ciągle zmienia kolor
- 5. Dlaczego adres zmiennej lokalnej zmienia się podczas wykonywania wiele razy, ale nie podczas debugowania go za pomocą GDB?
- 6. adres C adresu zmiennej
- 7. Dlaczego odchylenie wejścia zakresu nie zmienia się?
- 8. Dlaczego wskaźnik zmienia się podczas przejścia funkcji?
- 9. Dlaczego moja UILabel się nie zmienia?
- 10. Dlaczego rozmiar czcionki się nie zmienia?
- 11. Mysql innoDB ciągle się zawiesza
- 12. Railsy: Dlaczego niestandardowy adres url zmienia się po wywołaniu `render 'new'`?
- 13. Jak porównać dwa ciągi JSON gdy kolejność zgłoszeń ciągle się zmienia
- 14. Nginx z Inspektorem ciągle się zmienia stan b/w bieganie i uruchamianie
- 15. Jak zatrzymać kątowa przeładować gdy adres zmienia
- 16. Dlaczego DOM zmienia kodowanie?
- 17. Dlaczego właściwość NSString zmienia się na nieprawidłową wartość?
- 18. Powiązanie jednostki danych rdzenia nie zapisuje się między uruchomieniami
- 19. Dlaczego git pull pokazuje ciągle nowe gałęzie?
- 20. Django AUTH_PROFILE_MODULE zmienia adres URL logowania?
- 21. Zobacz, jak zmienia się python
- 22. drukuj adres pamięci zmiennej Python
- 23. Java zmienia wartość zmiennej za pomocą metody?
- 24. Inicjatory RealmSwift - naprawa Xcode - ciągle się mylą
- 25. Adres tablicy - różnica pomiędzy mającą ampersanda i nie ampersanda
- 26. python: dlaczego random.shuffle zmienia tablicę
- 27. dlaczego mój cały indeks zmienia się w moim projekcie git
- 28. Dlaczego przesyłanie Javascript wielkości porcji zmienia się w przeglądarce?
- 29. W Groovy, dlaczego zachowanie "==" zmienia się dla interfejsów rozszerzających porównywalne?
- 30. Dlaczego rozmiar etykiety zmienia się w pliku zasobów?
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. –