128 lines
2.7 KiB
Markdown
128 lines
2.7 KiB
Markdown
# 纯算模式
|
||
|
||
## 适用目的
|
||
|
||
在确定目标不是纯验证码图片题之后,用这份文档选择更细的纯算路径。
|
||
|
||
## 一、标准签名题
|
||
|
||
### 核心结构
|
||
|
||
```text
|
||
request params
|
||
-> normalize / stringify / sort
|
||
-> inject token / timestamp / ua
|
||
-> hash / encrypt
|
||
-> final sign
|
||
```
|
||
|
||
### 高频模式
|
||
|
||
- `query_string -> sha1 -> md5`
|
||
- `token&t&appKey&data -> md5`
|
||
- `client + mysticTime + product + key -> md5`
|
||
- `params -> aes -> aes -> rsa`
|
||
|
||
### 必查点
|
||
|
||
1. 原始串字段顺序
|
||
2. URL 编码和 JSON 序列化格式
|
||
3. token、cookie、UA、时间戳来源
|
||
4. 是否还有响应解密链
|
||
|
||
## 二、Cookie / Header 题
|
||
|
||
### 核心结构
|
||
|
||
```text
|
||
source(cookie/storage/location)
|
||
-> builder
|
||
-> header/cookie writer
|
||
```
|
||
|
||
### 优先动作
|
||
|
||
1. Hook `document.cookie`
|
||
2. Hook `fetch` / `XMLHttpRequest.send`
|
||
3. 记录 header/body 最终长相
|
||
4. 回溯 writer 上游
|
||
|
||
### 常见坑
|
||
|
||
- 把初始化 cookie 当成业务 cookie
|
||
- 只记录最终值,不记录写入调用栈
|
||
- 漏掉页面状态和 location 参数
|
||
|
||
## 三、JSVMP / VMP 题
|
||
|
||
### 高危信号
|
||
|
||
- 数组很大
|
||
- 大量位运算
|
||
- switch 分发密集
|
||
- 值逐位拼接
|
||
|
||
### 推荐打法
|
||
|
||
1. 先找最终输出和中间数组
|
||
2. 先做低风险 AST:字符串表、常量折叠、死代码删除
|
||
3. 对数组写入点、对象取值点、位运算点做 logpoint
|
||
4. 先恢复中间 payload,再恢复最终编码
|
||
|
||
### 不要这样做
|
||
|
||
- 不要要求 AST 一次性完整还原 VM
|
||
- 不要用普通断点硬扛高频状态机
|
||
- 不要在没抓到中间态前整体迁移整段 VM
|
||
|
||
## 四、Wasm 题
|
||
|
||
### 高危信号
|
||
|
||
- `WebAssembly.instantiate`
|
||
- 导出函数直接影响 sign
|
||
- JS 中只看到薄封装
|
||
|
||
### 推荐打法
|
||
|
||
1. 找 wasm 加载点
|
||
2. 找导出函数名
|
||
3. 喂固定输入看输出
|
||
4. 能改写成 JS/Python 则优先改写
|
||
5. 只在必要时再做深度反编译
|
||
|
||
## 五、标准算法与自定义编码的分界
|
||
|
||
很多复杂题不是“整题都是自定义算法”,而是:
|
||
|
||
```text
|
||
标准参数归一化
|
||
-> 中间 payload
|
||
-> 自定义转序/位运算/编码
|
||
-> 标准 hash 或再次包装
|
||
```
|
||
|
||
优先把这 4 段拆开,不要整段一起抄。
|
||
|
||
## 六、固定不稳定输入
|
||
|
||
纯算落地前,优先固定这些值:
|
||
|
||
- `Date.now()`
|
||
- `Math.random()`
|
||
- `crypto.getRandomValues`
|
||
- cookie 中的动态 token
|
||
- `navigator.userAgent`
|
||
- challenge 初始化对象
|
||
|
||
如果不先固定这些输入,经常会出现“长度对、值不对”。
|
||
|
||
## 七、最小落地结果
|
||
|
||
完成一题后,至少沉淀这些内容:
|
||
|
||
1. `build_input(...)`
|
||
2. `build_raw_string(...)` 或 `build_payload(...)`
|
||
3. `sign(...)` / `encrypt(...)`
|
||
4. 一个浏览器对齐样本
|
||
5. 一个本地校验样本 |