2012-04-08 12 views
7

Jeśli uruchomię program C/C++ w gdb (po kompilacji z flagą -g) i sprawdzę adresy pewnych zmiennych, argumentów ... itd., A następnie uruchomię to poza gdb (używając ./) adresy są takie same jak te, które widziałem w gdb? Jeśli są inne, to zazwyczaj są podobne lub będą drastycznie odmienne?Różnica między adresami gdb a "prawdziwymi" adresami?

Pytam o to, ponieważ mam program przepełnienia bufora, który działa idealnie w gdb (z i bez punktów przerwania), jednak gdy próbuję go uruchomić poza gdb, to nie działa.

+4

Jeśli chodzi o przepełnienie bufora, polecam spróbować Valgrind. – Troubadour

+1

Wymuś program na rdzenny zrzut z "ulimit -c unlimited", a następnie sprawdź plik core za pomocą gdb. – strkol

Odpowiedz

7

zbadam adresy niektórych zmiennych argumentów ... itp, a następnie uruchomić go poza gdb (za pomocą ./) będą adresy te są takie same jak te, które widziałem w gdb

To zależy.

zmienne
  1. globalne zdefiniowane w głównym pliku wykonywalnego pozostanie pod tym samym adresem (chyba że wykonywalny jest zbudowany z -fpie i związane z -pie flagami.
  2. zmienne globalne zdefiniowane w innych bibliotekach dzielonych mogą mieć drastycznie różne adresy powodu ASLR.
  3. zmienne lokalne i parametry mogą poruszać się przez kilka K-bajtów powodu ASLR.
  4. Heap przyznane zmienne mogą również drastycznie poruszać wskutek ASLR lub jeśli program jest wielowątkowy.

Należy pamiętać, że GDB w systemie Linux domyślnie wyłącza funkcję ASLR, aby ułatwić debugowanie. Możesz ponownie włączyć ASLR pod GDB z set disable-randomization off. To może pozwolić na odtworzenie problemu w GDB.

mam przepełnienie bufora

Należy również pamiętać, że narzędzia jak Valgrind i Address Sanitizer są często znacznie bardziej skuteczna w znalezieniu przepełnienia bufora niż bieganie pod GDB. Adres Sanitizer w szczególności to great, ponieważ znajduje przepełnienie bufora w globaliach i na stosie (Valgrind nie).

0

Kompilowanie za pomocą flagi -g zwiększa rozmiar kodu podczas wstawiania dodatkowych informacji do pliku wykonywalnego.

Jeśli chodzi o problem z buforem, pomocne byłoby opublikowanie fragmentu kodu, w którym coś jest nie tak.

2

Nigdy nie należy zakładać, że określony kod lub znaki zostaną umieszczone w ustalonym miejscu.

Było to prawdą w przeszłości w większości systemów operacyjnych, ale jest to luka w zabezpieczeniach. złośliwe oprogramowanie używa tego do odmiany programów. System operacyjny będzie starał się szyfrować adresy w celu zwiększenia bezpieczeństwa.

+2

Chciałem właśnie wspomnieć o [randomizacji układu przestrzeni adresowej (ASLR)] (http://en.wikipedia.org/wiki/Address_space_layout_randomization). – Blastfurnace

+0

Można * bezpiecznie * założyć, że w pliku wykonywalnym zależnym od pozycji wszystkie zmienne globalne pozostaną na tym samym stałym adresie, od jednego wykonania do drugiego. –

+1

@ Zatrudniony rosyjski: Nie spodziewałbym się tego. Dlaczego tak myślisz? –

Powiązane problemy