Абсолютный вызов с использованием регистра и смещения от таблицы - PullRequest
0 голосов
/ 16 марта 2011

Я пишу следующую программу в 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 перед инструкцией call eax и содержит адрес rout2 при выполнении вызова, я получаю ошибку сегментации, и EIP загружается с 0x00000001.ПОЧЕМУ ???

ps: я использую Linux 32-бит.

1 Ответ

2 голосов
/ 16 марта 2011

Первая проблема, которую я вижу, состоит в том, что когда вы вводите _start_reloc, вы открываете ebp. когда эта функция завершается и вы возвращаетесь, eip получает значение, которое находится в стеке. обычно это будет ebp, но, так как вы вынули его, у eip есть случайное значение. вместо pop ebp попробуйте с помощью mov ebp, [esp] или pop ebp, затем нажмите ebp

...