die查看一下
elf64位
这里有key,下面也有提示是RC4
发现s是获取环境的,nc一下环境获取enc密文。
这里查看rc4初始化的内容,对比一下正常的RC4代码,为什么在第二个循环里面嵌套了多一个for循环呢
但是对比起来这里发现是在j=(j+s[i]+k[i])%256这里多加了一个1300
再查看加密部分
再次对比原来的两个代码段,发现这里多加了一个0x14,也就是20
思路:
就是在RC4初始化这里加多了一个1300,导致s盒和原来的不相同,逆向回来的时候也还是加1300,为什么呢,因为我们得到的s盒是要和我们的明文去异或的,异或再异或这个数等于不变
所以s盒的算法该加还是加
但是加密算法是加多了一个0x14,故逆向回去的时候则需要减去一个0x14
exp:如下
def swap(S, i, j):
S[i], S[j] = S[j], S[i]
def rc4_init(K):
S = list(range(256))
T = [K[i % len(K)] for i in range(256)]
j = 0
for i in range(256):
j = (j + S[i] + T[i] + 1300) % 256
swap(S, i, j)
return S
def rc4_crypt(S, Data):
x = y = 0
result = []
for byte in Data:
x = (x + 1) % 256
y = (y + S[x]) % 256
swap(S, x, y)
t = (S[x] + S[y]) % 256
# 使用相应的解密逻辑
decrypted_byte = (byte - 20) ^ S[t]
result.append(decrypted_byte)
return result
def main():
K = bytearray("welcometoylctf", 'utf-8') # 密钥
flag = bytearray([
0x91, 0x86, 0x1b, 0x2d, 0x9e, 0x6f, 0x24, 0x26,
0x7b, 0xa3, 0x98, 0xf1, 0xd2, 0x89, 0x22, 0x18,
0x3a, 0xec, 0x30, 0x2d, 0x80, 0x2a, 0x46, 0x67,
0x6c, 0x76, 0x53, 0x77, 0x51, 0x26, 0x0a, 0xeb,
0x84, 0x79, 0x5c, 0xd1, 0xb6, 0x80, 0x5a, 0xf4,
0xb8, 0x34, 0xa6
])
S = rc4_init(K) # 初始化 RC4
decrypted_flag = rc4_crypt(S, flag) # 解密 flag
print("Decrypted flag:", ''.join(chr(b & 0xff) for b in decrypted_flag)) # 打印解密后的 flag
if __name__ == "__main__":
main()
#Decrypted flag: YLCTF{a91a9f69-492f-45bb-a1e3-aeb1d52417e0}