霍雅
2024蓝桥杯reverse逆向复现
1.rc4
题目提示rc4,可以猜测为rc4算法
分析主函数,一眼就可以看完
赋值一个字符串到Str
传了一个数组和数组长度和字符串还有个42到一个函数
剩下打印输出str
所以核心加密函数在sub_401005
点进去看还是进一步的传参
点进去看有很多256的特征,是标准的rc4算法,没有魔改
第一种方式
把数组提取出来
通过标准rc4解密代码解密
def rc4(key, data):
S = list(range(256))
j = 0
# 初始化状态数组 S
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i] # 交换 S[i] 和 S[j]
S[j]=S[j]
i = j = 0
output = []
# 加密过程
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换 S[i] 和 S[j]
K = S[(S[i] + S[j]) % 256]
output.append(byte ^ K) # 生成密钥流并加密数据
return bytes(output)
# 示例使用
key = b"gamelab@" # 密钥
plaintext =[0xB6,0x42,0xB7,0xFC,0xF0,0xA2,0x5E,0xA9,0x3D,0x29,0x36,0x1F,0x54,0x29,0x72,0xA8,0x63,0x32,0xF2,0x44,0x8B,0x85,0xEC,0xD,0xAD,0x3F,0x93,0xA3,0x92,0x74,0x81,0x65,0x69,0xEC,0xE4,0x39,0x85,0xA9,0xCA,0xAF,0xB2,0xC6]
#plaintext=b""
# 解密(使用相同的函数)
decryptedtext = rc4(key, plaintext) #
print(decryptedtext)
为什么gamelab@为秘钥呢其实靠猜也能猜出来
从代码分析,因为Str只参与了s盒的生成,
这也是rc4的一个特征
为什么判断他没有魔改呢
这种题,加密逻辑简单,其实都不用看有没有魔改
先用标准函数解一遍,解不出来再考虑魔改
第二章方法就是
仔细会看函数,函数并没有输入和比较功能
根据rc4的特点可以知道,加密和解密都是一个函数完成
所以函数存在自解密
一般像这种题,结尾没有比较或者没有输入都是函数存在自解密
所以直接在return下个断点
flag就出来了
欢乐时光
题目给了提示
flag被使用了算法分成若干个小块,每个块使用相同的加密解密方法,但是这个算法是对称加密,请将分析密文并还原。
说明是分组加密
分组加密的密码有TEA XTEA XXTEA AES DES一般ctf就出这几个
查看主函数
有什么drink cup应该就是tea系列的了
前面那三个不用管,没有参与到后续的加密
然后分析一下逻辑
read输入42个直接到buf
然后经过cry函数传了buf和v5 v5在上面是一个数组
下面是一个比较函数
比较buf是不是等于v6
点进去看像这种结果的tea家是xxtea
tea和xtea长得比较像,都是3行操作去加密
先不管有没有魔改,直接用标准解密去跑
经过前面的分析,buf和v6比较
说明v6是密文,v5是秘钥
除此之外,一般tea加密的秘钥都是4组
把密文和key复制进去
发现是解不出来的
回去看加密
其实做题做的多的,一眼就能看出来是轮速被魔改了
把他改成和题目一样的格式
运行一下flag就出来了
这种题属于是新生赛都放不过第二周的