Shellcode ---> 脚本命令入门

2024-03-02 17:52
文章标签 入门 命令 脚本 shellcode

本文主要是介绍Shellcode ---> 脚本命令入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天来浅讲一下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.sh2.bash
我一般用这个 bash  flag.sh3. ./
这个要求自身文件自身可以执行,并且具有可执行权限
##或者你先 chmod一下 !!

4.多命令执处理

这里我就直接拿黑马程序员的一道题目来演示吧

首先我要创建一个文件目录

mkdir /root/itheima

然后切换进入这个文件夹

cd /root/itheima

然后再创建并且编辑batch.sh这个文件

touch batch.sh 
vim batch.sh

以下是文件内容

#! /bin/bashtouch one.txt 
echo "Hello Shell" >>one.txt

然后就是去运行,并且查看这个文件了

bash batch.sh
cat one.txt

可以看见是成功执行

 这样我们就完成了多命令的处理

5.环境变量

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

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

怎么查看呢?

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

对于一些常见的环境变量

1.HISTFILE

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

echo $HISTFILEcat /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/bashVAR$="我想摆烂"
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
donebash 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的一部分内容,以后有机会再把他补充完整

这篇关于Shellcode ---> 脚本命令入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766948

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显