Hoe kan ik de geheugeninhoud wijzigen met GDB?

Ik weet dat we verschillende commando’s kunnen gebruiken om het geheugen te openen en te lezen: bijvoorbeeld print, p, x…

Maar hoe kan ik de inhoud van het geheugen op een specifieke locatie wijzigen (tijdens het debuggen in GDB)?


Antwoord 1, autoriteit 100%

Het gemakkelijkste is het instellen van een programmavariabele (zie GDB: toewijzing):

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

Of u kunt een willekeurige (schrijfbare) locatie op adres bijwerken:

(gdb) set {int}0x83040 = 4

Er is meer. Lees de handleiding.


Antwoord 2, autoriteit 25%

Zoals Nikolai heeft gezegd, kunt u het gdb ‘set’-commando gebruiken om de waarde van een variabele te wijzigen.

U kunt ook het ‘set’-commando gebruiken om geheugenlocaties te wijzigen.
bijv. Voortbouwend op Nikolai’s voorbeeld:

(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

Dit zou moeten werken voor elke geldige aanwijzer en kan naar elk geschikt gegevenstype worden gecast.


Antwoord 3, autoriteit 13%

Uitbreiding van de antwoorden die hier worden gegeven.

Je kunt gewoon set idx = 1doen om een ​​variabele in te stellen, maar die syntaxis wordt niet aanbevolen omdat de variabelenaam kan botsen met een set-subcommando. Als voorbeeld zou set w=1niet geldig zijn.

Dit betekent dat u de voorkeur geeft aan de syntaxis: set variable idx = 1of set var idx = 1.

Last but not least, je kunt gewoon je vertrouwde oude printopdracht gebruiken, omdat het een uitdrukking evalueert. Het enige verschil is dat hij ook het resultaat van de uitdrukking afdrukt.

(gdb) p idx = 1
$1 = 1

Je kunt hiermeer lezen over gdb.


Antwoord 4

Een van de handigste dingen is om de waarde van registers rechtstreeks te wijzigen.

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

Om de waarde van rdi register te wijzigen:

set $rdi = 0x8201010

Other episodes