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