(NASM) Как я могу установить значение памяти, используя GDB? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть простой код NASM, как показано ниже. Я хочу установить значение 43 (которое является смещением +3 в массиве trx) на значение 99.

section .data
    trx db 25,21,17,43

section .text
    global _start

_start:
    mov [trx+3], byte 99

last:
    mov rax, 60
    mov rdi, 0
    syscall

Когда я отлаживаю и функция _start пройдена, это работает. Значение 43 изменено на 99.

(gdb) i var
All defined variables:

Non-debugging symbols:
0x00000000006000c4  trx
0x00000000006000c8  __bss_start
0x00000000006000c8  _edata
0x00000000006000c8  _end
(gdb) x/4b &trx
0x6000c4:   25  21  17  43
(gdb) break _start
Breakpoint 1 at 0x4000b0
(gdb) run
Starting program: /home/hexdemsion/Desktop/asm/exec 

Breakpoint 1, 0x00000000004000b0 in _start ()
(gdb) stepi
0x00000000004000b8 in last ()
(gdb) x/4b &trx
0x6000c4:   25  21  17  99

Теперь, как я могу установить это значение непосредственно в GDB? Я пробовал эту команду в GDB, но все еще не работает.

(gdb) set 0x00000000006000c4+3 = 99
Left operand of assignment is not an lvalue.
(gdb) set {int}0x00000000006000c4+3 = 99
Left operand of assignment is not an lvalue.
(gdb) set {b}0x00000000006000c4+3 = 99
No symbol table is loaded.  Use the "file" command.

Кроме того, я не предоставляю отладочную информацию во время сборки.

nasm -f elf64 -o obj.o source.asm; ld -o exec obj.o

1 Ответ

0 голосов
/ 28 апреля 2020

У тебя почти было это; используйте set {char}(0x00000000006000c4+3) = 99.

Вот более подробное объяснение:

В операторе GDB set выражение слева от = может быть вспомогательной переменной или именем регистра или lvalue , соответствующий какому-либо объекту в цели.

lvalue - это объект, который имеет адрес, тип и может быть назначен.

Литерал или вычисляемый адрес, такой как 0x00000000006000c4 или 0x00000000006000c4+3, не является lvalue, но вы можете привести его к lvalue, используя *(type *)(0x00000000006000c4+3) или {type}(0x00000000006000c4+3).

Gdb знает о C примитивных типах, плюс любые типы исполняемого файла и библиотек, которые вы отлаживаете, могут содержаться в их таблицах символов или разделах отладки В вашем случае, так как вы хотите установить байт, вы будете использовать C s char type.

(gdb) x/4b &trx
0x6000c4:   25  21  17  43
(gdb) set {char}(0x00000000006000c4+3) = 99
(gdb) x/4b &trx
0x6000c4:   25  21  17  99
...