将参数传递给execve syscall的最简单方法

时间:2019-10-04 23:32:58

标签: linux assembly x86 nasm system-calls

据说,将参数传递给execve syscall非常简单。

在教程中,讲师说这只是一行,而把它留作练习。

下面的代码执行“ ls”命令。我正在尝试执行“ ls -la”之类的东西。 搜索后,我仍然不知道在何处添加“ -la”!

我知道它在ecx寄存器指向的结构中,并且必须以null终止。现在,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 个答案:

答案 0 :(得分:3)

您必须将-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
%