ezre
这是一道混合加密base64的改表和rc4的魔改
加密原理
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。
RC4算法中的几个关键变量:
1:S-Box 也就是所谓的S盒,是一个256长度的char型数组,每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换。
2:密钥K char key[256] 密钥的长度keylen与明文长度、密钥流的长度没有必然关系
3:临时向量k 长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给k,否则,轮转地将密钥的每个字节赋给k
原文链接:https://blog.csdn.net/xiao__1bai/article/details/123357156
1.先拖入exe查看,直接拖入ida64
从这里直接观察到有一串字符有base64的特征(关于base64,我的上一篇博客有写)
是一串base64加密直接到赛博厨子解密得不到什么,先保留下来,然后继续观察
3pn1Ek92hmAEg38EXMn99J9YBf8=
然后F5进入伪代码逐一点进去分析函数
这里直接看到就是一个rc4的128位,分析应该上面的Thi5_1S_key?就是密钥
但是没有加密之前的data,然后继续往后看
这里就是一个base64改表,点进下面那个a0123456789xyza就能得到改过的表
得到改过的表然后可以网上找一个脚本得到数据0123456789XYZabcdefghijklABCDEFGHIJKLMNOPQRSTUVWmnopqrstuvwxyz+/
import base64
str1 = "3pn1Ek92hmAEg38EXMn99J9YBf8="
#str1是要解密的代码
string1 = "0123456789XYZabcdefghijklABCDEFGHIJKLMNOPQRSTUVWmnopqrstuvwxyz+/"
#string1是改过之后的base64表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
#b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"'
b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"'
得到没经过rc4解密的数据然后又知道密钥,写出脚本得到flag
def key(box, key):
for i in range(128): #初始化T表
box[i] = i
j = 0
for i in range(128): #将s盒打乱
j = (j + box[i] + key[i % len(key)]) & 127
box[i], box[j] = box[j], box[i]
def encrypt(box, input):
output = []
k = 0
for i in range(len(input)): #得到密钥流加密
j = (i + 1) & 127
k = (box[j] + k) & 127
box[k], box[j] = box[j], box[k]
output.append(box[(box[j] + box[k]) & 127] ^ input[i])
return bytes(output)
box = [0] * 128
key(box, b'Thi5_1S_key?')
print(encrypt(box,(b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"')))
# flag{Simple_rEvErse}
flag{Simple_rEvErse}
还有一个方法是动态调试,但是我f8单步进入的时候有问题