GCC / G ++地址并且无法读取寄存器

时间:2017-11-10 14:27:46

标签: c++ c gcc gdb g++

Dump of assembler code for function main():
   0x000000000000071a <+0>: push   rbp
   0x000000000000071b <+1>: mov    rbp,rsp
   0x000000000000071e <+4>: sub    rsp,0x20
   0x0000000000000722 <+8>: mov    rax,QWORD PTR fs:0x28
   0x000000000000072b <+17>:    mov    QWORD PTR [rbp-0x8],rax
   0x000000000000072f <+21>:    xor    eax,eax
   0x0000000000000731 <+23>:    lea    rax,[rbp-0x20]
   0x0000000000000735 <+27>:    mov    rdi,rax
   0x0000000000000738 <+30>:    call   0x764 <Test::Test()>
   0x000000000000073d <+35>:    lea    rax,[rbp-0x20]
   0x0000000000000741 <+39>:    mov    rdi,rax
   0x0000000000000744 <+42>:    call   0x7ae <Test::a()>
   0x0000000000000749 <+47>:    mov    eax,0x0
   0x000000000000074e <+52>:    mov    rdx,QWORD PTR [rbp-0x8]
   0x0000000000000752 <+56>:    xor    rdx,QWORD PTR fs:0x28
   0x000000000000075b <+65>:    je     0x762 <main()+72>
   0x000000000000075d <+67>:    call   0x5f0 <__stack_chk_fail@plt>
   0x0000000000000762 <+72>:    leave  
   0x0000000000000763 <+73>:    ret    
End of assembler dump.

我有一个问题..我正在尝试调试程序,但地址很奇怪,我无法读取寄存器(启动后)。 "The program has no registers now." 这种情况发生在我在计算机上编译的任何程序中。

编辑:

gef➤  break*0x0000000000000763
Breakpoint 1 at 0x763: file 1.cpp, line 36.
gef➤  r 
Starting program: /root/Desktop/Challenges/AdvancedMemoryChallenges/1.bin 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x763

gef➤  info reg $rip
rip            0x7ffff7dd9c20   0x7ffff7dd9c20
gef➤ 
gef➤  start
[+] Breaking at '{int (void)} 0x55555555471a <main()>'
[!] Command 'entry-break' failed to execute properly, reason: Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x763

1 个答案:

答案 0 :(得分:1)

0x763是重定位前的地址。 (目前还不清楚它是来自目标文件还是实际的可执行文件。)

正在运行的程序中的代码地址在地址空间中永远不会低。

您需要在_startmain上设置断点,启动程序,并查看内核分配给相关机器代码的地址。 GDB disassemble命令打印将打印此类地址。

GDB会自动禁用地址空间布局随机化(ASLR),因此只要您不更改程序,库或内核(有时也会导致流程布局更改),地址将保持不变。