一,学习加密算法RC4,tea,编码Base64
1.学习加密算法RC4
RC4(Rivest Cipher 4)是一种流密码算法,由Ron Rivest于1987年设计。它以其简单性和速度而闻名,曾经被广泛应用于各种安全协议中,如早期的SSL/TLS(用于保护网页安全)和WEP(用于保护Wi-Fi网络)。它是一种对称密钥算法,即加密和解密使用相同的密钥。
RC4的工作原理
RC4的核心在于生成一个伪随机字节流(称为密钥流),然后将这个密钥流与明文(需要加密的数据)进行异或(XOR)操作来生成密文。解密时,使用相同的密钥再次生成相同的密钥流,并与密文进行异或操作即可恢复出明文。
算法主要包含两个部分:
密钥调度算法(Key Scheduling Algorithm - KSA):
- 初始化一个256字节的数组 $S$(称为S盒),通常 $S$ 被初始化为 $S[i] = i$($i$ 从 0 到 255)。
- 使用用户提供的密钥(长度可变)来打乱这个 $S$ 盒。
RC4的特点和安全性
- 优点: 算法简单、实现容易、运行速度快。
- 缺点(安全性问题):
- 密钥相关偏差: RC4生成的密钥流在初始阶段存在统计偏差(称为“初始字节问题”或“偏差”),攻击者可以利用这些偏差来恢复密钥或明文。
- 密钥重用风险: 绝对不能使用相同的密钥流加密不同的数据(即不能重用密钥),否则攻击者可以轻易恢复明文。
- 弱密钥: 存在某些密钥,使得生成的密钥流更易被预测。
- 已知攻击: 存在多种针对RC4的实际攻
RC4是一种历史悠久的流密码算法,曾因其高效性而被广泛采用。然而,其固有的安全缺陷导致它最终被淘汰。在需要加密的现代应用中,应避免使用RC4,转而采用更安全的替代方案。
2.tea
TEA(Tiny Encryption Algorithm)是一种轻量级对称加密算法,由David Wheeler和Roger Needham于1994年提出。它以简洁高效著称,适用于资源受限的环境(如嵌入式系统)。以下是核心要点:
算法原理
基本结构
TEA采用Feistel网络结构,将64位明文分成两个32位块($L_0$、$R_0$),通过多轮迭代(通常64轮)混淆数据。
每轮操作包含:- 轮函数:$F(R, K) = \left( (R \ll 4) + K_0 \right) \oplus \left( R + \delta \right) \oplus \left( (R \gg 5) + K_1 \right)$
- 更新规则:
$$ \begin{cases} L_{i+1} = R_i \ R_{i+1} = L_i + F(R_i, K) \end{cases} $$
密钥与常量
- 密钥:128位,分为4个32位子密钥($K_0, K_1, K_2, K_3$)。
- 常量$\delta$:固定值$0x9e3779b9$(黄金分割数衍生值),用于增强非线性。
安全性
- 优点:结构简单、执行速度快,抗已知明文攻击。
- 弱点:
- 易受相关密钥攻击(Related-key Attack)
- 每轮数据变化较小,需足够轮数(建议≥64轮)。
- 改进版本:XTEA(扩展TEA)和XXTEA(支持可变块长)弥补了部分缺陷。
3.编码Base64
Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方案,常用于数据传输和存储中,以避免二进制数据的特殊字符问题。其核心原理是将输入数据划分为固定大小的块(通常为3字节),然后将每个块转换为4个Base64字符。Base64字符集包含64个字符:大写字母A-Z、小写字母a-z、数字0-9,以及符号+和/,填充字符=用于处理输入长度不足的情况。
编码过程
- 输入处理:将输入数据视为字节序列(例如字符串的字节表示)。
- 分组:将字节序列分成每组3字节(24位)。如果输入长度不是3的倍数,则使用0字节填充剩余部分。
- 位操作:对于每组3字节$b_1, b_2, b_3$(每个字节为8位),组合成一个24位整数: $$v = (b_1 \ll 16) | (b_2 \ll 8) | b_3$$ 其中$\ll$表示左移位操作。
- 提取6位组:将24位整数$v$分成4个6位组:
- 第一组:$g_1 = (v \gg 18) \mathbin{&} 63$
- 第二组:$g_2 = (v \gg 12) \mathbin{&} 63$
- 第三组:$g_3 = (v \gg 6) \mathbin{&} 63$
- 第四组:$g_4 = v \mathbin{&} 63$ 这里$\gg$表示右移位操作,$\mathbin{&}$表示位与操作,63是$2^6 - 1$(即6位最大值)。
- 字符映射:每个6位组$g_k$(范围0-63)映射到Base64字符集中的一个字符:
- 索引0-25: A-Z
- 索引26-51: a-z
- 索引52-61: 0-9
- 索引62: +
- 索引63: /
- 填充处理:如果输入字节数不是3的倍数,则添加填充字符=:
- 剩余1字节:添加两个填充字符(编码为2个Base64字符和2个=)。
- 剩余2字节:添加一个填充字符(编码为3个Base64字符和1个=)。
二,解决upx壳
一、使用UPX官方工具
二、动态调试脱壳
定位OEP(原始入口点)
- 在调试器中单步跟踪
- 观察
jmp指令跳转目标地址 - 典型特征:跳转后出现
push ebp等标准入口代码
内存转储
- 到达OEP后暂停执行
- 使用调试器的内存转储功能(如OllyDbg的
Scylla插件) - 修正IAT(导入地址表)
三、自动化工具
常用工具:
UPXUnpacker:专用脱壳脚本x64dbg/OllyDbg:配合脱壳插件PEiD:先检测壳版本再选择对应方法