linux反弹shell的本质(一)

文件描述符

定义

linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。

当Linux启动的时候会默认打开三个文件描述符,分别是:

标准输入standard input 0 **(默认设备键盘)
标准输出standard output **1
(默认设备显示器)
错误输出:error output 2(默认设备显示器)

文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
img

重定向

定义:顾名思义,重定向,就是改变输入输出的方向,针对文件描述符的操作
输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向
符号
(1)输入重定向 < <<
(2)输出重定向 > >>
那么如何实现重定向依靠的就是改变文件描述符
img
img

img

总结一下话,就是把原本要输出的内容输出到文本中,把原本要输入的内容从文本中输入

深入理解

1.bash在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向
2.如果有多个重定向符号,遵循从左到右的的顺序,切不要随便改变顺序,会带来不一样的结果
3.< 是对标准输入0重定向,>是对标准输出1重定向

1.输入重定向

格式: [n]< word (注意[n]与<之间没有空格)

说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入)

img ![img](https://raw.githubusercontent.com/Hwwg/myphoto/master/20210203204231.png) 解释:解析器解析到<会先处理重定向,将标准输入重定向123.txt,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file,于是cat就从file中读取指令了,

2.输出重定向

格式: [n]> word
img

3.标准输出与标准错误输出重定向

格式: &> word >& word
说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1
例: 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的,详细的介绍后面会有)

img 从上可以看出,我们执行的指令内容都会被重定向输出到123.txt,这就很符合前面所说的,重定向这一定理,原来是要直接输出到屏幕上的,被我们重定向到文件夹内

4.文件描述符的复制

格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)

说明:

1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开

因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)

2)这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符

这里就可以用上面的例子作为演示,将错误和正确的输出都输入到文件中

5顺序不可更换实例

cmd 2>&1 >file
解析到 2>&1 根据上面,可以理解为现在储存在1这个数组中,解析到>,将内容输出到file

6.exec绑定重定向

格式:exec [n] </> file/[n]

上面的输入输出重定向将输入和输出绑定文件或者设备以后只对当前的那条指令有效,如果需要接下来的指令都支持的话就需要使用 exec 指令

参考:https://xz.aliyun.com/t/2548
图片来源:http://c.biancheng.net/view/942.html

重点:

格式: [n]<>word

说明:以读写方式打开word指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入。

思考

很好的体现出了Linux中一切皆文件的特性,重定向就是改变文件(在linux中也即一切数据)的输入输出流向。

Author

vague huang

Posted on

2021-02-03

Updated on

2021-02-04

Licensed under

Comments