Wie finde ich die Adresse einer Zeichenfolge im Speicher mit GDB?

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer826353

Ich möchte die Adresse einer Zeichenfolge im Speicher finden. In diesem Fall suche ich nach “/bin/sh”. Es ist eine initialisierte Variable, also im Abschnitt .data und nach der Kompilierung hat es eine feste Adresse. Was mache ich also in GDB, um seine Speicheradresse herauszufinden? Und ich kenne den Namen der Variable nicht, in der sie gespeichert ist.

  • Sehr verwandt. Viele “doppelte Antworten”, unterschiedliche Frage.

    – Benutzer202729

    24. Juni 2018 um 5:26 Uhr

Verwenden info proc map klingt für mich nach einem besseren Ansatz.

(gdb) info proc map
process 930
Mapped address spaces:

      Start Addr           End Addr       Size     Offset objfile
        0x400000           0x401000     0x1000        0x0 /myapp
        0x600000           0x601000     0x1000        0x0 /myapp
        0x601000           0x602000     0x1000     0x1000 /myapp
  0x7ffff7a1c000     0x7ffff7bd2000   0x1b6000        0x0 /usr/lib64/libc-2.17.so
  0x7ffff7bd2000     0x7ffff7dd2000   0x200000   0x1b6000 /usr/lib64/libc-2.17.so
  0x7ffff7dd2000     0x7ffff7dd6000     0x4000   0x1b6000 /usr/lib64/libc-2.17.so
  0x7ffff7dd6000     0x7ffff7dd8000     0x2000   0x1ba000 /usr/lib64/libc-2.17.so

(gdb) find 0x7ffff7a1c000,0x7ffff7bd2000,"/bin/sh"
0x7ffff7b98489
1 pattern found.
(gdb) x /s 0x7ffff7b98489
0x7ffff7b98489: "/bin/sh"
(gdb) x /xg 0x7ffff7b98489
0x7ffff7b98489: 0x0068732f6e69622f

  • Das ist seltsam, Adressen, nach denen Sie suchen, gehören zu libc. Sollte die Zeichenfolge nicht in dem Bereich liegen, der zu gehört myapp ausführbar, also 0x400000..0x602000?

    – Hallo Engel

    23. Juli 2020 um 9:05 Uhr

Benutzer-Avatar
Karim Manauil

Wenn Sie im gesamten Adressraum des Prozesses suchen möchten, müssen Sie die Speicherzuordnung für Ihren Prozess abrufen und die Startadresse und die Endadresse mit dem Befehl find in gdb verwenden.

zum Beispiel, wenn cat /proc/$PID/maps zeigt, dass der virtuelle Speicher Ihres Prozesses von 0x08048000 bis 0xc0000000 reicht, können Sie wie folgt suchen:

(gdb) find 0x80048000, 0xc0000000, "/bin/sh"

Eine andere Möglichkeit, die Speicherzuordnung Ihres Prozesses zu erhalten, ist die Verwendung des eingebetteten Befehls von gdb:

(gdb) info proc map

  • Sie können sich auf (sourceware.org/gdb/onlinedocs/gdb/Searching-Memory.html) für weitere Details zur Verwendung des Befehls find auf gdb.

    – Karim Manauil

    11. Juli 2016 um 2:31 Uhr


  • Innen gdb verwenden shell cat ... (type für Windows). Verwenden Sie dies auch, um die PID zu erhalten. Oder verwenden Sie die andere Antwort unten, die die Shell nicht betrifft.

    – Benutzer202729

    24. Juni 2018 um 5:24 Uhr

Benutzer-Avatar
Präsident James K. Polk

Verwenden Sie die finden Befehl.

find [/sn] start_addr, +len, val1 [, val2, …]
find [/sn] start_addr, end_addr, val1 [, val2, …]

Durchsucht den Speicher nach der Folge von Bytes, die durch val1, val2 usw. angegeben sind. Die Suche beginnt bei der Adresse start_addr und wird entweder für len Bytes oder bis einschließlich end_addr fortgesetzt. s und n sind optionale Parameter. Sie können in beliebiger Reihenfolge einzeln oder zusammen angegeben werden.

s, Suchabfragegröße Die Größe jedes Suchabfragewerts.

b Byte

h Halbwörter (zwei Bytes)

w Wörter (vier Bytes)

g Riesenwörter (acht Bytes)

Alle Werte werden in der aktuellen Sprache interpretiert. Das bedeutet zum Beispiel, dass wenn die aktuelle Quellsprache C/C++ ist, die Suche nach der Zeichenkette „Hallo“ das nachgestellte „\0“ enthält.

Wenn die Wertgröße nicht angegeben ist, wird sie vom Typ des Werts in der aktuellen Sprache übernommen. Dies ist nützlich, wenn man das Suchmuster als eine Mischung von Typen angeben möchte. Beachten Sie, dass dies beispielsweise bedeutet, dass im Fall von C-ähnlichen Sprachen eine Suche nach einem nicht typisierten 0x42 nach ‘(int) 0x42’ sucht, was typischerweise vier Bytes ist.

n, maximale Anzahl der Funde Die maximale Anzahl der zu druckenden Übereinstimmungen. Standardmäßig werden alle Funde gedruckt.

Sie können Zeichenfolgen als Suchwerte verwenden. Setzen Sie sie in doppelte Anführungszeichen (“). Der Zeichenfolgenwert wird Byte für Byte in das Suchmuster kopiert, unabhängig von der Endianness des Ziels und der Größenangabe.

Die Adresse jeder gefundenen Übereinstimmung wird gedruckt sowie eine Zählung der Anzahl der gefundenen Übereinstimmungen.

Die Adresse des zuletzt gefundenen Wertes wird in der Komfortvariable ‘$_’ gespeichert. Eine Zählung der Anzahl der Übereinstimmungen wird in ‘$numfound’ gespeichert.

1283120cookie-checkWie finde ich die Adresse einer Zeichenfolge im Speicher mit GDB?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy