QwindF 发表于 2024-7-27 18:36

【Web】CrackMe 花费了我一下午

后天就开学了,想着再上上论坛,发现好久没写Crackme了,于是就有了这个作品。
还是老样子,密码唯一,有很多提示(密码提示很多次了)。

没有Edge的用win10版本
两个一样的





Arcticlyc 发表于 2024-7-27 19:52



以下来自通义千问
为了找到满足条件的输入值,我们需要逆向工程函数 `complexLogic` 的操作,并找到使得函数返回 `true` 的初始值 `t`。

我们首先回顾一下函数中的关键步骤:
1. 输入值 `t` 被转换成整数 `r`。
2. `e = ~r` (按位取反 `r`)。
3. `o = 31 * e` (将 `e` 乘以 31)。
4. `n = o - 2024` (从 `o` 中减去 2024)。
5. `W = n << 2` (将 `n` 左移 2 位)。
6. `d = W / 7` (将 `W` 除以 7)。
7. `a = d + 50` (向 `d` 加上 50)。
8. `u = Math.floor(13 * a)` (将 `a` 乘以 13 并向下取整)。
9. 如果 `u` 不等于 3312927722,则返回 `false`。
10. 循环计算 `r` 直到 `c` 达到 18。
11. `v = r`。
12. 如果 `v` 等于 314937684510,则返回 `true`。

现在,让我们从步骤 8 开始逆向操作,因为我们已经知道了 `u` 和 `v` 的目标值。

### 逆向步骤 8:
- `u = Math.floor(13 * a)`
- `a = (u / 13)`
- `d = a - 50`
- `W = 7 * d`
- `n = W >> 2` (右移 2 位,相当于除以 4)
- `o = n + 2024`
- `e = o / 31`
- `r = ~e`

### 逆向步骤 10:
- 我们需要找到一个 `r` 的值,使得经过循环之后 `v = r` 等于 314937684510。

我们首先计算 `u` 和 `v` 的逆向过程,然后再考虑循环的影响。

### 计算 `u` 的逆向过程:
- `u = 3312927722`
- `a = (u / 13) = 254840594`
- `d = a - 50 = 254840544`
- `W = 7 * d = 1783883808`
- `n = W >> 2 = 445970952`
- `o = n + 2024 = 446173404`
- `e = o / 31 = 14392690`
- `r = ~e = -14392691`

### 计算 `v` 的逆向过程:
- `v = 314937684510`

我们需要找到一个初始值 `r`,使得在执行循环后得到 `v`。

### 循环逆向:
- 循环中 `r` 的变化由以下公式给出:
- `r = (r + c) * (c % 2 === 0 ? 2 : 3)`

由于循环是从 `c = 8` 到 `c = 18`,我们可以尝试逆向执行这个循环来找出原始的 `r`。

让我们先尝试逆向执行循环,看看能否找到原始的 `r`。

### 逆向循环:
- 我们需要从 `v = 314937684510` 开始逆向。
- 从 `c = 18` 到 `c = 8`,对每个 `c` 执行逆向操作。
- 如果 `c` 是偶数,我们用 `r / 2 - c` 替代 `r`。
- 如果 `c` 是奇数,我们用 `Math.floor(r / 3) - c` 替代 `r`。

现在我们开始逆向循环。

### 逆向循环示例:
- `c = 18`: `r = Math.floor(v / 3) - 18`
- `c = 17`: `r = Math.floor(r / 3) - 17`
- `c = 16`: `r = r / 2 - 16`
- `c = 15`: `r = Math.floor(r / 3) - 15`
- `c = 14`: `r = r / 2 - 14`
- `c = 13`: `r = Math.floor(r / 3) - 13`
- `c = 12`: `r = r / 2 - 12`
- `c = 11`: `r = Math.floor(r / 3) - 11`
- `c = 10`: `r = r / 2 - 10`
- `c = 9`: `r = Math.floor(r / 3) - 9`
- `c = 8`: `r = r / 2 - 8`

现在我们将计算逆向循环的每一步。

```javascript
let v = 314937684510;

// 逆向循环
for (let c = 18; c >= 8; c--) {
    if (c % 2 === 0) {
      v = v / 2 - c;
    } else {
      v = Math.floor(v / 3) - c;
    }
}

console.log(v);
```

让我们计算出这个逆向循环的结果。
以上来自通义千问




QwindF 发表于 2024-7-27 19:21

好像忘记处理其他情况了,没有输出验证成功的都算失败吧(
图中有提示

RustAbra 发表于 2024-7-28 00:42

1、格式化js会陷入无限正则解析;
2、debugger可以通过修改if条件强制绕过(typeof _0x585341 === _0x208e4a(539, "*kVT")处);
3、complexLogic是扔到console一行一行反混淆的{:17_1089:};
耗时接近2.5小时。
我牛逼!楼主更牛逼!

chenxingfeng 发表于 2024-7-28 08:06

han5562877 发表于 2024-7-28 10:21

还是可以c一下的哈哈, 好久没做题了, 没想到是个exe

DRZH 发表于 2024-7-28 15:26

Arcticlyc 发表于 2024-7-27 19:52
以下来自通义千问
为了找到满足条件的输入值,我们需要逆向工程函数 `complexLogic` 的操作,并找 ...

大佬好强,学到很多{:1_932:}
通义千问计算 u 的逆向过程那部分有点小错误,从n = W >> 2 = 445970952这一步往后按这样推的话最后是推不出r的,已知结果再从前往后推的话会发现1783883808这个数是由-627770872 << 2 得出来的

Arcticlyc 发表于 2024-7-28 16:29

DRZH 发表于 2024-7-28 15:26
大佬好强,学到很多
通义千问计算 u 的逆向过程那部分有点小错误,从n = W >> 2 = 445970952这 ...

你才是大佬{:301_1003:}
页: [1]
查看完整版本: 【Web】CrackMe 花费了我一下午