Вместо того, чтобы открывать оболочку, она просто заканчивается

#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 .