CISCN2022华中分区部分wp
字数 2206 2025-08-06 21:48:51
CISCN2022华中分区赛题解与教学文档
Web安全部分
Web1 - 目录穿越漏洞利用
漏洞分析:
- 题目存在目录穿越漏洞,通过构造特殊路径访问服务器上的敏感文件
- 最终目标是找到flag.php文件
解题步骤:
- 尝试使用
../等目录遍历技术访问上级目录 - 通过不断尝试发现flag.php文件路径
- 直接访问flag.php获取flag
教学要点:
- 目录遍历漏洞原理:未正确过滤用户输入的路径参数
- 常见利用方式:
../、..\、编码绕过等 - 防御措施:规范化路径、白名单过滤、禁用特殊字符
Web2 - 文件上传漏洞利用
漏洞分析:
- 通过BurpSuite抓包发现响应中有identity字段
- 添加identity字段后获得隐藏上传页面A0ther_hldden_PaGe.php
- 存在文件上传漏洞但限制为.jpg扩展名
解题步骤:
- 上传.htaccess文件使服务器解析.jpg文件为PHP
AddType application/x-httpd-php .jpg - 上传包含恶意代码的图片马(.jpg)
- 使用蚁剑等工具连接WebShell
- 在服务器上查找并获取flag
教学要点:
- .htaccess文件的作用与配置
- 文件上传漏洞的绕过技巧
- 图片马的制作方法
- 防御措施:文件类型检查、内容检测、禁用危险功能
PWN部分
Pwn1 - HTTP请求处理中的堆漏洞
漏洞分析:
- 模拟HTTP请求处理过程的程序
- 在edit功能中存在off-by-NULL漏洞
- 环境:libc2.27,开启沙箱需要ORW(open/read/write)绕过
利用步骤:
- 通过堆布局构造合适的内存结构
- 利用off-by-NULL触发堆合并
- 泄露libc地址计算基址
- 构造ROP链绕过沙箱限制
- 最终通过ORW读取flag文件
关键代码:
# 泄露libc地址
add('a'*0x450)
add('b'*0xa0)
delete(0)
add('a'*0x450)
show(0)
libc_base = u64(ru('\x7f')[-6:].ljust(8,b'\0')) - 0x3ebca0
教学要点:
- off-by-NULL漏洞原理与利用
- libc地址泄露技术
- 沙箱绕过技术(ORW)
- HTTP协议模拟与交互
逆向工程部分
Re1 - Android APK逆向(RC4算法)
分析过程:
- 反编译APK发现自定义encode函数
- 识别出明显的RC4算法特征
- 编写解密脚本还原flag
RC4解密脚本:
def rc4_main(key = "init_key", message = "init_message"):
s_box = rc4_init_sbox(key)
crypt = rc4_excrypt(message, s_box)
return crypt
def rc4_init_sbox(key):
s_box = list(range(256))
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
return s_box
def rc4_excrypt(plain, box):
plain = base64.b64decode(plain.encode('utf-8'))
plain = bytes.decode(plain)
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i] + 136) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
return "".join(res)
教学要点:
- RC4算法原理与实现
- Android APK逆向基本流程
- 加密算法识别技巧
- 动态调试与静态分析结合
Re3 - Python PYD逆向(迷宫问题)
分析过程:
- 分析main.py和PYD文件
- 恢复迷宫地图(101x101)
- 识别地图元素:
- 'S': 起点
- 'X': 终点
- '0': 墙
- '1': 路
迷宫求解算法(DFS):
void dfs(int x,int y,int len) {
vis[x][y] = 1;
if(flag == 1) return;
if(f[x][y] == '2') { // 终点
for(int j = 0;j<=len;++j)
cout<<leng[j];
flag = 1;
return;
}
for(int i = 0;i<4;++i) { // 四个方向
int nx = x+x1[i];
int ny = y+y1[i];
if(nx<0||ny<0||nx>=n||ny>=n||vis[nx][ny] == 1)
continue;
if(f[nx][ny] == '0') // 墙
continue;
leng[len] = w[i]; // 记录路径
dfs(nx,ny,len+1);
vis[nx][ny] = 0;
}
}
教学要点:
- Python PYD文件逆向分析
- 迷宫算法实现(DFS/BFS)
- 游戏逆向基本方法
- 路径记录与输出
密码学部分
密码1 - LCG算法破解
题目分析:
- 线性同余生成器(LCG)算法:
s_{n+1} = (a*s_n^2 + b*s_n + c) mod n - 已知:b, n, seed, s1, s2, c1, c2
解题步骤:
- 根据seed, s1, s2建立方程求解a和c
- 通过c1, c2的关系恢复flag
- 注意题目描述与实际代码的差异
关键计算:
a = (((s2-s1)-b*(s1-seed))*gmpy2.invert((pow(s1,2)- pow(seed,2)),n))%n
c = (-a*s1**2 - b*s1 + s2)%n
flag = ((c11-c)*gmpy2.invert(a,n)%n)
教学要点:
- LCG算法原理与破解
- 模运算与逆元计算
- 密码题目中的陷阱识别
- 多解情况的处理
密码2 - 共模攻击
题目分析:
- 三组RSA加密,使用相同的模数n
- 通过GCD计算发现n1和n2有公共因数p
解题步骤:
- 计算n1和n2的GCD得到p
- 计算q = n/p
- 计算私钥d = e^-1 mod (p-1)(q-1)
- 解密得到明文
关键代码:
p = gmpy2.gcd(n1,n2)
q1 = n1//p
d1 = gmpy2.invert(e1,(q1-1)*(p-1))
print(long_to_bytes(pow(c1,d1,n1)))
教学要点:
- RSA算法原理
- 共模攻击的条件与方法
- 大数分解技巧
- 多组相关加密数据的处理
杂项(Misc)部分
Misc1 - 内存取证分析
分析过程:
- 使用Volatility分析内存转储
- 发现notepad进程中有关键信息:
- Python脚本片段(文件操作)
- 密码提示"Achilles heel"相关
- 发现并提取flag.zip加密文件
- 通过XOR爆破恢复原始zip
- 使用密码"Ank1eAnk1e"解压
关键发现:
- notepad中保存的XOR加密脚本
- 画图程序中的密码提示
- 内存中的egg1.rtf文件包含flag
教学要点:
- 内存取证基本流程
- 进程内存分析技巧
- XOR加密破解方法
- 密码心理学与提示分析
Misc2 - ZIP伪加密与明文攻击
解题步骤:
- 识别ZIP伪加密特征
- 使用工具修复伪加密
- 或使用已知明文攻击破解
教学要点:
- ZIP文件结构分析
- 伪加密原理与修复
- 明文攻击条件与方法
- 常用工具使用(bkcrack等)
Misc3 - PNG隐写分析
解题步骤:
- 使用binwalk发现隐藏的压缩包
- 修改PNG尺寸提取压缩包
- 使用LSB隐写分析提取flag
教学要点:
- 文件格式分析与隐写识别
- LSB隐写原理与工具使用
- 文件修复技巧
- 多层级隐写分析方法
总结
本比赛涵盖了网络安全竞赛的多个领域,每道题目都考察了不同的技术点:
- Web安全:目录穿越、文件上传漏洞利用
- PWN:堆漏洞利用、沙箱绕过
- 逆向工程:算法识别、游戏逆向
- 密码学:LCG破解、RSA共模攻击
- 杂项:内存取证、文件隐写分析
关键学习点:
- 多技术领域综合能力
- 漏洞利用的创造性思维
- 算法分析与逆向能力
- 密码学原理的实际应用
- 数字取证与隐写分析技巧