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 answer、eip
和 ebp
寄存器(不在我的输出中)具有以下含义:
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 注册。)
基于所有这些,我认为:
- 在我的机器上没有 epb/eip 寄存器
- 我的机器上一直使用 rip 而不是 eip
- 我的机器上一直使用 rbp 而不是 ebp
问题
- 以上理解是否正确?
(理论 B:我的机器上也有 这些寄存器,但是 gcc 以这样的方式编译程序,它使用 rip 而不是eip 和 rbp 而不是 ebp。理论 C:因为我在函数的开头而不是函数内部中断,所以 eip 和 ebp 尚未使用;rip 和 rbp 在这种情况。)
- (假设我的主要理论是正确的):是新机器有 eip/ebp 而不是 rbp/rip 的情况,还是新机器有两组寄存器,而旧机器只有 rbp/rip?
- 如果 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 位版本。
上下文
在我的机器上发出命令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 answer、eip
和 ebp
寄存器(不在我的输出中)具有以下含义:
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 注册。)
基于所有这些,我认为:
- 在我的机器上没有 epb/eip 寄存器
- 我的机器上一直使用 rip 而不是 eip
- 我的机器上一直使用 rbp 而不是 ebp
问题
- 以上理解是否正确? (理论 B:我的机器上也有 这些寄存器,但是 gcc 以这样的方式编译程序,它使用 rip 而不是eip 和 rbp 而不是 ebp。理论 C:因为我在函数的开头而不是函数内部中断,所以 eip 和 ebp 尚未使用;rip 和 rbp 在这种情况。)
- (假设我的主要理论是正确的):是新机器有 eip/ebp 而不是 rbp/rip 的情况,还是新机器有两组寄存器,而旧机器只有 rbp/rip?
- 如果 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 位版本。