【问题标题】:(NASM) How can i set memory value using GDB?(NASM) 如何使用 GDB 设置内存值?
【发布时间】:2020-04-27 22:54:39
【问题描述】:

我有一个简单的 NASM 代码,如下所示。我想将值 43(这是 trx 数组中的 +3 偏移量)设置为值 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

【问题讨论】:

    标签: debugging gdb nasm


    【解决方案1】:

    你几乎拥有它;使用set {char}(0x00000000006000c4+3) = 99

    这里有更详细的解释:

    在 gdb 的set 语句中,= 左侧的表达式可以是便利变量,也可以是寄存器名称,也可以是对应于目标中某个对象的 左值

    左值是具有地址、类型和可赋值的对象。

    0x00000000006000c40x00000000006000c4+3 等文字或计算地址不是左值,但您可以使用 *(type *)(0x00000000006000c4+3){type}(0x00000000006000c4+3) 将其转换为左值。

    Gdb 了解 C 原始类型,以及您正在调试的可执行文件和库在其符号表或调试部分中可能包含的任何类型。在你的情况下,因为你想设置一个字节,你会使用 C 的 char 类型。

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

    【讨论】:

    • (gdb) set {char}(0x00000000006000c4+3) = 99 Cannot access memory at address 0x6000c7
    • 还是不行,先生。我正在从 NASM 调试二进制文件,而不是 C。
    • 我不确定您为什么会收到 Cannot access memory at address 0x6000c7 错误。收到此错误后,x/4b &trx 命令是成功还是失败?
    猜你喜欢
    • 2011-01-03
    • 2013-06-26
    • 1970-01-01
    • 2011-03-19
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    相关资源
    最近更新 更多