第八届“强网”拟态防御国际精英挑战赛-线上预选赛 writeup
字数 3978 2025-11-11 12:32:56

第八届“强网”拟态防御国际精英挑战赛线上预选赛 Writeup 教学文档

1. Blockchain

1.1 题目背景

区块链可视化管理前端项目 WeBASE 部署后通常挂在 /WeBASE-Front/ 路径下。

1.2 解题步骤

  1. 路径猜测:在 URL 后直接添加 /WeBASE-Front/ 路径访问
  2. 输入测试
    • 尝试输入 0:无效果
    • 尝试输入 1:出现输入框
  3. 数据解析
    • 输入 1 后得到一段编码数据,这是对 SystemConfigPrecompiled(地址 0x000...1000)的调用
    • 方法为 setValueByKey(string key, string value),将系统配置项 tx_count_limit 设为 "2"
  4. ABI 解码:对输入数据进行 ABI 解码,得到密文:
    buiqhrvilHwigdClBuiTucduZnXmrLoHleieggbawsgsgcAyaFekhqWmAvqTocwhBuiiARfyurergyhNprwePcHcurmQsmGmqopirdhliaWpdRwIvhRphqgNproiBgGevBaRwfsyifiAlRvQpvglwfsemLQeBzswpnrkhbwmiAsXkcFjWvrXlLtuDbVsiRvyiqStWgcHwsxlLqqilrfCwfCmmqiWlPwhogSxuybMuvXmPncLbnrxPcGmitiWzgHbWhxXkcgfQtlxhQhxiakiUmtNprmvPcGmitiWecWhoeiegzMjWymxlaofwefyVgbyaFvmYyzmmGg
    
  5. 维吉尼亚解密:根据题目提示使用维吉尼亚密码解密,密钥为 ineedyou

1.3 最终结果

Flag: flag{ineedyou}

2. Unsafe Parameters

2.1 密码学背景

基于论文 "共用私钥指数 d 的格攻击"(ijeie-2017-v7-n2-p79-87.pdf):

  • 针对 r=3 的多素数 RSA 系统
  • n=5 组公钥,共用同一个私钥指数 d

2.2 攻击原理

  1. 场景还原

    • 生成 5 组三素数模数 Ni = pi × qi × ri(每个素数 512 位)
    • 统一使用同一个 425-bit 私钥指数 d
    • 对每个模数计算 ei ≡ d⁻¹ (mod φ(Ni))
    • 所有素数求和后参与 AES 密钥派生
  2. 关键等式

    • RSA 等式:ei × d = 1 + ki × φ(Ni)
    • 对三素数模数:φ(Ni) = Ni - si,其中 si = (pi + qi + ri) - 1
    • 规模约为 Ni²/³
  3. 格构造

    • 选择缩放量 M ≈ N²/³
    • 构造 (n+1) 维格,基矩阵包含 ei 和 -Ni
    • 目标短向量包含分量 1-kisi 和 dM

2.3 攻击步骤

  1. LLL 算法

    • 对构造的格应用 LLL 约简算法
    • 找到包含 dM 的最短向量
    • 计算 d = |wn+1| / M
  2. 模数分解

    • 计算 ki = (ei × d - 1)
    • 使用 Miller 型因式分解法分解每个 Ni
    • 得到三素数 pi, qi, ri
  3. 密钥恢复与解密

    • 计算所有素数之和:sum = Σ(pi + qi + ri)
    • 派生 AES 密钥:key = sha3_512(str(sum)).digest()[:16]
    • 使用 AES-ECB 解密密文得到 flag

3. EZMiniAPP

3.1 题目分析

  • 获取 wxapkg 文件(微信小程序包)
  • 无需传统解包,可直接用记事本打开分析

3.2 加密逻辑

  1. 入口函数onCheck() 调用 customEncrypt(a, t),实际执行 enigmaticTransformation(a, t)
  2. 比较机制:加密结果与固定字节数组比较
  3. 反调试检测
    • 函数 sub_00402000 初始化阶段检测调试器
    • 读取 /proc/self/status 检查 "TracerPid" 字段
    • 使用 LD_PRELOAD 钩住 strlen/memcmp 可绕过

3.3 加密算法分析

  1. RC4 魔改

    • KSA:标准 RC4 的 S-box 初始化
    • PRGA:每产出字节前进行 rounds 次预热迭代
    • 反馈机制:Y[i] = M[i] ⊕ KS[i] ⊕ prev(i),prev(0) = S[0]
  2. 仿射变换

    • 对字母进行 7 × a + 11 数学转换
    • 逆向映射可恢复原始字符

3.4 动态分析技巧

  1. Hook 技术:使用 gcc 编译钩子程序
  2. 字符分析:输入单一字符 ch,观察加密输出模式
  3. 密钥恢复newKey2025!

3.5 最终结果

Flag: flag{r0uNd_Rc4_Aff1neEnc1yp7!}

4. HyperJump

4.1 调试分析

  1. 断点设置:在比较函数处下断点
  2. 加密特性:单字节加密,与密文对应位置独立比较
  3. 已知信息:flag 头格式已知

4.2 反调试绕过

  • 修改条件判断,让程序进入 if 分支
  • 将 jnz 改为 jz,提高爆破效率

4.3 爆破方法

  1. 初始测试:使用全相同字符(如数字、小写字母)
  2. 位置识别:观察哪个位置跳转到不同分支
  3. 逐位确定:对每个位置尝试可见字符,确定正确字节

4.4 最终结果

Flag: flag{m4z3d_vm_jump5__42}

5. Ciallo_Encrypt

5.1 信息收集

  1. 日志分析:发现 base64 编码数据
  2. GitHub 搜索:找到作者仓库和 forks
  3. 历史记录:在 commit 历史中发现凭证信息

5.2 登录凭证

  • 账号:3517508570@qq.com(HTML 实体解码后)
  • 密码:f42e16b836b22e83fd3818b603c75dc6(仓库名的 MD5)

5.3 加密算法分析

  1. 参数格式
    • ciallo_str:无多余换行符的输入字符串
    • ts_str:字符串格式的时间戳
  2. 加密方式:AES-ECB 模式,MD5 派生密钥

5.4 仓库爆破

  1. 脚本开发:爆破私人仓库的 commit ID
  2. 有效发现:找到额外 commit e58e
  3. 算法恢复:从 commit 中获取完整加密逻辑

5.5 最终结果

Flag: flag{9f08699d-1b6c-471e-9ed0-86dbf3ee8074}

6. The Hidden Link

6.1 流量分析

  • 协议:UDP 流量
  • 工具:Wireshark

6.2 数据提取

  1. 流追踪:追踪 UDP 流 12
  2. 模式识别:发现四个字符一组的分片数据
  3. 数据拼接:提取并拼接有意义的 flag 片段

6.3 最终结果

Flag: flag{dr0n3_fl1ght_c0ntr0ll3r_h4ck3d}

7. smallcode

7.1 代码审计

  1. 功能点
    • $_POST['context']:写文件功能,文件名限制为 1.txt
    • $_POST['env']:设置环境变量
  2. 命令执行:最终执行 wget 从 host hhhh 下载文件

7.2 利用技术

  1. 环境变量注入
    • 设置 LD_PRELOAD=/var/www/html/1.txt(绝对路径)
    • 构造恶意动态链接库
  2. Payload 构造
    __attribute__((constructor)) void exploit() {
        system("恶意命令");
    }
    

7.3 权限提升

  1. SUID 利用:发现 nl 命令具有 SUID 位
  2. GTFObins 参考:使用标准提权技术
  3. Flag 读取:成功获取权限后读取 flag

8. safesecret

8.1 代码审计

分为两部分:SSRF 绕过和 SSTI 绕过

8.1.1 SSRF 绕过

  1. 目标:访问内网路由 /_internal/secret
  2. 限制绕过
    • 利用 JSON 解析异常触发 walked_steps ≥ ERROR_COUNT
    • walked_steps = len(history) - 1
  3. 重定向构造
    • Refresh 响应头
    • HTML Meta Refresh
    • X-Next 头(需要特定响应码)
  4. Payload:构造 7 次重定向使 walked_steps = 6

8.1.2 SSTI 绕过

  1. 限制条件
    • 字符串长度 ≤ 47
    • 过滤关键字:read、下划线等
  2. 全局变量利用
    • 发现 ssetsget 方法加载到全局变量
    • 使用 sget.__globals__.read('filename')
  3. Payload 构造:长度刚好 47 字符

8.2 最终结果

通过组合利用获取 flag

9. babystack

9.1 保护检查

  • 开启 NX 保护

9.2 漏洞分析

  1. 溢出点read(0, v2, 0x100) 存在栈溢出
  2. 目标修改:将变量 v3 修改为 0x1337ABC

9.3 利用脚本

from pwn import *

payload = b'A' * offset + p32(0x1337ABC)

10. Stack

10.1 保护检查

  • 完整保护:Canary, NX, PIE, RELRO

10.2 漏洞利用

  1. 溢出点:两个栈溢出点
  2. 利用思路
    • 使用 mprotect 将 bss 段设置为可执行
    • 执行 shellcode 读取 flag

10.3 SROP 技术

  1. 第一个溢出:控制 saved rbp
  2. 系统调用:利用 read 返回值为 0xf 调用 sigreturn
  3. 利用链
    • ROP1:泄露 libc,读入 ROP2
    • ROP2:orw 读取 flag

11. can

11.1 题目背景

  • 模拟 CAN 总线 ISO-TP 协议
  • 接收三类帧:SF、FF、CF

11.2 漏洞分析

  1. 帧格式
    • SF:单帧,直接携带数据
    • FF:首帧,指示总长度
    • CF:连续帧,按序号拼接
  2. 漏洞点sub_1840 中边界检查滞后,造成越界写入

11.3 利用步骤

  1. 信息泄露:通过日志打印泄露函数地址,计算基址
  2. ROP 链构造
    • ROP1:泄露 libc,读入 ROP2
    • ROP2:orw 读取 flag
  3. 回调函数劫持:覆盖 completion_callback 指针

11.4 最终结果

成功读取 flag 文件内容


本教学文档详细分析了第八届"强网"拟态防御国际精英挑战赛线上预选赛的各题目解题思路和关键技术点,涵盖了区块链安全、密码学攻击、逆向工程、漏洞利用等多个网络安全领域。

第八届“强网”拟态防御国际精英挑战赛线上预选赛 Writeup 教学文档 1. Blockchain 1.1 题目背景 区块链可视化管理前端项目 WeBASE 部署后通常挂在 /WeBASE-Front/ 路径下。 1.2 解题步骤 路径猜测 :在 URL 后直接添加 /WeBASE-Front/ 路径访问 输入测试 : 尝试输入 0 :无效果 尝试输入 1 :出现输入框 数据解析 : 输入 1 后得到一段编码数据,这是对 SystemConfigPrecompiled (地址 0x000...1000 )的调用 方法为 setValueByKey(string key, string value) ,将系统配置项 tx_count_limit 设为 "2" ABI 解码 :对输入数据进行 ABI 解码,得到密文: 维吉尼亚解密 :根据题目提示使用维吉尼亚密码解密,密钥为 ineedyou 1.3 最终结果 Flag : flag{ineedyou} 2. Unsafe Parameters 2.1 密码学背景 基于论文 "共用私钥指数 d 的格攻击" (ijeie-2017-v7-n2-p79-87.pdf): 针对 r=3 的多素数 RSA 系统 n=5 组公钥,共用同一个私钥指数 d 2.2 攻击原理 场景还原 : 生成 5 组三素数模数 Ni = pi × qi × ri(每个素数 512 位) 统一使用同一个 425-bit 私钥指数 d 对每个模数计算 ei ≡ d⁻¹ (mod φ(Ni)) 所有素数求和后参与 AES 密钥派生 关键等式 : RSA 等式:ei × d = 1 + ki × φ(Ni) 对三素数模数:φ(Ni) = Ni - si,其中 si = (pi + qi + ri) - 1 规模约为 Ni²/³ 格构造 : 选择缩放量 M ≈ N²/³ 构造 (n+1) 维格,基矩阵包含 ei 和 -Ni 目标短向量包含分量 1-kisi 和 dM 2.3 攻击步骤 LLL 算法 : 对构造的格应用 LLL 约简算法 找到包含 dM 的最短向量 计算 d = |wn+1| / M 模数分解 : 计算 ki = (ei × d - 1) 使用 Miller 型因式分解法分解每个 Ni 得到三素数 pi, qi, ri 密钥恢复与解密 : 计算所有素数之和:sum = Σ(pi + qi + ri) 派生 AES 密钥:key = sha3_ 512(str(sum)).digest()[ :16 ] 使用 AES-ECB 解密密文得到 flag 3. EZMiniAPP 3.1 题目分析 获取 wxapkg 文件(微信小程序包) 无需传统解包,可直接用记事本打开分析 3.2 加密逻辑 入口函数 : onCheck() 调用 customEncrypt(a, t) ,实际执行 enigmaticTransformation(a, t) 比较机制 :加密结果与固定字节数组比较 反调试检测 : 函数 sub_00402000 初始化阶段检测调试器 读取 /proc/self/status 检查 "TracerPid" 字段 使用 LD_ PRELOAD 钩住 strlen/memcmp 可绕过 3.3 加密算法分析 RC4 魔改 : KSA:标准 RC4 的 S-box 初始化 PRGA:每产出字节前进行 rounds 次预热迭代 反馈机制:Y[ i] = M[ i] ⊕ KS[ i] ⊕ prev(i),prev(0) = S[ 0 ] 仿射变换 : 对字母进行 7 × a + 11 数学转换 逆向映射可恢复原始字符 3.4 动态分析技巧 Hook 技术 :使用 gcc 编译钩子程序 字符分析 :输入单一字符 ch,观察加密输出模式 密钥恢复 : newKey2025! 3.5 最终结果 Flag : flag{r0uNd_Rc4_Aff1neEnc1yp7!} 4. HyperJump 4.1 调试分析 断点设置 :在比较函数处下断点 加密特性 :单字节加密,与密文对应位置独立比较 已知信息 :flag 头格式已知 4.2 反调试绕过 修改条件判断,让程序进入 if 分支 将 jnz 改为 jz,提高爆破效率 4.3 爆破方法 初始测试 :使用全相同字符(如数字、小写字母) 位置识别 :观察哪个位置跳转到不同分支 逐位确定 :对每个位置尝试可见字符,确定正确字节 4.4 最终结果 Flag : flag{m4z3d_vm_jump5__42} 5. Ciallo_ Encrypt 5.1 信息收集 日志分析 :发现 base64 编码数据 GitHub 搜索 :找到作者仓库和 forks 历史记录 :在 commit 历史中发现凭证信息 5.2 登录凭证 账号 :3517508570@qq.com(HTML 实体解码后) 密码 :f42e16b836b22e83fd3818b603c75dc6(仓库名的 MD5) 5.3 加密算法分析 参数格式 : ciallo_str :无多余换行符的输入字符串 ts_str :字符串格式的时间戳 加密方式 :AES-ECB 模式,MD5 派生密钥 5.4 仓库爆破 脚本开发 :爆破私人仓库的 commit ID 有效发现 :找到额外 commit e58e 算法恢复 :从 commit 中获取完整加密逻辑 5.5 最终结果 Flag : flag{9f08699d-1b6c-471e-9ed0-86dbf3ee8074} 6. The Hidden Link 6.1 流量分析 协议 :UDP 流量 工具 :Wireshark 6.2 数据提取 流追踪 :追踪 UDP 流 12 模式识别 :发现四个字符一组的分片数据 数据拼接 :提取并拼接有意义的 flag 片段 6.3 最终结果 Flag : flag{dr0n3_fl1ght_c0ntr0ll3r_h4ck3d} 7. smallcode 7.1 代码审计 功能点 : $_POST['context'] :写文件功能,文件名限制为 1.txt $_POST['env'] :设置环境变量 命令执行 :最终执行 wget 从 host hhhh 下载文件 7.2 利用技术 环境变量注入 : 设置 LD_PRELOAD=/var/www/html/1.txt (绝对路径) 构造恶意动态链接库 Payload 构造 : 7.3 权限提升 SUID 利用 :发现 nl 命令具有 SUID 位 GTFObins 参考 :使用标准提权技术 Flag 读取 :成功获取权限后读取 flag 8. safesecret 8.1 代码审计 分为两部分:SSRF 绕过和 SSTI 绕过 8.1.1 SSRF 绕过 目标 :访问内网路由 /_internal/secret 限制绕过 : 利用 JSON 解析异常触发 walked_ steps ≥ ERROR_ COUNT walked_ steps = len(history) - 1 重定向构造 : Refresh 响应头 HTML Meta Refresh X-Next 头(需要特定响应码) Payload :构造 7 次重定向使 walked_ steps = 6 8.1.2 SSTI 绕过 限制条件 : 字符串长度 ≤ 47 过滤关键字:read、下划线等 全局变量利用 : 发现 sset 和 sget 方法加载到全局变量 使用 sget.__globals__.read('filename') Payload 构造 :长度刚好 47 字符 8.2 最终结果 通过组合利用获取 flag 9. babystack 9.1 保护检查 开启 NX 保护 9.2 漏洞分析 溢出点 : read(0, v2, 0x100) 存在栈溢出 目标修改 :将变量 v3 修改为 0x1337ABC 9.3 利用脚本 10. Stack 10.1 保护检查 完整保护:Canary, NX, PIE, RELRO 10.2 漏洞利用 溢出点 :两个栈溢出点 利用思路 : 使用 mprotect 将 bss 段设置为可执行 执行 shellcode 读取 flag 10.3 SROP 技术 第一个溢出 :控制 saved rbp 系统调用 :利用 read 返回值为 0xf 调用 sigreturn 利用链 : ROP1:泄露 libc,读入 ROP2 ROP2:orw 读取 flag 11. can 11.1 题目背景 模拟 CAN 总线 ISO-TP 协议 接收三类帧:SF、FF、CF 11.2 漏洞分析 帧格式 : SF:单帧,直接携带数据 FF:首帧,指示总长度 CF:连续帧,按序号拼接 漏洞点 : sub_1840 中边界检查滞后,造成越界写入 11.3 利用步骤 信息泄露 :通过日志打印泄露函数地址,计算基址 ROP 链构造 : ROP1:泄露 libc,读入 ROP2 ROP2:orw 读取 flag 回调函数劫持 :覆盖 completion_ callback 指针 11.4 最终结果 成功读取 flag 文件内容 本教学文档详细分析了第八届"强网"拟态防御国际精英挑战赛线上预选赛的各题目解题思路和关键技术点,涵盖了区块链安全、密码学攻击、逆向工程、漏洞利用等多个网络安全领域。