2012-04-08 19 views
7

Wenn ich ein C/C++ - Programm in Gdb (nach dem Kompilieren mit dem Flag -g) und ich untersuche die Adressen bestimmter Variablen, Argumente ... etc, und dann ich es außerhalb von Gdb (mit ./) laufen diese Adressen sind die gleichen wie die, die ich in gdb gesehen habe? Wenn sie anders sind, sind sie normalerweise ähnlich oder werden sie sich drastisch unterscheiden?Unterschied zwischen gdb-Adressen und "echten" Adressen?

Ich frage dies, weil ich ein Pufferüberlaufprogramm habe, das perfekt in gdb funktioniert (mit und ohne Breakpoints), aber wenn ich versuche, es außerhalb von gdb auszuführen, funktioniert es nicht.

+4

In Bezug auf Ihren Pufferüberlauf empfehle ich Ihnen Valgrind versuchen. – Troubadour

+1

Erzwingen Sie das Programm zu Core-Dump mit "ulimit -c unlimited", dann untersuchen Sie die Core-Datei mit Gdb. – strkol

Antwort

7

untersuche ich die Adressen bestimmter Variablen, Argumente ... etc, und dann werde ich führen Sie es außerhalb von GDB (mit ./) diese Adressen die gleichen wie die, die ich in gdb sah

Es kommt darauf an.

  1. Globale Variablen im Hauptprogramm definiert wird an der gleichen Adresse bleiben (es sei denn, die ausführbare Datei mit -fpie und verknüpft mit -pie Fahnen gebaut.
  2. Globale Variablen in anderen gemeinsam genutzten Bibliotheken definiert aufgrund drastisch unterschiedliche Adressen haben ASLR.
  3. Lokale Variablen und Parameter von mehreren K-Bytes bewegen kann aufgrund von ASLR.
  4. Heap zugewiesenen Variablen auch drastisch aufgrund ASLR, oder wenn Ihr Programm ist multi-threaded.
  5. bewegen kann

Beachten Sie, dass GDB unter Linux standardmäßig ASLR deaktiviert, um das Debuggen zu vereinfachen. Sie können ASLR unter GDB mit set disable-randomization off erneut aktivieren. Dadurch können Sie das Problem unter GDB reproduzieren.

Ich habe einen Pufferüberlauf

Beachten Sie auch, dass Tools wie Valgrind und Address Sanitizer sind oft wesentlich effektiver für die Suche nach Pufferüberlauf als unter GDB läuft. Insbesondere die Adresse Sanitizer ist groß in dem es Pufferüberläufe in Globals und auf Stapel findet (Valgrind nicht).

0

Kompilieren mit dem -g Flag erhöht die Code-Größe, wie es in die ausführbare zusätzliche Information stößt.

In Bezug auf Ihr Pufferproblem würde es helfen, ein Codeschnipsel zu veröffentlichen, wo Dinge schief gehen.

2

Sie sollten niemals davon ausgehen, dass sich ein bestimmter Code oder Vars an einem festen Ort befinden.

Dies war in der Vergangenheit in den meisten Betriebssystemen wahr, aber es ist ein Sicherheitsloch. bösartige Software verwendet dies, um Programme zu beeinflussen. OS wird dazu neigen, Adressen zu verwürfeln, um die Sicherheit zu erhöhen.

+2

Ich wollte gerade [Adressraum-Layout-Randomisierung (ASLR)] erwähnen (http://en.wikipedia.org/wiki/Address_space_layout_randomization). – Blastfurnace

+0

Man kann * sicher * davon ausgehen, dass in einer positionsabhängigen ausführbaren Datei alle globalen Variablen von einer Ausführung zur anderen an derselben festen Adresse bleiben. –

+1

@ Angestellter Russisch: Das würde ich nicht erwarten. Warum denkst du das? –