很短看起来很简单的题目,main()如下:

__int64 vulnerable()
{
  puts("HaHaHa!\nWhat else can you do???");
  close(1);
  close(2);
  return shell();
}

内核启动的时候默认打开这三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出文件stderr,分别得到文件描述符 0, 1, 2

所以,close(1);close(2);代表该题关闭了输出流和报错流。

解题思路是可以将输入输出流倒置,即exec 1>&0

输入输出的指向是默认0输入、1输出的,但可以修改,文件名字可以用&+文件描述符来代替。