【发布时间】:2011-07-16 11:53:56
【问题描述】:
为了练习偏移、寻址、表格等,我在 NASM 中编写了以下程序。
t_addr:
dw rout1-@, rout2-@
@ equ $
_start:
mov esi, rout1
call esi
call _start_reloc
_start_reloc:
pop ebp
sub ebp, _start_reloc-@
xor eax, eax
add eax, 1
sal eax, 1
lea esi, [ebp+t_addr-@]
mov ax, word [esi+eax]
add eax, ebp
call eax
ret
rout1:
mov eax, 0
ret
rout2:
xor eax, eax
ret
虽然 _start 标签后的前两条指令正常运行并将控制权转移到 rout1 函数,但当我尝试访问 rout2函数使用表中的偏移量,而在 GDB 中,我在 call eax 指令之前查看 eax 的值并包含rout2 执行调用时出现分段错误,并且 EIP 加载了 0x00000001。为什么???
ps:我使用的是 linux 32 位。
【问题讨论】: