#linux #assembly #x86-64 #nasm #execve
#linux #сборка #x86-64 #nasm #execve
Вопрос:
Я пытался написать программу сборки (NASM на 64-разрядной машине Ubuntu 20.04), которая выполняет системный вызов execve команды sh.
Вместо того, чтобы открывать оболочку, она просто заканчивается.
Я был бы очень признателен за любую помощь в решении этой проблемы.
Вот код:
global _start
_start:
mov rax,59
xor rdi, rdi
mov rdi, str1
xor rsi, rsi
mov rsi, str2
mov rdx, 0xa
syscall ;execute execve syscall
mov rax,60
xor rdi,rdi
syscall ;execute exit syscall
section .data
str1: db '/bin/sh' ;string of the first argument of execve
str2: db '/bin/sh',0xa ;string array of the secand argument of execve.
Я компилирую и выполняю asm-файл следующим образом:
nasm -felf64 execve_sh.nasm -o xxx.o
ld xxx.o -o zzz
./zzz
Большое спасибо
, Тали
Комментарии:
1. Хотя это не единственная ваша проблема, ваши строки должны быть завершены нулем (0). Я рекомендую использовать отладчик и особенно
strace
для просмотра параметров системного вызова execve. Вы, вероятно, обнаружите проблемы.strace ./zzz
2. Я попытался добавить 0xa в str1, но ничего не изменил. Str2 завершается 0xa .
3. Они должны завершаться с помощью nul (0x0), а не новой строки (0xa).
4. Но также тщательно подумайте о том, как выглядит вектор аргументов. Это не указатель на строку, это указатель на массив указателей. Вам нужно будет создать такой массив в памяти с нулевым указателем, отмечающим его конец.
5. Просто примечание: «просто заканчивается», по-видимому, потому, что системный вызов execve завершается неудачно, а «просто заканчивается» — это то, что ваша программа намеренно делает (вызывая
_exit
системный вызов), еслиexecve
системный вызов возвращается. Вы получили бы больше информации, если бы проверили код ошибки, оставленныйrax
execve
системным вызовом; это отрицательноеerrno
значение an .