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
- 0号描述符(
- 执行
execl("/bin/sh", NULL)时,会用/bin/sh的程序镜像替换当前进程的运行空间,但进程打开的文件描述符会默认保留,除非显式设置了FD_CLOEXEC关闭标记,这段代码没有做相关设置,所以三个标准流和socket的绑定关系会被新启动的shell完全继承。
而shell程序的默认工作逻辑就是:从标准输入读入用户输入的命令,把命令的执行结果输出到标准输出,执行过程中产生的错误信息输出到标准错误。此时三个标准流都已经绑定到和攻击者监听端连通的socket上,自然就实现了:攻击者在监听端输入的命令会通过socket传递给shell执行,shell的所有输出也会通过socket回传给攻击者,完成远程控制的效果。
如果没有这三次dup2调用,exec启动的shell的标准输入输出仍然绑定在运行这段代码的主机本地终端上,攻击者通过socket只能建立连接,既不能输入命令也收不到执行结果,反向shell就完全失效了。
内容的提问来源于stack exchange,提问作者user14598214
相关产品推荐
相关产品推荐

