WHUCTF2025新生赛wp-红石音乐

进入存档,试图切创造无效,发现周围有一个循环型命令方块 所以要先把它拆掉


拆之前注意到命令方块边上有个告示牌,F5切视角拿到flag1:d3QwUl9lc19ydF9p


/fill拆掉之后即可开创造(如果使用air替换的话,flag1的告示牌会被破坏,故建议先看flag1)


轨道的尽头是个岩浆池,注意到有一个告示牌,但正面是fake flag,反面则是flag2:bjEhaGZ1ZVRfdDAz


mc中的大型结构一般是用结构方块生成,在这个结构的一角找到一个结构方块(为方便演示,拆掉了上面的石头)

注意到地板的y值为-59,推断地板地下还有空间,开旁观模式+挂夜视即可在方块下看到悬挂的告示牌 flag3:T21jZHMhdXtfX3Jt


在道路一侧可以看到标有flag4的告示牌

中间部分的玻璃有着一定规律,当成摩斯电码(玻璃块为’_’,玻璃板为’.’,空格正常)

--.. .-- --.. -.- -... .--- ...- ..-.

解码并结合掩码即可得到flag4:ZWZkbjVf


在乐谱结尾部分可以找到一个木桶

里面有一本书和一条hint

书的内容为二进制字符串

根据提示,在文件夹根目录内找到6_digits_bacon.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *char_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+="; // A-Z 65-90; 0-9 30-39; a-z 97-122; + 43; = 61
// 0-25 52-61 26-51 62 63
int get_char_id(char ch){
int id = (int)ch;

if ((id >= 65) && (id <= 90)) id -= 65;
else if ((id >= 30) && (id <= 39)) id += 22;
else if ((id >= 97) && (id <= 122)) id -= 71;
else if (id == 43) id = 62;
else if (id == 61) id = 63;

return id;
}

char* id_to_6_bin(int id){
char* bin_str = (char*)malloc(7 * sizeof(char));
for (int i = 5; i >= 0; i--){
bin_str[5 - i]=((id>>i)&1)?'1':'0';
}
bin_str[6]='\0';
return bin_str;
}

char* six_digits_bacon(char* str){
int len = strlen(str);
int total_length = len * 6 + 1;
char* result = (char*)malloc(total_length * sizeof(char));
result[0] = '\0';

for (int i = 0; i < len; i++){
char ch = str[i];
int char_id = get_char_id(ch);
char* bin_str = id_to_6_bin(char_id);
strcat(result,bin_str);
free(bin_str);
}

return result;
}

根据此脚本即可推出flag5:ZWZkbjVfYXVBUl9z(x)

正确的flag5应该是X2MhY1lhYXVBUl9z,某人抄错了


结构方块从\generated\[命名空间id]\structures中读取外部的结构NBT文件,在此文件夹中找到flag6.nbt,其内容是JSFuck的变种(python版本),使用脚本将其还原为数字

1
2
3
4
5
6
7
def decode(encoded_str):
parts = encoded_str.split(' ')
safe_pattern = re.compile(r'^[()<+,]+$')
for part in parts:
if not safe_pattern.match(part):
raise ValueError(f"Invalid encoded part: {part}")
return ''.join(chr(eval(part)) for part in parts)

再将十进制数转为十六进制,即可还原出flag6

1
2
3
dec: 6510039471362360889
hex: 5a584e6854534639
flag6: ZXNhTSF9

将flag1-flag6拼接在一起,用base64解密,再用栅栏(n=4)解密,即可得到最终flag

1
2
3
4
5
6
7
8
flag1-6:
d3QwUl9lc19ydF9pbjEhaGZ1ZVRfdDAzT21jZHMhdXtfX3JtZWZkbjVfX2MhY1lhYXVBUl9zZXNhTSF9

base64:
wt0R_es_rt_in1!hfueT_t03Omcds!u{__rmefdn5__c!cYaauAR_sesaM!}

flag:
whuctf{Y0u_aRe_a_True_mAsteR_0f_r3dstOne_m5sic_and_M1sc!!!!}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 rhzhr's blog
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信