前言:学习笔记。
下载 解压 查壳。
64位ida打开。
进入主函数。
很容易得知,这是一个RC4加密。
【
(题外话)
在reverse中,RC4考点,不会很难。
reverse中RC4关键点就是,抓住异或。
一般解这种题,都可以在xor处下断点去,看看加密后的值。
】
此题,在RC4加密完后,与0x22进行异或与密文进行对比。
先得到与0x22异或前的数据。(flag_RC4_encode)
编写RC4解密脚本:
""" 未魔改的RC4,逆向推导明文"""
def rc4(key, data):
S = list(range(256))
j = 0
out = []
# Key-scheduling algorithm (KSA)
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
# Pseudo-random generation algorithm (PRGA)
i = j = 0
for char in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
k = S[(S[i] + S[j]) % 256]
out.append(char ^ k)
return bytes(out)
key = b'12345678abcdefghijklmnopqrspxyz' # RC4_Key值。
ciphertext = bytes.fromhex('BCC5127D852384717B392802D351F32C892BA62CAF09') # RC4加密后的值。
plaintext = rc4(key, ciphertext)
print(f"明文:{plaintext.decode()}") # 解密。
在线工具也可以。
flag{nice_to_meet_you}