给出一点神秘的个人解法。

第一步

https://anoth3r.top/st/ 找密码

我们连麦的三人没人意识到 song,所以没有听歌找线索

方法一

暴力,没什么好说的

方法二

易得我们是使用滚轮滑动的, F12找到所有的绑定到 wheel事件上的函数,发现了如下绑定

alt

定位达到文件后不难发现

alt

于是的得到密码

方法三

如果你翻了html,可以发现,输入正确密码后显示的文字在前端一直存在,只是在classList中增/删show alt

alt

无论通过那种方式,可以得到 https://anoth3r.top/PWSD/https://anoth3r.top/dx2025w6

第二步

https://anoth3r.top/dx2025w6 中,调试台中可以发现如下信息

alt

于是我们得到了下一步的入口 https://anoth3r.top/bottle

此处还有一个神秘的点,输入 https://anoth3r.top/dx2025w6/bottle 重定向到 https://anoth3r.top/wp-content/uploads/bottle.png 得到张图片,对第三步的解密有启式作用。是 CCBC12 第一题,解密方式为 模拟倒水的过程。

第三步

https://anoth3r.top/bottle 中,我们发现需要密码,此时回到 https://anoth3r.top/PWSD/ 中,发动人脉拷打朋友得到密码为 Nikaidou Hiro。 alt

alt

输入密码可以得到一张图片,形式上和 CCBC12 第一题 一摸一样,于是可以得到答案为 slotmachine,下一个界面为 https://anoth3r.top/slotmachine

但是其实我们不需要知道密码也能到下一步la----o···hu---j····i(防和谐),如下图

alt

第四步

很遗憾赛时没有意识到这一步,因为我们中的一人发现了神秘东西。

当你尝试注册账号登录后会进入博客后台界面,但是由于权限原因你只能看到最近评论,此时有人点进了 eatwhat,于是直接把第四步跳了 :)

正确解法如下:

切换到深色模式或者鼠标滑动可以发现如下文字:

alt

于是我们可以设置下一次的值,但貌似没什么用

于是我想到逆向spin按钮按下后的过程, 找到绑定的函数,跳转后发现如下代码 alt

显然输入 forceSpin(777) 在 spin 一下后就会出现提示下一步的弹窗,前往 https://anoth3r.top/eatwhat

第五步

https://anoth3r.top/eatwhat 界面不难发现每次刷新界面后的随机数序列不变,可以想到种子是固定的。

同样逆向按钮 click 后调用的函数,找到 button:eatwhat

alt

跳转后发现发现如下代码

alt

于是我们拿到了 和种子 ,以及一个叫 Fisher–Yates 的算法。

可惜的是由于赛时跳步了,我们没能意识到这是其中的一步,转而去分析瓶子去了,并且我们没有发现两张 bottle 的图片其实不一样,我一直在试 (原题答案)。

赛后询问出题人后得知,我们将 每两个组合形成一个数组

alt

逆向从后向前的 Fisher–Yates 算法后得到

alt

转化成字符得到

alt

此时最后两个不是英文字符,想到汉语字符是双字节的,拼起来输出得到中文感叹号

于是谜底为

由出题人得知 可以换成任意姓名。

解密代码如下:

#include <bits/stdc++.h>
using namespace std;

template<typename T> T shuffle(T s) {
    int n = s.size();
    vector<int> nn(n);
    for(int i=n-1;i>0;i--){ 
        nn[i] = rand() % (i + 1); // [0, i]
    }
    for (int i = 1; i < n ; i++) {
        
        swap(s[i], s[nn[i]]);
    }
    return s;
}

int main() {
    srand(197); // 一定要播种

    string s = "79323070616d536148655972207761016b614e7061724520616265ff3236207520";
    vector<string> a;
    
    for(int i=0;i<s.size()-1;i+=2){
        string ss;
        ss += s[i];
        ss += s[i+1];
        a.push_back(ss);
    }
    
    for (auto x : a) cout <<"0x"<< x << ',';
    cout<<'\n';
    a = shuffle(a);
    for (auto x : a) cout <<"0x"<< x << ' ';
    cout<<'\n';
    
    for(auto x:a) cout<<char((('0'<=x[0]&&x[0]<='9')?x[0]-'0':x[0]-'a'+10)*16+(('0'<=x[1]&&x[1]<='9')?x[1]-'0':x[1]-'a'+10));
}

于是就做完了,真是一场酣畅淋漓的 CTF。

以下为究极遗憾实录

alt

alt