SEKAI CTF 部分WP(我超,初音未来)

 第一次参加国际赛,感觉不是很差,至少能看懂题目

总共852队 

附上菜鸡团队最终排名照(排在155)

附上竞赛网址:

Project SEKAI CTF 2022

(1)Vocaloid Heardle(misc)

根据题目提示,发现这应该不是一道隐写相关的题目

下载他给的两个文件,标有flag字样的mp3文件打开后不是一段杂音,而是一段关于miku以及其他二次元歌手的音声混剪

扔给音频分析工具果然也没有收获

之后打开py文件做分析

主函数读取flag文件中的字符串,截取flag中间部分,并且将其中的字符逐个转化为十进制后再调用函数

两个函数中上面那个是先获取json资源,然后根据主函数传过来的十进制数找到数值相同musicID,并且又根据musicID将其中的资源包名称给变量resource

下面那个函数则是根据变量resource打开相应资源并将相应的mp3文件写入本地mp3文件中

最下面的操作看不太懂,但是可以大胆猜测整体逻辑是根据flag字段转化而来的十进制逐个到资源页面搜索相应的音乐,最后的操作估计是将所有音乐合并为一个音乐文件,也就是flag.mp3

打开相应json资源页面

https://sekai-world.github.io/sekai-master-db-diff/musicVocals.json

仔细看其中有一段日文显示字样,可能是歌曲名称

但是网易云听歌识曲后的结果并未搜到,翻译后发现其实只是虚拟歌姬的日文

但是在此网站下面发现了一个关键词assetbundleName

就是在同一类中寻找的

然后根据下方代码打开网站

随便打开一个就是mp3资源页面

大概逻辑如下:

(1)将截取后的flag字段转化为十进制,到

https://sekai-world.github.io/sekai-master-db-diff/musicVocals.json

页面中寻找与十进制相对应的musicID

(2)在json界面中根据musicID在同一类中寻找assetbundleName

(3)打开根据assetbundleName打开相应资源页面 

(4)将资源页面中的歌曲下载到本地

(5)最后剪辑成为一个混剪

坏消息是只能通过给出的flag.mp3文件中的混剪,从歌曲资源页面中逐个去听,如果对应上了,则此歌曲的musicID序号即为flag某一字段的十进制。

当然也可以将资源页面所有歌曲以及混剪歌曲都做一遍听歌识曲后再逐一对应

好消息是由于ASCII表示是有限制的,以及可以先听常在flag中出现的字段(0~9,大小写字母),所以缩小范围后人工听也还可以,需要注意的是每一首音乐有不同版本,比如有miku版的以及歌手版等等

从头到尾一遍听下来只有一个没听到,考虑是特殊字符,再听听发现是‘<’

最后得到flag:

SEKAI{v0CaloId<3u}

   

2Matrix Lab 1re

​​​​​​​

下载文件后发现是.class文件,丢到IDEA里面去反编译

主函数分析发现flag长度为43,并且被分为三段,中间一段被传参到solve函数

到solve函数

首先字符串被转化为二维函数(6*6)

接下来一通操作(实现矩阵中每个数的移位)

接下来再对矩阵进行加密

getArray是将矩阵的两行合并为一个字符串(其中一行是反着来)

encrypt则是先做了一个栅栏加密,然后再根据一个十进制数(密钥)做一个异或

这种同类型操作做了三组,所以最后flag由三组构成

写出脚本

#include <iostream>
using namespace std;

int len=6;

int tempres[6][6];
string de(string key,int num){
    char str[12];
    for(int i=0;i<12;i++){
        key[i]^=num;
    }
    
    int var3=5;
    int var4=6;
    for(int i=0;i<12;i++){
        str[var3--]=key[i];
        str[var4++]=key[i+1];
        i++;
    }
     
    return str;
}

void re_getArray(string temp,int fi,int se){
    
    int j=0;
    for(int i=0;i<len;i++){
        tempres[fi][i]=temp[j];
        j++;
    }
    
    for(int i=0;i<len;i++){
        tempres[se][len-1-i]=temp[j];
        j++;
    }
}

void re_solve(){
    int length=6;
    for(int var2 = 0; var2 <= length / 2; ++var2) {
            for(int var3 = 0; var3 < length - 2 * var2 - 1; ++var3) {
                char var4 = tempres[var2 + var3][length - 1 - var2];
                tempres[var2 + var3][length - 1 - var2]=tempres[length - 1 - var2][length - 1 - var2 - var3];
                tempres[length - 1 - var2][length - 1 - var2 - var3]=tempres[length - 1 - var2 - var3][var2];
                tempres[length - 1 - var2 - var3][var2]=tempres[var2][var2 + var3];
                tempres[var2][var2 + var3]=var4;
            }
        }
    
}
 int main()    
{
     string key1="oz]{R]3l]]B#";
     string key2="50es6O4tL23E";
     string key3="tr3c10_F4TD2";
     
     string temp_key1=de(key1,2);
     string temp_key2=de(key2,1);
     string temp_key3=de(key3,0);
     
    re_getArray(temp_key1,0,5);
    re_getArray(temp_key2,1,4);
    re_getArray(temp_key3,2,3);
     
    re_solve();
    
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            printf("%c",tempres[i][j]);
        }
    } 

    
}

得到flag:

(3)Perfect Match X-treme(re)

 打开之后是一个糖豆人demo

玩了一下,本来下面方块显示的都是水果,但是最后那个显示器上却显示了

类似于这个玩意

果然不是直接玩游戏就能直接拿flag的

 果断到用winRAR打开压缩包,然后搜索关键字SEKAI

居然找到了 

进入到相应文件中

左下角那个H3CK_15_加到SEKAI{F4LL_GUY5_ 与1LL3G4L}中间即可

得到SEKAI{F4LL_GUY5_H3CK_15_1LL3G4L}

(然后就快乐的拿到了490+左右的分数)

猜你喜欢

转载自blog.csdn.net/weixin_51681694/article/details/127172655
ctf