You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现的反向shell代码中为什么需要使用dup2函数?

反向shell代码中dup2调用的作用说明

你的推测完全正确,此处dup2的核心作用就是将进程的三个标准流替换为已经建立连接的socket文件描述符,这个操作和后续的execl调用直接相关,是反向shell能正常工作的核心逻辑之一。

具体逻辑拆解如下:

  • socket()调用成功后返回的是指向TCP连接的文件描述符,默认分配的是当前进程未占用的最小编号,一般是3或者更大,不会是0、1、2这三个默认对应标准流的编号。
  • dup2(oldfd, newfd)的作用是先关闭newfd对应的已打开资源(如果存在),再让newfd和oldfd指向同一个打开的文件(此处就是我们和攻击端建立好的socket连接)。三次dup2调用执行完之后:
    • 0号描述符(STDIN_FILENO,标准输入)指向socket
    • 1号描述符(STDOUT_FILENO,标准输出)指向socket
    • 2号描述符(STDERR_FILENO,标准错误)指向socket
  • 执行execl("/bin/sh", NULL)时,会用/bin/sh的程序镜像替换当前进程的运行空间,但进程打开的文件描述符会默认保留,除非显式设置了FD_CLOEXEC关闭标记,这段代码没有做相关设置,所以三个标准流和socket的绑定关系会被新启动的shell完全继承。

而shell程序的默认工作逻辑就是:从标准输入读入用户输入的命令,把命令的执行结果输出到标准输出,执行过程中产生的错误信息输出到标准错误。此时三个标准流都已经绑定到和攻击者监听端连通的socket上,自然就实现了:攻击者在监听端输入的命令会通过socket传递给shell执行,shell的所有输出也会通过socket回传给攻击者,完成远程控制的效果。

如果没有这三次dup2调用,exec启动的shell的标准输入输出仍然绑定在运行这段代码的主机本地终端上,攻击者通过socket只能建立连接,既不能输入命令也收不到执行结果,反向shell就完全失效了。

内容的提问来源于stack exchange,提问作者user14598214

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:08