Wie ändere ich Speicherinhalte mit GDB?

Lesezeit: 2 Minuten

Benutzeravatar von bits
Bits

Ich weiß, dass wir mehrere Befehle verwenden können, um auf den Speicher zuzugreifen und ihn zu lesen: zum Beispiel print, p, x …

Aber wie kann ich den Inhalt des Speichers an einer bestimmten Stelle ändern (während des Debuggens in GDB)?

  • Schreiben Sie eine Zeichenfolge in den Speicher: stackoverflow.com/questions/19503057/…

    – Ciro Santilli OurBigBook.com

    10. Juli 2015 um 12:10 Uhr


Benutzeravatar von Nikolai Fetissov
Nikolai Fetissov

Am einfachsten ist es, eine Programmvariable zu setzen (vgl GDB: Zuordnung):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

Oder Sie können einfach einen beliebigen (beschreibbaren) Ort nach Adresse aktualisieren:

(gdb) set {int}0x83040 = 4

Es gibt mehr. Lesen das Handbuch.

  • Ich muss eine Programmvariable setzen, BEVOR ich auf beliebige Speicherorte zugreife? Kann ich nicht gleich den zweiten set-Befehl ausführen?

    – Spidy

    26. September 2012 um 12:44 Uhr

  • Auch, set (str[6]) = 'c' funktioniert, falls Sie ein Array haben, wie char str[]

    – xealits

    24. September 2020 um 13:38 Uhr

  • Ich debugge Assemblercode (arm64). Um 0x1234 an Adresse 0x6000000 zu schreiben, tun set *((unsigned int)0x6000000) = 0x1234

    – Chan-Kim

    7. Dezember 2021 um 4:24 Uhr


Wie Nikolai gesagt hat, können Sie den gdb-Befehl „set“ verwenden, um den Wert einer Variablen zu ändern.

Sie können auch den ‘set’-Befehl verwenden, um die Speicherorte zu ändern. z.B. Erweiterung des Beispiels von Nikolai:

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20

Dies sollte für jeden gültigen Zeiger funktionieren und kann in jeden geeigneten Datentyp umgewandelt werden.

  • set {char[100]}(0x00) = "" Löscht 100 Byte Speicher an Adresse 0x00

    – davenpcj

    21. Oktober 2020 um 22:42 Uhr

Erweitern Sie die hier bereitgestellten Antworten.

Du kannst einfach tun set idx = 1 um eine Variable zu setzen, aber diese Syntax wird nicht empfohlen, da der Variablenname mit einem Set-Unterbefehl kollidieren kann. Als Beispiel set w=1 wäre nicht gültig.

Das bedeutet, dass Sie die Syntax bevorzugen sollten: set variable idx = 1 oder set var idx = 1.

Zu guter Letzt können Sie einfach Ihren bewährten alten Druckbefehl verwenden, da er einen Ausdruck auswertet. Der einzige Unterschied besteht darin, dass er auch das Ergebnis des Ausdrucks druckt.

(gdb) p idx = 1
$1 = 1

Sie können mehr über gdb lesen hier.

Eines der nützlichsten Dinge ist, den Wert von Registern direkt zu ändern.

 0x000000000800088e <+67>:    lea    rdi,[rip+0x118]        # 0x80009ad

So ändern Sie den Wert des RDI-Registers:

 set $rdi = 0x8201010

Speicher schreiben:

(gdb) set *0x20001234 = 0xABABABAB

Lesespeicher:

(gdb) x 0x20001234
0x20001234:     0xabababab

1421220cookie-checkWie ändere ich Speicherinhalte mit GDB?

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

Privacy policy