Shellcode ---> 脚本命令入门

news2024/11/18 15:31:29

今天来浅讲一下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
  1. sudo 指的是以管理员身份运行
  2. chmod 其实就是change mode的缩写
  3.  -R  表示递归地应用权限更改到目录及其所有内容上
  4. 000 每一个数字分别对应了 文件所有者 文件所属组  其他用户
  5. /home 就是根目录

执行了这个之后你就会发现你的home目录下的所有东西都打不开了(除非你是root)

  然后就是下一条命令

chmod -R a-rwx /home

这个的效果和上面类似

  1. chmod还是change mode
  2. -R  递归地应用权限更改到目录及其所有内容上
  3. a表示所有用户
  4. -rwx  意思就是取消可读,可写,可执行的权限 
  5. /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.环境变量

对于环境变量,可以分为以下两类

  1. 系统环境变量
  2. 用户自定义环境变量

怎么查看呢?

env  //查看系统的环境变量
set  //查看系统,用户自定义环境变量,以及函数

对于一些常见的环境变量

1.HISTFILE

这个可以查询当前用户执行命令的历史列表

echo $HISTFILE

cat /root/.zsh_history

2.LANG

这个环境变量可以用来搜索系统的字符集

echo $LANG

3.PATH

这个可以查看Linux的环境变量

echo $PATH

6.用户自定义局部变量

1.自定义规则

  1. 变量可以有字母,下划线,数字,但是不能以数字开头
  2. 等号两边不能有空格!!!
  3. 在bash环境中,变量默认是字符串类型,无法直接进行数值运算
  4. 变量两边如果有空格,必须要用双引号括起来
  5. 不能用shell的关键字来作为变量名称
  6. 字符串不需要用 "" '' 这些括起来!!!

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}

这个呢是用来获取用户的输入参数的, 而且它有如下规则

  1. 当n在 1-9的时候,{}可以选择不写
  2. 当n>=10的时候,{}必须要写,否则就是获取的第一个参数,并且拼接一个0返回
  3. 当n取0的时候 你输出他就是用来获取当前脚本的名字

下面我们来演示一下

2. ${#}

这个是可以用来获取当前输入参数的个数

 可以看见是能成功获取的

3. ${@} && ${*}

对于以上两个 ,用法可以分为一下操作

  1. 直接使用  $@ $* 的时候,它会直接获取输入的参数 
  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.关于字符串

对于变量的格式,如果是字符串,那么是有三种形式的

  1. var='whoami'
  2. var="whoami"
  3. var=whoami

这三种方式都是可以的!!! 

但是,我们一般推荐使用双引号

因为双引号中,可以对${}这种变量进行解析,并且在使用转义符号的情况下,可以嵌套双引号

2.关于字符串的拼接

对于拼接,我们常用双引号拼接

echo "${var1} 我是拼接 ${var2}"

     然而

对于获取字符串的长度,我们可以这样

echo ${#var1}

  能成功获取到字符串的长度

3.关于字符串的截取

这个不是重点,我们就直接讲一种方法就行

 这个意思就是从左边开始的位置截取length的长度

4.关于数组

对于shell中的数组,有两种定义方法(只有一维数组)

  1. nums=(1 2 3 4 2 56 'itheima'  'whoami')
  2. 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 

首先我们来讲一下它的参数先

  1. -p  用于在用户输入的时候做提示(和python中的input的提示差不多)
  2. -s 静默模式,用户的输入将不会被回显
  3. -t 用于限制用户的输入时间
  4. -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.字符比较运算符

[[]] 和 [] 

相对于 [] ,[[]]更加强大

 

嘻嘻,是不是一目了然!!  而且

  1. [[]]不会发生单词分割
  2. [[]] 不需要对  > < 这些进行转义
  3. 而且 [[]] 可以比较整数,小数,字符串!!!! 

功能十分强大!!

20.布尔运算符

先来讲一下它的参数

 ! 取反

-o 就是我们所说的 or

-a 也就是我们所说的 and

而且,他们一般是跟着 [] 去和test来使用的 !!!

21.逻辑运算符

 还是先来看一下它的参数 

&& 也就是 and

||  也就是 or

当然了 这两个要结合 [[]] 或者(())来用才有用

一下是他们之间的区别

22.文件的检测

 

说那么多,我们来挑一个文件试试不就知道了??  我们就挑1.sh这个文件试一试把!!!

先编辑文件内容

讲几个注意点

  1. file的路径不要错  ,而且!!!!!!!! 引用的时候要用 $file 而不是file 当时红温了
  2. if后面跟的是 [[]] 
  3. 注意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.输入重定向

一般分为以下的几种格式

  1. 命令>file 将执行结果覆盖性地输出到文件里面
  2. 命令>> file  将执行结果追加性地输出到文件里面
  3. 命令  2>file 将执行的错误结果覆盖性地输出到文件里面
  4. 命令 2>>file 将执行的错误结果追加性地输出到文件里面
  5. 命令 >> 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的一部分内容,以后有机会再把他补充完整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1485081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

if-else if-else 语句

if-else if -else语句 定义&#xff1a;是多条件分支语句&#xff0c;即根据多个条件来控制程 序执行的流程。 语法格式&#xff1a; if (表达式) { 若干语句 } else if (表达式) { 若干语句 } … … else { 若干语句 }

云轴科技ZStack与华东师范大学共建产教融合基地

近日&#xff0c;上海云轴信息科技有限公司&#xff08;云轴科技ZStack&#xff09;与华东师范大学上海国际首席技术官学院宣布&#xff0c;共同打造产教融合基地&#xff0c;以促进人才培养与产业需求的全方位融合。这一举措旨在深化教育与产业的合作关系&#xff0c;培养更多…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

Unity AI生成全景图制作天空盒

现在的AI很强大。 其中&#xff0c;有这样一个网站&#xff0c;通过输入提示词&#xff0c;选择某种风格就可以为你生成360全景图。 网页链接 一、生成全景图 打开网页后&#xff0c;如图&#xff1a; 勾选&#xff0c;点击CONFIRM。 点击GET STARTED&#xff0c;进入主页。…

JavaScript 基本数据类型的详解

JavaScript的基本数据类型 以下都是JS内置的几种类型 数据类型描述number数字&#xff0c;不区分整数和小数string字符串类型booleantrue 真, false 假undefined表示未定义的值null只有唯一的值 null&#xff0c;表示空值 number 数字类型 JavaScript 中不区分整数和浮点数&…

使用mysqld --install命令时出现MSVCR120.dll文件丢失错误

Visual C 2013 and Visual C Redistributable Package https://support.microsoft.com/en-us/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package 进去之后先找到自己的版本&#xff0c;x64还是x86&#xff0c;下载 vcredit &#xff0c;进行安装即…

Sora核心之一:可变时长、分辨率、尺寸

Overview 一、总览二、摘要三、引言四、方法4.1、架构改动4.2、训练改变4.3、NaViT的效率 NaViT 一、总览 题目: Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution 机构&#xff1a;Google DeepMind 论文: https://arxiv.org/pdf/2307.06304…

AG32 MCU 如何进入低功耗模式

默认情况下&#xff0c;微控制器(MCU)在系统复位或电源复位后处于运行模式。当CPU不需要持续运行时&#xff0c;可以使用几种低功耗模式来节省功耗。这是由用户选择的模式&#xff0c;给出了低功耗&#xff0c;短启动时间和可用的唤醒源之间的最佳妥协。 AG32VF 系列MCU具有以下…

LeetCode 刷题 [C++] 第226题.翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 题目分析 深度优先搜索&#xff08;DFS&#xff09;- 递归方式 对于二叉树的镜像问题&#xff0c;很容易想到的就是使用递归来解决&#xff0c;自底向上依次翻转每一个节点…

python类型注解,多态详解

目录 1.类型注解 1.变量的类型注解 2.函数&#xff08;方法&#xff09;的类型注解 3.union类型 2.多态 抽象类 1.类型注解 1.变量的类型注解 #基础数据类型注解 import randomv1 : int 10 v2 : str "aaa" v3 : bool True#类对象类型注解 class student:p…

kafka文件存储机制和消费者

1.broker文件存储机制 去查看真正的存储文件&#xff1a; 在/opt/module/kafka/datas/ 路径下 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 如果是6415那么这个会存储在563的log文件之中&#xff0c;因为介于6410和10090之间。 2.…

linux的通信方案(SYSTEM V)

文章目录 共享内存(Share Memory)信号队列&#xff08;Message Queue&#xff09;信号量(semaphore) 进程间通信的核心理念&#xff1a;让不同的进程看见同一块资源 linux下的通信方案&#xff1a; SYSTEM V 共享内存(Share Memory) 特点&#xff1a;1.共享内存是进程见通信最…

图论 - 最小生成树(Prime、Kruskal)

文章目录 前言Part 1&#xff1a;Prim算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;Kruskal算法求最小生成树1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客介绍两种求最小生成树的方法&#xff…

使用OpenCV和mediapipe实现手部信息抓取

目录 运行效果 挨行解读 &#xff08;1&#xff09;初始化MediaPipe Hand模块 &#xff08;2&#xff09;打开摄像头 &#xff08;3&#xff09;初始化计时器 &#xff08;4&#xff09;开始程序主题部分 &#xff08;5&#xff09;读取视频帧 &#xff08;6&#xff09…

c++基础知识补充5

隐式类型转换型初始化&#xff1a;如A a1, 与全局类没有区别&#xff0c;只是受主类的类域限制&#xff0c;内部类天生是主类的友元 采用匿名构造如A()代替A aa可以加速编译器优化 接收建议新创建一个对象

基于springboot+vue的科研工作量管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

大模型(LLM)的token学习记录-I

文章目录 基本概念什么是token?如何理解token的长度&#xff1f;使用openai tokenizer 观察token的相关信息open ai的模型 token的特点token如何映射到数值&#xff1f;token级操作&#xff1a;精确地操作文本token 设计的局限性 tokenizationtoken 数量对LLM 的影响训练模型参…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

【GitHub】修改默认分支

GitHub的默认分支为main&#xff0c;但我们常常习惯使用master作为默认分支&#xff0c;那在GitHub上如何将master修改为默认分支呢&#xff1f; 全局修改 点击头像&#xff0c;选择菜单栏中的设置 输入master作为默认分支&#xff0c;然后执行updating即可&#xff01; 单项…

【Java数据结构】——二叉搜索树

目录 &#x1f388;概念 &#x1f388;操作-查找 &#x1f388;操作-插入 &#x1f388;操作-删除&#xff08;难点&#xff09; &#x1f388;概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&a…