Самый простой способ передать аргументы для выполнения системного вызова - PullRequest
0 голосов
/ 05 октября 2019

Предположительно, очень просто передать аргументы в системный вызов execve.

В учебном пособии инструктор говорит, что он находится только в одной строке, и оставьте это как упражнение.

Код ниже выполняет команду "ls". И я пытаюсь выполнить что-то вроде "ls -la". После поиска и поиска я все еще не знаю, куда добавить «-la»!

Я знаю, что он находится в структуре, на которую указывает регистр ecx, и что он должен заканчиваться нулем. На данный момент ecx содержит адрес / bin / ls. Должны ли аргументы быть другим адресом? argv - это массив с первым элементом "/bin/ls"...

global _start

section .text
_start:
        xor eax, eax
        push eax

        push 0x736c2f6e 
        push 0x69622f2f ; //bin/ls

        mov ebx, esp

        push eax
        mov edx, esp

        push ebx
        mov ecx, esp

        mov al, 11
        int 0x80

. Это не работает:

xor eax, eax
push eax
push 0x2a632020
push 0x736c2f6e 
push 0x69622f2f ; /bin/ls  c*
mov ecx, esp

1 Ответ

3 голосов
/ 05 октября 2019

Вы должны сохранить аргумент -la в регистре ecx и скопировать его в регистр esp (я имею в виду в стеке)

push eax
push byte 0x61
push word 0x6c2d 
mov ecx, esp ; -la

Ниже приведен ваш модифицированный код:

global _start

section .text
_start:

xor eax, eax

push eax
push byte 0x61
push word 0x6c2d    
mov ecx, esp ; -la

push eax
push 0x736c2f6e
push 0x69622f2f ; //bin/ls
mov ebx, esp

push edx
push ecx
push ebx
mov ecx, esp

mov al, 11
int 0x80

Код работает нормально :)

% ./list
total 4
-rwxrwxr-x 1 febri febri 512 Oct  5 07:45 list
% 
...