<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Claude Code on 猫猫鱼的小窝</title>
    <link>https://cat.fjh1997.top/tags/claude-code/</link>
    <description>Recent content from 猫猫鱼的小窝</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    <managingEditor>xxx@example.com (catcatyu)</managingEditor>
    <webMaster>xxx@example.com (catcatyu)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Mon, 20 Jul 2026 18:00:00 +0800</lastBuildDate>
    
    
    <atom:link href="https://cat.fjh1997.top/tags/claude-code/atom.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>NepCTF 2026：Claude Code 多 Agent 自动做题、交 Flag 与实例槽抢占策略</title>
      <link>https://cat.fjh1997.top/posts/202607201.html</link>
      <pubDate>Mon, 20 Jul 2026 16:45:00 &#43;0800</pubDate>
      <author>xxx@example.com (catcatyu)</author>
      <guid>https://cat.fjh1997.top/posts/202607201.html</guid>
      <description>
        <![CDATA[<h1>NepCTF 2026：Claude Code 多 Agent 自动做题、交 Flag 与实例槽抢占策略</h1><p>作者：catcatyu（xxx@example.com）</p>
        
          <p>NepCTF 2026 用 Claude Code 当「总控 + 工人」：主会话只盯榜单和槽位，真正解题全部丢给子代理。本文整理压缩前实际跑通的一套策略——自动交 flag、多子代理并行、内存硬限制、以及<strong>只有一个远程实例槽时怎么抢占</strong>。</p>
<p>最终成绩：rank <strong>20</strong> / 1011 队，score <strong>6916</strong>，<strong>27</strong> 题 AC（队名 catcatyu）。这不是「模型多聪明」的单点展示，而是<strong>调度系统</strong>能不能在 12G 内存、单实例槽、JWT 会过期的约束下持续产 flag。</p>
<h2 id="可复现打包解压后直接-claude">
<a class="header-anchor" href="#%e5%8f%af%e5%a4%8d%e7%8e%b0%e6%89%93%e5%8c%85%e8%a7%a3%e5%8e%8b%e5%90%8e%e7%9b%b4%e6%8e%a5-claude"></a>
可复现打包（解压后直接 <code>claude</code>）
</h2><p>策略已拆成独立仓库 + zip，带 <strong>mock 平台离线 demo</strong>（不需要真实比赛账号也能看到「#71 低 solves REMOTE_ONLY 被 #64 READY 抢槽」）。</p>
<table>
  <thead>
      <tr>
          <th>资源</th>
          <th>链接</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>GitHub 仓库</strong></td>
          <td><a href="https://github.com/fjh1997/ctf-agent-dispatch" target="_blank" rel="noopener noreferrer">fjh1997/ctf-agent-dispatch</a>
</td>
      </tr>
      <tr>
          <td><strong>zip 下载（推荐 v0.2.1）</strong></td>
          <td><a href="https://github.com/fjh1997/ctf-agent-dispatch/releases/download/v0.2.1/ctf-agent-dispatch-0.2.1.zip" target="_blank" rel="noopener noreferrer">ctf-agent-dispatch-0.2.1.zip</a>
</td>
      </tr>
      <tr>
          <td>Release 页</td>
          <td><a href="https://github.com/fjh1997/ctf-agent-dispatch/releases/tag/v0.2.1" target="_blank" rel="noopener noreferrer">v0.2.1</a>
（含根 <code>CLAUDE.md</code> + <code>.claude/agents/</code>）</td>
      </tr>
  </tbody>
</table>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -L -o ctf-agent-dispatch-0.2.1.zip <span class="se">\
</span></span></span><span class="line"><span class="cl">  https://github.com/fjh1997/ctf-agent-dispatch/releases/download/v0.2.1/ctf-agent-dispatch-0.2.1.zip
</span></span><span class="line"><span class="cl">unzip ctf-agent-dispatch-0.2.1.zip <span class="o">&amp;&amp;</span> <span class="nb">cd</span> ctf-agent-dispatch-0.2.1
</span></span><span class="line"><span class="cl">claude
</span></span><span class="line"><span class="cl"><span class="c1"># 会话启动后会自动 bootstrap + 跑 mock 抢槽 demo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 纯 CLI 验收: bash scripts/bootstrap.sh &amp;&amp; ./.venv/bin/python scripts/selftest.py</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>仓库内还包含：</p>
<ul>
<li>根目录 <strong><code>CLAUDE.md</code></strong>（Claude Code 打开项目自动加载）</li>
<li><strong><code>AGENTS.md</code></strong> + <strong><code>.claude/agents/ctf-worker.md</code> / <code>ctf-monitor.md</code></strong>（可 Spawn 子代理）</li>
<li><code>agents/CLAUDE.md</code>、<code>bin/ctf-run-scoped</code>、<code>examples/nepctf2026.yaml</code></li>
</ul>
<p>兼容：<strong>Claude Code</strong>（<code>claude</code>）/ <strong>Codex</strong>（读根目录 <code>AGENTS.md</code>）/ 纯 CLI。<br>
强制安全见仓库 <strong><code>SAFETY.md</code></strong>：禁止格式化真盘、禁止 Ghost 还原到盘符/PhysicalDrive。</p>
<blockquote>
<p>说明：不是「不需要 agents 配置」。v0.1.0 只放了 <code>agents/CLAUDE.md</code> 命名偏内部；<strong>v0.2.1 起以根 <code>CLAUDE.md</code> + <code>.claude/agents/</code> 为准</strong>。</p>
</blockquote>
<h2 id="总览主会话不解题">
<a class="header-anchor" href="#%e6%80%bb%e8%a7%88%e4%b8%bb%e4%bc%9a%e8%af%9d%e4%b8%8d%e8%a7%a3%e9%a2%98"></a>
总览：主会话不解题
</h2><p>核心分工：</p>
<table>
  <thead>
      <tr>
          <th>角色</th>
          <th>干什么</th>
          <th>不干什么</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>主会话（monitor）</strong></td>
          <td>拉榜、差分新题、看 dispatch 表、开/杀子代理、抢实例槽、刷新 JWT</td>
          <td>不在主上下文里硬刚 RE / angr</td>
      </tr>
      <tr>
          <td><strong>子代理（worker）</strong></td>
          <td>单题离线 prep / 写 exp / 打远程 / 交 flag</td>
          <td>不随便 DELETE 别人的实例；不无限占槽</td>
      </tr>
  </tbody>
</table>
<pre class="mermaid">
  flowchart TB
  M[主会话 monitor tick] --> B[GET challenge?size=100]
  M --> D[读 state/dispatch.json]
  M --> I[GET /api/game/2/instance]
  B --> Diff{新 ID 或未 AC 且无活代理?}
  Diff -->|是| S[Spawn 子代理]
  Diff -->|否| Age{jsonl 超时 15-20min?}
  Age -->|是| S
  S --> W1[子代理 A 离线 prep]
  S --> W2[子代理 B 远程 pwn]
  W1 --> F{拿到 flag?}
  W2 --> F
  F -->|是| Sub[POST submit + GET 校验]
  Sub --> Stop[Stop 同题其它代理]
  I --> Slot{槽占用?}
  Slot -->|低优先级占着| Preempt[通知 → DELETE → 给 READY]
</pre><p>工作根目录必须落在持久盘：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/home/catcatyu/nepctf/          # 唯一 work_root，禁止 /tmp/nepctf
</span></span><span class="line"><span class="cl">├── TOKEN                       # JWT，CDP 刷新
</span></span><span class="line"><span class="cl">├── state/
</span></span><span class="line"><span class="cl">│   ├── dispatch.json           # 题 ID → agent 状态
</span></span><span class="line"><span class="cl">│   ├── board_latest.json
</span></span><span class="line"><span class="cl">│   └── monitor_state.json
</span></span><span class="line"><span class="cl">└── work/&lt;id&gt;/
</span></span><span class="line"><span class="cl">    ├── flag.txt
</span></span><span class="line"><span class="cl">    ├── exp/
</span></span><span class="line"><span class="cl">    ├── detail.json / files.json
</span></span><span class="line"><span class="cl">    └── repro/
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>/tmp</code> 重启就没了——早期丢过一整棵 work19，血泪。</p>
<h2 id="平台-api-最小集">
<a class="header-anchor" href="#%e5%b9%b3%e5%8f%b0-api-%e6%9c%80%e5%b0%8f%e9%9b%86"></a>
平台 API 最小集
</h2><p><code>game_id=2</code>，鉴权：<code>Authorization: Bearer $TOKEN</code>。</p>
<table>
  <thead>
      <tr>
          <th>用途</th>
          <th>方法</th>
          <th>路径</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>题列表</td>
          <td>GET</td>
          <td><code>/api/game/2/challenge?size=100</code></td>
      </tr>
      <tr>
          <td>题详情</td>
          <td>GET</td>
          <td><code>/api/game/2/challenge/{id}</code></td>
      </tr>
      <tr>
          <td>附件</td>
          <td>GET</td>
          <td><code>/api/game/2/challenge/{id}/file?folder=static&amp;file={name}</code></td>
      </tr>
      <tr>
          <td>开实例</td>
          <td>POST</td>
          <td><code>/api/game/2/challenge/{id}/instance</code></td>
      </tr>
      <tr>
          <td>列实例</td>
          <td>GET</td>
          <td><code>/api/game/2/instance</code></td>
      </tr>
      <tr>
          <td>关实例</td>
          <td>DELETE</td>
          <td><code>/api/game/2/challenge/{id}/instance</code></td>
      </tr>
      <tr>
          <td>交 flag</td>
          <td>POST</td>
          <td><code>/api/game/2/challenge/{id}/submit</code></td>
      </tr>
      <tr>
          <td>校验</td>
          <td>GET</td>
          <td><code>/api/game/2/challenge/{id}/submit</code> → <code>solved:true</code></td>
      </tr>
  </tbody>
</table>
<p>注意：</p>
<ol>
<li>附件<strong>必须</strong> query 形式 <code>?folder=static&amp;file=...</code>，路径式 URL 会落到 SPA HTML。</li>
<li>DELETE 是 <code>.../challenge/{id}/instance</code>，不是 <code>.../instance</code> 光秃秃一条（会 405）。</li>
<li>提交字段主办方前端用过 <code>content</code>；部分脚本 <code>flag</code> / <code>content</code> 双写更稳。</li>
<li>远程 flag <strong>按实例动态</strong>，和比赛时 <code>flag.txt</code> 字符串不同是正常的。</li>
</ol>
<h3 id="自动交-flag子代理侧">
<a class="header-anchor" href="#%e8%87%aa%e5%8a%a8%e4%ba%a4-flag%e5%ad%90%e4%bb%a3%e7%90%86%e4%be%a7"></a>
自动交 flag（子代理侧）
</h3><p>子代理拿到 <code>NepCTF{...}</code> / <code>flag{...}</code> 后的标准收尾：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">NO_PROXY</span><span class="o">=</span><span class="s1">&#39;*&#39;</span> <span class="nv">no_proxy</span><span class="o">=</span><span class="s1">&#39;*&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">TOKEN</span><span class="o">=</span><span class="k">$(</span>cat /home/catcatyu/nepctf/TOKEN<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">FLAG</span><span class="o">=</span><span class="s1">&#39;NepCTF{...}&#39;</span>   <span class="c1"># 或 flag{...}</span>
</span></span><span class="line"><span class="cl"><span class="nv">ID</span><span class="o">=</span><span class="m">47</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$FLAG</span><span class="s2">&#34;</span> &gt; /home/catcatyu/nepctf/work/<span class="nv">$ID</span>/flag.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 提交（双字段兼容）</span>
</span></span><span class="line"><span class="cl">curl --noproxy <span class="s1">&#39;*&#39;</span> -sS -X POST <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s1">&#39;Content-Type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d <span class="s2">&#34;{\&#34;content\&#34;:\&#34;</span><span class="nv">$FLAG</span><span class="s2">\&#34;,\&#34;flag\&#34;:\&#34;</span><span class="nv">$FLAG</span><span class="s2">\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="s2">&#34;https://www.nepctf.com/api/game/2/challenge/</span><span class="nv">$ID</span><span class="s2">/submit&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 校验</span>
</span></span><span class="line"><span class="cl">curl --noproxy <span class="s1">&#39;*&#39;</span> -sS <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="s2">&#34;https://www.nepctf.com/api/game/2/challenge/</span><span class="nv">$ID</span><span class="s2">/submit&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 期望: {&#34;solved&#34;:true,&#34;solves&#34;:N}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>主会话看到 <code>solved:true</code> 或子代理报告 AC 后：<strong>立刻停掉该题仍在跑的本地代理</strong>，避免空转烧内存。</p>
<h2 id="多子代理怎么开开多少">
<a class="header-anchor" href="#%e5%a4%9a%e5%ad%90%e4%bb%a3%e7%90%86%e6%80%8e%e4%b9%88%e5%bc%80%e5%bc%80%e5%a4%9a%e5%b0%91"></a>
多子代理：怎么开、开多少
</h2><h3 id="主会话原则">
<a class="header-anchor" href="#%e4%b8%bb%e4%bc%9a%e8%af%9d%e5%8e%9f%e5%88%99"></a>
主会话原则
</h3><ul>
<li><strong>主会话 = 调度器</strong>，不把 27 题 RE 全塞进自己的 context。</li>
<li>一题至少一个 worker；离线 prep 与远程 exploit 可拆成先后两个 agent。</li>
<li><code>state/dispatch.json</code> 记：<code>id → agent_id / status / last_beat / READY 等级</code>。</li>
<li>同题禁止双活（除非明确 pipeline：A 写 exp，B 等 A 的 READY 再打远程）。</li>
</ul>
<h3 id="派发触发每个-monitor-tick">
<a class="header-anchor" href="#%e6%b4%be%e5%8f%91%e8%a7%a6%e5%8f%91%e6%af%8f%e4%b8%aa-monitor-tick"></a>
派发触发（每个 monitor tick）
</h3><ol>
<li><code>board_ids - dispatch_ids</code> → <strong>新题立刻离线 prep</strong>。</li>
<li>未 AC 且 <code>status</code> 像在干活，但 agent jsonl <strong>超过 15–20 分钟无更新</strong> → <strong>respawn</strong>（用户明确 hold 的除外）。</li>
<li>题面 / 附件名相对 <code>work/{id}/detail.json</code> 有真变化 → 存 <code>*.prev.json</code>，<code>content_changed=true</code>，<strong>带着新提示重派</strong>。</li>
<li>子代理 <code>completed</code> 但硬验收没过（例如 #42 没弹出 calc）→ <strong>只带着 residual gap 再 spawn</strong>，不许当 done 躺平。</li>
</ol>
<h3 id="并发上限">
<a class="header-anchor" href="#%e5%b9%b6%e5%8f%91%e4%b8%8a%e9%99%90"></a>
并发上限
</h3><table>
  <thead>
      <tr>
          <th>类型</th>
          <th>上限</th>
          <th>原因</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>重求解（angr / unicorn / 遗传 / 双模拟 / V8 fuzz）</td>
          <td><strong>≤2</strong></td>
          <td>12G 主机，再多必 swap 螺旋</td>
      </tr>
      <tr>
          <td>轻离线（OSINT / web 读代码 / 小脚本）</td>
          <td>可多一些</td>
          <td>内存尖刺小</td>
      </tr>
      <tr>
          <td>ProcessPool / 多进程</td>
          <td><strong>workers≤2</strong></td>
          <td>禁止 <code>os.cpu_count()</code></td>
      </tr>
      <tr>
          <td>远程实例</td>
          <td><strong>全队 1 槽</strong></td>
          <td>平台限制，见下节</td>
      </tr>
  </tbody>
</table>
<h3 id="子代理-prompt-里必写的约束">
<a class="header-anchor" href="#%e5%ad%90%e4%bb%a3%e7%90%86-prompt-%e9%87%8c%e5%bf%85%e5%86%99%e7%9a%84%e7%ba%a6%e6%9d%9f"></a>
子代理 prompt 里必写的约束
</h3><p>每个 worker 系统提示里固化（不是可选）：</p>
<ul>
<li>work_root = <code>/home/catcatyu/nepctf</code>，TOKEN 路径固定。</li>
<li><strong>MemoryMax 包装</strong>（下一节）。</li>
<li>附件下载 URL 形态。</li>
<li>交 flag 的 POST + GET 校验。</li>
<li><strong>不要</strong> DELETE 非自己优先级规则允许的实例；先通知占用方。</li>
<li>REALWORLD 展示题（#42 等）：交付物是可跑 PoC，不是「分析完了」。</li>
<li>禁止付费下附件；禁止 Ghost 写真盘。</li>
</ul>
<h2 id="内存硬限制所有重活进-cgroup">
<a class="header-anchor" href="#%e5%86%85%e5%ad%98%e7%a1%ac%e9%99%90%e5%88%b6%e6%89%80%e6%9c%89%e9%87%8d%e6%b4%bb%e8%bf%9b-cgroup"></a>
内存硬限制：所有重活进 cgroup
</h2><p>背景：主机大约 <strong>12G RAM + 16G swap</strong>。真·OOM 元凶往往是胖 <strong>python3</strong>（单进程 RSS+swap 到 6G+），不是浏览器。</p>
<h3 id="默认包装每个-solver--re">
<a class="header-anchor" href="#%e9%bb%98%e8%ae%a4%e5%8c%85%e8%a3%85%e6%af%8f%e4%b8%aa-solver--re"></a>
默认包装（每个 solver / RE）
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemd-run --user --scope <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="nv">MemoryMax</span><span class="o">=</span>3G <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="nv">MemoryHigh</span><span class="o">=</span>2.5G <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="nv">TasksMax</span><span class="o">=</span><span class="m">64</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --quiet --collect -- <span class="se">\
</span></span></span><span class="line"><span class="cl">  python3 script.py …
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>systemd-run</code> 不可用时：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">ulimit</span> -v <span class="m">3500000</span>   <span class="c1"># ~3.5G 虚拟地址空间</span>
</span></span><span class="line"><span class="cl"><span class="nb">ulimit</span> -u <span class="m">64</span>
</span></span><span class="line"><span class="cl">python3 script.py
</span></span></code></pre></td></tr></table>
</div>
</div><p>轻量 curl / 提交也尽量给长 python 加 <code>ulimit -v 2000000</code>。</p>
<h3 id="额外军规">
<a class="header-anchor" href="#%e9%a2%9d%e5%a4%96%e5%86%9b%e8%a7%84"></a>
额外军规
</h3><ul>
<li>禁止无界多进程遗传、整二进制 angr 一把梭、<code>open().read()</code> 读 multi-GB dump。</li>
<li>大文件用 mmap / 流式；临时 dump 用完就删；不要在内存里同时摊开多份 PE/APK。</li>
<li>主会话若发现某 agent 的 python <strong>无 scope 却 RSS ≳1.5G</strong> → kill，套上 MemoryMax 重跑。</li>
<li>Windows PE（#36 ColorfulArray 等）<strong>上宿主机 Windows 调</strong>，不要指望 WSL Wine 完整。</li>
</ul>
<h2 id="实例槽唯一的全局锁">
<a class="header-anchor" href="#%e5%ae%9e%e4%be%8b%e6%a7%bd%e5%94%af%e4%b8%80%e7%9a%84%e5%85%a8%e5%b1%80%e9%94%81"></a>
实例槽：唯一的全局锁
</h2><p>平台侧基本是 <strong>整队同时只能挂一个 challenge instance</strong>。离线题不占槽；远程 pwn/web/AI 容器题抢这把锁。</p>
<h3 id="优先级71-抢-64-之后订正">
<a class="header-anchor" href="#%e4%bc%98%e5%85%88%e7%ba%a771-%e6%8a%a2-64-%e4%b9%8b%e5%90%8e%e8%ae%a2%e6%ad%a3"></a>
优先级（#71 抢 #64 之后订正）
</h3><p>从高到低：</p>
<ol>
<li><strong>True READY / LOCAL_OK one-shot</strong><br>
离线链路已 E2E 跑通，只差远程确认。同级按 <strong>solves 高优先</strong>（分越低越急也可以，我们实现里用 solves 作衰减题的价值代理）。</li>
<li><strong>有附件 + 远程路径清晰</strong><br>
exp 写好了，只差 host。</li>
<li><strong>REMOTE_ONLY</strong>（无附件，必须 live 摸）<br>
<strong>仅当没有更高档 READY 在排队时</strong>才能占槽。<br>
同级同样 higher solves first。<br>
<strong>禁止</strong> 0～2 solves 的 REMOTE_ONLY 抢走 READY 且 solves 更高的题（#71 抢 #64 就是反例）。</li>
<li><strong>水货 / 过早 READY</strong> → 立刻让出，修到真 READY 再排队。</li>
<li>占槽方 <strong>15～30 分钟</strong>只有本地空转、远程零进展 → 按上表轮转。</li>
<li>纯离线题 <strong>永远不挡槽</strong>。</li>
</ol>
<h3 id="抢占动作">
<a class="header-anchor" href="#%e6%8a%a2%e5%8d%a0%e5%8a%a8%e4%bd%9c"></a>
抢占动作
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1. 通知占用中的子代理：「槽要被更高优先级回收」
</span></span><span class="line"><span class="cl">2. DELETE /api/game/2/challenge/{old_id}/instance
</span></span><span class="line"><span class="cl">3. POST  /api/game/2/challenge/{new_id}/instance
</span></span><span class="line"><span class="cl">4. 把 address 塞给新 worker
</span></span></code></pre></td></tr></table>
</div>
</div><p>规则允许时主会话可 <strong>不逐次人肉确认 DELETE</strong>（赛中节奏），但 <strong>必须先 notify</strong> 占用 agent，避免它还在写半截 exp 突然 断连却以为自己还占着。</p>
<h3 id="槽与题型矩阵直觉">
<a class="header-anchor" href="#%e6%a7%bd%e4%b8%8e%e9%a2%98%e5%9e%8b%e7%9f%a9%e9%98%b5%e7%9b%b4%e8%a7%89"></a>
槽与题型矩阵（直觉）
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">离线 crypto/misc ────────────── 不占槽，尽管跑（受重求解 ≤2 限制）
</span></span><span class="line"><span class="cl">有附件 + exp 已本地通 ──────── READY，最高优先抢槽
</span></span><span class="line"><span class="cl">无附件 REMOTE_ONLY ─────────── 低 solves 时排后面
</span></span><span class="line"><span class="cl">REALWORLD 展示题 ───────────── 可离线做 PoC；平台未必要 submit
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="jwt-与登录cdp-刷新">
<a class="header-anchor" href="#jwt-%e4%b8%8e%e7%99%bb%e5%bd%95cdp-%e5%88%b7%e6%96%b0"></a>
JWT 与登录：CDP 刷新
</h2><p>WSL 里直接打 <code>nepctf.com</code> 有时要代理；平台 API 建议 <code>NO_PROXY=*</code> 直连。<br>
JWT 失效表现：<code>please login first</code>（401）。<code>please take part in first</code>（403）则是进队/会话问题。</p>
<p>刷新路径（宿主机 Edge <code>remote-debugging-port=9222</code>）：</p>
<ol>
<li>Windows 上 Node + <code>ws</code> 连 <code>http://127.0.0.1:9222</code></li>
<li>找已登录的 nepctf 标签，<code>Runtime.evaluate</code> 读 <code>localStorage.account.token</code></li>
<li>写回 <code>/home/catcatyu/nepctf/TOKEN</code></li>
</ol>
<p>WSL 往往 <strong>打不进</strong> 宿主机 <code>127.0.0.1:9222</code>，所以刷新脚本跑在 <strong>PowerShell / 宿主 Node</strong>，不要假设 WSL 本机 CDP 一定通。</p>
<h2 id="题面变更监控">
<a class="header-anchor" href="#%e9%a2%98%e9%9d%a2%e5%8f%98%e6%9b%b4%e7%9b%91%e6%8e%a7"></a>
题面变更监控
</h2><p>主办会上下架、改描述、塞补题提示。每个 tick 对未 AC 题：</p>
<ol>
<li><code>GET /challenge/{id}</code></li>
<li>规范化 <code>content</code> + 附件 <strong>文件名</strong> 和 <code>work/{id}/detail.json</code> / <code>files.json</code> 比</li>
<li>真变化 → 备份 prev，标记 <code>content_changed</code>，<strong>带着新 hint 重派</strong></li>
</ol>
<p>忽略纯 JSON key 顺序抖动。<br>
<strong>不付费</strong>下附件（付费盘 / CSDN VIP / 付费 ISO 一律跳过）。</p>
<h2 id="外网与代理">
<a class="header-anchor" href="#%e5%a4%96%e7%bd%91%e4%b8%8e%e4%bb%a3%e7%90%86"></a>
外网与代理
</h2><ul>
<li>子代理拉 GitHub / Google：可走 <code>http://192.168.1.5:10808</code></li>
<li>打比赛实例、提交 flag：优先 <code>NO_PROXY='*'</code> 直连，避免代理把内网式实例域名带歪</li>
<li>OSINT 禁止开一堆空白 CDP 标签刷屏</li>
</ul>
<h2 id="安全红线写进-agent-记忆">
<a class="header-anchor" href="#%e5%ae%89%e5%85%a8%e7%ba%a2%e7%ba%bf%e5%86%99%e8%bf%9b-agent-%e8%ae%b0%e5%bf%86"></a>
安全红线（写进 agent 记忆）
</h2><ul>
<li><strong>禁止</strong> Ghost / 磁盘镜像 <strong>restore</strong> 到真实物理盘或盘符。</li>
<li>取证只在 <code>work/</code> 下的 <strong>文件副本</strong> 上做。</li>
<li>Windows 真机调 PE；Linux ELF 留在 WSL。</li>
</ul>
<h2 id="一场下来最有用的教训">
<a class="header-anchor" href="#%e4%b8%80%e5%9c%ba%e4%b8%8b%e6%9d%a5%e6%9c%80%e6%9c%89%e7%94%a8%e7%9a%84%e6%95%99%e8%ae%ad"></a>
一场下来最有用的教训
</h2><ol>
<li><strong>调度 &gt; 单题智商</strong>：槽让低 solves REMOTE_ONLY 占着时，READY 题在干等 = 白丢分。</li>
<li><strong>MemoryMax 不是可选优化</strong>：没有 cgroup 时一个 angr 就能把整台机器拖进 swap 死亡。</li>
<li><strong>主会话别自己做题</strong>：context 会被 27 份 RE 撑爆；monitor 只做差分和派发。</li>
<li><strong>AC 立刻杀残党</strong>：平台已 solved 的题还留着 fuzz 进程，是纯噪音。</li>
<li><strong>验收标准写进 prompt</strong>：#42 必须「弹出 calc」而不是「写完分析」；否则 agent 会提前 final。</li>
<li><strong>动态 flag</strong>：复现/WP 不要要求和 <code>flag.txt</code> 字符串全等。</li>
<li><strong>错误历史要隔离</strong>：#23 的 force-ramp、#24 的纯 spoof、#53 的 root:123456，都是失败支路，dispatch 文档里要标成 forbidden path。</li>
</ol>
<h2 id="最小可抄清单">
<a class="header-anchor" href="#%e6%9c%80%e5%b0%8f%e5%8f%af%e6%8a%84%e6%b8%85%e5%8d%95"></a>
最小可抄清单
</h2><p>若只抄一页纸：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">work_root = ~/nepctf（非 /tmp）
</span></span><span class="line"><span class="cl">主会话 = 榜单差分 + dispatch + 槽调度 + JWT
</span></span><span class="line"><span class="cl">子代理 = 一题一（或 prep→remote 两段）
</span></span><span class="line"><span class="cl">重活 = systemd-run MemoryMax=3G，重求解 ≤2
</span></span><span class="line"><span class="cl">槽优先级 = READY/LOCAL_OK &gt; 有exp附件 &gt; REMOTE_ONLY(高solves)
</span></span><span class="line"><span class="cl">抢槽 = notify → DELETE challenge/{id}/instance → POST 新题
</span></span><span class="line"><span class="cl">交 flag = POST submit 后 GET 看 solved:true，然后 stop 同题 agent
</span></span><span class="line"><span class="cl">题面变了 = 重派；付费附件 = 不做；Ghost 写真盘 = 禁止
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="相关">
<a class="header-anchor" href="#%e7%9b%b8%e5%85%b3"></a>
相关
</h2><ul>
<li><strong>题解博文</strong>：<a href="/posts/202607202.html">NepCTF 2026 WriteUp（猫娘手写本 · rank 20）</a>
 · <a href="https://github.com/fjh1997/nepctf2026-writeup/releases/download/v1.0.0/nepctf2026-writeup-catcatyu-rank20.zip" target="_blank" rel="noopener noreferrer">完整包 zip</a>
</li>
<li><strong>可复现项目</strong>：<a href="https://github.com/fjh1997/ctf-agent-dispatch" target="_blank" rel="noopener noreferrer">ctf-agent-dispatch</a>
 · <a href="https://github.com/fjh1997/ctf-agent-dispatch/releases/download/v0.2.1/ctf-agent-dispatch-0.2.1.zip" target="_blank" rel="noopener noreferrer">zip v0.2.1</a>
</li>
<li>平台：<code>https://www.nepctf.com</code>，<code>game_id=2</code></li>
</ul>
<p>—— 调度比模型版本号更决定能吃下几道远程题。</p>
        
        <hr><p>本文2026-07-20首发于<a href='https://cat.fjh1997.top/'>猫猫鱼的小窝</a>，最后修改于2026-07-20</p>]]>
      </description>
      
        <category>CTF</category><category>AI工具</category>
      
    </item>
    
  </channel>
</rss>
