本次实战通过逆向分析一款使用4位PIN码的文件加密工具,深入解析其Salsa20算法的加密逻辑,并最终编写Python脚本完成PIN码的暴力破解,成功恢复原始文件。
被加密的文件flag.png.enc是一个经加密的PNG图像文件,目标是通过逆向获取加密算法并爆破PIN码进行解密,还原出原始的flag.png。
逆向分析思路
由于PIN码仅为4位数字(0000-9999),因此暴力破解是可行的。关键在于通过逆向分析,确定加密算法和密钥生成方式,从而编写有效的解密脚本。
逆向分析过程
首先尝试使用工具进行一次文件加密操作,观察其行为。随后使用逆向分析工具进行静态分析。
1. 定位关键函数
在反汇编代码中,根据字符串“encrypted”进行交叉引用,可以快速定位到与文件加密处理相关的核心函数区域。
2. 处理花指令
在分析关键函数时,遇到了花指令,导致代码流分析异常。通过IDA Pro手动识别并修复堆栈不平衡的问题。具体操作为:选中被混淆的代码块,按下C键将其重新定义为代码,并进行重新分析。对于简单的单指令花指令,通常使用nop指令填充即可。
分析后发现,程序由Rust语言编译而成,处理其他相关函数时也采用了相同的方法去除干扰。
3. 核心算法分析
经过清理后,可以对主逻辑函数进行分析。在主函数(main_func)附近,确认了其功能是获取用户输入的文件内容。
真正的加密逻辑位于另一个函数(sub_140039890)中。在该函数内部,发现了对Findcrypto函数的调用,并识别出核心加密算法为Salsa20。
Salsa20是一种流密码,加密时需要32字节的密钥(key)和8字节的随机数(nonce)。算法使用密钥和随机数生成一个伪随机密钥流,然后与明文进行异或操作。
在加密函数的初始化部分,观察到了如0x61707865、0x3320646E等常量的加载,这些是Salsa20算法内部状态的固定常数,进一步确认了算法类型。
解密脚本编写
基于逆向分析结论:
- 加密算法:Salsa20。
- Key:由4位数字PIN码补齐至32字节(如“1234”补齐为
1234\x00\x00...)。
- Nonce:分析内存或逻辑后确定为固定值
b'\x24\x24\x24\x24\x24\x24\x24\x24'。
- 原始文件为PNG格式,其固定文件头为
\x89\x50\x4E\x47。
可以编写Python脚本进行爆破。脚本遍历0000至9999的所有PIN码,用其生成密钥,尝试解密flag.png.enc文件,并用PNG文件头验证解密是否成功。
from Cryptodome.Cipher import Salsa20
cipher_data = open("flag.png.enc", "rb").read()
for i in range(10000):
# 将PIN码格式化为4位字符串,并补齐为32字节作为Salsa20密钥
key = str(i).rjust(4, '0').ljust(32, '\x00')
nonce = b'\x24\x24\x24\x24\x24\x24\x24\x24'
sal = Salsa20.new(key=key.encode(), nonce=nonce)
plain_data = sal.decrypt(cipher_data)
# 通过判断PNG文件头验证解密成功
if plain_data.find(b"\x89\x50\x4E\x47") >= 0:
open("flag.png", "wb").write(plain_data)
print(f"[+] Success! PIN is: {str(i).rjust(4, '0')}")
break
运行脚本后,即可成功爆破出正确的PIN码,并得到解密后的flag.png文件。本实战结合了静态逆向分析与脚本编写,完整展示了针对简单文件加密工具的破解流程。
|