我在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 中,我在调用eax 指令之前查看 eax 的值并包含地址 rout2 执行调用时,我得到分段错误,EIP加载0x00000001。 WHY ???
p.s:我使用Linux 32位。
答案 0 :(得分:2)
我看到的第一个问题是,当你输入_start_reloc时,你会弹出ebp。当该函数结束并且你退回时,eip获取堆栈中的值。通常这将是ebp,但是因为你现在把它弹出,所以eip有一个随机值。而不是pop ebp尝试使用mov ebp,[esp]或pop ebp然后推送ebp