c-如何在GDB会话期间访问特定的内存地址



这是一个非常简单的C程序的反汇编(strcpy()是一个常量字符串并打印它(:

No symbol table is loaded.  Use the "file" command.
Reading symbols from string...done.
(gdb) break 6
Breakpoint 1 at 0x6b8: file string.c, line 6.
(gdb) break 7
Breakpoint 2 at 0x6f2: file string.c, line 7.
(gdb) r
Starting program: /home/wsllnx/Detached/string
Breakpoint 1, main () at string.c:6
6               strcpy(buf, "Memento MorintInjected_string");
(gdb) disass main
Dump of assembler code for function main:
0x00005555554006b0 <+0>:     push   %rbp
0x00005555554006b1 <+1>:     mov    %rsp,%rbp
0x00005555554006b4 <+4>:     sub    $0x70,%rsp
0x00005555554006b8 <+8>:     lea    -0x70(%rbp),%rax
0x00005555554006bc <+12>:    movabs $0x206f746e656d654d,%rdx
0x00005555554006c6 <+22>:    mov    %rdx,(%rax)
0x00005555554006c9 <+25>:    movabs $0x6e49090a69726f4d,%rcx
0x00005555554006d3 <+35>:    mov    %rcx,0x8(%rax)
0x00005555554006d7 <+39>:    movabs $0x735f64657463656a,%rsi
0x00005555554006e1 <+49>:    mov    %rsi,0x10(%rax)
0x00005555554006e5 <+53>:    movl   $0x6e697274,0x18(%rax)
0x00005555554006ec <+60>:    movw   $0x67,0x1c(%rax)
0x00005555554006f2 <+66>:    lea    -0x70(%rbp),%rax
0x00005555554006f6 <+70>:    mov    %rax,%rdi
0x00005555554006f9 <+73>:    mov    $0x0,%eax
0x00005555554006fe <+78>:    callq  0x555555400560 <printf@plt>
0x0000555555400703 <+83>:    mov    $0x0,%eax
0x0000555555400708 <+88>:    leaveq
0x0000555555400709 <+89>:    retq
End of assembler dump.
(gdb)

我目前正在学习如何充分使用GBD,我想知道:

  • 如何访问像"0x206f746e656d654d"这样的特定地址?当我尝试使用x/xx/s时,GDB会说:

    '0x206f746e656d654d:     Cannot access memory at address 0x206f746e656d654d'
    

0x6e49090a69726f4d0x735f64657463656a等也是如此…

提前感谢所有有用的答案。

这些实际上不是内存地址。使用64位常量表示ASCII值是一种编译器优化。编译器不是实际调用strcpy(),而是通过寄存器移动字符串常数值。

0x206f746e656d654d是x86小端序格式的字符串"Memento"(带空格(的ASCII值。