BUU-wustctf2020_closed-WP

Posted on Nov 17, 2020

这道题考的其实不是pwn,应该说是Linux系统编程的知识。

我啥都不会,看了别人的wp之后才知道一点。

这个函数close了标准输出(close(1))和标准错误(close(2)),所以虽然我们有了shell,但是我们获得不了输出。然鹅我们可以通过exec 1>&0来把标准输出重定向到文件描述符0(标准输入),这个文件默认是开启的。这样我们就可以看到输出了。

那么exec 1>&0是什么鬼呢,问一下男人man exec

男人好像不会说中文,看不是很懂。

exec有两个作用

  1. 代替shell执行命令,区别是shell执行完之后会回到shell,而exec会直接退出。
  2. 文件重定向,也就是exec 1>&0这样将文件描述符为1的文件重定向到0上

好的,文件这个名词好像很迷惑。Linux将所有的东西都看作文件,即“一切皆文件”,标准输出流就是一个文件,标准输出就是输出到这个文件上,这是一种抽象,现在Linux还活的好好的,说明这种抽象是合理的。而内核为了高效的管理这些文件,就为他们设立了文件描述符,文件描述符一般是非负(小)整数,特别的,标准输入的文件描述符为0,标准输出的文件描述符为1,标准错误的文件描述符为2。由于这三个非常标准,所有程序是默认开启这几个文件的,不然就没法交换了嘛。

这道题为了秀我们,就把标准输出的文件关了,所以我们把这个文件重定向到标准输入上,这样一切本来会写到标准输出的流就写到标准输出上了,我们就可以看到输出了。

当然exec的语法很迷惑,我也不知道为啥要这么写,估计&就是取址的意思,这样就实现了重定向。