Я пытаюсь написать программу с кодом оболочки, которая будет вызывать execve и создавать оболочку. Я работаю на 32-битной виртуальной машине, которая была предложена для этого класса. Код выглядит следующим образом:
section .text
global _start
_start:
;clear out registers
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
;exacve("/bin/sh",Null,NULL)
;ascii for /bin/sh;
;2f 62 9 6e 2f 73 68 3b
push 0x3b68732f
push 0x6e69622f
mov ebx, esp
mov al, 11
int 0x80
;exit(int status)
movv al, 1
xor ebx, ebx
int 0x80
Я компилирую с nasm -f elf -g shell.asm
и связываю с ld -o shell shell.o
Когда я пытаюсь запустить его, я получаю ошибку сегментации. Я попытался использовать gdb, чтобы увидеть, где я допустил ошибку, но он дает сбой, даже если установить точку останова на _start+0. Пишет, что был segfault по адресу после последней инструкции кода. т. е. если последняя строка имеет адрес 0x804807c, то ошибка сегментации происходит по адресу 0x804807e до того, как какой-либо код сможет запуститься.
Может ли кто-нибудь указать мне правильное направление, чтобы я мог понять, как это исправить?