在做WUSTCTF中的closed这道题时发现的这个问题,经过一番查阅后才知道了作法
先看原题
大概意思为:
close(1);close(2);
最后返回shell函数也就是system(/bin/sh)
一句简短的payload就可以返回shell
而exec 1>&0
这段仅有的payload的分析我们可以先引申到linux的EXEC与文件描述符
EXEC的两种用法
exec ls
exec 5</dev/null;exec 5<&-
文件描述符
0
、1
皆为linux下的文件描述符
而在linux中,一切都可以作为文件,文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。
如果此时去打开一个新的文件,它的文件描述符会是3。exec 1>myoutput
把标准输出重定向到myoutput文件中,也可以用exec 0<myinput
把标准输入重定向到myinput文件中,而且,文件名字可以用&+文件描述符
来代替。再看回原题,这里的close(1);close(2);
便是关闭了 标准输出和 标准错误输出
但我们就可以使用重定位文件描述符的办法,将标准输出重定位到标准输入上来达到返回shell的目的(因为默认打开一个终端后,0,1,2都指向的是当前终端,所以该语句相当于重启了标准输出,也就可以看到程序的输出了)