gdb "info frame" 中没有 epb/eip 寄存器

No epb/eip registers in gdb "info frame"

上下文

在我的机器上发出命令info frame时(断点在main),输出如下:

(gdb) info frame
Stack level 0, frame at 0x7fffffffdbd0:
 rip = 0x4005b1 in main; saved rip = 0x7ffff7a53b05
 Arglist at 0x7fffffffdbc0, args: 
 Locals at 0x7fffffffdbc0, Previous frame's sp is 0x7fffffffdbd0
 Saved registers:
  rbp at 0x7fffffffdbc0, rip at 0x7fffffffdbc8

据我了解,this answereipebp 寄存器(不在我的输出中)具有以下含义:

eip is the register for next instruction to execute (also called program counter)

"ebp" is the register usually considered as the starting address of the locals of this stack frame, which use "offset" to address

,我了解到

[RIP is] the instruction pointer

[...]

Some of these registers were envisioned to be used for specific use, and commonly are. The most critical ones are the RSP and RBP.

最后,info registers 给出了以下输出:

(gdb) info registers
rax            0x4005ad 4195757
rbx            0x0      0
rcx            0x0      0
rdx            0x7fffffffdcc0   140737488346304
rsi            0x7fffffffdca8   140737488346280
rdi            0x2      2
rbp            0x7fffffffdbc0   0x7fffffffdbc0
rsp            0x7fffffffdbc0   0x7fffffffdbc0
r8             0x7ffff7dd7c60   140737351875680
r9             0x7ffff7dead10   140737351953680
r10            0x7fffffffda50   140737488345680
r11            0x7ffff7a53a10   140737348188688
r12            0x4004b0 4195504
r13            0x7fffffffdca0   140737488346272
r14            0x0      0
r15            0x0      0
rip            0x4005b1 0x4005b1 <main+4>
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0

(N.B.: 也尝试​​使用 info all-registers。输出更长,但仍然没有 eip/epb——这是我所期待的,因为根据文档,这些是 vector/FPU 注册。)

基于所有这些,我认为:

问题

  1. 以上理解是否正确? (理论 B:我的机器上也有 这些寄存器,但是 gcc 以这样的方式编译程序,它使用 rip 而不是eip 和 rbp 而不是 ebp。理论 C:因为我在函数的开头而不是函数内部中断,所以 eip 和 ebp 尚未使用;rip 和 rbp 在这种情况。)
  2. (假设我的主要理论是正确的):是新机器有 eip/ebp 而不是 rbp/rip 的情况,还是新机器有两组寄存器,而旧机器只有 rbp/rip?
  3. 如果 gdb 中的 info registers 没有显示寄存器,是否意味着该寄存器在机器上不存在,或者它可能存在,但未在调试程序的上下文中使用? (基于 GDB documentation,我认为是前者。)

背景

我正在尝试做this exercise,其要点是:

Stack4 takes a look at overwriting saved EIP and standard buffer overflows.

所以主要问题是:在这种情况下我应该选择 rip 而不是 eip? (然而,除了回答这一点,我想对大体上的背景有更好的了解,因此提出以上更详细的问题。)

我想,这个练习是为 i386 架构编写的,它是较旧的 32 位 x86 变体。 %ebp%eip 寄存器是这些寄存器的 32 位版本。

你是 运行,我想,在 x86-64 上,64 位 x86 变体。对于这个版本的体系结构,这些寄存器扩展到 64 位,并具有新名称 %rbp%rip.

在 x86-64 上编译时,通常可以为 32 位 x86 ABI 编译代码,如果您使用 gcc 然后在编译时添加 -m32 标志。如果这样做,GDB 将向您显示 %ebp%eip 寄存器。

一般来说,您应该将 %rip 视为 %eip 的 64 位版本,而将 %rbp 视为 %ebp 的 64 位版本。