SCM APK Writeup 1. p1/p2/p3/p4 在哪里校验 四段输入最终都会进入 PasswordValidator.validateAndDecrypt(context, p1, p2, p3, p4): PasswordValidator.smali 这一个函数就是总校验入口。它的逻辑可以概括成: 先在 Java/Kotlin 层校验 p1 再在 Java/Kotlin 层结合 p1 校验 p2 调 native 校验 p3 调 native 校验 p4 全部通过后,用 p1+p2+p3+p4 拼成 key 去解密 flag.enc 关键调用点分别在: p1 校验主体...
完整 WP 这题按你给的思路,核心链路是: ZIP 伪加密 -> 修标志位 -> 解出 task.mp4 -> 提取 audio.wav -> Echo Hiding 解码 -> Morse -> Atbash -> ISCC{...} 这份新附件最终跑出的结果是: ISCC{GNU6+/W0KKF2(B/} 1. 识别 ZIP 伪加密 附件是 attachment-4 (1).zip。 它不是“真加密”,而是 ZIP 头里的加密标志位被置了。 我检查到: 本地文件头 PK\x03\x04 的加密位是正常的 中央目录头 PK\x01\x02 的加密位被置成了 1 这会导致很多解压工具误以为它需要密码。 修法就是把这两个位置的最低位清...
这题的核心是两段“夜班遗留逻辑”叠起来用: .git 泄露拿源码历史 历史源码里同时泄露了 JWT 调试密钥和内部接口签名密钥 入口点 访问首页后,先看前端脚本: GET /static/main.js 返回: document.addEventListener("DOMContentLoaded", () => { window.__buildTrace = "/.git/HEAD"; }); 这基本就是明示去读 .git。 继续访问: GET /.git/HEAD GET /.git/refs/heads/master 拿到分支头提交哈希,然后递归拉取 Git object,还原仓库历史。 还原出的关键信息 当前版本...
WP APK 先用 apktool d 解包,入口在 com.example.mobile01.MainActivity。点击按钮后逻辑在 MainActivity$1.onClick(): input = etFlagInput.getText().toString().trim(); if (!FlagFormatChecker.checkBasicFormat(input)) { wrong; return; } if (FlagDispatcher.dispatchCheck(input)) { success; } else { wrong; } FlagFormatChecker 只检查格式: ISCC{...} 真正校...
Dual Protection WP 题目信息 题目文件:Dual Protection.exe flag 格式:ISCC{} 一、程序基本行为 程序运行后会提示输入: Input Flag: 输入后只会输出两种结果: Correct. Wrong. 通过字符串可以直接看到: Input Flag: %36s Correct. Wrong. 其中 %36s 已经暗示输入长度和 36 很相关。 二、主逻辑分析 主逻辑位于 0x401100 附近,核心流程可以还原为: memset(buf, 0, 0x63); printf("Input Flag: "); scanf("%36s", buf); if (strlen(buf) !=...
在字符串里可以直接看到目标比较值: 000A9CD32B9E4D0D563A190E6B2DC2923ADA53F5BEF22A7A 主逻辑里一共用了 4 个数字: 344, 21, 89, 233 对 {} 内的内容依次进行: RC4(key="344") 与 "21" 循环异或 与 "89" 循环逐字节相加 用 SHA256("233") 的前 16 字节作为 TEA key 加密 转大写十六进制后与目标常量比较 因此只需要逆向还原: 目标 hex 转字节 TEA 解密 去填充 循环减去 "89" 循环异或 "21" RC4 解密,key="344" 还原后得到明文: deaIoihuwuasyIleolyclrt 所以最终...
源码泄露了一个入口 http://39.105.213.28:12601/?source=1 拿到关键代码后,可知有三层校验。 第一层: $filtered = str_replace("key", "", $_GET['step1']); if ($filtered === "key") 这里利用重叠绕过,构造: step1=kkeyey 因为: str_replace("key", "", "kkeyey") === "key" 第二层: $a = $_POST['a'] ?? null; $obj_a = (object)$a; $user_key = $obj_a->key; if (isset($user_key) &&...