2025MoeCTF
Misc
:::info
ak后评价:这几天老是在玩做的比较慢,抽空做完了moectf的misc,总体评价是简单的没边了很适合新手(除了有一题我想的太复杂了自己在那边左脑打右脑,其实贼简单)
有不少音频题,这是别的misc几乎遇不到的
好玩
:::
misc入门指北

一题给了pdf,说


果然很经典就是一个个打上去然后给它调成了白色的看不见而已,如果下边调黑其实也能出

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

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

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

解得moectf{LSB_1s_s0_1nt3rest1ng!!sj9wd}
SSTV

结合提示,这个音频其实就是sstv的电码,听的我耳朵都要炸了
下个RXSSTV解码一下
由于SSTV工具是根据音频传递图片信息,正常解法需要一台设备播放一台设备收音,所以需要一个虚拟声卡,还能避免杂音的干扰。(我不明白为什么我用手机放它接收不到,但是我人声讲话可以)

然后利用虚拟声卡我们就成功得到了flag
moectf{d3codiNG_SStV_reQu1REs-PATI3nC3}
捂住一只耳

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

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

听上去像摩斯电码

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

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

一看就这个最多,括号里还写个png,肯定和这个有关,先导出来看看

应该是png,把前后的多余东西删掉

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

似乎没什么关系
把png放到binwalk看一眼,发现有zlib
这个是default compression,说明文件头是789C
分离一下
查看十六进制,发现这个.zlib文件没啥内容,而这个3E无后缀的文件虽然内容少但是似乎藏着些什么
尝试解密看看能不能干个二维码出来
我真无语了就是直接对照着标准银河字母解密罢了
第一行:the_flag_is_below
第二行:now_you_have
第三行:mastered_enchanting
所以答案就是moectf{now_you_have_mastered_enchanting}。。。无语
ez_png

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

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

看见有俩zlib

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

?直接打开DB7C7的十六进制直接就出了?这也太简单了吧,这不binwalk使用题吗???
这题有上题一半恶心吗,我思考半天结果只是人力解密
flag:moectf{h1DdEn_P4YlOaD_IN-Id4T}
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 1.pdf -n 1 -m 6 -c 0123456789qwertyuiopasdfghjklzxcvbnm
跑半天跑不出来

老实了,直接去破解网站吧


有提示啊,直接搜吧


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

矢量化一下吧

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


跟tls有关,先tcp搜一下log


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

好这个对了,就是这个
给他命名完.log后缀后放入tls


(上边是原来的)

可以看到多了不少文件

这zip都写脸上了,导出一下

果然是个zip,打开来是flag.txt,说是密码是七位纯数字,那爆破起来很方便了(比隔壁lil简单多了)

怎么突然报错了

噢要把这个冗余的删了才算

然后去爆破就好了,很快的,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是7571号文件

额还有第二层?直接把明文写脸上了吗
但是我们找不到多余的信息了
根据明文的提示,我们不可能直接构造flag.txt,一定是通过明文.exe来搞出flag.txt的
这边我们新建文件,直接写4D5A90000300000004000000
直接拿这个最常见的Windows可执行文件12字节来创建个文件尝试明文爆破(主要还是利用了ZipCrypto很老的特点,直到一部分可以推出全部)

去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有问题啊

宽高有问题啊,改改就是了

moectf{Image_Height_Restored}
WebRepo

想到了不好的回忆:指LilCTF


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

有个7zip

定位后提取

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

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


成功在同目录下还原flag
Encrypted volume


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

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

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

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

其实蛮简单一题,就看能不能找到png了,找不到就做不出来,找到了就很顺(其实有点套娃的意思,最后的brainfuck没什么意义)
哈基米难没露躲
是一个txt文件,打开来全是哈吉米

我怀疑有哈吉米编码了

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

搞半天不能用2.0的哈吉米翻译器,必须用1.0的简单base64加盐https://lhlnb.top/hajimi/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}
网谷杯-non-interlaced
Hint:神奇的图片有什么意义呢?
这边随手记录两道网谷杯的题目,两道misc,我也没参赛,别人给的,这边随便记一笔就是了

这题打开发现长成这样子,按顺序一共九张奇怪的图片
按照正常的思路,应该是九张照片按什么顺序有一定做法
先看看1.png好了

扔到随波逐流发现R这一条是有压缩包的样子
我们用stegslove打开,直接Red一行勾选完

然后保存即可,同理看看9.png,发现这个是蓝色的一栏,且有着压缩包的文件尾

然后就水到渠成了,全部按这个颜色顺序一个个来就是了。最后把十六进制拼起来
拼成了压缩包打开,是一个图片

如图
网谷杯-Format-8bits
Hint:看不懂的汉字隐藏了什么秘密呢?

直接binwalk,发现有个压缩包


是一堆乱码,其实一开始我是在想会不会是和422异或什么的,发现不是
结合之前做过的moe的题目
怀疑是乱码修复
问题是之前的网站不太行,这边新找了一个不错
https://xth8013.com/tool/recoverCharset

得解
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


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

直接就出了
Pyjail 1

在我做这个的时候正好看到了这个

先不用,看看源码

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

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

于是得到最后的payload:
print(getattr(builtins, ‘dict‘, builtins)chr(111)+chr(112)+chr(101)+chr(110).read())
具体步骤如图


得到flag
Pyjail 2

内容一致,就只是python程序不一样了(我说就很像web吧?)

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

主要是这样子六步
但由于被禁,我们无法获取__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了,也就是说我们无法调用所有的内置函数
后边的{}也说了我们没有任何的预定义的局部变量
面对这种情况,或许只能利用__import__导入模块了
不知道__import__(‘os’).system(‘’)行不行

可以先试试看,至少简单表达式是可以的
getattr(getattr(().class.base.subclasses()[132].init.globals[‘sys’],’modules’)[‘os’],’read’)(getattr(getattr(().class.base.subclasses()[132].init.globals[‘sys’],’modules’)[‘os’],’open’)(‘/tmp/flag.txt’), 1000)
Crypto
Crypto入门指北

这个入门指北主要讲的就是EIGamal的密码了,是继RSA以来另一个有意思的密码,我觉得值得深挖

所以这题把私钥给泄露了,肯定是能做出来的

利用这个公式就能解出题目的答案
我们直接先求s = pow(c1, x, p)
然后求s的模逆元s_inv = pow(s, -1, p)
最后直接求m = (c2 * s_inv) % p
然后再long_to_bytes即可

moectf{th1s_1s_y0ur_f1rst_ElG@m@l}
ez_DES

分组密码吗?有点意思
先看看什么是DES


我们一步步倒着看

这边知道了c,也知道了这个encrypt函数是啥意思,目前下边的c是key加密的flag内容
而key如下,是五个固定+三个随机

那我们直接写代码逆向回去就好了
注意这边key需要遍历一下

得到答案
Found flag: moectf{_Ju5t envmEra+e.!}
Key: ezdes8br
baby_next


看起来就是rsa的题目呀
前边告诉我们flag一共38位,有八位是moectf{}

题目说很好分解,那我们直接上yafu
果然很好分解
p = 9835790642950870702456388102541833011851580184211232019829465812360043670916676289614924432072209183922656300400121695605187082642402117584019839337925591
q = 9835790642950870702456388102541833011851580184211232019829465812360043670916676289614924432072209183922656300400121695605187082642402117584019839297179867
直接输入rsa(也只会写这个代码了


还是rsa简单
moectf{vv0W_p_m1nu5_q_i5_r34l1y_sm4lI}
ez_square

欸又是rsa的题,还是这个熟练点

这题主要是n不好分解,所以给了个hint来辅助一下,辅助我们得到p和q
一边是(p+q)^2mod(pq)=hint的式子,一边是pq=n的式子,两个等式求p和q两个未知量,正好求解
结合题目,这边hint计算后为平方数
是 2343458209274425996985047093820966198128351630302072151512123489799998738482601894111632387083653590921895308705989628111300210058143690024967352474744452 的平方

代码必须合适才能解出来,不然等半天也搞不出来
p = 8063541879684999172434156846785579383392012202377476576385935453837904086104134169422578105606735811577484535836740321806192056243591239447944792906642589
q = 10407000088959425169419203940606545581520363832679548727898058943637902824586736063534210492690389402499379844542729949917492266301734929472912145381387041

然后还是经典rsa代码

ezBSGS

要求满足13^x=114514mod100000000000099的最小整数x
专门提一嘴题目,那肯定是和BSGS拖不了干系了

与题干几乎一致,我们也能满足114514和100000000000099互质

直接修改已有脚本

依次输入100000000000099,13,114514,

得到flag
moectf{18272162371285}
ezAES


从后往前看,enc=aes(key,flag),enc已知,key已知,aes算法已知,求flag

代码写的比较烦,有10 轮完整操作(SubBytes、ShiftRows、MixColumns、AddRoundKey) + 1 轮最终轮
总的来说就是有逆字节替换、逆行移位、逆列混合等操作
happyRSA

这个太眼熟了,nss也有一题happyRSA

上边的是本题,下边的是nss的

要我说其实差不多对吗,都是多给了一个方程求p和q
x=power_tower_mod(n_phi + 1, r, pow(n_phi, 3))
求出p和q这题就结束了

power_tower_mod函数如上,迭代这个123456次
x=power_tower_mod(p+q, r, (p+q)**3)
ezlegendre

给了一堆三十九位的数字串

杂交随机数


代码如上,在尝试了几次之后可以发现其实压根就不随机,最后的输出数和flag息息相关,并且唯一,因此我们可以就这个输出数直接给逆推回flag(甚至还可以爆破?但是或许太麻烦了)
我们逐块分析

lfsr函数,两个参数,先把mask填充的和这个data一样长,然后把这俩玩意异或了,然后再算算这个异或出来的东西的1的个数是奇数还是偶数,奇数就1,偶数就0,把data左移一位来放上这个0/1

接下来是四个参数的lcg函数,生成的是伪随机序列,就是进行了个计算而已,没什么好说的

后边先初始化,x转化为64位二进制字符,然后分成两半,前一半给L,后一半给R,b是个固定的值,m也是,这俩都是后期给lcg玩的应该

核心是这个循环,显然循环了整整2025次,先管R叫mask,然后seed是当前的L的二进制整数,再用lfsr函数把L和R结合自更新出新的L
然后再用lcg函数生成新的R(参数为现在的R,-233,seed,2^32)
最后交换L和R的位置
就这种事情还干了2025次

最后拼起来再转整数
最后得到了我们这个整数,所以我们要转回去的话,先把现在这个搞成二进制的,拆开来
然后进2025次循环,每次循环就先置换,置换完了还原R,然后还原L,这个地方有点难度因为他本来就是自加密

搜索一下其实可以搜到这个算法
happyrsa

是一道RSA的题目

这边主要是多了一个函数,递归123456次,然后a是一直不变的
m不断变为小于或等于该整数m的相对素数的数量
最后返回a的a%m次方再取m的余
a其实是不变的,k也知道了就是取123456次递归,问题只在于m的变化,即m在123456次后会变成什么样子
理清了加密思路后我们看看这边怎么做
首先是提示,↑↑表示幂塔(tetration)运算

幂塔,顾名思义就是个塔()
因为有提示,所以我们直接可以得到下边的这个式子

这边还是主要由于这个简化形式,否则怕是难做
于是解密步骤化为了下述的三部

化简出来后,我们就可以用x表示N,即n_phi了,那样的话N其实已知了
然后恢复p和q,毕竟p+q已知,pq已知
接着最后解密m即可,就没难度了
这边最难的部分还是化简,还要再深思一下,我实在不明白怎么化简的

主要还是这样子三步,化简出来就简单了
得到flag:moectf{rsa_and_s7h_e1se}
神秘数字太多了

和BSGS算法息息相关
我们需要构造这个N个1

直接这样子即可,所以我们要找的N其实就是上述式子的k
于是式子转变为了


直接用BSGS算法

输入即可得到答案
moectf{7718260004383}
Web
:::info
ak啦!真的超有意思,非常适合新手,特别好玩,也很生动,虽然可能有点太简单了()
:::
0 Web入门指北

给了个指北说明书,跟题目我看没什么关系

还给了七个上锁的zip,有点意思
所以第一题应该只和txt文件有关了

给了一大长串的JSfuck编码
可以直接按F12进入控制台,然后输入这个jsfuck代码运行,看见答案

moectf{jv@vScr1p7_14_so0o0o0o_inT3r3&t!!!}
Moe笑传之猜猜爆

点开来查看源码

这题是在和randomNumber比较
所以我们可以直接打开控制台,输入randomNumber,然后把这个数字拿去猜,百猜百中

得到答案FLAG: moectf{d5819f8f-6c5f-e4a2-7131-67cece980472}
01 第一章 神秘的手镯

这个题还是反向代理的,还得下个websocket的软件

打开来我们玄天至宝

至于迷咒,我看就是txt里边的内容吧

哦这边主要是考无法粘贴怎么输入进去
直接F12,然后在元素区定位这个框

然后把这行字“在此输入万言启封咒”改成密文

然后就出答案了
moectf{f_i2_1s_Your_g00d_fri3nd!!}

也是有小说密码了
@Dxyoyugnd8EHrg7NaXaSA1J
02 第二章 初识金曦玄轨

一道考Http请求包的题目哇,先连接看看

按下ctrl+u即可用神识探查其中文字

让我们前往黄金轨道看看

什么?!天道。。拒绝了我。。。。

还是要学一下这个http包怎么写吧
不过这题其实直接抓包然后看这个网站就行了

确实在破阵盘这不直接看见了(所以抓包软件就是破阵盘???)
moectf{0bs3rv3_Th3_Gold3n_traiL}

来了这不就fAMwxQ2rEhbXWUw9IJmvU4ec

看这玩意中二的
03 第三章 问剑石!篡天改命!


改东西呗

直接抓包然后篡改天道,资质直接S,光芒也给直接干到flowing_azure_clouds
然后发送请求就能看见flag
moectf{gEt-pO5T-TraNSMIssion_15-4_gOoD_mEthoD!!110}

小说解压密码:cBrtGRQSKeLvty0@lKyFpU@Z
是很经典的打脸环节(虽然资质是假的)
04 第四章 金曦破禁与七绝傀儡阵
(我其实很好奇为什么要把04设置的比05难导致04出现在05后边了)


确实是真经
磐石傀儡

这真是教程题啊,太适合新生了,比如我


我们直接给url添加参数即可

获得玉简碎片: bW9lY3Rme0Mw不知道后边会不会有用
做完之后的答案如下:
好第二关
织云傀儡

post请求


直接hackbar插件载入即可
获得玉简碎片: bjZyNDd1MTQ3
做完之后的答案如下:
好第三关
溯源傀儡

第三关要本地访问
利用X-Forwarded-For连到自己这边


加上就能看见回显答案了

获得玉简碎片: MTBuNV95MHVy
做完之后的答案如下:
输入soul什么的进入第四关
器灵傀儡

使用moe browser,去哪搞这个,直接修改浏览器标识即可
user-agent改成这个就行

看见答案了

获得玉简碎片: X2g3N1BfbDN2
做完之后的答案如下:
/heart_seal进入第五关
心印傀儡

修改身份认证来了

这边记一下这些sec-fetch




当然这题跟这些都没关系,这题考cookie来的

直接加入这个cookie就好了

获得玉简碎片: M2xfMTVfcjM0
做完之后的答案如下:
/pathfinder前往第六关!!!
前尘傀儡

考的referer


所以我们加入Referer:http://panshi/entry即可

获得玉简碎片: bGx5X2gxOWgh
做完之后的答案如下:
/void_rebirth最后一关去咯
逆转傀儡

这啥玩意,春秋蛊吗
这边学到个扫描的方法,记一下

就直接put新生!就好啦?

获得玉简碎片: fQ==,这不是一眼base64吗
做完之后的答案如下:
/final_success走我们去合成玄机秘钥

应该就是base64了,我们集合一下通关玉简bW9lY3Rme0MwbjZyNDd1MTQ3MTBuNV95MHVyX2g3N1BfbDN2M2xfMTVfcjM0bGx5X2gxOWghfQ==

得到答案moectf{C0n6r47u14710n5_y0ur_h77P_l3v3l_15_r34lly_h19h!}

jU92itArJr2pe04Em6HF_tik
小说没啥,就展示了一下代码
05 第五章 打上门来!


破阵之机,寻得根目录

谁家赛博本源
根据这个提示,在文件目录穿梭的技法,锁定的是目录遍历漏洞,链接

原理如下

看见所有的目录了,每一行信息如下
x不代表没有密码,而是代表着密码在../../../etc/shadow
这边每个字段意义是——用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
当然了,这题用不到那么多东西,这题只需要我们退回到上级目录即可

马上就看见个flag文件夹

这就有了
moectf{@LI-1NPuT_I5-MaIiC1Ou52c17d18d}


06 第六章 藏经禁制?玄机初探!

这不数据库的sql注入吗()


看这大阵,所以这个是这样子传输的,就是个sql注入题

输入万能密码
username=’=’&password=’=’
后端的程序大概如下:
string sql = select * from users where username = ‘input_username’ and password = ‘input_password’;
我的输出会让这个变成:
string sql = select * from users where username = ‘’=’’ and password = ‘’=’’;
其中的''=''返回1
即username=True and password=True,即可绕过。

moectf{W31cOM3_To-sQI_InjECtiOnl168a28fe}


也是让这个恒等,但步骤显然不是我这样子,做题还是要先探查再去看,不是盲目去做
07 第七章 灵蛛探穴与阴阳双生符

这个文件。。有点眼熟啊,是不是robots.txt啊
欸不让我去/flag.php

那我们手动上这个,发现这样子的php文件

其实就是要两个具有相同 MD5 哈希的不同字符串
/flag.php?a=d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70&b=d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70
我辛辛苦苦找的md5一样的值竟然不行,或许是太长了,试试看绕过吧


可以试试看0e绕过,一下就成功了

moectf{md5-Is_not_SafE!l292f0e0dcfb}


还真是()
08 第八章 天衍真言,星图显圣

看起来还是sql注入,估计是过滤加上了
果然之前的不行了
先进行模糊测试

似乎都能通过?

提示是都要这仨的精髓
这里我想尝试看看列数但是这边毫无回显啊

但是输入经典 ‘ OR 1=1 – 或者是上一题的==这种万能钥匙,成功进入了管理者页面,回显正常
现在应该试试看可查询的属性列了


尝试了多次后发现得这样子构造,需要/!BY/来替代空格
需要#替代–+
联合构造永真环境
最后测试出这个列数为2
那我们直接输入’ UNION SELECT null,null#验证一下

没问题的
下一步确认回显位置
‘ UNION SELECT ‘test1’,’test2’#
输入后如下,确认位置在第一个

因此我们输入’ UNION SELECT @@version,database()
直接输出数据库版本

‘ UNION SELECT table_name,table_schema FROM information_schema.tables WHERE table_schema = database() LIMIT 0,1#
要找列肯定是去information_schema库

输入直接welcome flag了,关键表名为flag
‘ UNION SELECT column_name, data_type FROM information_schema.columns WHERE table_name = ‘flag’ LIMIT 0,1#
提取一下列名

所以列名为value
都知道了呗,表名flag,列名value
‘ UNION SELECT value, null FROM flag#
直接搜,注意value要在一列的位置

解得flag
moectf{UnIOn_Bas3d-sq1i-fTW1!d4719196}


?为什么是二五,我试出来是1啊,奇了怪了,算了算了
web就这样子ak啦,还有很多要学的,这个真的很好玩
09 第九章 星墟禁制·天机问路


输入星域真名就好了

尝试直接ls /失败
但是尝试; ls /成功了
这说明了命令注入漏洞存在(;被识别为命令分隔符),那我们也是确认了空格和;的可用性

只是没有看见flag的痕迹,再找找看
实在是在各种路径都没找到
所以我们只能直接全局搜索了; find / -name ‘flag‘ 2>/dev/null

没找到可用文件,cat得到的都是没效果的内容
说明不存在以flag命名的文件,我们换一个思路,搜索看看环境变量里是否存在
;env | grep -i flag
列出含有flag的环境变量

成功找到flag,这说明很多时候flag也会藏在环境变量中

CszFiOPw1kDQoKB_hS6@Do^n

10 第十章 天机符阵

省流也是够省了
直接输入ls,提示报错

说明我必须传入合法的xml格式内容

注意XML的语法规则
在几次失败尝试后逐渐摸清了应该是<契约><阵枢>/flag.txt;</阵枢><解析>cat</解析></契约>的类型
但是一直不出来,似乎这条路被过滤了

在尝试了各种绕过后最后确认了这题需要使用外部攻击,利用XML外部实体声明得到flag


我想主要还是因为有配置,解析器会加载外部实体,如果没有的话估计不行
我们来看revenge
10 第十章 天机符阵_revenge


果然前边的不让用了
可能只是在别的地方?过滤一下数据流看看flag.txt的绝对地址

直接就出来了,这说明这题依旧没有屏蔽外部实体

0mzKObH~eIodVLbwF9921DTT

果然啊,这题就是有天道护盾,所以只能用外部实体符强行嵌入
而且这个版本也能工作,说明/flag.txt文件的内容不包含任何特殊字符
这题还是XXE漏洞啊
安全建议如下:

11 第十一章 千机变·破妄之眼

省流已经写的很清楚了
但是五种怎么说也有120种排列,单靠手打显然不可能,更何况参数名还要等于参数值
所以我们编写脚本,将120种参数传入

在遍历后成功发现了正确的输出

但是这个参数时刻都在变化,并不是找到后就可进入的
寻得正确参数,再以虚空穿行之法,穿越层层禁制,直抵阵眼核心。
需要虚空穿行一下
我们在查出来后直接访问flag.php即可

失败了
尝试直接访问网址,访问到了find.php


然后就被嘲讽了
看不见,那试试看能不能靠编码出

尝试用base64输出

直接就有了,看这老弟
moectf{79bc1e24-caea-3a27-f57d-1c9f376d53a5}

W3WOVC8XU1v_189G0dINixcb
12 第十二章 玉魄玄关·破妄

这省流越来越精简了,蚁剑简单啊

可以看到连接密码是cmd,直接蚁剑吧

找半天找不到,试试看直接命令行搜吧

结果压根就没有叫flag的文件啊
也有可能存在环境变量里

找到了,flag

其实就是说这个moectf的flag在环境变量而已
13 第十三章 通幽关·灵纹诡影

这边给的提示很多,已经把要求都说完了

只要满足这些即可,我们随便搞一个jpg文件然后在文件尾加上一句话木马看看

反正只看前边的六个十六进制
我们可以直接上传php,反正也没过滤,伪装一下就行了,进去改成说这玩意是jpg
蚁剑连接后即可得到flag


就是把php文件伪装成jpg文件上传即可
14 第十四章 御神关·补天玉碑


御神关同样是文件上传漏洞来的
但是在这边过滤了很多邪道术法
考虑到题目的提示,我们可以找找看有什么apache特殊文件

搜索后可以找到这个.htaccess文件

这边可以参考我在nssctf遇到的题目,直接上传这个文件,然后让所有的文件都是用php解析,再上传php一句木马伪装的文件即可


OK先上传这个

然后上传伪装的php一句话木马

接下来蚁剑连接即可



答案是这样子的
15 第十五章 归真关·竞时净魔

这边倒是没给什么提示

还是一样的传.jpg/.png/.gif文件漏洞
但是会进行重命名净化不太明白是什么意思
16 第十六章 昆仑星途

包裹执行system命令
?file=data://text/plain,

成功读到flag所在文件
cat /flag-1pZ2J0vNMvyuId8a8wmMF3BsWXeCao.txt

得到flag

而在答案中则是利用的base64绕过,其实是一样的,只是base64输出
17 第十七章 星骸迷阵·神念重构


开始返璞归真没有外壳了
上来还是经典highlight_file(File),当你直接访问该脚本时,会看到其源代码
接下来是类A,有一个公共元素$a,然后定义了一个魔术方法__destruct,当销毁时会自动调用,执行$a中包含的字符串
后边是反序列化,看有没有参数a,有就直接用unserialize函数
我们构造一下payload
我们说有一个对象,类名为A,长度为1
然后再描述一下这个A,就说其为字符串,属性值为phpinfo();看看
a=O:1:”A”:1:{s:1:”a”;s:10:”phpinfo();”;}
直接就出了

moectf{db332f2c-cb7a-edc1-a671-e8dd883a7bdc}
18 第十八章 万卷诡阁·功法连环


其实和上边那题差不多
这边代码会检查是否存在GET函数person,如果存在就对其调用unserialize()函数,这边反序列化了输入且无过滤
而PersonA定义了wakeup函数,会在被反序列化之后自动调用,执行$this->name->work()
如果这边我们能控制PersonA的$name属性,使其成为一个PersonB对象,那么我们实际上调用的就是PersonB的work函数了
这边work函数还有eval函数
所以我们应该想办法构造PersonB的$name属性,然后通过eval()函数执行
Reverse
逆向工程入门指北


第一题打开还有教程呢,那我们直接听话ida打开就好
然后shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置

打开来就是一大串哇
直接crtl+f打开搜索栏,搜索flag


成功找到flag为:
moectf{open_your_IDA_and_start_reverse_engineering!!}
upx


UPX是什么?是一个可执行文件的压缩工具,同时可以用于加壳

加壳指的就是给那个程序执行前加了点步骤,防御

先看看原来给的加没加壳

下了个PEiD看看
那这边输入upx -d 1.exe我们直接对题目所给的exe进行脱壳,成功脱壳

可以看见脱壳后文件都大了不少
原来的是放不进ida的,而现在能够放进去了

看见这样子一串,我们肯定是要(char)v9[i] == v6[i]
这边输入字符串,会把我的输入放到buffer(包括我输入的回车),然后会遍历每一个字符,一个个放到v9[]去
接下来最后一个字符 v9[i] = Buffer[i] ^ Buffer[i+1] ^ 0x21 最后一个 v9[i] = Buffer[i] ^ 0x21
接着校验前 35 个字节:(char)v9[i] 必须逐个等于常量表 v6[i]
所以让 (char)v9[i] == v6[i] 的方法:把 s[35]=0x0A 当作已知,从 i=34 倒推 s[i]=v6[i]^s[i+1]^0x21,得到的 35 个字节是你的输入;最后按回车提交
那我们根据v6,直接写代码逆推即可

正好v6[]就在上边

果然是要考虑到换行边界的,最后得到flag为moectf{Y0u_c4n_unp4ck_It_vvith_upx}
upx_revenge

upx-d不让用了,但是手动脱壳看上去过于困难了

猜测是不是改UPX了,好像很多题都这样
发现确实,多加了一个1,放到十六进制发现还有个0
那我们删一下


ez3

问我知不知道z3 solver,还真不知道,搜一下

是一个求解器,可以用来做数学运算、综合性编程问题和逻辑题之类

先在ida看看这个题目,发现输入后首先要求输入是42位长度
然后是要用moectf{}来包裹住这个flag
所以我们要reverse的就是中间那34个字节的东西

而这些东西需要和check函数比对
那我们就去看看check函数

check函数长成这样子

是在进行一个遍历后选择异或的操作


当然需要和a[n33]比较,我们这边找到了a数组的内容


写得代码,根据数组a逆向,成功得到flag
(虽然我并没有用z3 solver,这玩意老是报错)
moectf{Y0u_Kn0w_z3_S0Iv3r_N0w_a1f2bdce4a9}
base

先die,看见是64位

定位main函数

就好了?就没了,好吧
moectf{Y0u_C4n_G00d_At_B45e64!!}
speed

先die

好哦是64位,放到ida里

定位一下main函数
似乎没东西,再看窗口Winmain

能看见moe,蛮好的
有窗口函数,但是原来的文件打不开,试试看动态调试

果然在这个地方出现了窗口,打开后结果如下:

moectf{Just_dyn@mic_d3bugg1ng}
catch

先die然后ida64打开

搜索后发现了flag藏在程序中

一步步找我们就能找到flag如下,密文为geoilqbcyUcyUkUlkaoUlfkmw


这边enc函数是在给这玩意与11异或,那咱直接把密文和11异或即可

好算出来不对啊,我无语了
结果直接shift+f12就看见了个差不多的


rot13就出来了,flag就这个moectf{S4m3_Tr1ck_with_@flower_desuwa}
(其实是自己有一个算法,一直在变的,多动调几次就出来了)
ezpy

给的pyc文件,直接线上改成py文件看看

反编译结果如上
阅读代码,会将输入和114514进行一个编码
而输出如果为wyomdp{I0e_Ux0G_zim}即正确
其实上边就是个凯撒而已,我们扔随波逐流都能出

moectf{Y0u_Kn0W_pyc}
flower

这个在spc新生赛的时候就有略微了解过,说起来下边的maze题也是
我记得没错的话花指令就是存在一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑,用来防御

搜索了一下看见这样子一串
但是这一次遇见的和之前的不一样,这个是可以反编译的花指令
这类花指令本身是正常的汇编指令,它们运行完后不会改变原来程序的堆栈,寄存器,但能起到干扰静态分析的作用,一般分为两种,一种是改变堆栈操作,另一种是利用call指令或Jmp指令增加执行流程复杂度。
这边找一下,找到_start函数出现问题

检测到正的sp值了,堆栈指针不平衡

存在以上问题
要进行栈调整,首先应选中进行调整的地址,并选择Edit▶Functions▶Change Stack Pointer

改完之后发现问题仍然存在,似乎是_libc_start_main_impl处有问题

确实报错了,检测到对const内存的写访问,输出可能是错误的
主要是这俩错误

先把初始sp值改成0

自动修复栈分析后长的都不一样了
(上边是之前做的,下边是培训完做的)

咱导入Linux去

来连上先

定位main函数

动态调试失败
分析主函数,似乎核心问题在于check和solve函数
check函数未发现异常,而solve函数似乎遭到了抵抗阻止反编译的进行


定位红色区域

找花指令直接nop掉

A cup of tea

正好今天学到tea加密啊,我们来看看moe的


定位到主要的函数

找到key和密文

定位到tea加密部分
直接改数字


moectf{h3r3_4_cuP_0f_734_f0R_y0U!!!!!!}
今天也是学的颇有成效
Two cups of tea

规范做默认


我们点开来看看tea加密部分
Mazegame

打开主函数

可以看到这部分是迷宫四个方向会导致的结果

而结果正在下边
大概解读如下:


查字符串能看见大概迷宫

定位过去,这个v9数组应该就是具体的迷宫框架,结合尝试与迷宫四边肯定都是墙的常识
这边是1是墙,0是路
但是这个顺序不太对,我们让ai重新生成一份标准的迷宫图

大致就这样子,试试看能不能ai跑一条路出来,太长了眼睛要瞎掉了





一开始想当然了,因为是左上角开始的,就想当然认为结尾应该是在右下角

看上去很对,但是输入后显示未到终点
再次分析

不应该忘了之前看见的这一个,因此我们可以确认答案在迷宫的第16行第33列的位置,这一个地方才是真正的终点(搞死人,也没个标识)
好在我们只需要修改位置即可


位置有点壮观
最后ida可以看到答案即为输入,因此答案就是moectf{ssddddwwddssddddssddssssddwwddwwddwwwwddddssssaassssaaaassaassaawwaawwwwaaaassddssaassddssssaaaassddddddwwwwddddssddddwwddwwaawwddddssssssssssssaaasssdddssssaassssaaaassaassaawwaawwwwaaaassddssaassddssssaaaassddddddwwwwddddssddddwwddwwaawwddddssssssssssssaaawawwwaassaawwaassaaaaaaaaaawwwwaassssssddddssssssdddddddddwwdddssddwwwdddsssdddddwwawwddddddddddddddddddddssddddddddwwwwawwwwwwwwdwwwwwwwwwwwaawwdwwwwwwwwwwdwwwwwwaaaasssssssssssssssssssssssssssssssssssssaaawwaaaaaaaaaaaaaaaaaaawwwddddddddwwddddddddddwwwawaawawwwwwwwwwwwwwddwwwwaassaawwaassaaaaaaaaaawwwwaawwddwwaawwdwwwdwwwwddddddddddssddddssssdsdssddssaassaaaawwaaaassssaaaaaawwddddwwwwaawwawaassdsssdd}(这太震撼了)
ezandroid


APK软件,主要还是用雷电APP智能分析和jadx或许多一些
直接雷电打开

敏感信息捕捉,直接给抓到了

这一看就是base64的moectf

直接就完成了,确实是ez
ezandroid.pro

问native层,先了解一下大致结构

可以大概得知安卓有应用层、应用框架层、系统运行库层、硬件抽象层(HAL)和Linux内核层。其中,Native层主要位于系统运行库层和硬件抽象层


其职责主要就是运行本地的代码,来实现核心算法,后边再让java层调用这一层的函数,输出出去
2048_master_re

这边和misc是同一个附件
我们放入ida看看

搜索字符串就可以发现,这边藏着说我们找到了一些线索,但是不够解锁最深的秘密,而我们就是要找到这个秘密
双击进入加密函数sub_401C83

可以看见这个block=的sub_401A81函数即为加密函数,四参数


再往里边看,这其实是一个XXTEA的加密


这边解密一下

成功得到flag:moectf{@_N1c3_cup_0f_XXL_te4_1n_2O48}
Pwn
终于敢写pwn题目了
0 二进制漏洞审计入门指北

这边直接把附件放进虚拟机然后写一串代码就好了,代码都给了,不用大改

先连接

根据虚拟机网段配置wsrx

直接就原来给的代码塞进去就是了
每一步写的很详细了

这边send和sendline的区别主要在这

这边直接与运行python即可得到flag
1 ez_u64


首先确定是64位系统,接着看一下如何解题

查看main函数,只需要满足v1 = num即可执行system(/bin/sh)提权了,接下来就简单了,因此本题的问题只在于如何使v1=num

这边我们是先连上环境
然后定位到Here这句话,相当于打断点
打过来之后马上提取后边八个字节的内容,输入到data里,因为后边是hint,是和我们输入对比的num,只要捕获并作为v1输入即可
后边构造payload再sendline
即提权成功
后边经典ls和cat即可

moectf{US3Ful_tHlNg5-IN-pwNTOol52b463460}
1 find it


依旧是64位的内容

可以理解一下fd先,文件描述符,对于Linux中一切都是文件,因此fd就相当于是每一个被打开文件的一个地址符

我们默认fd0为stdin标准输入,fd1为stdout标准输出,fd2为stderr标准错误,而后边打开的每一个文件会自动领到3以后的数字作为自己的文件标识符
我们这边先看看内容

这边我们来看主函数
上来先说自己把标准输出隐藏起来了,让我们去找他
这边可以看到,v3=dup(1)
也就是说fd=1被藏到了fd=3的地方
所以当问我们在哪里的时候我们应该回复的是3,如果回复1就会被close
接下来就问我们想看什么,会打开我们输入的那个file
这边我们输入flag就是了
一般由于fd012都被占用,这边新打开的文件应该是fd=3才对
但是刚刚把fd=1变成了fd=3,所以fd=1的地方是空着的,也就是说现在打开的这个flag在fd=1的地方
所以它问我们fd,我们输入1,如下

成功得到flag
2 EZtext


先确定是64位的

这边可以看到这一题是在考栈溢出

这边的v4是我们输入的,输入4+8就满了

可以看到只要输入8个及以上就会填满栈,然后这边还有一个另一个read函数,可以输入8+8个,但是我们只能输入a1个内容,也就是说我们应该让a1大一点,超过16才是

所以我们一开始可以先输入个50,然后我们写入16个a即可完成栈溢出


我们还可以注意到左边有个treasure函数

我们/bin/sh的程序在这个地方
所以我们应该改地址改0x4011CD的位置
注意这边是64位程序啊,要用p64来封装

就直接一步步下来先发50再发溢出再发/bin/sh地址即可

得到flag
moectf{reTZt3Xt_iS-tHE-stArT_0f-rop18d3c395}
2 ezshellcode


这是一道没有system的题目

这边一开始需要我们输入4,然后往下跳
这边栈溢出成立,可以输入4096个但是输入0x10+8就溢出了
这边的重点是没有system函数,即我们必须直接通过系统调用得到/bin/sh提权
其实system(“/bin/sh”)底层是调用execve(“/bin/sh”,0,0)
我们需要通过pwntools的asm函数来汇编shellcode
pwntools有个强大的工具shellcraft,可以直接帮助我们生成shellcode
所以这一题就是需要我们编写汇编代码,直接调用 execve系统调用

直接写大概长这样子(当然不长这样子了),太困难了,我们还是尝试使用shellcraft

利用shellcraft可以方便很多shellcode = asm(shellcraft.sh())

注意这题已经创建好了一个专门的shellcode区域

用户的输入会填充到这里的,所以这题根本就不需要所谓的缓冲区溢出

直接这样子就搞定了,刚刚卡住一直想利用栈溢出,但这题其实没有,在payload前这样子写只会妨碍shellcode执行
得解

moectf{pOWErfUl-sHeL1cod3-Can_d0-ANythlNgbe879}
3 认识libc

先看位数

我发现moe很喜欢出64位的恶心人()
会多一个libc文件,system我们在源文件找不到,只能在libc文件里找到
一般是我们只知道偏移地址,但是不知道基地址,通过puts可以得到它现在的地址,减去偏移地址便可得到基地址

先看原来的pwn文件

上来先到这边io.recvuntil(“> “)一下
可以看到这边存在栈溢出漏洞,我们可以填入0x100个内容,但是buf只能存储0x40+8个内容

padding=0x40+8
接下来我们直接
1 | |
当puts被调用时,puts_plt会把puts函数的地址储存在puts_got中,所以直接把puts_got作为puts_plt的参数使用,puts函数就会把自己的函数地址打印出来
main作为返回地址、得到puts的实际地址之后会重新开始操作
ROPgadget –binary “ret2libc” –only “pop|ret”
然后我们再确定一下pop rdi和ret地址,就可以开始构造第一个payload1了

我去。。。问题在这边,这题做不出来的主要原因就是传不了参,但我现在只会传参,再学会儿吧
pop_rbp=0x40116d
ret=0x40101a

好之后我们直接提取\x7f的前六位
puts = u64(p.recvuntil(“\x7f”)[-6:].ljust(8, b”\x00”))
基地址也能算出来了
然后system地址直接由基地址算出来
libc_base = puts - libc.dump(“puts”)
system = libc_base + libc.dump(“system”)
而/bin/sh其实题目自带了

所以bin_sh=0x1D8678

老实了,等学到rbp咋玩再说吧



















