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)?
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)?
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
Schreiben Sie eine Zeichenfolge in den Speicher: stackoverflow.com/questions/19503057/…
– Ciro Santilli OurBigBook.com
10. Juli 2015 um 12:10 Uhr