【问题标题】:GCC/G++ addresses and can't read the registers [duplicate]GCC / G ++地址并且无法读取寄存器[重复]
【发布时间】:2018-04-23 19:29:56
【问题描述】:
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

【问题讨论】:

  • 这是未充分说明的。你如何构建它,如何启动它,等等?可能有点跑题了,真的……
  • 您能否在edit 中澄清您的问题?
  • 我已经编辑了这个问题,希望你能理解这个问题。 :P
  • 您能否向我们展示您在输入start 后跟info reg $rip 时获得的输出(通过编辑问题)?
  • 我看到info reg $rip 成功了。你运行了什么命令导致"The program has no registers now." 错误?

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2011-09-12
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多