Execve с аргументом в x64 с gnu asm

# #assembly #arguments #x86-64 #shellcode #execv

Вопрос:

Я пытаюсь написать шелл-код в GNU asm для linux и не могу вызвать execve с аргументами.

То, что я пытаюсь сделать :

 execve("/bin/ls", ["/bin/ls", "-la", NULL], NULL);
 

это мой код :

 .section .text
.globl _start
_start:
    push $0x3b
    pop %rax
    xorq %rdx,%rdx
    
    push %rdx
    movabs $0x61616161616c2d2d,%r8
    shr $0x8, %r8
    push %r8
    
    movabs $0x736c2f6e69622f2f,%r8
    shr $0x8, %r8                    
    push   %r8
    mov    %rsp,  %rdi
    push   %rdx
    push   %rdi
    mov    %rsp,  %rsi
    syscall
    
    push $0x3c
    pop %rax
    xorq    %rdi,  %rdi
    syscall
 

И как раз перед системным вызовом execv это мой reg/стек :
gdb

Я полагаю, что : RDI должен содержать адрес «/bin/ls» RSI должен содержать адрес адреса «/bin/ls » RDX = NULL

шелл-код выполняет /bin/ls, но не с аргументами-la.

Что случилось ?

тнх

Комментарии:

1. Аргументы представляют собой массив в стиле Си, указатель на указатель.

Ответ №1:

Вы никогда не указывали указатель на вторую строку argv. push %rdx; push %rdi нажимает NULL , а затем указатель на "/bin/ls" , но нет указателя на ваш "-laaaaa" . Тебе нужен еще один push между этими двумя. Например:

     push %rdx           // NULL
    lea 8(%rdi), %rcx   // pointer to "-laaaaa"
    push %rcx
    push %rdi           // pointer to "/bin/ls"
    mov %rsp, %rsi      // pointer to the argument vector