GDB x / i收到错误的地址

时间:2017-11-13 16:27:42

标签: gdb

#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello world");
    return 0;
}

在运行多个si命令

后,我正在使用GDB调试此程序
gdb-peda$
[----------------------------------registers-----------------------------------]
...
[-------------------------------------code-------------------------------------]
   0x4003ec:    add    BYTE PTR [rax],al
   0x4003ee:    add    BYTE PTR [rax],al
   0x4003f0:    push   QWORD PTR [rip+0x200c12]        # 0x601008
=> 0x4003f6:    jmp    QWORD PTR [rip+0x200c14]        # 0x601010
 | 0x4003fc:    nop    DWORD PTR [rax+0x0]
 | 0x400400 <printf@plt>:   jmp    QWORD PTR [rip+0x200c12]        # 0x601018
 | 0x400406 <printf@plt+6>: push   0x0
 | 0x40040b <printf@plt+11>:    jmp    0x4003f0
 |->   0x7ffff7dee870 <_dl_runtime_resolve_avx>:    push   rbx
       0x7ffff7dee871 <_dl_runtime_resolve_avx+1>:  mov    rbx,rsp
       0x7ffff7dee874 <_dl_runtime_resolve_avx+4>:  and    rsp,0xffffffffffffffe0
       0x7ffff7dee878 <_dl_runtime_resolve_avx+8>:  sub    rsp,0x180
                                                                  JUMP is taken
[------------------------------------stack-------------------------------------]
...
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x00000000004003f6 in ?? ()

当我试图在*0x601010中显示说明时,我收到错误,因为GDB使用了错误的地址(0xfffffffff7dee870),但是,当使用x/g命令时,地址(0x00007ffff7dee870)是正确的。

gdb-peda$ x/4i *0x601010
   0xfffffffff7dee870:  Cannot access memory at address 0xfffffffff7dee870
gdb-peda$ x/g 0x601010
0x601010:   0x00007ffff7dee870
gdb-peda$ x/8xb 0x601010
0x601010:   0x70    0xe8    0xde    0xf7    0xff    0x7f    0x00    0x00
gdb-peda$ x/4i 0x00007ffff7dee870
   0x7ffff7dee870 <_dl_runtime_resolve_avx>:    push   rbx
   0x7ffff7dee871 <_dl_runtime_resolve_avx+1>:  mov    rbx,rsp
   0x7ffff7dee874 <_dl_runtime_resolve_avx+4>:  and    rsp,0xffffffffffffffe0
   0x7ffff7dee878 <_dl_runtime_resolve_avx+8>:  sub    rsp,0x180

有谁可以解释原因?

谢谢!

2 个答案:

答案 0 :(得分:2)

这:x/4i *0x601010相当于x/4i (long) *(int*)0x601010。它从内存位置0xf7dee870加载(截断)整数0x601010,然后将其签名扩展为长0xfffffffff7dee870,然后尝试读取此(伪造)地址的指令。

您想:x/4i *(long*)0x601010x/4i {long*}0x601010

答案 1 :(得分:0)

gdb-peda$ x/4i *0x601010
   0xfffffffff7dee870:  Cannot access memory at address 0xfffffffff7dee870
gdb-peda$ x/g 0x601010
0x601010:   0x00007ffff7dee870

在第一个命令中,您编写*0x601010 - 表示该位置的内存内容。在第二个命令中,省略*,它表明该内存的内容确实是gdb为响应第一个命令而尝试访问的内容。

我认为您可能想要的是x/4i 0x601010,或者disassemble命令。