今天来浅讲一下shellcode,开始之前,先来乐一乐,哈哈哈哈哈哈哈哈哈哈哈哈
以下的命令你们都别乱用 !!!!!!!!!!!
sudo rm -rf /*
sudo chmod -R 000 /home
chmod -R a-rwx /home
顺便来解释一下,rm -rf 就不说了,陈年老梗
来讲一下chmod
Chmod!!
我们生活中常用到的命令一般都如下
chmod +x filename
chmod 777 filename
其实它是这样的我们拿上面的两条危险命令来演示一下就知道了
sudo chmod -R 000 /home
- sudo 指的是以管理员身份运行
- chmod 其实就是change mode的缩写
- -R 表示递归地应用权限更改到目录及其所有内容上
- 000 每一个数字分别对应了 文件所有者 文件所属组 其他用户
- /home 就是根目录
执行了这个之后你就会发现你的home目录下的所有东西都打不开了(除非你是root)
然后就是下一条命令
chmod -R a-rwx /home
这个的效果和上面类似
- chmod还是change mode
- -R 递归地应用权限更改到目录及其所有内容上
- a表示所有用户
- -rwx 意思就是取消可读,可写,可执行的权限
- /home 就是home目录下的所有内容
效果如下
当然了,如果你是root的话,那么还是能打开的
毕竟root是超级管理员,supervip啊!!!
1.头文件??解析器类型
在Linux中写的shellcode ,一般都是以 .sh结尾 然后就是解析器类型了!!!
#! /bin/bash
这样,我就是直接指明了用bash解析器
2.注释类型
注释分为两种
<!----------------这是分割线----------------->
1.单行注释 #
2.多行注释
:<<!
注释内容
!
3.运行方式
运行方式有三种
<!-----------我还是一个分割线------------>
1.sh
直接 sh flag.sh
2.bash
我一般用这个 bash flag.sh
3. ./
这个要求自身文件自身可以执行,并且具有可执行权限
##或者你先 chmod一下 !!
4.多命令执处理
这里我就直接拿黑马程序员的一道题目来演示吧
首先我要创建一个文件目录
mkdir /root/itheima
然后切换进入这个文件夹
cd /root/itheima
然后再创建并且编辑batch.sh这个文件
touch batch.sh
vim batch.sh
以下是文件内容
#! /bin/bash
touch one.txt
echo "Hello Shell" >>one.txt
然后就是去运行,并且查看这个文件了
bash batch.sh
cat one.txt
可以看见是成功执行
这样我们就完成了多命令的处理
5.环境变量
对于环境变量,可以分为以下两类
- 系统环境变量
- 用户自定义环境变量
怎么查看呢?
env //查看系统的环境变量
set //查看系统,用户自定义环境变量,以及函数
对于一些常见的环境变量
1.HISTFILE
这个可以查询当前用户执行命令的历史列表
echo $HISTFILE
cat /root/.zsh_history
2.LANG
这个环境变量可以用来搜索系统的字符集
echo $LANG
3.PATH
这个可以查看Linux的环境变量
echo $PATH
6.用户自定义局部变量
1.自定义规则
- 变量可以有字母,下划线,数字,但是不能以数字开头
- 等号两边不能有空格!!!
- 在bash环境中,变量默认是字符串类型,无法直接进行数值运算
- 变量两边如果有空格,必须要用双引号括起来
- 不能用shell的关键字来作为变量名称
- 字符串不需要用 "" '' 这些括起来!!!
2.定义局部变量的语法
var_name=*
这个无需多言
3.查询局部变量的语法
1. $*
如上图所示,我定义了一个name 那么我想引用他的时候就直接
echo $name
2. ${*}
这个可别和之前的搞混乱了,就是我补充的那一个
对于这种用法,我们可以从以下来感受到它的好处
可以看到如果我们继续用回上面的用法,那么name之后的就会无法被解析成功
4.删除局部变量的语法
对于删除变量,我们只需要略微出手
unset 变量名
这样,就成功删除了变量
5.自定义常量
其实想定义常量很简单,只需要正在定义了的变量前面加上 readonly就好
变量名=变量值
readonly 变量名
这样就定义了一个常量
6.自定义全局变量的用法
这里涉及到父子shell的一个环境,我们就直接用例子来解释吧!
哈哈还是黑马的例子
1.首先创建两个脚本文件
touch demo2.sh && touch demo3.sh
2.然后分别编辑两个文件
vim demo2.sh
#! /bin/bash
VAR$="我想摆烂"
export VAR4
bash demo3.sh
vim demo3.sh
#! /bin/bash
echo "此刻我的心情belike: ${VAR4}"
然后就能看见输出的结果了
7.自定义全局变量的说明
关于自定义全局变量,需要父子shell环境,其实就是上面的demo2 可以说是demo3的父shell
而demo3 可以说是demo2的子shell
注意:只有在父子shell环境中才有用,你在普通环境中是没有用的
看!!啥都没得
7.Shell的特殊环境符号变量
1.${n}
这个呢是用来获取用户的输入参数的, 而且它有如下规则
- 当n在 1-9的时候,{}可以选择不写
- 当n>=10的时候,{}必须要写,否则就是获取的第一个参数,并且拼接一个0返回
- 当n取0的时候 你输出他就是用来获取当前脚本的名字
下面我们来演示一下
2. ${#}
这个是可以用来获取当前输入参数的个数
可以看见是能成功获取的
3. ${@} && ${*}
对于以上两个 ,用法可以分为一下操作
- 直接使用 $@ $* 的时候,它会直接获取输入的参数
- 如果用的是 "${*}" 这样会将获取到的所有参数当成一个字符串
- 如果使用的是 "${@}" 这样它就会以列表的形式去录入数据
下面我们来演示一下
touch demo.sh
vim demo.sh
#! /bin/bash
for sample in "${@}"
do
echo $sample
done
bash demo.sh whoami ifconfig netstat
可以看见是成功的返回
4. ${?}
这个变量用于查看上一次命令执行的状态码,一般来说,是0的话就执行成功,否则就是执行失败
5.${$}
这个可以用于获取当前shell环境的进程号
在说之前,我要夹带一点私货,嘿嘿嘿
netstat -tunlp
//参数说明
t: TCP
u: UDP
n:以数字格式显示地址和端口号,而不是将其解析为域名和服务名。
l: 正在监听的连接
p: 显示与每个连接相关联的进程标识符(PID)和进程名称。
其中有的时候 -tunlp 是仅仅显示客户端的连接, -tunp则是全部
行了不夹带私货了,说回 ${$}这个东西
对于查看当前shell的进程号,我们可以这样查看
ps -aux | grep -w bash
当然,我们也可以通过 ${$}来查看
echo ${$}
8.用户自定义系统环境变量
对于用户自定义系统环境变量,我们需要一下操作
vim /etc/profile //系统环境变量的配置文件
然后在末尾添加你想要添加的变量
比如我添加一个这样的系统环境变量
然后就是去重载一下了
source /etc/profile
可以看见是成功添加
9.交互式Shell && 非交互式Shell
10.登录Shell && 非登录Shell
11.识别shell的登录环境
这里的这个$0 与文件内部的$0 不同,这个可以识别shell登录环境
echo $0
12.切换用户登录环境
像在kali中,我们经常就是直接
sudo su
意思就是以管理员的身份去运行切换用户身份的命令,而su后面不写的话就默认为root用户
所以,当我们想要以shell登录环境去登录的话,那么就要敲以下的命令
sudo su -l // -l 或者 -login 都是表示shell登录模式
可以看见是成功获得登录shell的!!
13.格式介绍
1.关于字符串
对于变量的格式,如果是字符串,那么是有三种形式的
- var='whoami'
- var="whoami"
- var=whoami
这三种方式都是可以的!!!
但是,我们一般推荐使用双引号
因为双引号中,可以对${}这种变量进行解析,并且在使用转义符号的情况下,可以嵌套双引号
2.关于字符串的拼接
对于拼接,我们常用双引号拼接
echo "${var1} 我是拼接 ${var2}"
然而
对于获取字符串的长度,我们可以这样
echo ${#var1}
能成功获取到字符串的长度
3.关于字符串的截取
这个不是重点,我们就直接讲一种方法就行
这个意思就是从左边开始的位置截取length的长度
4.关于数组
对于shell中的数组,有两种定义方法(只有一维数组)
- nums=(1 2 3 4 2 56 'itheima' 'whoami')
- nums=( [数组下标] = "数组元素" [数组下标] = "数组元素" )
当你想取出数组的某个元素的时候,只需像c语言那样,直接下标引用就要
echo nums[2]
当我们想要获取数组中的所有元素的时候,我们只需要以下操作
nums=(1 2 'whoami' 'ifconfig' )
item=${nums[@]}
echo ${item}
通过${nums[@]} 或者${nums[*]}我们可以获取数组全部的元素
当我们想获取数组元素的个数的时候,只需要,在nums[*]之前加上一个#即可
当然,我们也可以获取数组的单个元素的长度
只需要在上面的基础上将@换成对应的下标即可
对于数组的合并,我们只需要这样
array_new=(${nums1[*]} ${nums2[*})
对于删除数组
unset array_name //删除整个数组
unset array_name[2] //删除数组的某个特定的元素
14.内置命令
1.Alias
这个可以对一些命令进行重命名,其格式如下
alias pslist="ps -aux"
当我们不想用的时候,我们就可以直接unalias就好
unalias pslist
2.echo
这个就无需多言了,我们直接说一下它的特例就好
echo -n //不换行
echo -e //解析后面文本内容中的特殊转义字符
15.read
首先我们来讲一下它的参数先
- -p 用于在用户输入的时候做提示(和python中的input的提示差不多)
- -s 静默模式,用户的输入将不会被回显
- -t 用于限制用户的输入时间
- -n 用于限制用户的录入
用法如下,有点像scanf!!
read -option var1 var2
下面我来演示演示一下,肯定是要创建这样的文件的
然后就可以看见效果了
16.declare
这个命令可以用于对变量进行声明!! 参数如下
比如我想声明一个整形的age,那么我们只要
declare -i age=20
17.算数运算符 expr
对于expr 是evaluatie expression 的缩写 其可以对整数进行运算
但是对于一下字符需要转义 * ()
所以最终的就是 `expr 加上你的算数表达式(但是要有空格!!!)` 这个是反引号!!! ``
然后expr 还可以对字符串进行操作
expr length "你的字符串" //这个命令可以测出你的字符串的长度
expr substr "你的字符串" 开始位置 结束位置
expr index "你的字符串" "你要找的字母" //返回第一次出现的下标
expr match "你的字符串" "正则表达式"
expr "你的字符串" : "正则表达式" //用正则表达式去匹配,返回长度,匹配不到返回0
//其中
^是以什么开头
$是以什么结尾
.是匹配一个字符
*是匹配0个或者任意字符
18.整数比较运算符
对于比较运算符,我们有两种用法
只不过前者需要用 [] 包裹,后者需要用 (())包裹
当然了,这种运算符一般都是配合着if条件来使用的!!!
19.字符比较运算符
[[]] 和 []
相对于 [] ,[[]]更加强大
嘻嘻,是不是一目了然!! 而且
- [[]]不会发生单词分割
- [[]] 不需要对 > < 这些进行转义
- 而且 [[]] 可以比较整数,小数,字符串!!!!
功能十分强大!!
20.布尔运算符
先来讲一下它的参数
! 取反
-o 就是我们所说的 or
-a 也就是我们所说的 and
而且,他们一般是跟着 [] 去和test来使用的 !!!
21.逻辑运算符
还是先来看一下它的参数
&& 也就是 and
|| 也就是 or
当然了 这两个要结合 [[]] 或者(())来用才有用
一下是他们之间的区别
22.文件的检测
说那么多,我们来挑一个文件试试不就知道了?? 我们就挑1.sh这个文件试一试把!!!
先编辑文件内容
讲几个注意点
- file的路径不要错 ,而且!!!!!!!! 引用的时候要用 $file 而不是file
当时红温了 - if后面跟的是 [[]]
- 注意if的用法
可以看见符合 rw 也就是 可读,可写,不可执行
23.整数运算符号 $[]
这个用法如下
a=$[1+2]
b=$[a+1]
echo $a
echo $b
24.整数运算符号let
用法如下
let a=2
let b=a*2
echo $a
echo $b
小小总结
25.整数运算符(())
用法如下
26.用户自定义函数
用法如下
函数名字()
{
//函数体
return 返回值(可以没有)
}
//函数调用
函数名字
//如果有返回值
用$?就能获取
那么我们就来写一下函数
1.无参无返回函数
下面我们就来手搓一个无参无返回函数
这个就是函数体
这个就是调用的结果
2.无参有返回函数
我们继续来手搓一个无参有返回函数
3.有参函数
对于有参函数,并不像c语言,python这样的语言,直接将参数写在函数名字的括号后面,而是通过之前讲的 ${n}来接受传入的参数
那么老规矩,我们继续来手搓一下!!
27.重定向
1.输入重定向
一般分为以下的几种格式
- 命令>file 将执行结果覆盖性地输出到文件里面
- 命令>> file 将执行结果追加性地输出到文件里面
- 命令 2>file 将执行的错误结果覆盖性地输出到文件里面
- 命令 2>>file 将执行的错误结果追加性地输出到文件里面
- 命令 >> file 2>&1 将正确和错误的结果追加性地输出到文件
2.输入重定向
在开始之前,先来讲一个工具
wc -option -file
其中的参数
-l 统计出现的行数(line)
-c 统计出现的字符数 (character)
-w 统计出现的单词数 (word)
一般用法,都是这样
wc -l < file //用于统计文件一共有多行
还可以配合while循环
28.If
其语法如下
if 条件判断
then
代码
elif 条件判断
then
代码
else
代码
fi
if一般都是结合 (())来使用的
可以看见是能够完成的!!!
29.While
while呢有以下两种写法
多行写法
while (())
do
代码
done
单行写法
while 条件 ; do 代码体 ;代码体 ; .......;done ;
分别来展现一下
30.For
for的代码如下
for x in var1 var2 var3 ....
do
代码体
done
还有一种方式
for x in {start .. end}
do
代码体
done
c语言行为
for ((i=start;i<=end;i++))
do
代码块
done
以上就是shellcode的一部分内容,以后有机会再把他补充完整