Вы можете поместить массив argv
в стек и загрузить его адрес в rsi
. Первый член argv
является указателем на имя программы, поэтому мы можем использовать тот же адрес, который мы загружаем в rdi
.
xor edx, edx ; Load NULL to be used both as the third
; parameter to execve as well as
; to push 0 onto the stack later.
push "-aal" ; Put second argument string onto the stack.
mov rax, rsp ; Load the address of the second argument.
mov rcx, "/bin//ls" ; Load the file name string
push rdx ; and place a null character
push rcx ; and the string onto the stack.
mov rdi, rsp ; Load the address of "/bin//ls". This is
; used as both the first member of argv
; and as the first parameter to execve.
; Now create argv.
push rdx ; argv must be terminated by a NULL pointer.
push rax ; Second arg is a pointer to "-aal".
push rdi ; First arg is a pointer to "/bin//ls"
mov rsi, rsp ; Load the address of argv into the second
; parameter to execve.
Это также исправляет несколько других проблем с кодом в вопросе. В качестве имени файла используется 8-байтовая переменная pu sh, поскольку x86-64 не поддерживает 4-байтовую переменную pu sh и гарантирует, что имя файла имеет нулевой терминатор.
Этот код использует 64-битную переменную pu sh с 4-байтным значением, ближайшим к pu sh "-aal", поскольку строка помещается в 4 байта. Это также делает его нулевым завершением без необходимости использовать нулевой байт в коде.
Я использовал строки с удвоенными символами, поскольку они используются в вопросе, чтобы избежать нулевых байтов в коде, но я бы предпочел следующее:
mov ecx, "X-al" ; Load second argument string,
shr ecx, 8 ; shift out the dummy character,
push rcx ; and write the string to the stack.
mov rax, rsp ; Load the address of the second argument.
mov rcx, "X/bin/ls" ; Load file name string,
shr rcx, 8 ; shift out the dummy character,
push rcx ; and write the string onto the stack.
Обратите внимание, что строка имени файла получает нулевой терминатор через сдвиг, избегая лишних pu sh. Этот шаблон работает со строками, где двойной символ не будет работать, и его можно использовать и с более короткими строками.