QingCenCTF 刷题writeup

osint懒得写writeup了

网址:https://ctf.jinqiusec.studio/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
做 CTF Web 题时,按一个清晰的顺序来可以少走弯路。下面是一套通用的做题流程,适合刚接触 Web 安全的同学。
一、信息收集
查看网页源码 — 右键查看源代码,或 F12 打开开发者工具,留意 HTML 注释、隐藏字段、JS 里的敏感信息。
抓包分析 — 用 Burp Suite、Fiddler 或浏览器自带的 Network 面板,看请求头、参数、Cookie、响应内容。
目录与文件 — 尝试常见路径(如 /robots.txt、/.git、/admin、/backup),必要时用目录扫描工具。

二、漏洞挖掘
注入类 — 根据参数类型考虑 SQL 注入、命令注入、模板注入等,先判断是否有回显/报错。
文件与协议 — 文件包含、文件上传、XXE、SSRF 等,关注读文件、写文件、访问内网等能力。
逻辑与权限 — 越权、条件竞争、验证码绕过、二次注入等业务逻辑问题。

三、利用与拿 flag
构造 payload — 根据漏洞类型写 exp,注意编码、过滤绕过。
获取 flag — 在页面、响应头、源码、或远程服务器上找到 flag 格式(如 flag{...})。
总结:先看源码和抓包,再找注入点和逻辑问题,最后构造 payload 拿 flag。多做题、多总结,就能形成自己的做题节奏。

Web-basic

题目描述:

1
简单的web

这题就是看源代码

打开容器后,F12或者ctrl+u就可以看到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Basic</title>
<style>
html, body { height: 100%; }
body {
margin: 0;
background: #fff;
color: #111;
display: grid;
place-items: center;
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
"Helvetica Neue", Arial, "Noto Sans", "PingFang SC", "Microsoft YaHei",
sans-serif;
}
.text {
font-size: clamp(22px, 4vw, 40px);
font-weight: 700;
letter-spacing: 0.02em;
}
</style>
</head>
<body>
<div class="text">来获得你的第一个flag吧</div>

<!-- FLAG: flag{89fcd88d-ce9e-4603-8133-d52342a1d757} -->
<div style="display:none" aria-hidden="true">
flag{89fcd88d-ce9e-4603-8133-d52342a1d757} </div>
</body>
</html>

flag为:

1
flag{89fcd88d-ce9e-4603-8133-d52342a1d757} 

Web-new basic

题目描述:

1
web入门

image-20260312210541964

和原来一样,还是看源代码获得flag:

1
flag{45f4fdce-1603-46d7-a42f-6e23e869f153}

Web-basic_1

题目描述:

1
简单的web 1

打开容器是这个界面:

{C0B556E7-1944-4CCB-82D5-F8C994A4F7D6}

想得到flag是不是应该让按钮可以按才行,而要实现这一点就需要修改前端代码:

1
2
3
4
5
6
7
8
<body>
<h3>一个不能按的按钮</h3>
<form action="/index.php" method="post">
<input disabled class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag"
name="auth" />
</form>
</body>
</html>

可以看到是使用post向后端请求返回flag的,disabled是关键,这玩意导致了那个按钮不能按,所以直接把这玩意删了然后回车就可以得到flag:

{79632ED0-6802-478A-B464-46ECC298990F}

{E3DD6ADD-670A-4B06-BB60-8252B51A5BA3}

所以,flag为:

1
flag{6222b09a-13af-4e7d-a4b9-5ae663ee1268}

Web-new basic_1

题目描述:

1
web入门

{2047C741-9B6C-4BCD-938A-3E72C8663543}

不给看源代码那就抓包然后发包得到flag:

{FAEA9D39-BC08-4860-B680-74D4C72E449A}

flag为:

1
flag{04a0b5d2-755f-41da-b941-9c5c1a3f9275}

Web-basic_2

题目描述:

1
简单的web 2

电灯泡:

{0EAB8FB6-1228-49D0-AAA3-259DD22CD3B8}

你在game.js里就可以发现这道题目的逻辑:

{0BAA7F11-5E6D-4B37-BD65-31807B445909}

这道题不用怎么看源代码,人家开头就给你定义好了,flag是一堆jsfuck编码,直接把它取出来在控制台里运行即可:

{D53CD2EA-8205-48A6-A2B7-0A622DA9B81D}

记得把前后双引号都去干净啊,这题flag为:

1
flag{Qingcen_Is_The_Best}

Web-new basic_2

题目描述:

1
web入门

{D9C29DC1-F2A8-418A-A846-AF1EF81B01E1}

输入点信息抓包然后把is_admin的值从0改成1得到flag:

{40D43030-9AA2-44C0-BAB5-2E435219402D}

flag为:

1
flag{2641fe63-824b-4d83-a67d-60198c2fd043}

Web-basic_3

题目描述:

1
简单的web 3

这是前端:

{87045CF2-D29D-42F1-8B9C-B098DFC4170C}

下面是源代码,main.js告诉我们怎么得到flag:

{ED6A84B5-0E15-47EC-9E5B-C3898E5C772B}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
let randomNumber = Math.floor(Math.random() * 1000) + 1; // 1-1000
const guesses = document.querySelector('.guesses');
const lastResult = document.querySelector('.lastResult');
const lowOrHi = document.querySelector('.lowOrHi');
const guessBtn = document.getElementById('guessBtn');
const guessField = document.getElementById('guessField');

let guessCount = 1;
let resetButton;

function checkGuess() {
let userGuess = Number(guessField.value);
if (guessCount === 1) {
guesses.textContent = '上次猜的数:';
}
guesses.textContent += userGuess + ' ';

if (userGuess === randomNumber) {
lastResult.textContent = '恭喜你!猜对了!';
lastResult.style.backgroundColor = 'green';
lowOrHi.textContent = '';
guessField.disabled = true;
guessBtn.disabled = true;
// 猜对后请求flag
fetch('/flag', { method: 'POST' })
.then(res => res.json())
.then(data => {
document.querySelector('.flagResult').textContent = "FLAG: " + data.flag;
});
setGameOver();
} else {
lastResult.textContent = '!!!游戏结束!!!';
lastResult.style.backgroundColor = 'red';
lowOrHi.textContent = '你猜错了';
guessField.disabled = true;
guessBtn.disabled = true;
setGameOver();
}

guessCount++;
guessField.value = '';
guessField.focus();
}
guessBtn.addEventListener('click', checkGuess);

function setGameOver() {
resetButton = document.createElement('button');
resetButton.textContent = '开始新游戏';
document.body.appendChild(resetButton);
resetButton.addEventListener('click', resetGame);
}

function resetGame() {
guessCount = 1;
const resetParas = document.querySelectorAll('.resultParas p');
for (let i = 0; i < resetParas.length; i++) {
resetParas[i].textContent = '';
}
resetButton.parentNode.removeChild(resetButton);

guessField.disabled = false;
guessBtn.disabled = false;
guessField.value = '';
guessField.focus();

lastResult.style.backgroundColor = 'white';

randomNumber = Math.floor(Math.random() * 1000) + 1; // 1-1000
}

这块很显眼:

1
2
3
4
5
6
7
// 猜对后请求flag
fetch('/flag', { method: 'POST' })
.then(res => res.json())
.then(data => {
document.querySelector('.flagResult').textContent = "FLAG: " + data.flag;
});
setGameOver();

直接掀桌子了不玩游戏了直接向后端请求flag:

{638E2788-0330-4DA2-96CA-A18A521234C8}

flag为:

1
flag{809cc34e-3f3c-4673-91d8-9ffb1edb1c1e}

Web-new basic_3

题目描述:

1
web入门

前端是这样的:

image-20260312211036794

康康源代码:

源代码有个key.js:

image-20260312211340412

这是jsfuck编码,把前后双引号删掉然后在控制台里运行:

image-20260312211548892

得到密码,然后放进前端输入框里输入就可以得到flag:

image-20260312211633827

flag为:

1
flag{39fb402d-6235-4812-9485-a1e3a911f348}

Web-ezrequest

题目描述:

1
你知道HTTP通常使用的两种请求方法吗?

一个get,一个post

有两种工具:一种是burpsuite,一种是hackbar

get的构造方式:

1
http://docker.jinqiusec.studio:36596/?变量=值

post构造:

hackbar请求体中也是变量等于某个值

打开容器,第一个要求:

{11529852-118D-4457-A2EC-6A21509EB4F5}

{CFD533D6-304C-423D-9609-04D96B05C434}

得到第二个要求,同样的:

{FB4FD72B-1379-41B1-B38D-13992222A16A}

所以,flag为:

1
flag{dc7b45d7-dc0c-4ee0-bfa3-e165e062059e}

Web-ezrequest_1

题目描述:

1
请求头的妙用

这个你看着我的截图就可以了解了:

{6F92B622-3A02-4381-B722-33C97EA12E65}

这个和上面那题一样,值改一下就行:

{D0107665-3D7E-4903-A072-3F2899697760}

这个也是同理:

{932CC611-746D-4E75-89E2-5CDCB9772F3E}

OK遇到新知识点,这个考的是xff,你先点击那个MODIFY HEADER,加一个X-Forward-For在value里加一个本地IP:127.0.0.1,对了xff本质上就是一个代理服务器。遇到改IP啥的想到就行。

{27628177-C95A-4563-8F2C-91F3195770D2}

让你使用某某某浏览器,就是User-Agent:标识客户端类型(浏览器、爬虫等)。

{83706E09-FF11-449D-9555-9CD4BA6F4FAC}

用某某代理访问指的就是Via:记录请求经过的代理服务器和网关。

{214D1545-1668-4DC6-B39F-D137F0311D73}

这个考的就是cookie了:发送服务器之前设置的Cookie信息。作用:身份认证

{7C030030-FED3-41CA-BFD7-A3EC70C01008}

最后得到flag:

1
flag{deddc4f2-536f-4eb9-80ab-f9808e1b009b}

Web-basic_4

题目描述:

1
简单的web 4

{7CAB37A2-94C8-488D-9B88-FDF495ED03CA}

不用多说,访问/robots.txt界面:

{DB895D0C-1D92-4E76-AA93-4EB120D86F37}

然后访问原网址的/flag.php界面就行了,flag为:

1
flag{af99444b-91bb-4ced-92a7-3b23806e34c1}

Web-new basic_4

题目描述:

1
web入门

这道题就是代码审计:

image-20260312212448245

看看main.js:

image-20260312212508745

从上往下看,先定义了三个数组,都有确定的值,_d(a)这个函数就是把数组里的数字转换为ASACII码,后面就是一些验证逻辑:

1
2
3
4
5
if (input !== _d(_0)) {
msgEl.textContent = '邀请码无效,请核对后重试。';
msgEl.className = 'msg error';
return;
}

这部分指定了输入的那个邀请码就是把var_0那个数组经过了那个函数转换后的结果,所以我们的任务很明确了,把那些数字转换为ASCII码:

给个网址吧:https://www.bchrt.com/tools/online-ascii-converter/

image-20260312212954476

1
QCCTF_VIP_2026

其他两个我们也可以看看:

image-20260312213117638

image-20260312213138031

第三个还给了个假的,第二个那个/flag是一个路径,在源代码里是从这里传入的:

1
2
3
4
5
fetch(_d(_1), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: input })
})

就是你输入邀请码,经过验证逻辑正确后,这个函数就会向后端发送post请求,跳转到/flag路径,显示flag(我觉得我讲清楚了):

image-20260312213507383

flag为:

1
flag{74e40217-9c87-4df2-993c-26caaec09725}

Web-basic_5

题目描述:

1
简单的web 5

单纯扫目录(前提有相应的字典)(用群里的目录字典):

{B1997D3F-4C4A-4F18-B91F-1D991AA36428}

1
dirsearch -u http://docker.jinqiusec.studio:37550/ -w httppath.txt

访问fl4g.php即可得到flag:

1
flag{ee0fdd0e-1f25-4955-953e-c9646f6f77d2}

Web-new basic_5

题目描述:

1
web入门

image-20260313132255101

康康源代码:

1
2
3
4
5
6
7
8
9
function encryptData(obj) {
const jsonString = JSON.stringify(obj);
return btoa(unescape(encodeURIComponent(jsonString)));
}

function decryptData(encodedString) {
const jsonString = decodeURIComponent(escape(atob(encodedString)));
return JSON.parse(jsonString);
}

获得flag逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const payload = { score: currentScore };
fetch('/claim', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: encryptData(payload) }),
})
.then((res) => res.json())
.then((encryptedResponse) => {
if (encryptedResponse.data) {
const data = decryptData(encryptedResponse.data);
if (data.flag) {
resultDiv.className = 'success';
resultDiv.style.whiteSpace = 'pre-wrap';
resultDiv.textContent = `恭喜达成目标!\n${data.flag}`;
claimBtn.disabled = true;
} else if (data.message) {
resultDiv.className = 'fail';
resultDiv.textContent = data.message;
}
} else {
resultDiv.className = 'fail';
resultDiv.textContent = `错误: ${encryptedResponse.error || '未知'}`;
}
})
.catch((err) => {
console.error(err);
resultDiv.className = 'fail';
resultDiv.textContent = '请求失败,请重试。';
});
});
});

仿造payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
const payload = { score: 1000 };
const encrypted = btoa(unescape(encodeURIComponent(JSON.stringify(payload))));

fetch('/claim', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: encrypted })
})
.then(res => res.json())
.then(res => {
const result = decodeURIComponent(escape(atob(res.data)));
console.log("🎉 Flag:", JSON.parse(result).flag);
});

得到flag:

1
flag{b5d6f7cb-797a-4135-ae80-0ad6a64a973f}

Web-basic_6

题目描述:

1
简单的web 6

前端是这个:

1
黑客小子,尝试发送一个 GET 请求吧,参数名为 id, 他的值是0~1000的数字; 我在其中一个 id 中放了宝藏,你能找到吗?

这题就是字典爆破,使用burpsuite:

对了基础使用我是不讲的B站上有视频会讲且更有效,在博客里会显得比较繁琐

首先先用hackbar发个包,同时用bp抓包:

{A13ADCF9-3507-4FC6-B55E-7B0BD6660714}

抓到了右键发送到intruder:

选中1(我发送的id=1),点击添加payload,这就可以爆破id了

{95767A34-CFFB-42E1-91AA-4EBA32F5D710}

{1CAF93FF-354C-4DEB-9632-1B95F3308237}

设置1-1000的payload开始攻击:

{9C0AC981-575B-4AE7-B036-6344AA7672ED}

攻击完后按那个长度它会根据长短来排序找到最长那个看它的响应就可以看到flag:

1
flag{e75467e9-e04e-4e9a-8aec-7bed60670bbb}

{F8A9C08D-28DF-4981-8889-8E35D0C30B43}

Web-new basic_6

题目描述:

1
web入门

{951AC71C-0A87-41AE-97D8-49ED485B1768}

依旧前端和源代码没啥重要信息抓包发包看看:

{5FCFBABF-A790-47E4-9A0D-C6FB51E0DEEF}

flag为:

1
flag{633bea10-a158-44f1-9b5c-8801ae47d889}

Web-basic_7

题目描述:

1
简单的web 7

{49231550-FDED-4147-AEDB-79A02E82FD4C}

尝试弱口令爆破依旧发包抓包:

{AFA88BBF-AEE4-46A2-8788-46943391787D}

123这个就是我们要爆破的位置:

{9F0E6C00-64D6-4DE9-B09A-9BC332606A2F}

这里我们用常用密码爆破,网址:https://github.com/rootphantomer/Blasting_dictionary:

{1C25442B-E4DC-4D83-B143-E59A0E614AFC}

所以,flag为:

1
flag{12716998-067b-4632-a09b-789b8bc15830}

Web-new basic_7

题目描述:

1
web入门

image-20260312215753730

看源代码没啥思路,扫扫目录,一开始没扫到,猜测是一些被忽略掉的目录(比如phps),dirsearch扫扫看:

1
dirsearch -u http://docker.qingcen.net:39952/ -e phps

image-20260312220258285

访问一下:

image-20260312220341469

真正有用的就后面几句:

1
2
3
4
5
6
$a = $_GET["a"] ?? null;
if (!isset($a) || $a != "QCyYdS") {
renderPage('缃戠珯寤鸿涓�', "鏈綉绔欐鍦ㄥ缓璁句腑锛屾暚璇锋湡寰呫€俓n濡傛湁鍚堜綔鎰忓悜锛岃閫氳繃姝e紡娓犻亾鑱旂郴鎴戜滑銆�", false);
}
$flag = trim(file_get_contents("/flag"));
renderPage('楠岃瘉鎴愬姛', $flag, true);

用get方法传入a=QCyYdS,即可得到flag:

image-20260312220721514

image-20260312220709250

flag为:

1
flag{57a4bd5d-16ff-4799-a4d9-4a012648ab81}

其中,

?? null

如果网址里有 a 参数 → 把参数值赋值给变量 $a

如果网址里没有 a 参数 → 把 null(空值)赋值给 $a

isset($a):判断变量 $a是否存在、不为空

!isset($a):前面加 ! 表示取反$a 不存在 / 为空

后面那个你应该知道,就是a的值不等于QCyYdS

整体逻辑就是:

  1. 你访问这个网页时,代码会先看网址里有没有带参数 a
  2. 如果没带 a 或者 a 的值不是 QCyYdS (表达式为真)→ 显示「网站建设中」
  3. 如果a 的值刚好是 QCyYdS → 跳过错误提示,直接读取服务器的 flag 并显示给你

Web-new basic_8

题目描述:

1
web入门

前端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
在安全测试或 CTF 中,信息收集常从站点上那些公开却易被忽视的入口入手。本文归纳三个常见考点:index.phps、robots.txt 与 sitemap.xml。

一、index.phps:源码以文本形式返回
考点 · 源码泄露

在某些服务器配置下,扩展名为 .phps 的文件会被当作 PHP 源代码而非可执行脚本处理,请求时直接以纯文本(如 text/plain)返回,多用于开发调试或历史配置未及时关闭。

因此,若站点存在 index.php,可尝试访问 index.phps、config.phps、flag.phps 等对应名称。一旦服务器按上述规则响应,即可直接看到业务逻辑、密钥或敏感路径,构成典型的源码泄露。

# 示例请求
GET /index.phps
# 响应为 PHP 源代码(text/plain),而非脚本执行结果。
二、robots.txt:爬虫排除协议
考点 · 爬虫协议

robots.txt 置于站点根目录(即 /robots.txt),用于向搜索引擎与爬虫声明:哪些路径允许抓取、哪些路径不应抓取。该文件遵循爬虫排除标准(Robots Exclusion Protocol),虽无强制力,但被主流爬虫广泛遵守。

常见指令含义如下:

User-agent: * 表示规则适用于所有爬虫;
Disallow: /path 表示禁止抓取该路径及其子路径;
Allow: /path 可在某条 Disallow 之下对该路径做例外放行。
从安全与 CTF 角度而言,被 Disallow 的路径往往对应管理后台、接口或测试页面等敏感资源,故 robots.txt 常被用作信息收集的起点。

User-agent: *
Disallow: /admin/
Disallow: /flag.php
# 合规爬虫不会抓取上述路径,但可手动访问以进行测试。
三、sitemap.xml:站点地图
考点 · 站点地图

sitemap.xml 是面向搜索引擎的站点地图文件,用于列出希望被收录的 URL,并可附带最后修改时间、更新频率、优先级等元数据,通常置于根目录 /sitemap.xml,供搜索引擎发现与抓取。

与信息收集相关的特点包括:

可能列出未在首页或导航中展示的页面(如后台、隐藏栏目);
可能暴露目录结构或开发、测试用路径;
可在 robots.txt 中通过 Sitemap: https://example.com/sitemap.xml 声明,与爬虫协议配合使用。
信息收集时,先查看 /sitemap.xml 可发现“存在却未公开链接”的地址,再结合 robots.txt、.phps 等途径进一步探测。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://example.com/</loc></url>
<url><loc>https://example.com/about</loc></url>
</urlset>
小结:信息收集时可优先查看 /robots.txt 与 /sitemap.xml,再尝试常见 .phps 及敏感路径,常能发现意料之外的入口。

为第九题做铺垫,这题是爬虫:

image-20260312222254170

访问这个php得到flag:

1
flag{671fed5c-d28b-4a44-8d10-bdf03c031b30}

Web-new basic_9

题目描述:

1
web入门

题目是一张图的前端:

{1978B106-A382-41D1-82A5-B6B766D468E3}

源代码也只看到前端的那些东西,尝试扫描目录:

{3C915FD7-8EC9-43B6-B4FE-44F5F5BD2E29}

扫到一个sitemap.xml访问看看:

{CC36288F-B30E-4C7E-968A-ABBBB17BBE6A}

看见有一个wqw.php可以访问:

{BA4EEB4A-C63D-410B-9E17-7E8709B0F4D4}

改身份,就是改请求头呗和cookie有关:

{DB303725-5C71-4B19-A464-C2E2A5E92E70}

flag为:

1
flag{ca7c6c99-a628-46ad-87be-d3eb49a5b9bc}

Web-new basic_10

题目描述:

1
web入门

这题用dirsearch,用群里的字典,作者这题引导的很好,卡片可以打开看看:

image-20260312222605747

1
dirsearch -u http://docker.jinqiusec.studio:37550/ -w httppath.txt

image-20260312222650174

访问fl4g.php获得flag:

1
flag{d40ea120-1870-4df9-b0b0-80c612adc3c5}

Web-new basic_11

题目描述:

1
web入门

image-20260312223011413

每个卡片都点点看:

image-20260312223046794

暗示弱口令

image-20260312223112290

image-20260312223129967

image-20260312223142175

image-20260312223207193

image-20260312223229368

那就抓包试试弱口令(对id进行数值爆破):

image-20260312223319878

我先把cookie改成admin以防没权限:

image-20260313134609976

先来1000个:

image-20260313134636879

然后响应一个一个往下翻,看到flag:

image-20260313134721070

flag为:

1
flag{70764ddd-37b8-41bc-8e84-61b64e9ade92}

Web-new basic_12

题目描述:

1
web入门

image-20260313135026719

随机输入一个密码然后抓包:

image-20260313135107859

发送到intruder,用常用密码爆破即可:

image-20260313135205375

image-20260313135224872

image-20260313135302871

所以,flag为:

1
flag{bb344828-449a-4dd0-bae8-154cd9d34ffd}

字典网址:https://github.com/rootphantomer/Blasting_dictionary

Web-ezphp

题目描述:

1
简单的php代码

页面是php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
show_source(__FILE__);
include("flag.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a and $a==0){
if(is_numeric($b)){
exit("nono");
}else{
if($b>2026){
echo $flag;
}
}
}else{
exit("no");
}
?> no

{56023C98-A805-4539-B298-494515372F92}

弱类型只比较值,强类型比较类型和值

{E0896CD1-926A-40E6-810A-9169D7E8EB75}


{D21D84B1-E4EC-455B-BEC1-2DFB78D6F469}

a,b都采用get请求,php弱比较:

{351041CE-3BFE-4024-A29C-1A5F9D902C09}

所以,flag为:

1
flag{458377d2-31c2-443e-9b87-3ee6109a0eb7}

Web-别笑,你也过不了第二关

题目描述:

1
2
不是哥们,说白了你有啥实力啊
过关不是简简单单

在控制台把score改成一个很大的数就行超过后端源码的那个,每一关都这样,得到flag:

score = 10000000000000000000000000000这样的

{59A9D372-4BC7-4C21-A146-D2744CE14770}

Web-strange_login

题目描述:

1
我当然知道 1=1 了!?

{A68C618A-C83D-4B08-A52D-107441F46959}

SQL注入,SQL语句为:

1
'or 1=1#

密码随便填即可获得flag:

{5873FEC2-1EC7-4B75-9457-6AE18A56C130}

Web-DD 加速器

题目描述:

1
D 师傅在服务器上部署了一个加速器,并且提供一个页面来 ping 游戏服务器……

在查看环境变量时发现了flag

{6B1A0B69-3592-482A-BBDB-552EFB856B1E}

flag为:

1
flag{b74f81a9-fa0a-4b9b-b3f9-3000c30d27ea}

Web-黑客小 W 的故事(1)

题目描述:

1
NewStar 的赛场上,小 W 被传送到了一个到处都是虫子的王国,在这里寻觅许久之后,他发现只有学会剑技(HTTP 协议)才能够离开这里。

{312D89A2-2E84-4B29-9936-7E5C552E9FAC}

{61373555-3DFF-4DC9-8E0D-322F1C693040}

{DC38E845-F891-4924-B4F5-32CEB1DA241D}

抓包呗:

{43CF81F7-8470-4B2F-9D46-699C1F6AF16D}

发现count了吧,修改这个值就行了:

{3C485A19-4A31-40A3-A388-BF6281BB7747}

count>800就行:

进入level2:

{C4394BC5-1251-4A31-8B38-29B5B486C63B}

{AF51047A-7383-4C43-A615-A3CC70770B48}

发现听不懂,看提示:

{1C79E087-726C-420F-AB14-0025C2122767}

get传参:

{4A730A7E-D115-4920-8A83-95BB393C9C7E}

一级域名的?前面要有/,二级甚至三级就没有这个要求了:

{DA11D300-A56B-40F5-B43E-E2CCB8FDB4E1}

通过前面可得要告诉他guding,值随便填:

{95F4A28B-3219-43E6-8024-5AE16CE4C2C2}

{F385EB5C-EE18-41E9-B834-E8611EEFB1D3}

这里,DELETE是一种请求方法,和get,post同样的性质,改下抓包,顺便把chongzi传进去来去除(对了,只有get是特殊的在url里传的,其他都是请求体,不同参数用&连接):

{A6B15F19-6417-4CA4-964F-175C6E9420A6}

{9DBCD8A8-AC8F-46FD-8622-525598CD8E2A}

{5BA31B74-0F2A-4B02-97F5-F72BD3EB9D01}

看起来没啥思路看看提示:

{AFFD5601-1560-445B-AF07-57A53E64067B}

改user-agent(这块纯恶心):

改到5.0就可以访问flag了:

{C73C2902-20EF-4558-84DA-3D0A2CD91AD2}

{D71A2F30-8DB6-4954-A95E-0DA72F438BF5}

flag为:

1
flag{dcc4c139-80dd-4e5e-92d4-78676b86f282}

{03CDC94D-DEB9-489A-8E9C-D395DAE80C7E}

Misc-城邦:压缩术

题目描述:

1
欢迎挑战者们来到压缩术的考验关卡,本关考察压缩术的综合使用,请挑战者们通过 6 位密码门开始挑战吧! (要想使用压缩术,请先念咒语 abcd...xyz0123...789)

本题提示就是6位密码门,咒语是小写字母+数字这个组合,直接暴力破解,得到密码ns2025:

{EF54A56E-90ED-44E0-BDD2-19B5EFADA02A}

得到tips.txt:

1
恭喜你,通过了第一道考验,请用其他压缩魔法打开下一扇门吧!(下一扇门明明没有密码,为什么还是要输入密码呢?)

这是提示伪解密,直接全局方位标记的09 00改为00 00即可:

{2B8AD043-0E39-432A-B617-D11491FE0EA0}

{0648BDEE-D96A-492E-924B-D6D342B1FB3E}

得到key.txt:

1
This is the door's key!

含义还不知道,但是看到flag.zip里也有一个key.txt,而且他的压缩算法是Zipcrypto,这就是明文攻击,使用bkcrack:

{BD510196-9C24-4479-8369-EF526FCD0FE7}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:\bkcrack-1.8.0-win64\bkcrack-1.8.0-win64>bkcrack -C flag.zip -c key.txt -p key.txt
bkcrack 1.8.0 - 2025-08-18
[20:03:37] Z reduction using 16 bytes of known plaintext
100.0 % (16 / 16)
[20:03:37] Attack on 445380 Z values at index 6
Keys: c5a43985 0efe59a5 5dfb3167
63.8 % (284322 / 445380)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 284322
[20:05:33] Keys
c5a43985 0efe59a5 5dfb3167

D:\bkcrack-1.8.0-win64\bkcrack-1.8.0-win64>bkcrack -C flag.zip -c flagggggg.txt -k c5a43985 0efe59a5 5dfb3167 -d flag.txt
bkcrack 1.8.0 - 2025-08-18
[20:07:27] Writing deciphered data flag.txt
Wrote deciphered data (not compressed).

即可得到flag:

1
flag{You_have_mastered_the_zip_magic!}

Misc-前有文字,所以搜索很有用

题目描述:

1
欢迎来到文字的世界!这里的字符,要么以你未曾想象过的方式排列,要么你根本都「看」不见。但是没有关系,这里是线上赛,我们不断网,尽情冲浪吧! Track2 的隐藏数据并没有被压缩,请不要使用 -C

Track 1:

1
2
3
4
5
6
7
8
9
零宽度空格符 (zero-width​​​​‎‎​ space) \u200B : 用于较长单词的换行分隔

零宽度非断空格符 (zero width no-break space) \uFEFF : 用于阻止特定位置的换行分隔
​​​​‌
零宽度连字符 (zero-width joiner) \u200​​​​​D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果
​​​​​
零宽度断字符 ​​​​‎‎​(zero-width non-joiner​​​​‍​‌) \u200C :​​​​‎‌ 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果
​​​​‍​‎
左至右符​​​​‎‎ (left-to​​​​‍​‌-right mark) \u200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右​​​​‎‍‌

零宽隐写,按照题目所给的类型选择:

{AF0ADE82-563A-47FC-871B-7BD80E361972}

即可得到flag1:

{173CE4EE-1504-4CCA-B87C-F07549090B31}

1
2
ZmxhZ3t5b3Vf
---base64解码为:flag{you_

Track 2:

咏雪,明示就是snow隐写,还有一个txt放了key,用brainfuck加密了,先用brainfuck解密得到key:

{62BC5A55-1295-414C-90B1-7E5C3235C5B4}

1
brainfuckisgooooood

而且Track2 的隐藏数据并没有被压缩,请不要使用 -C,所以手动操作吧:

这里要注意要把docx里的内容全部复制到txt里(至于原因我还不知道,但是试过之后确实发现没有信息提取出来),我命名为input.txt:

1
snow.exe -p brainfuckisgooooood input.txt output.txt

一般的snow解密后有压缩包的,在-p 前面加个-C,output里有一串摩斯电码:

1
----- ...- ...-- .-. -.-. ....- -- . ..--.-

解密即可flag2为:

1
0V3RC4ME_

{0F29242E-E7AB-4868-A435-40D7A7A47CA3}

cyberchef要会用

Track 3:

谁多谁少一算便知,发现很多字符,就是字频统计:随波逐流一把梭

1
2
字频降序(包含标点):cH@1LenG3s}w!iVFQKAv.9d;&]Ym>ht5)k#6TruC4J0xZ:MqE<oz/UP"+b|p{B$y?7a %*~,^-[l2_(Rf\'OW=`gI8XDSjN
字频降序(不含标点):cH1LenG3swiVFQKAv9dYmht5k6Tru4C0JxZEMqozPUbpBy7a l2RfOWgI8XDSjN

根据flag特征,这一部分就是flag:

1
cH@1LenG3s}

整合一下,flag为:

1
flag{you_0V3RC4ME_cH@1LenG3s}

Misc-EZ_fence

题目描述:

1
RAR 发现一张残缺的照片竟然需 要 4 颗钉子才能钉住,照片里面似乎藏着秘密。

打开图片发现文件尾藏了一个rar压缩包,binwalk分离,这个是被密码加密过的(找密码线索):

1.题目提示这是一张残缺的图片,暗示高被修改了,这里用随波逐流就可以

{3F38F48A-283C-44E8-AF89-8FA1C0693E62}

然后要4个钉子才能钉住,暗示这是栅栏密码,而且是4栏,在W型里发现一个长得像base64的:

{DDB8CC6F-35C2-4EA8-86CF-133A8CC16D68}

1
rSvMwgdouWZVhAvoj79GhSvWztPoyLfPytvQwJjBnKz=

而图片里那个下面的就是换表的字符表:

1
8426513709qazwsxedcrfvtgbyhnujmikoplQWSAERFDTYHGUIKJOPLMNBVCXZ-_

这个可以用随波逐流一把梭

{62045066-FC65-48F6-B75D-B01036F279C8}

{A3E18448-7C3E-4725-BD93-B2E942975510}

也可以用换表脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import base64
def custom_base64_decode(encoded_str, custom_table):
# 标准Base64字符表
standard_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

# 创建从自定义表到标准表的映射
custom_to_standard = {custom_char: standard_char
for custom_char, standard_char in zip(custom_table, standard_table)}

# 将自定义Base64字符串转换为标准Base64字符串
standard_encoded = []
for char in encoded_str:
if char == '=': # 处理填充字符
standard_encoded.append('=')
else:
standard_encoded.append(custom_to_standard[char])
standard_encoded_str = ''.join(standard_encoded)

# 进行标准Base64解密
decoded_bytes = base64.b64decode(standard_encoded_str)
return decoded_bytes.decode('utf-8', errors='replace')


if __name__ == "__main__":
# 加密后的字符串
encrypted_str = "rSvMwgdouWZVhAvoj79GhSvWztPoyLfPytvQwJjBnKz="

# 自定义字符表
custom_table = "8426513709qazwsxedcrfvtgbyhnujmikoplQWSAERFDTYHGUIKJOPLMNBVCXZ-_"

# 解密
decrypted_str = custom_base64_decode(encrypted_str, custom_table)

print("加密字符串:", encrypted_str)
print("解密结果:", decrypted_str)

运行结果:

1
2
3
D:\py\python.exe C:\Users\Lenovo\Desktop\ctf\.vscode\solve.py 
加密字符串: rSvMwgdouWZVhAvoj79GhSvWztPoyLfPytvQwJjBnKz=
解密结果: New5tar_zjuatrojee1mage5eed77yo#

也可以用cyberchef,但是字符表末尾需要转义一下,不然会报错:

1
8426513709qazwsxedcrfvtgbyhnujmikoplQWSAERFDTYHGUIKJOPLMNBVCXZ\-_

这里是要注意的,末尾转义:

{97104B20-9D47-4CCA-A840-487F5E592257}

因此得到密码:

1
New5tar_zjuatrojee1mage5eed77yo#

打开压缩包得到flag:

1
flag{y0u_kn0w_ez_fence_tuzh0ng}

Misc-wireshark_checkin

题目描述:

1
un 搭建了一个简单的 http 服务器,但是不小心把重要文件删除了,只剩下访问这些文件时的流量,你能帮他找到吗

打开流量包,锁定http流追踪流一个一个翻就可以看到flag:

{9EC8C8BE-67E0-4FF2-908C-827E4EA5995F}

1
flag{ez_traffic_analyze_isn't_it}

Misc-wireshark_secret

题目描述:

1
un 偷看涩图,被抓到流量了

流量里找图:

{00B38705-14A3-4303-BE1D-32976042DAD9}

导出来:

{B6BD6948-6270-4EC6-AEE6-D559935953FA}

{68995A0A-B134-4BA1-8747-B020650C9D2D}

{7E6DAC1F-CABD-4FBF-9AB0-0F4C28E24435}

flag为:

1
flag{you_are_gooddddd}

Misc-热心助人的小明同学

题目描述:

1
小明的邻居小红忘记了电脑的登录密码,好像设置的还挺复杂的,现在小红手里只有一个内存镜像(为什么她会有这个?),小明为了帮助邻居就找到了精通电脑的你……

拿到手的是一个叫 image.raw 的文件,由题可知是内存镜像。

1
vol.py -f image.raw imageinfo

{FCA72EDA-E065-4333-8736-C6EE26086292}

可知建议选择的操作系统版本有:Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86. 这里选择第一个(Win7SP1x86_23418)进行尝试,反正不行就试试别的。

确定系统版本后就开始研究怎么拿到密码了,由于简介说过密码「好像设置的还挺复杂的」,又让找出密码明文,爆破是不现实的,在 Volatility 2 和密码明文有关的还有 lsadump,直接梭。

{EC17DB3D-4EF2-4EC2-BED0-36B057FF76DD}

开头的 0x48 并不是密码,你可以理解为是一个标志,除开这个你就能得到系统密码:ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh.

所以 flag 为 :

1
flag{ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh}

Misc-兑换码

题目描述:

1
领取 NewStar 前瞻兑换码,明天中午 12 点就失效喽!就在图片下面。什么,你没有看到?原来是 png 的下面啊,那没事了。

png修改高度即可,随波逐流一把梭:

{079A8C96-C6E0-474D-9337-49AE7C8C7644}

flag为:

1
flag{La_vaguelette}

Misc-decompress(校内赛道)

题目描述:

1
2
正在失传的技艺之压缩包解压
注:请把解压的结果再计算 32 位小写 MD5 后包上 flag{} 提交

7z一把梭:

image-20260327191645498

image-20260327191725532

点击flag.zip.001,里面有flag.txt:

1
flag{e6468aaf-7ddc-4eb2-b6db-bce9f1ffb52f_oOo0hhh_U_r3411y_K0nw_h0w_2_d3c0mpr355_Multi-part_archive_5e35fcde-28e1-487d-9659-ba2dab629bb3_&_Th1s_f1ag_15_s0O0oO_l0oOoOng999_b433dc9b-db28-4a1d-965b-dc0a95d3a53a}

转换为32位小写md5:https://toolshu.com/md5

image-20260327191927371

flag为:

1
flag{c6edaba55bac51875a215e2de11c35dd}

Misc-decompress(公开赛道)

题目描述:

1
正在失传的技艺之压缩包解压

依旧7z一把梭,一层层点进去:

image-20260327192204612

到这里有个passwd:

1
^([a-z]){3}\d[a-z]$

^ - 表示字符串的开始
([a-z]){3} - 匹配三个连续的小写字母(a到z):
[a-z] 匹配任意一个小写字母
{3} 表示前面的模式重复3次
\d - 匹配一个数字(0-9)
[a-z] - 再匹配一个小写字母
$ - 表示字符串的结束

这个正则表达式要求字符串必须满足以下条件:

以3个小写字母开头
接着是1个数字
最后以1个小写字母结尾
整个字符串长度为5个字符

image-20260327192417808

是加密的用passware解决:

image-20260327193039770

具体的设置根据引导来就行,选择

Misc-Ciallo~(∠・w )⌒★

题目描述:

1
2
3
4
5
6
7
8
9
10
11
Ciallo~(∠・ω )⌒★
探秘Ciallo的魅力:不只是口头禅的艺术
在社交场合中,有时一句简单的问候语就能传达出无尽的亲切与可爱。Ciallo,这个看似简单却充满魔力的词汇,正是因幡巡的标志性口头禅,它源自于意大利语的“ciao”和英语的“hello”的巧妙融合。(想象一下,当这两个截然不同的语言元素碰撞在一起,仿佛在轻轻地诉说着“你好,可爱的人”,是不是立刻就感受到那份独特的温馨?)
Ciallo的魅力在于它的亲和力和轻松感,仿佛是朋友之间随性而亲切的招呼。(它不仅仅是一种语言表达,更是一种情感的传递,让人感觉像是被温暖的阳光包围。)它的存在,让每一次交流都变得轻松愉快,让每一个对话都充满了生活的趣味。
当然,Ciallo的魅力并不仅仅限于其本身的含义。它更像是一种文化符号,象征着意大利人对生活的热情和对人与人之间关系的重视。(每一句Ciallo,都是对人际关系的尊重和对生活热情的展现,让人不禁对这个国家的文化产生了向往。)
然而,尽管Ciallo如此可爱,每个人心中都有自己喜欢的那一份独特。就像某人深深钟爱着宁宁,(这也许是一种情感的投射,或者是一种个性的体现)Ciallo的存在,就如同生活中的一抹亮色,让每个人都能找到属于自己的那份独一无二的温暖。
总的来说,Ciallo不仅仅是一种语言,它是一种情感的桥梁,是一种文化的态度,是一种生活的方式。它让我们的交流更加生动有趣,让我们的生活更加多彩多姿。(让我们一起在Ciallo的魔力中,感受那份来自意大利的热情和生活情趣,让每一天都充满微笑和爱意。)
所以我们需要Ciallo!!!!
密码是四位数字喵~
flag文件格式为flag{}
出题人: 小睿孩

image-20260313130103845

第一眼没啥思路,把word后缀改成.zip:

1.docx本身就是个压缩包

2.题目提示四位密码,更能说明这是压缩包

放到archpr里破解:

image-20260313130328723

得到密码是0721,解压一下:

image-20260313130456164

在这个路径发现Ciallo~(∠・w )⌒★.txt打开看看:

1
iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAAP3aGbAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHb0lEQVR4nO3d23EkRRBA0RUhPzAGXzAKXzAGSwYP2FKQtak7fc63op+jG/VT2R+v1+sHQMFv2xcAcEqwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIEOwgIzP8SP+/sdf48d8M//8/ef2Jfzc+Xscv53FU5/zO/+pG2/HCgvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvImJ/WcC4xtODc+Pb93aEFz5zBcMOb3c7umAorLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBjc1rDucUN4otb7Xd3+Y8/8xu382YTIJ75O/8SKywgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIaGx+5r/d2AN8/peHZ9+9SN6DFRaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQYVrD93Xjw+WLIxMWv8P+pbObAPGdWWEBGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGY1pDc/cQL971+PjDc5vZ3euw6Jn/s6/xAoLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyNic1vDYTfmHxucl7B7zxiiCxAQIv/NBVlhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhAxsfr9dq+Bv6vGzMYEm4MQnizR/RmrLCADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgY/5T9YmPoVe+Aj9+wMfuFk5c5OJPqLJ/3goLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyJj/VH1l2/chwyd+vRs/DD/LqQOeu/EkrbCADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CAjPlpDefGN4gnRhHcsDve4NDu8Ilz47M0xk9dYVoD8GiCBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmb0xrOJXaxL86KuLEtftzuSxx/RDduZ/E97k7IOGeFBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWR8Lp57cYP4ja3247eTmFFx7sY0i91j8utZYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWEDG5ubncZVNs4fHvHGRNzzzA+uVtzNudxu5FRaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQMT+t4bEb6N9sU/7429nd5T9+9t3RIOcWZ2ncYIUFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZHy8Xq+tcyc20N9weJ2Ji/yxep2LEzJuzGB4syd543assIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsICM+WkNN/amG28wxdt5mvFJJ+On/hIrLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBjfloDUwwYGPRmszQSTGsAHk2wgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyPgcP+KbbeC84XBT6PjH4i8dc/HUiY3Kixd5fvbKv60VFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAxP63h3O4u9nGV/e6Hxocr3Hg+i8/8zX69FVZYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkCFYQMbmtIZzz9yUf37X45MVvmT8Ee3e+JtN3ThUGT5hhQVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkNKY1PNPuDIaExbkON8YbLL7HG0/yBissIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyBAsIMO0hu/rxt79xa32lXkAh3ZvZ3H4xO6NW2EBGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhARmPzc2I37LjKx9APr3P3dsbPXtktfHjMytZ0KywgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgY3Naw43JAe+k8qn68Y+h3zA+jeDG20mMTPCpeoAjggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZH6/Xa/saAI5YYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQ8S9Xn61IJxaU+AAAAABJRU5ErkJggg==

这是base64放进cyberchef里一把梭:

image-20260313130624922

发现是个二维码,扫码获取flag:

image-20260313130706855

flag为:

1
flag{0d00_0721}

Misc-盆友的遗憾

题目描述:

1
joke有一个朋友他失恋了,这里有一份他写过的情书,用了一堆加密,你能把情书的内容发给joke吗,joke也想吃瓜,嘿嘿嘿~

img

打开压缩包发现是加密的,先用随波逐流扫一下:

img

发现是伪加密,使用随波逐流自带的伪加密修复:

img

压缩包中的emo.zip是真加密需要密码,密码就在另一个txt文件里:

image-20260326212946409

这是jsfuck编码,在浏览器控制台里运行得到第一关的密码:

img

第一关密码:Minecraftyyds

这是emo.zip的密码。

img

下一关,She loved me.zip依旧是真加密。

hint.txt里有个emoji:

img

好像没思路,看看tip.jpg(使用010 editor):

img

文件尾有个网站,这个就是解密的网站:https://txtmoji.com/,这里我没想考什么,只是提醒大家emoji加密不只有base100,可能还会出这样的,倘若我没给网址,检索能力也是你必须要有的。

这里的key就是0x89.

img

得到一个base64,用cyberchef解密:

这里有点小瑕疵,那个网站生成的时候不小心带了一点特殊字符,删掉并解码即可:

img

img

得到这一关的密码:why y0u leave me

下一关的zip依旧是真加密的:

img

密码就在txt里:

img

看到有特殊字符,这是零宽隐写(这个可以网站搜,随波逐流也自带):

img

得到密码:Love seems like a joke

Ok来到了最后一关:

img

随波逐流梭一下会发现文件尾后面是一个zip文件用binwalk分离一下:

img

这个zip是四位密码,我猜各位应该能猜到是四位这里就没提示了,爆破出来密码是:love

img

flag.txt里还是emoji,这里考的就是base100了解密一下:

img

得到flag: flag{Y0u_Ae9_my_0n1y_0ne}

Misc-美妙的音乐

题目描述:

1
小明最近发现了一首好听的曲子,他把曲子发给你并邀请你一起欣赏,可是这个曲子似乎有什么不对劲的地方?

发现是个mid后缀的音频文件:

image-20260327190931385

这种音频的处理思路一般是使用audacity或者miditrail,拖入audacity是这样的:

image-20260327191133854

可能会看不清,所以换个软件:

image-20260327191316954

得到flag:

1
flag{thi5_1s_m1Di_5tEG0}

Crypto-SageMath 使用指南

题目描述:

1
使用 SageMath 运行程序以获得 FLAG.

flag为:

1
flag{e142d08c-7e7d-43ed-b5ad-af51ffc512ee}

Crypto-Base

题目描述:

1
This is a base question!

附件:

1
4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D

cyberchef一把梭即可:

{9A279891-ECAC-4DE5-A986-1BD257041FE7}

flag为:

1
flag{B@sE_0f_CrYpt0_N0W}

Reverse-begin

找到主函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int __fastcall main(int argc, const char **argv, const char **envp)
{
_main(argc, argv, envp);
puts(
"This program will teach you the basic use of IDA, including viewing variables, searching strings, cross referencing, etc");
puts("Please open this program with IDA, and we will tell you the flag step by step");
puts("First:You should press F5 to decompile the main function");
strcpy((char *)&flag_part1, "OK,You can click on this variable to discover the first part\n");
puts("The flag has three parts with a total length of 50");
puts("There are no spaces in the flag");
puts("If you find that flag part1 is garbled, please press the ' a ' key");
puts("The second part of the flag can be achieved by pressing shift+F12");
system("pause");
return 0;
}

F5查看伪代码,flag有3个part,先看flag1,双击part,按a进行翻转得到flag1:

{619049BA-601B-4FBF-AD62-0533B776A4D5}

{CA36EAC3-A445-4834-A82C-A46DD7D5EECD}

1
flag{Mak3_aN_

Shift+F12查看part2:

{50D9D10D-C62A-4AFC-AA45-045DCFFB3205}

1
3Ff0rt_tO_5eArcH_

flag3就是变量名(按x可以跳转到变量):

{6F0E59ED-E7A9-41AA-A814-69DD002C4C56}

{74A7112B-28B4-4BF6-97F8-8F45DA982944}

flag3为:

1
F0r_th3_f14g_C0Rpse}

整合一下,flag为:

1
flag{Mak3_aN_3Ff0rt_tO_5eArcH_F0r_th3_f14g_C0Rpse}

Reverse-base64

题目描述:

1
仍然是 base64

这题我感觉在考misc,这题就是base64换表:

{736A4B4F-6834-48CB-A0A8-ABF33BBD6AA1}

{A17B18F3-3F7F-47B7-8FE6-BFD512CE45B4}

1
g84Gg6m2ATtVeYqUZ9xRnaBpBvOVZYtj+Tc=
1
WHydo3sThiS7ABLElO0k5trange+CZfVIGRvup81NKQbjmPzU4MDc9Y6q2XwFxJ/

flag为:

1
flag{y0u_kn0w_base64_well}