基础的几种混淆方式

异或加密

异或加密的一个特点就是计算量小,在混淆shellcdoe特征上是一个比较好的手法,不过基础的异或加密的一个特点就是解密的密钥固定

string = "f" # 要异或的shellcode
key = 11  #你的密钥
def enc(string, key):
    result = ''
    for i in range(len(string)):
        result += chr(ord(string[i]) ^ key)
    return result
data = enc(string, key) #加密后的内容
print(data)


# 对异或后的字符串解密
# 还原的话很简单,在对加密结果异或一下就还原了
#print(enc(data, key)) # 

shellcode = enc(data,key).encode() #调用的shellcode

MAC编码

二进制和MAC地址的字符串形式之间进行转换

from macaddress import MAC


with open("payload.txt","rb") as f:
    #注意6个字节转换一个mac值
    chunk = f.read(6)
    print("MAC =[")
    while chunk:
        if len(chunk)<6:
            padding = 6 - len(chunk)
            #当剩余字节数不满6个可添加\x00补充字节数
            chunk = chunk + (b"\x00" * padding)
            print("{}\'{}\'".format(' '*8,MAC(chunk)))
            break
        print("{}\'{}\',".format(' '*8,MAC(chunk)))
        chunk = f.read(6)
    print("]    ")

IPv4编码

把16进制的Shellcode代码转成10进制,然后组成一个ipv4地址

from ipaddress import ip_address

with open('payload.txt',"rb") as f:
    chunk = f.read(4)
    print("ipv4=[")
    while chunk:
        if len(chunk) < 4 :
            padding = 4 - len(chunk)
            chunk = chunk + (b"\x00" *padding)
            print("{}\'{}\'".format(' '*8,ip_address(chunk)))
            break
        print("{}\'{}\'".format(' '*8,ip_address(chunk)))
        chunk = f.read(4)
    print("]")

AES加密

在Python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量、都需要是bytes(字节型)数据。python 在构建aes对象时也只能接受bytes类型数据。

当秘钥,iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。

ECB

from Crypto.Cipher import AES

key = b'1234567812345678' #秘钥,b就是表示为bytes类型
text = b'1234567812345678' #需要加密的内容,bytes类型
aes = AES.new(key,AES.MODE_ECB) #创建一个aes对象
# AES.MODE_ECB 表示模式是ECB模式
en_text = aes.encrypt(text) #加密明文
den_text = aes.decrypt(en_text) # 解密密文
print("密文:",en_text)
print("明文:",den_text)
shellcode = den_text#调用的shellcode

CBC

CBC模式需要重新生成AES对象

from Crypto.Cipher import AES

key = b'1234567812345678' #秘钥,b就是表示为bytes类型
iv = b'1234567887654321' # iv偏移量,bytes类型
text = b'abcdefghijklmnhi' #需要加密的内容,bytes类型
aes = AES.new(key,AES.MODE_CBC,iv) #创建一个aes对象
# AES.MODE_CBC 表示模式是CBC模式
en_text = aes.encrypt(text) 
print("密文:",en_text) #加密明文,bytes类型
aes = AES.new(key,AES.MODE_CBC,iv) #CBC模式下解密需要重新创建一个aes对象
den_text = aes.decrypt(en_text)
print("明文:",den_text)

关于ecb加密中有一个注意的点就是要将加密的内容做到16的整除才能使用,在不满足的情况下,需要将shellcode后面补充00。

UUID

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,在理论上来说只要能破坏特征的手法都能拿来免杀,但是这种UUID以前很多人都在用,现在效果其实不大好

import uuid

with open('payload.txt',"rb") as f:
    chunk = f.read(16)
    print("uuid=[")
    while chunk:
        if len(chunk) < 16 :
            padding = 16 - len(chunk)
            chunk = chunk + (b"\x00" *padding)
            print("{}\'{}\'".format(' '*8,uuid.UUID(bytes_le=chunk)))
            break
        print("{}\'{}\'".format(' '*8,uuid.UUID(bytes_le=chunk)))
        chunk = f.read(16)
    print("]")
posted @ 2023-07-16 00:34  uein  阅读(77)  评论(0编辑  收藏  举报