在做WUSTCTF中的closed这道题时发现的这个问题,经过一番查阅后才知道了作法

先看原题

大概意思为:

  • 先向程序中输入字符串
  • 然后一次执行close(1);close(2);最后返回shell函数也就是system(/bin/sh)

一句简短的payload就可以返回shell

exec 1>&0这段仅有的payload的分析我们可以先引申到linux的EXEC与文件描述符

{% note info%} **EXEC的两种用法** 1. **exec 命令** ;命令代替shell程序,命令退出,shell 退出;比如 `exec ls` 2. **exec 文件重定向**,可以将文件的重定向就看为是shell程序的文件重定向 比如 `exec 5myoutput`把标准输出重定向到myoutput文件中,也可以用`exec 0再看回原题,这里的close(1);close(2);便是关闭了 标准输出标准错误输出

但我们就可以使用重定位文件描述符的办法,将标准输出重定位到标准输入上来达到返回shell的目的(因为默认打开一个终端后,0,1,2都指向的是当前终端,所以该语句相当于重启了标准输出,也就可以看到程序的输出了)