[CTF]-反弹shell[1]


0x01文件描述符

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

用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值

linux启动后,会默认打开3个文件描述符,分别是:

	标准输入: standard input    //0
   	正确输出: standard output   //1
   	错误输出: error output      //2

在这里插入图片描述

注意:
1.以后再打开文件,描述符可以依次增加
2.一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。

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


0X02 重定向

(1)输入重定向 < <<
(2)输出重定向 > >>

重点:

  1. bash 执行指令时,
检查存不存在重定向的符号->存在->文件描述符重定向->执行

(之前说过了,输入输出操作都是依赖文件描述符实现的,重定向输入输出本质上就是重定向文件描述符)

  1. 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果

(这一点我们后面会展示)

  1. < 是对标准输入 0 重定向

    > 是对标准输出 1 重定向

4.再强调一下,重定向就是针对文件描述符的操作


1.输入重定向

格式:

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

说明:

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

file文件中存在内容
‘hello world’

root@kali:~# cat 0< file
hello world

root@kali:~# cat < file
hello world

root@kali:~# 0< file cat
hello world

root@kali:~# < file cat
hello world

解释:
解析器解析到 < 以后会先处理重定向,将标准输入重定向file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了

在这里插入图片描述


2.输出重定向

格式:

[n]> word
root@kali:~# echo hello > file
root@kali:~# cat file
hello 

root@kali:~# echo world 1> file
root@kali:~# cat file
world

root@kali:~# > file echo hello
root@kali:~# cat file
hello

root@kali:~# > file echo world
root@kali:~# cat file
world 

说明:
将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)

在这里插入图片描述

注意:

  1. shell遇到 > 操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

  2. >> 操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)错误输出(2) 绑定。

  3. 当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

  4. 一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

  5. 一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行


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

格式:

&> word >& word

说明:

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

在这里插入图片描述

解释
我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。

在这里插入图片描述


4.文件描述符的复制

格式:

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

说明:

  1. 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以的形式打开
    因此 0<&10>&1 是完全等价的(读/写方式打开对其没有任何影响)
  2. 这里的& 目的是为了区分数字名字的文件文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
    这里就可以用上面的例子作为演示,将错误和正确的输出都输入到文件中

重点:

之前我们说过,重定向符号的顺序不能随便换,因为系统是从左到右执行的,我们下面就举一个例子

1. ll > file 2>&1

2. ll 2>&1 >file

与第一条指令类似的指令在上面我已经介绍过了,我们现在就来看看第二条指令的执行过程

在这里插入图片描述

1.首先解析器解析到 2>&1

在这里插入图片描述

2.解析器再向后解析到 >

在这里插入图片描述


5.exec 绑定重定向

格式:

exec [n] </> file/[n]

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

重点:

格式:

 [n]<>word

说明:

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

在这里插入图片描述

实例

root@kali:~# exec 6>&1
#将标准输出与fd 6绑定
 
root@kali:~# ls  /proc/self/fd/ 
0  1  2  3  6
#出现文件描述符6
 
root@kali:~# exec 1>suc.txt
#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)
 
root@kali:~# ls -al
#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了
 
root@kali:~# exec 1>&6
#恢复标准输出
 
 
root@kali:~# exec 6>&-
#关闭fd 6描述符

root@kali:~# ls /proc/self/fd/
0  1  2  3

说明: 使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。


0X03 总结

  1. 重新设置命令的默认输入输出指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件,哈哈)
  2. 扩展自己新的描述符,对文件进行读写操作

参考

https://xz.aliyun.com/t/2548#toc-8
https://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值