使用寄存器和表偏移的绝对调用

时间:2011-03-16 10:37:22

标签: assembly x86 nasm

我在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位。

1 个答案:

答案 0 :(得分:2)

我看到的第一个问题是,当你输入_start_reloc时,你会弹出ebp。当该函数结束并且你退回时,eip获取堆栈中的值。通常这将是ebp,但是因为你现在把它弹出,所以eip有一个随机值。而不是pop ebp尝试使用mov ebp,[esp]或pop ebp然后推送ebp