GDB:打印内存地址的值

Cha*_*ell 5 gdb

根据https://www.ethicalhacker.net/columns/heffner/intro-to- assembly -and-reverse-engineering

mov 0xffffffb4,0x1
Run Code Online (Sandbox Code Playgroud)

将数字 1 移入 0xffffffb4。

所以,我决定自己测试一下。在GDB中,x是打印内存地址值的命令。然而,当我跑步时

x 0x00000000004004fc
Run Code Online (Sandbox Code Playgroud)

我没有得到 133(十进制)或 85(十六进制)的值

相反,我得到的是 0x85f445c7。知道这是什么吗?

me@box:~/c$ gdb -q test
Reading symbols from test...done.
(gdb) l
1       #include <stdio.h>
2
3       int main(){
4               int a = 1;
5               int b = 13;
6               int c = 133;
7               printf("Value of C : %d\n",c);
8               return 0;
9       }
(gdb) b 7
Breakpoint 1 at 0x400503: file test.c, line 7.
(gdb) r
Starting program: /home/me/c/test 

Breakpoint 1, main () at test.c:7
7               printf("Value of C : %d\n",c);
(gdb) 
Run Code Online (Sandbox Code Playgroud)

拆卸

(gdb) disas
Dump of assembler code for function main:
   0x00000000004004e6 <+0>:     push   %rbp
   0x00000000004004e7 <+1>:     mov    %rsp,%rbp
   0x00000000004004ea <+4>:     sub    $0x10,%rsp
   0x00000000004004ee <+8>:     movl   $0x1,-0x4(%rbp)
   0x00000000004004f5 <+15>:    movl   $0xd,-0x8(%rbp)
   0x00000000004004fc <+22>:    movl   $0x85,-0xc(%rbp)
=> 0x0000000000400503 <+29>:    mov    -0xc(%rbp),%eax
   0x0000000000400506 <+32>:    mov    %eax,%esi
   0x0000000000400508 <+34>:    mov    $0x4005a4,%edi
   0x000000000040050d <+39>:    mov    $0x0,%eax
   0x0000000000400512 <+44>:    callq  0x4003c0 <printf@plt>
   0x0000000000400517 <+49>:    mov    $0x0,%eax
   0x000000000040051c <+54>:    leaveq 
   0x000000000040051d <+55>:    retq   
End of assembler dump.
(gdb) x 0x00000000004004fc
0x4004fc <main+22>:     0x85f445c7
(gdb)
Run Code Online (Sandbox Code Playgroud)

mar*_*ruf 6

;DRTL

要打印 GDB 中的值,请使用 print 或(缩写 p)命令。

在你的指挥下

x 0x00000000004004fc

你错过了p命令。您必须xp命令对一起使用才能以十六进制格式打印值,如下所示:

(gdb) p/x 0x00000000004004fc
Run Code Online (Sandbox Code Playgroud)

如果内存地址是指向某个结构的指针,那么您必须在使用指针之前转换内存位置。例如,

struct node {
  int data;
  struct node *next
};
Run Code Online (Sandbox Code Playgroud)

是某个结构,并且您有该结构指针的地址,然后要查看必须使用的该内存位置的内容

(gdb) p *(struct node *) 0x00000000004004fc
Run Code Online (Sandbox Code Playgroud)